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である。
VariableFunctionは内部で接続され、有向非循環グラフ上で構築される。ユーザーが作成した場合を除き、全ての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>
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.