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,備註姓名+學校/公司+方向。