來自 | 知乎
地址 | 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,這算是人臉檢測領域最經典的算法之一,被各家廠商魔改,其性能也是很不錯的,也有很多版本的開源實現(如果不瞭解的話,傳送門)。但是我在測試各種實現的過程中,發現竟然沒有一套實現是超越了原版的。下圖中是不同版本的實現,打了碼的是我復現的結果。
這是一件很困擾的事情,參數、網絡結構大家設置都大差不差。但效果確實是迥異。
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不均衡造成的困擾。