

DLの学習時には、モデルを使って予測を出す→損失関数で損失を計算→損失関数を最適化アルゴリズムに（逆伝播＆パラメータ更新）という流れだと思うのですが、これをPyTorchを行う時、「この最適化アルゴリズムでこの損失関数を最適化するよ」という情報の結びつけは自動的に行われるのでしょうか？

具体的には、以下にあるように

[code]

    # 正しいコード
    # 交差エントロピー誤差関数
    loss_fnc = nn.CrossEntropyLoss()
     
    # SGD
    optimizer = optim.SGD(net.parameters(), lr=0.01)  # 学習率は0.01
    
[/code]

ではなく

[code]

    # 誤ったコード
    # 交差エントロピー誤差関数
    loss_fnc = nn.CrossEntropyLoss()
     
    # SGD
    # 最適化をおこなう関数を指定するようなパラメータがあると仮定
    optimizer = optim.SGD(net.parameters(), lr=0.01, target=loss_fnc)  # 学習率は0.01
    
[/code]

のようにしなくても、自動的に結びついているのでしょうか？

また、どこで結びつけがなされているのでしょうか？


CC BY-SA 4.0
2022-09-21T13:46:07.720
91218
2022-09-22T21:09:33.277
2022-09-21T13:52:04.697
3060
40034
question
python 深層学習 pytorch
PyTorchでの損失関数と最適化アルゴリズムの結びつけについて


最適化アルゴリズムと損失関数は独立しているので、明示的な結びつきは行われていないのです。

  * 損失関数は、パラメタの勾配を.backward()で算出します。勾配の値はパラメタ自体に蓄積されます。
  * 最適化アルゴリズムは、このパラメタ自体が持つ勾配情報を用いてパラメタ値の更新を行います。このとき勾配のみを見るので損失関数はどんなものかを最適化アルゴリズムは知る必要がありません。

[code]

    # 予測と損失の計算
    pred = net(x)　
    loss = loss_fn(pred, y)
    
    # バックプロパゲーション
    optimizer.zero_grad()　　# 全てのパラメタオブジェクトの勾配を0に更新
    loss_fn.backward()　　# ここでモデルパラメタオブジェクトに勾配の値が記録される
    optimizer.step()　　# パラメタオブジェクトの勾配の値を用いてパラメタ値の更新
    
[/code]

最適化アルゴリズムはnet.parameters()によって更新対象のパラメタ一覧を取得します。例えば、ここにモデルの一部のパラメタしか渡さなければ、その一部のパラメタの更新しか行われません。

ちなみに`optimizer.zero_grad()`はnet.parameters()のパラメタの勾配を全て0に更新します。loss_fn.backward()を行うと前回の勾配+新規勾配が蓄積されるので、新規勾配を計算する前に前回までの勾配情報をリセットしているのです。


CC BY-SA 4.0
2022-09-21T22:51:48.867
91222
2022-09-22T21:09:33.277
2022-09-22T21:09:33.277
54208
54208
91218
answer