自動微分

import torch

# テンソルを作成
# requires_grad=Trueで自動微分対象を指定
x = torch.tensor(1.0, requires_grad=True)
w = torch.tensor(2.0, requires_grad=True)
b = torch.tensor(3.0, requires_grad=True)

# 計算グラフを構築
# y = 2 * x + 3
y = w * x + b

# 勾配を計算
y.backward()

# 勾配を表示
print(x.grad)  # dy/dx = w = 2
print(w.grad)  # dy/dw = x = 1
print(b.grad)  # dy/db = 1

requires_grad

requires_gradでは,requires_grad=Trueとすることで微分対象のtensorを指定します.デフォルトではrequires_grad=Falseとなっており,このままだと微分の対象にはならず,勾配にはNoneが返ります.requires_grad=FalseはFine-tuningで層のパラメータを固定したいときに便利だそうです.

grad_fn

autogradにはFunctionと言うパッケージがあります.requires_grad=Trueで指定されたtensorとFunctionは内部で繋がっており,この2つで計算グラフが構築されています.この計算グラフに計算の記録が全て残ります.生成されたtensorのそれぞれに.grad_fnという属性があり,この属性によってどのFunctionによってtensorが生成されたのかを参照できます.ただし,ユーザによって作られたtensorの場合grad_fnはNoneとなります.

a = torch.tensor(1.0, requires_grad=True)
print(a.grad_fn) # None

b = a+2 # bは足し算(add)によって形成
print(b.grad_fn) # <AddBackward object at 0x7f740ffc0eb8>