當前位置: 華文問答 > 數位

深度學習的多個loss如何平衡?

2020-03-01數位

這也是個困擾了我多年的問題:

loss = a * loss1 + b * loss2 + c * loss3 怎麽設定 a,b,c?

我的經驗是 loss 的尺度一般不太影響效能,除非本來主 loss 是 loss1,但是因為 b,c 設定太大了導致其他 loss 變成了主 loss。

實踐上有幾個調整方法:

  1. 手動把所有 loss 放縮到差不多的尺度,設 a = 1,b 和 c 取 10^k,k 選完不管了;
  2. 如果有兩項 loss,可以 loss = a * loss1 + (1 - a) * loss2,透過控制一個超參數 a 調整 loss;
  3. 我試過的玄學躺平做法 loss = loss1 / loss1.detach() + loss2 / loss2.detach() + loss3 loss3.detach(),分母可能需要加 eps,相當於在每一個 iteration 選定超參數 a, b, c,使得多個 loss 尺度完全一致;進一步更科學一點就 loss = loss1 + loss2 / (loss2 / loss1).detach() + loss3 / (loss3 / loss1).detach(),感覺比 loss 向 1 對齊合理

某大佬告訴我,loss 就像菲涅爾透鏡,縱使你能設計它的含義,也很難設計它的梯度。所以暴力一輪就躺平了。我個人見解,很多 paper 設計一堆 loss 只是為了讓核心故事更完整,未必強過調參。