自動微分機能(autogradの仕組みと使い方)

PyTorchの自動微分機能(autograd)は、機械学習における勾配計算を自動で行う仕組みを提供する強力な機能です。これはニューラルネットワークの学習における**誤差逆伝播法(backpropagation)**を簡単に実装するために利用されます。


1. autogradの基本概念

PyTorchでは、torch.Tensorrequires_grad=Trueを指定すると、そのテンソルに対してすべての演算の履歴(計算グラフ)が記録されます。このグラフをもとに、backward()を呼び出すことで自動的に勾配が計算され、対応するテンソルの.grad属性に保存されます。


2. 仕組みの概要

  1. 計算グラフの構築(Dynamic Computational Graph)
    PyTorchは動的計算グラフを採用しています。これは、計算が実行されるたびにその都度グラフを構築するという仕組みで、柔軟でデバッグしやすいのが特徴です。

  2. 演算ごとにFunctionが記録
    各演算はFunctionオブジェクトとして記録され、.grad_fn属性に格納されます。この情報をたどることで、逆方向に勾配が伝播されます。

  3. 逆伝播の実行
    .backward()を呼び出すと、計算グラフを逆にたどって、各テンソルに対して偏微分値が計算され、.grad属性に保存されます。


3. 基本的な使い方

python
import torch # 勾配を追跡するテンソルを作成 x = torch.tensor([2.0], requires_grad=True) # 関数 y = x^2 を定義 y = x ** 2 # 逆伝播を実行して dy/dx を計算 y.backward() # 勾配を出力 print(x.grad) # tensor([4.])

この例では、y = x^2 の導関数 dy/dx = 2xx=2 を代入した結果、勾配は 4.0 になります。


4. 複雑な例(複数ステップの演算)

python
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) y = x * 2 z = y.mean() z.backward() print(x.grad) # tensor([0.6667, 0.6667, 0.6667])

ここでは、z = mean(2x) の勾配 dz/dx = 2/3 が各要素に対して計算されます。


5. 勾配の停止

学習時に不要なテンソルの勾配を計算しないようにするには、次のいずれかの方法を用います。

  • with torch.no_grad():

  • tensor.detach()

python
with torch.no_grad(): y = x * 2 # この演算では勾配が追跡されない

または

python
y = x.detach() * 2 # detachにより計算グラフから切り離される

6. 注意点

  • .backward()スカラー出力に対して使うのが基本です。ベクトルやテンソル出力に対して使うには、gradient引数に勾配の初期値を指定する必要があります。

  • 一度計算した勾配は、.zero_()で初期化しない限り蓄積されます。ループ内での使用時は注意が必要です。


7. まとめ

機能 説明
requires_grad=True 勾配追跡を有効にする
.backward() 逆伝播で勾配を計算
.grad 勾配の結果が格納される属性
torch.no_grad() 勾配追跡を一時的に無効化
.detach() テンソルを計算グラフから切り離す

PyTorchのautogradは、勾配計算を自動化し、ディープラーニングの開発を大幅に効率化します。この機能を正しく使いこなすことで、複雑なモデルでも簡潔に学習ロジックを実装できます。

生成日:2025/05/22