web-dev-qa-db-ja.com

pytorch-loss.backward()とoptimizer.step()の間の接続

optimizerlossの間の明示的な接続はどこにありますか?

オプティマイザは、このoptimizer.step(loss)を呼び出さずに損失の勾配を取得する場所をどのようにして知るのですか?

-より多くのコンテキスト-

損失を最小限に抑えると、勾配をオプティマイザに渡す必要がなくなりました。

loss.backward() # Back Propagation
optimizer.step() # Gardient Descent
22
Aerin

Pytorchの内部を深く掘り下げることなく、私は単純な答えを提供できます:

optimizerを初期化するときは、モデルのどのパラメーター(テンソル)を更新するかを明示的に指定することを思い出してください。勾配はテンソル自体によって「保存」されます(それらには grad_requires_grad_ 属性)損失時にbackward()を呼び出すと。モデル内のすべてのテンソルの勾配を計算した後、optimizer.step()を呼び出すと、オプティマイザーが更新するすべてのパラメーター(テンソル)を反復処理し、内部に格納されているgradを使用して値を更新します。

21
Shai

loss.backward()を呼び出すと、_requires_grad = True_を持つすべての損失パラメータの損失の勾配が計算され、すべてのパラメータの_parameter.grad_属性に格納されます。

optimizer.step()は、_parameter.grad_に基づいてすべてのパラメーターを更新します

10
Ganesh