1. Autograd:自動差別化
PyTorchのすべてのニューラルネットワークの中核はautograd
パッケージです。最初にこのパッケージを簡単に紹介し、次に最初のニューラルネットワークをトレーニングします。
autograd
このパッケージは、テンサーのすべての操作を自動的に区別します。これは実行時に定義されるフレームワークです。つまり、バックプロパゲーションはコードの実行方法に従って定義され、各反復は異なる場合があります。
次に、いくつかの簡単な例を使用して、このパッケージを確認します。
テンソル
torch.Tensor
パッケージのコアクラスです。プロパティ.requires_grad
をTrueに設定すると、そのプロパティに対するすべての操作の追跡が開始されます。計算が完了したら、呼び出して.backward()
すべての勾配を自動的に計算できます。このテンソルの勾配は.grad
属性に累積されます。
テンソルが履歴を追跡しないようにするには、呼び出してテンソルを.detach()
計算履歴から分離し、将来の計算が追跡されないようにすることができます。
追跡履歴(およびメモリ使用量)を防ぐために、torch.no_grad()を使用してコードブロックをラップすることもできます。これは、モデルにrequires_grad = True
トレーニング可能なパラメータがある場合があるため、モデルを評価するときに特に役立ちますが、勾配は必要ありません。
autogradの実装にとって非常に重要な別のクラスがあります-Function。
TensorとFunctionは相互に接続され、非周期的なグラフを作成して完全な計算プロセスを作成します。各テンソルには、.grad_fn
作成されたテンソルの機能を参照する属性があります(ユーザーが作成したテンソルを除く-それらgrad_fn
はNone
)。
導関数を計算したい場合は、Tensorで呼び出すことができます.backward()
。テンソルがスカラーの場合(つまり、1つの要素データが含まれている場合)、backward()
パラメーターを指定する必要はありませんが、要素がさらにある場合は、形状が一致するテンソルである勾配パラメーターを指定する必要があります。
import torch
テンソルを作成し、requires_grad = True
その計算を追跡するように設定します
x = torch.ones(2, 2, requires_grad=True)
print(x)
输出:
tensor([[1., 1.],
[1., 1.]], requires_grad=True)
テンサーで操作を実行します。
y = x + 2
print(y)
输出:
tensor([[3., 3.],
[3., 3.]], grad_fn=<AddBackward0>)
yは操作によって作成されるため、grad_fnがあり、xはユーザーによって作成されるため、そのgrad_fnはNoneです。
print(y.grad_fn)
print(x.grad_fn)
输出:
<AddBackward0 object at 0x000001E020B794A8>
None
yで操作を実行します
z = y * y * 3
out = z.mean()
print(z, out)
输出:
tensor([[27., 27.],
[27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward1>)
.requires_grad_(...)
既存のテンソルのrequires_grad
ロゴを所定の位置に変更します。指定しない場合、入力フラグはデフォルトでFalseになります。
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)
输出:
False
True
<SumBackward0 object at 0x000001E020B79FD0>
グラデーション
それでは、逆伝播を実行しましょう。これはout.backward()
、実行するのと同じです。out.backward(torch.tensor(1.))
out.backward()
outの勾配d(out)/ dxをxに出力します。
print(x.grad)
输出:
tensor([[4.5000, 4.5000],
[4.5000, 4.5000]])
ここで、Jacobianベクトル製品の例を見てみましょう。
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
y = y * 2
print(y)
输出:
tensor([ 384.5854, -13.6405, -1049.2870], grad_fn=<MulBackward0>)
この場合、yはスカラーではなくなります。 torch.autograd
完全なJacobian決定子を直接計算することはできませんが、Jacobianベクトル積のみが必要な場合は、ベクトルをパラメーターとして逆方向に渡すだけで済みます。
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)
输出:
tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])
torch.no_grad()コードを使用し、テンソルで.requires_grad = Trueを使用して、トレース履歴の使用を停止することもできます。
print(x.requires_grad)
print((x ** 2).requires_grad)
with torch.no_grad():
print((x ** 2).requires_grad)
输出:
True
True
False