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

來自 | 知乎 

地址 | https://www.zhihu.com/question/375794498

編輯 | AI有道 

本文僅作學術分享,若侵權,請聯繫後臺刪文處理

在一個端到端訓練的網絡中,如果最終的loss = a*loss1+b*loss2+c*loss3...,對於a,b,c這些超參的選擇,有沒有什麼方法?

作者:Evan
https://www.zhihu.com/question/375794498/answer/1052779937

其實這是目前深度學習領域被某種程度上忽視了的一個重要問題,在近幾年大火的multi-task learning,generative adversarial networks, 等等很多機器學習任務和方法裏面都會遇到,很多paper的做法都是暴力調參結果玄學……這裏偷偷跟大家分享兩個很有趣的研究視角

1. 從預測不確定性的角度引入Bayesian框架,根據各個loss分量當前的大小自動設定其權重。有代表性的工作參見Alex Kendall等人的CVPR2018文章:

Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics

https://arxiv.org/abs/1705.07115

文章的二作Yarin Gal是Zoubin Ghahramani的高徒,近幾年結合Bayesian思想和深度學習做了很多solid的工作。

2. 構建所有loss的Pareto,以一次訓練的超低代價得到多種超參組合對應的結果。有代表性的工作參見Intel在2018年NeurIPS(對,就是那個剛改了名字的機器學習頂會)發表的:

Multi-Task Learning as Multi-Objective Optimization

http://papers.nips.cc/paper/7334-multi-task-learning-as-multi-objective-optimization

因爲跟文章的作者都是老熟人,這裏就不尬吹了,大家有興趣的可以仔細讀一讀,乾貨滿滿。



作者:楊奎元-深動
鏈接:https://www.zhihu.com/question/375794498/answer/1050963528

1. 一般都是多個loss之間平衡,即使是單任務,也會有weight decay項。比較簡單的組合一般通過調超參就可以。

2. 對於比較複雜的多任務loss之間平衡,這裏推薦一篇通過網絡直接預測loss權重的方法[1]。以兩個loss爲例,  和 由網絡輸出,由於整體loss要求最小,所以前兩項希望 越大越好,爲防止退化,最後第三項則希望越小越好。當兩個loss中某個比較大時,其對應的也會取較大值,使得整體loss最小化,也就自然處理量綱不一致或某個loss方差較大問題。

該方法後來被拓展到了物體檢測領域[2],用於考慮每個2D框標註可能存在的不確定性問題。

[1] Alex Kendall, Yarin Gal, Roberto Cipolla. Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics. CVPR, 2018.

[2] Yihui He, Chenchen Zhu, Jianren Wang, Marios Savvides, Xiangyu Zhang. Bounding Box Regression with Uncertainty for Accurate Object Detection. CVPR, 2019.

作者:鄭澤嘉
鏈接:https://www.zhihu.com/question/375794498/answer/1056695768

Focal loss 會根據每個task的表現幫你自動調整這些參數的。

我們的做法一般是先分幾個stage 訓練。stage  0 : task 0, stage 1: task 0 and 1. 以此類推。在stage 1以後都用的是focal loss。

========== 沒想到我也可以二更 ===============

是這樣的。

首先對於每個 Task,你有個 Loss Function,以及一個映射到 [0, 1] 的 KPI (key performance indicator) 。比如對於分類任務, Loss function 可以是 cross entropy loss,KPI 可以是 Accuracy 或者 Average Precision。對於 regression 來說需要將 IOU 之類的歸一化到 [0, 1] 之間。KPI 越高表示這個任務表現越好。

對於每個進來的 batch,每個Task_i 有個 loss_i。每個Task i 還有個不同的 KPI:  k_i。那根據 Focal loss 的定義,FL(k_i, gamma_i) = -((1 - k_i)^gamma_i) * log(k_i)。一般來說我們gamma 取 2。

於是對於這個 batch 來說,整個 loss = sum(FL(k_i, gamma_i) * loss_i)

在直觀上說,這個 FL,當一個任務的 KPI 接近 0 的時候會趨於無限大,使得你的 loss 完全被那個表現不好的 task 給 dominate。這樣你的back prop 就會讓所有的權重根據那個kpi 不好的任務調整。當一個任務表現特別好 KPI 接近 1 的時候,FL 就會是0,在整個 loss 裏的比重也會變得很小。

當然根據學習的速率不同有可能一開始學的不好的task後面反超其他task。http://svl.stanford.edu/assets/papers/guo2018focus.pdf 這篇文章裏講了如何像momentum 一樣的逐漸更新 KPI。

由於整個 loss 裏現在也要對 KPI 求導,所以文章裏還有一些對於 KPI 求導的推導。

當然我們也說了,KPI 接近 0 時,Loss 會變得很大,所以一開始訓練的時候不要用focal loss,要確保網絡的權重更新到一定時候再加入 focal loss。

希望大家訓練愉快。

作者:Hanson
鏈接:https://www.zhihu.com/question/375794498/answer/1077922077

對於多任務學習而言,它每一組loss之間的數量級和學習難度並不一樣,尋找平衡點是個很難的事情。我舉兩個我在實際應用中碰到的問題。

第一個是多任務學習算法MTCNN,這算是人臉檢測領域最經典的算法之一,被各家廠商魔改,其性能也是很不錯的,也有很多版本的開源實現(如果不瞭解的話,傳送門)。但是我在測試各種實現的過程中,發現竟然沒有一套實現是超越了原版的。下圖中是不同版本的實現,打了碼的是我復現的結果。

不同版本mtcnn在FDDB上roc曲線

這是一件很困擾的事情,參數、網絡結構大家設置都大差不差。但效果確實是迥異。

clsloss表示置信度score的loss,boxloss表示預測框位置box的loss,landmarksloss表示關鍵點位置landmarks的loss。

那麼 這幾個權值,究竟應該設置爲什麼樣的才能得到一個不錯的結果呢?

其實有個比較不錯的注意,就是隻保留必要的那兩組權值,把另外一組設置爲0,比如 。爲什麼這麼做?第一是因爲關鍵點的迴歸在人臉檢測過程中不是必要的,去了這部分依舊沒什麼大問題,也只有在這個假設的前提下才能進行接下來的實驗。

就比如這個MTCNN中的ONet,它迴歸了包括score、bbox、landmarks,我在用pytorch復現的時候,出現一些有意思的情況,就是將landmarks這條任務凍結後(即 ),發現ONet的性能得到了巨大的提升。能超越原始版本的性能。

但是加上landmarks任務後( )就會對cls_loss造成影響,這就是一個矛盾的現象。而且和a、b、c對應的大小有很大關係。當設置成( )的時候關鍵點的精度真的是慘不忍睹,幾乎沒法用。當設置成( )的時候,loss到了同樣一個數量級,landmarks的精度確實是上去了,但是score卻不怎麼讓人滿意。如果產生了這種現象,就證明了這個網絡結構在設計的時候出現了一些缺陷,需要去修改backbone之後的multi-task分支,讓兩者的相關性儘量減小。或者是ONet就不去做關鍵點,而是選擇單獨的一個網絡去做關鍵點的預測(比如追加一個LNet)。box的迴歸並不是特別受關鍵點影響,大部分情況box和landmarks是正向促進的,影響程度可以看做和score是一致的,box的精度即便下降了5%,它還是能框得住目標,因此不用太在意。

上面這個實驗意在說明,要存在就好的loss權重組合,那麼你的網絡結構就必須設計的足夠好。不然你可能還需要通過上述的實驗就驗證你的網絡結構。從多種策略的設計上去解決這中loss不均衡造成的困擾。

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