LoginSignup
3
1

More than 5 years have passed since last update.

PyTorch公式チュートリアル Deep Learning with PyTorch #2 Autograd

Posted at

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>
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1