Autograd: automatic Differentiation (自動微分)
PyTorchにおける全てニューラルネットの中心はautograd
パーケージであり、まず簡単にこれについて説明した後、一番最初のニューラルネットワークの学習を行う。
自動微分とは
自動微分とは元関数から数式処理(高校数学、大学数学でやったような微分演算)で導関数を導出する数式微分、近似的に数値計算により微分係数を導出する数値微分と異なり、連鎖律を用いて微分を導出する方法。
$f, g$を微分可能な関数とし、$f$が$g$の関数、$g$が$x$の関数となっている時、$f$の$x$についての微分は以下のように計算できる。
$$\frac{df}{dx} = \frac{df}{dg}\frac{dg}{dx}$$
Variable
autograd.Variable
はこのautograd
パッケージの中心となるクラスであり、Tensor
クラスをラップしているので、Tensor
クラスのほぼ全ての演算を実行できる。全ての計算を実行したのち、backward()
を呼ぶことにより、全ての勾配を自動的に計算することが可能。生のtensorを.data
でアクセス可能であり、この変数はVariable
クラスの.grad
に蓄積される。
(tensorflowと比べるととてもデバッグしやすいですね!)
Function
自動微分の実相においてもう一つとても重要なクラスがFunction
である。
Variable
とFunction
は内部で接続され、有向非循環グラフ上で構築される。ユーザーが作成した場合を除き、全てのvariableは.grad_fn
というアトリビュートをもち、その変数を作成したFunction
を参照できる。
微分を計算したい場合には、Variable
に対して.backward()
を計算すればよい。Variable
がスカラーの場合、.backward()
に引数を渡す必要はないが、それ以外の場合はgradient
という引数を明示的に渡す必要がある。このgradient
はサイズが一致している必要がある。
grad_fn
実際にgrad_fn
で変数からそれを生成した演算の参照が可能か確かめてみる。
import torch
from torch.autograd import Variable #autgradパッケージからVariableクラスを参照する
x = Variable(torch.ones(2,2), requires_grad=True)
# 要素が全て1の2x2行列が生成される
y = x + 2
# 要素が全て1+2=3となる2x2行列が生成される
print(y.grad_fn)
# <torch.autograd.function.AddConstantBackward object at 0x7f1faab77138>