1. ホーム
  2. machine-learning

[解決済み] pytorch - loss.backward() と optimizer.step() の間の接続。

2023-01-08 21:35:44

質問

の間の明示的な接続はどこにあるのでしょうか? optimizerloss ?

オプティマイザは、以下のような呼び出しなしに、損失の勾配をどこで取得するかをどのように知ることができるのでしょうか? optimizer.step(loss) ?

-より詳細な文脈

損失を最小化するとき、オプティマイザに勾配を渡す必要がなかった。

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

どのように解決するのですか?

pytorchの内部を深く掘り下げることなく、単純化した答えを提供することができます。

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

計算グラフとpytorchテンソルに格納された追加のquot;grad"情報についての詳細な情報は この回答 .

オプティマイザによるパラメータの参照は、モデルをGPUに移動した場合など、トラブルの原因となることがあります。 オプティマイザーを初期化した後にモデルを GPU に移動した場合などです。 モデルの設定が終わっていることを確認し の前に オプティマイザを構築する前に、モデルの設定が終わっていることを確認してください。参照 この回答 をご覧ください。