我設計了一個神經網路,損失函數由三部分組成,然後每部分的差值比較大,其中兩項的損失函數初始幾百,剩下一項的損失函數只有幾點幾。那我應該怎麼設置權重呢?是否可以把損失函數都歸一化?或者給小一點的損失函數乘以個100?或者說可以動態的調整權重,一開始給小一點的損失函數乘以100,之後逐漸減小?可行嗎?會對學習速率,收斂造成什麼影響?


前幾天剛做過類似的問題。

我是先觀察用各個損失函數單獨訓練時,在接近收斂時損失函數的數量級,設置基準權重。比如一個損失函數在 0.2 左右,另一個在 0.02 左右,那麼就把基準權重設成 1:10。如果想強調某一個損失函數,就在此基礎上加大相應的權重。

這樣做的一個可能問題是,不同損失函數的收斂速度不同,在訓練過程中可能會暫時偏向於某一個損失函數。不過做為調參的起點還是可以的,如果這種問題真的發生了,再對症下藥地想辦法。

謝邀。

多個損失函數,數值上應該大致接近,或者說量綱大致一致。比如你有三個人的體重,分別用t、kg、g做單位,數值上直接差了數量級,你加權怎麼加。

這種還是有固定換算單位的,可以t乘1000,kg乘1,g乘0.001。但損失函數卻沒辦法確定這個換算關係,你就沒有辦法通過乘一個常數進行。

解決辦法是從損失函數入手使其一致,包括兩個方面:

(1)看損失函數是用什麼度量單位計算出來的,對其進行歸一化處理,先讓損失函數的輸入保持一致的量綱。比如如果用餘弦夾角計算的,本身就是[0,1]區間的,不用再處理。如果歐式距離,則對歐式距離進行歸一化處理,比如用不帶loss的Softmax進行歸一化,caffe的歐式距離層裡面也有直接歸一化的設置。再比如輸入直接是feature map,而feature map的值不是[0,1]的,則可以Softmax歸一化,也可以根據其取值區間歸一化。總之,先讓loss的輸入是相同區間的。

(2)損失函數的計算本身,比如是多個batch的總和,還是多個batch的平均,還是怎麼算的。即看這3中loss計算方法是否一致,這個應該比較容易看出來,然後進行調整。比如一個loss是總和,其它兩個loss是平均,那把總和那個除以batch_size就可以了。

目前我想到這兩點,僅供參考。


你問了一個世界性難題,沒有人可以有解決方法的。哪怕是你理論上計算出了某個特定的權重設置最終可以保證你的結果,在優化的過程中這個權重也不一定可以保證達到你理論計算的最優點。這種問題只能是『試』


設置超參平衡的是不同部分損失函數的量級和收斂速度,一般來說先使用超參調整損失到同一量級,然後再在這一調整範圍內搜索能平衡收斂速度的某一超參數值。


沒有免費午餐,任何方法總會在某種情況下表現糟糕。

如果都是正值,可以考慮取對數相加。


推薦閱讀:
相关文章