PyTorchでマルチロスを処理するにはどうすればよいですか? 質問する

PyTorchでマルチロスを処理するにはどうすればよいですか? 質問する

ここに画像の説明を入力してください

このように、モデルのパフォーマンスを向上させるために補助的な損失を使用したいと考えています。
どのタイプのコードでこれを PyTorch に実装できますか?

#one
loss1.backward()
loss2.backward()
loss3.backward()
optimizer.step()
#two
loss1.backward()
optimizer.step() 
loss2.backward()
optimizer.step() 
loss3.backward()
optimizer.step()   
#three
loss = loss1+loss2+loss3
loss.backward()
optimizer.step()

ご回答有難うございます!

ベストアンサー1

1 回目と 3 回目の試みはまったく同じで正しいのですが、2 回目のアプローチは完全に間違っています。

Pytorchでは、低層勾配はない後続の呼び出しによって「上書き」されるbackward()のではなく、蓄積または合計されます。これにより、最初のアプローチと 3 番目のアプローチは同一になりますが、メモリの少ない GPU/RAM を使用している場合は、最初のアプローチの方が適している可能性があります (1 回の呼び出しでバッチ サイズが 1024 の場合、サイズが 128 のバッチが 8 回あり、呼び出しが 8 回で、最後に呼び出しが1 回の場合backward() + step()と同じです)。backward()step()

この考え方を説明するために、簡単な例を挙げます。テンソルを同時にx次の値に近づけたいとします。40,50 and 60

x = torch.tensor([1.0],requires_grad=True)
loss1 = criterion(40,x)
loss2 = criterion(50,x)
loss3 = criterion(60,x)

最初のアプローチ: (tensor.gradテンソルの現在の勾配を取得するために使用しますx)

loss1.backward()
loss2.backward()
loss3.backward()

print(x.grad)

出力は次のようになります: tensor([-294.])(編集:より複雑な計算グラフの場合はretain_graph=True最初の 2 つの呼び出しを追加)backward

3番目のアプローチ:

loss = loss1+loss2+loss3
loss.backward()
print(x.grad)

出力は次のようになります:tensor([-294.])

opt.zero_grad2 番目のアプローチは、メソッドを呼び出した後に呼び出しを行わないため異なりますstep()。つまり、3 つのstep呼び出しすべてで、最初の呼び出しの勾配がbackward使用されます。たとえば、3 つの損失が5,1,4同じ重みの勾配を提供する場合、10 (=5+1+4) ではなく、重みに5*3+1*2+4*1=21勾配が設定されます。

さらに詳しい情報:リンク 1リンク 2

おすすめ記事