optimizer
とloss
の間の明示的な接続はどこにありますか?
オプティマイザは、このoptimizer.step(loss)
を呼び出さずに損失の勾配を取得する場所をどのようにして知るのですか?
-より多くのコンテキスト-
損失を最小限に抑えると、勾配をオプティマイザに渡す必要がなくなりました。
loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
Pytorchの内部を深く掘り下げることなく、私は単純な答えを提供できます:
optimizer
を初期化するときは、モデルのどのパラメーター(テンソル)を更新するかを明示的に指定することを思い出してください。勾配はテンソル自体によって「保存」されます(それらには grad
と _requires_grad
_ 属性)損失時にbackward()
を呼び出すと。モデル内のすべてのテンソルの勾配を計算した後、optimizer.step()
を呼び出すと、オプティマイザーが更新するすべてのパラメーター(テンソル)を反復処理し、内部に格納されているgrad
を使用して値を更新します。
loss.backward()
を呼び出すと、_requires_grad = True
_を持つすべての損失パラメータの損失の勾配が計算され、すべてのパラメータの_parameter.grad
_属性に格納されます。
optimizer.step()
は、_parameter.grad
_に基づいてすべてのパラメーターを更新します