Pytorch - 自動微分をもっと理解したい!
公式ホームページです。
まずは基本的なことから理解を深めたいと思います。
最初は、
TensorというPyTorchの最も基本となるデータ構造
この参考サイトの中で
Tensorはその名の通りテンソル、つまり多次元配列を扱うためのデータ構造です。NumPyのndarrayとほぼ同様のAPIを有しており、それに加えてGPUによる計算もサポートしています。Tensorは各データ型に対して定義されており、例えば32bitの浮動小数点数でしたらtorch.FloatTensorを、64bitの符号付き整数でしたらtorch.LongTensorを使用します。
そして自動微分です。
データをPyTorchテンソル化して、計算式を作る
backward()メソッドで逆伝播する(自動微分)
データ(テンソル)のgrad変数で微分係数(=勾配)を取得できる
import torch
def calc(x):
return (2 * x ** 3) + (4 * x ** 2) + (5 * x) + 6
x = torch.tensor(0.5, requires_grad=True) # 変数に対して「勾配計算が必要」とマーク
y = calc(x) # 既存の計算式から計算グラフを動的に構築
print(y) # tensor(9.7500, grad_fn=<AddBackward0>) ……などと表示される
y.backward() # 逆伝播の処理として、上記式から微分係数(=勾配)を計算(自動微分:Autograd)
g = x.grad # 与えられた入力(x)によって計算された勾配の値(grad)を取得
print(g)
出力は、
tensor(9.7500, grad_fn=<AddBackward0>)
tensor(10.5000)
となります。
自動微分をする場合に必要なもの、まず、数式。
def calc(x):
return (2 * x ** 3) + (4 * x ** 2) + (5 * x) + 6
y = calc(x)
そして、"x"に入れる値、
x = torch.tensor(0.5, requires_grad=True)
この時
requires_grad=True
で微分することを宣言("True"に設定)、することが必要です。
そして、微分していきます。誤差逆伝播法(Back propagation)です。
y.backward()
あとは勾配を出します。
g = x.grad
これで完了となります。
以下も参考サイトになります。
参考にTensorFlowも記録しておきます。
TensorFlow
データをTensorテンソル化して、勾配テープ(GradientTape)内で計算式を作る勾配テープ(tape)のgradientメソッドで逆伝播する(自動微分)
逆伝播により計算された微分係数(=勾配)が取得される
import tensorflow as tf
import tensorflow.keras.layers as layers # 「レイヤー」モジュールの別名定義
x = tf.Variable(0.5)
with tf.GradientTape() as tape: # 計算式に対して「勾配計算が必要」とマーク
y = calc(x) # 既存の計算式から計算グラフを動的に構築
print(y) # tf.Tensor(9.75, shape=(), dtype=float32) ……などと表示される
g = tape.gradient(y, x) # 逆伝播の処理として、上記式から微分係数(=勾配)を計算(自動微分:Autograd)
print(g) # tf.Tensor(10.5, shape=(), dtype=float32) ……などと表示される