Tensorflow 多個損失函數合成與多個損失函數多次操作的區別(Tensorflow: Multiple loss functions vs Multiple training ops)

代碼樣例

第一種情況

final_loss = tf.reduce_mean(loss1+loss2)
train_op = tf.train.AdamOptimizer().minimize(final_loss)

第二種情況

train_op1 = tf.train.AdamOptimizer().minimize(loss1)
train_op2 = tf.train.AdamOptimizer().minimize(loss2)
final_train_op = tf.group(train_op1 train_op2)

上述兩種情況的差別分析

第一種情況是一種混合訓練(joint training),這種方式是統一同時考慮多個loss的影響;這種方式常用在使用同一數據集進行訓練,使用同一feature但是不同輸出任務的模型訓練過程中,比如目標檢測領域的分類與迴歸任務要求採用同樣的feature [1]。
第二種情況是一種選擇性學習(alternative training),這並不是同時考慮兩種loss的約束,而是試圖在兩種任務中取得某種平衡,一般而言會使用在模型有多個輸出,但是這多個輸出並不使用同樣的feature;比如在指引第一個op時可能使用某些feature導致的結果,而在使用第二個op時可能使用的是另外一些featrue的結果。

上述兩種情況可用下圖進行歸納:
在這裏插入圖片描述
上圖是 Alternative training,可見使用了不同的layer導出的結果

在這裏插入圖片描述
上圖是 Joint training ,可見使用的是同樣的feature進行的判斷

如何選擇上述兩種方法

第二種方法常用於這樣的場合: 你具有兩種不同的數據集,並且需要執行不同的任務,但是網絡設計的feature 提取部分確需要是相同的,比如你需要將英文轉變爲法文,與此同時你也需要模型能將同樣的英文輸入轉爲德文;但是這種方法的使用往往取決於你的樣本數量,如果樣本數量嚴重不匹配,比如法文數據集遠大於德文數據集,那麼訓練時很容易造成同法文翻譯相關的某些bias 難以適應德文,因而造成訓練困難。
第一種方法適合於處理上述第二種方法的缺陷,這相當於是迫使loss做困難樣本的在線挖掘並加強處理;另外採用第一種方法需要注意的是,如果存在有的loss 的返回值遠小於其他loss的情況,如果在送入優化器之前直接相加這會導致這些loss的信息被忽略;一個有效的辦法是採用第二種辦法進行訓練,同時採用Adam優化器,因爲Adam優化器在loss輸入後會進行normalize處理,同具體的loss值大小關係不大。

總的來說,我個人比較傾向於採用第二種方案來進行訓練,因爲大體上來講可以將不同種類的loss設置不同的優化方案,並且在大多數情況下第二種和第一種的差距十分小。

參考文獻

[1] https://jg8610.github.io/Multi-Task/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章