多任務學習中各loss權重應該如何設計?

2021-02-19 深度傳送門

hahakity

個人感覺這是一個非常有意思的問題。之前在訓練多任務神經網絡的時候遇到過類似的問題,在我的問題中,損失函數有兩項貢獻,

這兩項 f 和 g,分別對應著分類損失和分割損失。隨著學習的進行,這兩個損失函數減小的速度很不一致。往往是一項減小的非常快,另一項減小的超級慢

看到這個問題的時候,我回想,應該可以對不同的損失項使用不同的學習率,即 Adaptive learning rate。其實 Adaptive Learning Rate 不是新東西,在 Adagrad, RMSProp, Adam 等等優化算法中,都有這個適配學習率的貢獻。但那裡的適配學習率,是對高維參數空間 

對更新快的方向,使用小一點的學習率,對更新慢的方向,使用大一點的學習率。

比如在 Adagrad 算法中,適配學習率的梯度下降算法公式為,

其中 

對於多任務學習,上面的適配學習率並沒有起到用處,根據

展開的話, 傳統的適配學習率用在多任務學習上有如下形式,

如果 

對更新快的任務,使用小一點的學習率,對更新慢的任務,使用大一點的學習率。

其中 

在Keras庫中,沒有對不同的任務使用 Adaptive 的學習率。貼一段 CycleGAN 的代碼,裡面有一個判別誤差,一個重建誤差和有兩個 Cycle 重建誤差,所以最終的誤差函數有4項,分別是 mse, mae, mae, mae。但優化算法使用的是同一個 Adam。

model = Model([input_gen, input_id],               [output_d, output_id, output_f, output_b])# define optimization algorithm configurationopt = Adam(lr=0.0002, beta_1=0.5)# compile model with weighting of least squares loss and L1 lossmodel.compile(loss=['mse', 'mae', 'mae', 'mae'],              loss_weights=[1, 5, 10, 10],              optimizer=opt)

loss_weights 確實可以在一開始將4個任務的學習率增大 1,5,10 和 10 倍。但並沒有對不同的任務使用不同的優化算法,除非最後一個選項 optimizer=opt 改成,

optimizers=[opt, opt, opt, opt]

根據 Keras 文檔中對 compile 函數的描述,optimizer 表示一個優化函數,而不是一個列表。而 loss_weights 是要用在加權求和中,得到一個整體的 loss,然後用同一個 optimizer 對神經網絡的參數進行更新。

(更新)最近嘗試訓練一個字體風格轉換程序,對不同的任務使用不同的 optimizer,發現在初期確實有效。這個程序意圖將楷書 A 風格轉換為行書 B。定義了兩種損失,一種是自編碼損失,另一種是輔助損失,即使用第三種字體--宋體,保證對同樣的字,A編碼後的潛變量等於A_c 編碼的潛變量;對同樣的字,B編碼後的潛變量等於 B_c 編碼的潛變量。這樣,將行書翻譯回正常體,讓神經網絡更好的映射。

如果使用傳統的多任務方法,使用一個優化器,損失函數差不多定義為

前兩項是自編碼損失,後兩項是翻譯到第三方字體時的編碼自洽性損失。結果發現,就算將後兩項的損失權重調小1000倍,它們還是起主導,很快讓編碼器學會將所有的字都編碼成常數,後兩項損失直接變為0。前兩項自編碼項不起作用。從第一個Epoch開始,結果就變成了這樣,

如果對前兩項使用一個優化器,對後兩項使用另一個優化器,

至少在前十個 Epoch,訓練是正常進行的。結果如下,

不過到了第20個Epoch的時候,後兩項又開始起決定性作用,結果變回到使用一個優化器的情形

還有一個技巧,不知道有沒有人嘗試過。即先對一個任務做訓練,訓練到一定階段,再啟動第2個任務

其他:

在下面這篇知乎文章中見到分別對兩個任務的共享參數,兩個任務的私有參數,使用3個 Adam 獨立訓練的小技巧。實現方法是 Tensorflow, 應該可以很快擴展到其他機器學習庫。

mountain blue:Multi-task Learning的三個小知識

另外,下面回答中遊凱超提到的 《Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics》很有啟發。那篇文章對不同任務的損失函數項按照方差進行歸一化。感覺與 Glorot/Xavier/He 權重初始化,以及 Batch/Layer/Instance/Group normalization 的思路都很像。也就是說,如果不同任務的私有參數(甚至是最後一層的參數或loss 本身),滿足的分布方差不一樣,也會出現有的任務梯度消失,有的任務梯度爆炸的問題。

如果神經網絡參數初始化的時候,已經使用了 Glorot/Xavier/He 的方法,那麼每一層所有參數滿足的分布是歸一化的。但沒有保證每個任務的私有參數,都單獨進行了歸一化。

將不同任務的參數分組初始化,正規化以及優化,可能是個好玩的研究方向。

PS:本文僅代表作者個人想法,沒有在多個任務上驗證過這個想法的合理性。大家可以結合實際情況具體判斷。

匿名用戶

現在最好的應該是這個:Multi-Task Learning as Multi-Objective Optimization。他開源的代碼有點小bug但可用。無數的人提醒我這個沒有文章裡說的那麼work了(包括我復現也是一樣)大家謹慎使用。

遊凱超

有一篇論文是專門研究這個問題的:Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics。作者列表中的Yarin Gal 是貝葉斯深度學習的重要人物

基本思想是估計每個任務的不確定度,每個loss除以不確定度,如果不確定度大,大體上相當於自動把loss的權重變小


Anticoder

假設多個任務loss在同一個metric下,那幾乎不用統一,除了一些先驗幹預。各個任務可以得到平等對待。如果同一個metric下不同任務loss差別巨大,那就是任務訓練難度本身的問題。同步到一個數量級也不能解決一個任務訓練不好的問題。

多個任務在不同metric下,這本身就是一個很trick的活,在不加任何假設前提下,統一一個數量級就是最大熵。

個人認為loss是因,梯度是果。梯度是你不好控制的,你對loss進行的縮放直接就作用在了loss。目標作為優化參數,那梯度就成了因,所以從好入手的loss是可以大部分決定參數的好壞的。

從動力角度,梯度衡量了loss對參數的敏感程度,決定了loss的作用能力。理論上只要梯度存在,一般算法對參數的更新會隨著更新頻次變小,還是可以收斂到一個比較好的值。那核心為題就是如何保持一個較為穩定持久的梯度。

一般其實你看梯度,看參數都很難得到一個理想的答案。大概思路就是看收斂速度,梯度消失情況,適當對不同結構選擇不同的優化器,學習率

有時候會加一些業務場景,比如結構中存在embedding這種會出現長尾分布的參數+dense這種不斷再更新,或者rnn,cnn等。embedding就更適合adagrad這種適合不同頻率的參數算法。


yanwan

這個問題涉及了多任務學習Network Architecture(how to share)Loss Function(how to balance)這兩個挑戰。

1. 把各loss統一到同一個數量級上,其背後的原因是不同任務的不同損失函數尺度有很大的差異,因此需要考慮用權值將每個損失函數的尺度統一。一般情況下,不同 task 收斂過程中梯度大小是不一樣的,對不同學習率的敏感程度也是不一樣的。把各loss統一到同一個數量級,可以避免梯度小的loss被梯度大的loss所帶走,使得學習到的featrure有較好的泛化能力。

這個問題比較新的解決辦法,可以參考cvpr2018的一個工作《Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics》,這篇文章提出利用同方差的不確定性,將不確定性作為噪聲,進行訓練。

2. Network Architecture一般有:Hard-parameter sharing和Soft-parameter-sharing。Hard-parameter sharing有一組相同的特徵共享層,這種設計大大減少了過擬合的風險;Soft-parameter sharing每一個任務都有自己的特徵參數和每個子任務之間的約束。而對於「不同網絡部分梯度的數量級」問題,雖然梯度值相同,但不同的loss在task上的表現也是不同的,所以還是要找不同loss的合適平衡點。

對於Network Architecture and Loss Function的關係,經過大量實驗和經驗總結後,發現一個好的Network Design比一個好的Loss Design更能有效增加featrue的泛化能力,一個好的Dataset比一個好的Network Design又更能有效增加feature的泛化能力。

最後,展示一下我們使用Multi-task learning訓練Face Reconstruction and Dense Alignment的例子。簡單說明下:這個模型中一共有4個task,dense alignment部分一共有4w個關鍵點,並且可以眨眼、可以張嘴。https://github.com/Star-Clouds/FRDA

關於深度傳送門

深度傳送門是一個專注於深度推薦系統與CTR預估的交流社區,傳送推薦、廣告以及NLP等相關領域工業界第一手的論文、資源等相關技術分享,歡迎關注!加技術交流群請添加小助手deepdeliver,備註姓名+學校/公司+方向。

相關焦點

  • 神經網絡中,設計loss function有哪些技巧?
    每當涉及到loss修改都比較惱火,存在如下問題:1、multitask時,如何控制各部分loss的權重?(如目標檢測任務中的框回歸loss+分類loss)2、multitask時,起始訓練各loss的數量級不同對收斂存在著哪些影響?3、根據任務修改loss時,如改進tripet loss,時常出現神經網絡作弊的情況,該如何設計loss?看看各位小夥伴的回答吧!
  • 多任務學習——共享模式/權重選擇/attention融合論文剖析
    文章目錄:多目標結構設計(共享機制)多任務權重選擇MTL與Attention的強強聯手1、多目標結構設計(共享機制)我在上上篇MTL實戰中提到過多任務的四種共享機制,具體見如下連結。硬共享模式比較簡單,也很常見,比如我們上篇文章中所說的ESMM模型,其實就是典型的share-bottom模式,即底層參數共享模式。但是在實際應用場景中,我們可能不僅僅需要優化CTR、CVR這樣在數據層面緊密相關的子任務,還會遇到很多子任務間相關性較弱的多任務學習場景。
  • 【loss平衡】深度學習的多個loss如何平衡?
    於是對於這個 batch 來說,整個 loss = sum(FL(k_i, gamma_i) * loss_i)在直觀上說,這個 FL,當一個任務的 KPI 接近 0 的時候會趨於無限大,使得你的 loss 完全被那個表現不好的 task 給 dominate。這樣你的back prop 就會讓所有的權重根據那個kpi 不好的任務調整。
  • 深度學習的多個 loss 是如何平衡的?
    一般都是多個loss之間平衡,即使是單任務,也會有weight decay項。比較簡單的組合一般通過調超參就可以。2. 對於比較複雜的多任務loss之間平衡,這裡推薦一篇通過網絡直接預測loss權重的方法[1]。以兩個loss為例,
  • 如何利用深度學習模型實現多任務學習?這裡有三點經驗
    幸運的是,我們發現了一篇非常棒的論文《Multi-Task Learning Using Uncertainty to Weigh Losses for Scene Geometry and Semantics》,提出引入不確定性來確定 MTL 中損失的權重:在每個任務的損失函數中學習另一個噪聲參數(noise parameter)。
  • 今日Paper|語義多任務學習;遞歸神經;損失平面;MT-BioNER等
    目錄利用不確定性設計損失權重進行場景幾何和語義多任務學習理解遞歸神經網絡中的泛化分段線性激活實質上塑造了神經網絡的損失平面MT-BioNER:使用BERT結構的多任務學習模型進行醫藥領域的命名實體識別from=leiphonecolumn_paperreview0421推薦原因多任務學習對越來越多的任務起到了訓練速度和表現分數等方面的促進作用,但是計算損失時,如何確定各個子任務的損失權重是一大難點,因為最佳的損失權重附近往往伴隨著比單個模型表現更差的損失權重值。
  • 今日Paper | 語義多任務學習;遞歸神經;損失平面;MT-BioNER等
    理解遞歸神經網絡中的泛化分段線性激活實質上塑造了神經網絡的損失平面MT-BioNER:使用BERT結構的多任務學習模型進行醫藥領域的命名實體識別一種面向語義表徵的層次型多任務學習方法  利用不確定性設計損失權重進行場景幾何和語義多任務學習
  • Focal Loss 原理及實踐
    Focal Loss的提出源自圖像領域中目標檢測任務中樣本數量不平衡性的問題,並且這裡所謂的不平衡性跟平常理解的是有所區別的,它還強調了樣本的難易性。儘管Focal Loss 始於目標檢測場景,其實它可以應用到很多其他任務場景,只要符合它的問題背景,就可以試試,會有意想不到的效果。
  • 多任務學習與深度學習
    比如,系統會同時執行學習兩項任務,以便這兩項任務都有助於別的任務的學習。這是模仿人類智能的一種方式,即人類如何同時執行多項任務。例如,當你看到一條狗的時候,你可以立即區分出這是一隻狗,而不是別的動物。如果你知道狗的品種,你也可以馬上說出這隻狗的品種來。
  • 深度學習的多個loss如何平衡 & 有哪些「魔改」損失函數,曾經拯救了你的深度學習模型?
    這篇文章整理自我的知乎回答(id: Hanson),分別對深度學習中的多個loss如何平衡 以及 有哪些「魔改」損失函數,曾經拯救了你的深度學習模型 這兩個問題進行了解答。1. 深度學習的多個loss如何平衡?1.1 mtcnn對於多任務學習而言,它每一組loss之間的數量級和學習難度並不一樣,尋找平衡點是個很難的事情。
  • 如何設計自主學習任務單
    文 / 金陵  蘇州電教館長         如何設計自主學習任務單?這要從自主學習任務單(以下簡稱「任務單」)的結構說起。這是結構化思考的方法,有利於學生從總體上把握學習材料。二是把教學重點、教學難點和其他知識點轉化為問題。這有利於學生從細節分析入手,理解學習材料。兩者相結合,就能使自主學習起到事半功倍的效果。  此外,信息技術學科是實踐性很強的學科,需要把問題與操作性任務結合起來考慮。有時候,操作性的任務比例應該大於問題。
  • 超詳細的語義分割中Loss盤點
    , 用這個 loss 前面不需要加 Softmax 層nn.CrossEntropyLoss(input, target)帶權交叉熵 Loss帶權重的交叉熵Loss,公式為:,我們需要手動調整這個參數,另外Focal Loss在分割任務上似乎是只適合於二分類的情況。
  • 以色列理工暑期學習-機器學習中Loss函數的小結
    The loss can be interpreted as a penalty or error measure.」回到最開始的機器學習的問題上,對於機器學習一般會包含以下五個部分:假設空間:如在線性回歸、邏輯回歸以及SVM中的參數測度函數:最大似然或最小損失是否有偏和方差的權衡:正則項或MAP最大後驗估計在假設空間中找到一個好的假設模型:優化模型
  • 超詳細的語義分割中的Loss大盤點
    #二值交叉熵,這裡輸入要經過sigmoid處理import torchimport torch.nn as nnimport torch.nn.functional as Fnn.BCELoss(F.sigmoid(input), target)#多分類交叉熵, 用這個 loss 前面不需要加 Softmax 層nn.CrossEntropyLoss(input
  • 深度學習中的多任務學習(Multi-task-learning)——keras實現
    而多任務學習也是希望模型同時做多個任務時,能將其他任務學到的知識,用於目標任務中,從而提升目標任務效果。如果我們換個角度理解,其實多任務學習,其實是對目標任務做了一定的約束,或者叫做regularization。我們不希望模型只局限於目標任務的學習,而是能夠適應多個任務場景,這樣可以大大的增加模型的泛函能力(generalization)。
  • 分類機器學習中,某一標籤佔比太大(標籤稀疏),如何學習?
    比如對於一個二分類任務,訓練集中類別為0的負樣本佔樣本總數的90%,而正樣本只佔10%。那麼這樣的訓練集有什麼弊端呢?如果類別不平衡的樣本直接丟給模型學習,那麼很顯然模型會在負樣本上的學習效果更好,因為模型『看到』的負樣本更多。舉個慄子,就像你如果花9天時間去學習數學,花一天時間去學習語文,不出意外你會在數學考試中表現更好。
  • Siamese網絡,Triplet Loss以及Circle Loss的解釋的
    在對比損失中,你只是更新權重來最小化不同類的相似性或最大化相同類的相似性。另一方面,使用Triplet Loss,模型既會將正樣本輸入拉向錨,也會將負樣本輸入推離錨。因此,我們將(Sn — Sp)推廣到(αn*Sn — αp * Sp),其中,αn和αp是獨立的權重因子,允許Sn和Sp以不同的速度學習。此外,Circle loss也給出了一個更明確的收斂點。在前面的Triplet Loss中,它認為上面的兩對具有相同的最優性。
  • 【損失函數合集】超詳細的語義分割中Loss盤點
    , 用這個 loss 前面不需要加 Softmax 層nn.CrossEntropyLoss(input, target)帶權交叉熵 Loss帶權重的交叉熵Loss,公式為:,我們需要手動調整這個參數,另外Focal Loss在分割任務上似乎是只適合於二分類的情況。
  • 常見的損失函數(loss function)總結
    指數損失函數(exponential loss)指數損失函數的標準形式如下:特點:(1)對離群點、噪聲非常敏感。經常用在AdaBoost算法中。(1)本質上也是一種對數似然函數,可用於二分類和多分類任務中。
  • pytorch模型訓練之 loss function選擇
    針對的是二分類任務,只有正例和反例,且兩者的概率和為 1,只需要預測一個概率。 這裡 x,y 可以是向量或者矩陣,i 是下標;xi 表示第 i 個樣本預測為 正例 的概率,yi 表示第 i 個樣本的標籤,wi 表示該項的權重大小。loss, x, y, w 的維度都是一樣的。