PyTorchは、自動微分を容易に行える便利なライブラリです。この例では、PyTorchを使って基本的なテンソル操作と勾配計算を行う方法を説明します。
テンソルの作成と操作
torch.randでランダムな値を持つ2x3のテンソルtを作成します。requires_grad=Trueを指定することで、このテンソルに対する操作が記録され、後で勾配を計算できるようにします。
import torch
import numpy as np
t = torch.rand(2, 3, requires_grad=True)
y = t + 5
print(y)
# tensor([[5.6119, 5.9397, 5.8334],
# [5.6603, 5.1596, 5.1985]], grad_fn=<AddBackward0>)
# ここのTensorはAddBackwardという方法で計算されていることが分かります。
z = y * 2
out = z.mean()
print(out)
# tensor(11.1344, grad_fn=<MeanBackward0>)
勾配の計算
out.backward()を呼び出すことで、outに関するtの勾配を計算します。
out.backward()
print(t.grad) # 勾配 d(out)/d(t)
# tensor([[0.3333, 0.3333, 0.3333],
# [0.3333, 0.3333, 0.3333]])
自動微分の中止
detachを使用すると、テンソルを計算グラフから切り離し、それ以上の自動微分が発生しなくなります。
result = out.detach()
print(result)
# tensor(11.1344)
# ここのgrad_fnが無くなっています。自動微分が中止されていることが分かります。
torch.no_grad()ブロック内計算グラフ全体を無効化できます。自動微分が中止されています。
with torch.no_grad():
y = t + 2
print(y)
# tensor([[2.8853, 2.7369, 2.0852],
# [2.1785, 2.7781, 2.3694]])
# ここのgrad_fnが無くなっています。自動微分が中止されていることが分かります。
まとめ
このコード例では、PyTorchの自動微分機能を利用して、テンソルの操作や勾配の計算を学びました。requires_gradを有効にすると、計算グラフが作られ、微分操作が簡単に実行できます。
補足: t.grad計算(数学の部分)
コードと計算の流れ
t = torch.rand(2, 3, requires_grad=True)
y = t + 5
z = y * 2
out = z.mean()
out.backward()
print(t.grad)
微分(バックプロパゲーション)
out.backward()を実行すると、tに対する微分∂out/∂tを計算します。ここでは連鎖律(チェーンルール)を使います。