見出し画像

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)  ……などと表示される


いいなと思ったら応援しよう!