2021年淺談多任務學習

作者 | 多多筆記

來源 |AI部落聯盟

頭圖 | 下載於視覺中國

寫此文的動機:

  1.   最近接觸到的幾個大廠推薦系統排序模型都無一例外的在使用多任務學習,比如騰訊PCG在推薦系統頂會RecSys 2020的最佳長文:

    Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations;

    2019年RecSys中Youtube排序模塊論文:

    Recommending what video to watch next: a multitask ranking system;

    以及廣告推薦、新聞推薦、短視頻推薦、問答推薦算法工程師們都經常使用/嘗試過的MMOE模型Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts。

    當然還有諸多優秀的多任務學習就不在此一一列舉啦。

  2. NLP中著名的多跳(multi-hop)問答數據集榜單HotpotQA上出現了一個多任務問答框架(2020年11月是榜1模型,名字叫IRRR),把open domain question answering中的信息抽取,排序,問答統一用一個模型來解決,既簡潔又拿了高分!

    引用斯坦福nlp組裏這篇論文的原話:

    We employ a single multi-task model to perform all the necessary subtasks---retrieving supporting facts, reranking them, and predicting the answer from all retrieved documents---in an iterative fashion。

當然不僅僅是NLP和推薦系統,最近CV和強化學習使用多任務學習進行創新的研究也是非常多的,但由於筆者對於CV和強化學習的多任務學習理解太淺,本文在談多任務學習的時候更多會用NLP和推薦系統中的模型來舉例和分析。

早在2017年,SEBASTIAN RUDER研究員就對當時的多任務學習進行了詳細總結:An Overview of Multi-Task Learning in Deep Neural Networks。知乎上對於多任務學習高贊文章也是學習和翻譯的這篇文章,那麼在2021年已經開始的今天,筆者認爲多任務學習並沒有褪去光環,反而在各個機器學習任務上發光發熱。個人感覺有必要再一次對多任務學習進行一次新的討論和學習了。

下面介紹本文的基本安排,對部分章節比較熟悉的大佬們可以跳過,選感興趣的部分進行閱讀,歡迎大佬們批評指導:

1. 多任務學習的概念

2. 多任務學習爲什麼活躍在各個AI領域?

3. 多任務學習改進的方向在哪裏?

4. 多任務學習在實際使用的時候有什麼技巧和注意事項?

下文大部分時間將多任務學習(multi task learning)簡稱爲MTL。

多任務學習的概念

圖1:單任務學習vs多任務學習

與“多”相對應是“單”,單任務學習vs多任務學習直白解釋:

單任務學習(single task learning):一個loss,一個任務,例如NLP裏的情感分類、NER任務一般都是可以叫單任務學習。

多任務學習(multi task learning):簡單來說有多個目標函數loss同時學習的就算多任務學習。例如現在大火的短視頻,短視頻APP在向你展示一個大長腿/帥哥視頻之前,通常既要預測你對這個視頻感興趣/不感興趣,看多久,點贊/不點贊,轉發/不轉發等多個維度的信息。這麼多任務既可以每個任務都搞一個模型來學,也可以一個模型多任務學習來一次全搞定的。

多任務學習爲什麼活躍在各個AI領域:CV、NLP、推薦系統、強化學習?

2.1 先談爲什麼適用於多個領域:

從圖1可以看出,對於有監督深度學習/機器學習而言,基本流程都是通過輸入數據,模型根據輸入數據來預測結果,訓練階段根據預測和監督信號之間的差異(loss)來修正模型的參數,讓模型參數儘可能可能符合數據的分佈。多任務學習這個框架可以將多個基本訓練流程放在一起,因此不管是CV、NLP還是推薦系統,都是適合這個框架的。

雖然說適合多個領域,但如果各個領域不需要多任務學習,多任務學習也不會出現在個大AI領域了,既然多個任務可以通過拆解爲多個子任務來學習,爲什麼還需要這個多任務學習呢?

2.2 爲什麼需要?

一句話:模型統一,方便高效效果好,以及那內心深處的吶喊:我要上分、我要上分、我要上分!

幾句話:

  1. 如上面短視頻和hotpotqa的多任務模型例子:

    方便,一次搞定多個任務,這點對工業界來說十分友好。

    假設要用k個模型預測k個任務,那麼k個模型預測的時間成本、計算成本、存儲成本、甚至還有模型的維護成本都是大於一個模型的,咱們聰明的算法小哥哥小姐姐們當然更喜歡多任務學習了,除非多任務學習的效果遠遠低於單任務學習。

  2. 多任務學習不僅方便,還可能效果更好!

    針對很多數據集比稀疏的任務,比如短視頻轉發,大部分人看了一個短視頻是不會進行轉發這個操作的,這麼稀疏的行爲,模型是很難學好的(過擬合問題嚴重),那我們把預測用戶是否轉發這個稀疏的事情和用戶是否點擊觀看這個經常發生事情放在一起學,一定程度上會緩解模型的過擬合,提高了模型的泛化能力。

  3. 多任務學習能提高泛化能力,從另一個角度來看,對於數據很少的新任務,也解決了所謂的“冷啓動問題”。

  4. 多個任務放一起學的另一個好處:

    數據增強,不同任務有不同的噪聲,假設不同任務噪聲趨向於不同的方向,放一起學習一定程度上會抵消部分噪聲,使得學習效果更好,模型也能更魯棒。

    NLP和CV中經常通過數據增強的方式來提升單個模型效果,多任務學習通過引入不同任務的數據,自然而言有類似的效果。

  5. 任務互助,某些任務所需的參數可以被其他任務輔助訓練的更好,比如任務A由於各種限制始終學不好W1,但是任務B卻可以輕鬆將W1擬合到適合任務A所需的狀態,A和B搭配,幹活兒不累~。

當然另一種機器學習角度的理解:多任務學習通過提供某種先驗假設(inductive knowledge)來提升模型效果,這種先驗假設通過增加輔助任務(具體表現爲增加一個loss)來提供,相比於L1正則更方便(L1正則的先驗假設是:模型參數更少更好)。

2.3 多任務學習的基本模型框架

再講講多任務學習的基本方法,也就能更加明白爲什麼各個領域都可以把這個框架拿來使用和研究了。

通常將多任務學習方法分爲:hard parameter sharing和soft parameter sharing。區別在於對圖1右邊MTL那一個方塊。

圖2 硬共享和軟共享

一個老當益壯的方法:hard parameter sharing

即便是2021年,hard parameter sharing依舊是很好用的baseline系統。它的基本框架如圖所示。無論最後有多少個任務,底層參數統一共享,頂層參數各個模型各自獨立。由於對於大部分參數進行了共享,模型的過擬合概率會降低,共享的參數越多,過擬合機率越小,共享的參數越少,越趨近於單個任務學習分別學習。形象理解爲:幾個人在一張桌子上喫幾盤菜,自己碗裏有自己的飯(北方吃麪的不管了先),共享的就是桌子、幾盤菜,不共享的就是自己碗裏的,桌子上菜越多,自己碗裏的越少,喫膩的概率更小;自己碗裏一自己的飯,桌子上沒幾個菜,一會兒飯就喫膩了orz。

現代研究重點傾向的方法:soft parameter sharing

圖3 引用谷歌MMOE模型圖

底層共享一部分參數,自己還有獨特的一部分參數不共享;頂層有自己的參數。底層共享的、不共享的參數如何融合到一起送到頂層,也就是研究人員們關注的重點啦。這裏可以放上咱們經典的MMOE模型結構(圖3),大家也就一目瞭然了。和最左邊(a)的hard sharing相比,(b)和(c)都是先對Expert0-2(每個expert理解爲一個隱層神經網絡就可以了)進行加權求和之後再送入Tower A和B(還是一個隱層神經網絡),通過Gate(還是一個隱藏層)來決定到底加權是多少。(超綱部分:聰明的小夥伴看到這個加權求和,是不是立刻就想到Attention啦?要不咱們把這個Gate改爲一種Attention?對不同專家的Attention來決定求和權重,那你得想辦法設計Attention的query啦,是個有趣的點。)

看到這裏,相信你已經對MTL活躍在各大AI領域的原因有一定的感覺啦:把多個/單個輸入送到一個大模型裏(參數如何共享根據場景進行設計),預測輸出送個多個不同的目標,最後放一起(比如直接相加)進行統一優化。

多任務學習改進的方向在哪裏?

既然多任務學習在多個領域都能拿來用,那我們做研究/搞算法的小夥伴是不是都想拿來試一試?萬一就漲幾個點,搞出了一個SOTA?解決了一個基本理論問題呢?當然試不能亂試,咱得有針對性的試,先聊一聊哪些方向可以試。

我們先假設多個任務適合放在一起,對於這些適合放在一起的任務,我們有哪些方向呢?

3.1 模型結構設計:哪些參數共享,哪些參數不共享?

模型結構設計這裏主要談最近的兩個大思路:把模型共享參數部分想象成榴蓮千層,想象一下我們是豎着切了喫,還是橫着一層側概念撥開了喫。

圖4 榴蓮千層(我的口水

A . 豎着切了喫:對共享層進行區分,也就是想辦法給每個任務一個獨特的共享層融合方式。圖3的MOE和MMOE模型就是豎着切了喫的例子。另外MMOE在MOE的基礎上,多了一個GATE,意味着:多個任務既有共性(關聯),也必須有自己的獨特性(Task specific)。共性和獨特性如何權衡:每個任務搞一個專門的權重學習網絡(GATE),讓模型自己去學,學好了之後對expert進行融合送給各自任務的tower,最後給到輸出,2019年的SNR模型依舊是豎着切開了喫,只不過豎着切開了之後還是要每一小塊都分一點放一起送給不同的流口水的人。(可能某塊裏面榴蓮更多?)

圖5 谷歌SNR模型

B:一層層拿來喫:對不同任務,不同共享層級的融合方式進行設計。如果共享網絡有多層,那麼通常我們說的高層神經網絡更具備語義信息,那我們是一開始就把所有共享網絡考慮進來,還是從更高層再開始融合呢?如圖6最右邊的PLE所示,Input上的第1層左邊2個給了粉色G,右邊2個給了綠色G,3個都給了藍色G,然後第2層左邊2塊給左邊的粉色G和Tower,右邊兩塊輸出到綠色G和Tower。

NLP的同學可以想象一下phrase embedding, sentence embedding。先用這些embedding按層級抽取句子信息之後,再進行融合的思路。圖4最右邊PLE第2層中間的藍色方塊可以對應sentence embedding,第2層的粉色方塊、綠色方塊可以對應兩個phrase embedding。雖然一句話裏的多個短語有自己的含義,但是畢竟還是在一句話裏,他們在自己獨特的語義表示上,當然也會包含了這句話要表達核心思想。

圖6 騰訊PCG PLE網絡(RecSys 2020 Best paper)

個人感覺如果完全理解了MMOE+PLE的這兩張圖裏所有的結構,對於模型結構共享/不共享層設計一塊肯定有自己的見解啦~~

3.2 MTL的目標loss設計和優化改進

既然多個任務放在一起,往往不同任務的數據分佈、重要性也都不一樣,大多數情況下,直接把所有任務的loss直接求和然後反響梯度傳播進行優化,是不是不合適呢?

通常多任務學習的loss function可以寫爲:

那麼對於共享參數Wsh在梯度下降優化時:

從上面的表達式可以看出,Wsh 的優化受到所有loss的影響,並且不同loss對於共享參數的影響可以使用權重w進行調節。那麼優化思路自然而然可以爲:

  1. loss的權重進行設計,最簡單的權重設計方式是人爲給每一個任務一個權重;

  2. 根據任務的Uncertainty對權重進行計算,讀者可參考經典的:

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

  3. 由於不同loss取值範圍不一致,那麼是否可以嘗試通過調整loss的權重w讓每個loss對共享Wsh 參數貢獻平等呢?

    GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks,另外一篇相似思路的文章End-to-end multi-task

  4. learning with attention 提出一種Dynamic Weight Averaging的方法來平衡不同的學習任務。

  5. Multi-Task Learning as Multi-Objective Optimization對於MTL的多目標優化理論分析十分有趣,對於MTL優化理論推導感興趣的同學值得一看。

小小預告一下下一篇的內容:各個任務回傳的梯度如果值大小差距很大、甚至向量距離還很遠、是不是有什麼辦法修正修正?

3.3 直接設計更合理的輔助任務!

前面的方法一個要設計網絡結構,一個要設計網絡優化方式,聽起來其實實踐上對於很多新手不是很友好,那這裏再介紹一個友好的方式!對於MTL優化的一個方向爲什麼不是找一個更合適的輔助任務呢?只要任務找的好,輔助loss直接加上去(給射手位配個小明同學好不好?),人爲設計一下權重調個超參數,模型結構幾乎不變都有可能效果更好的!feature engineering之外的另一大神器!輔助任務enginering!

輔助任務設計的常規思路:

  1. 找相關的輔助任務!

    不想關的任務放一起反而會損害效果的!

    如何判斷任務是否想關呢?

    當然對特定領域需要有一定的瞭解,比如視頻推薦裏的:

    是否點擊+觀看時長+是否點贊+是否轉發+是否收藏等等。

  2. 對於相關任務不太好找的場景可以嘗試一下對抗任務,比如學習下如何區分不同的domain的內容。

  3. 預測數據分佈,如果對抗任務,相關任務都不好找,用模型預測一下輸入數據的分佈呢?

    比如NLP裏某個詞出現的頻率?

    推薦系統裏某個用戶對某一類iterm的點擊頻率。

  4. 正向+反向。

    以機器機器翻譯爲例,比如英語翻譯法語+法語翻英語,文本糾錯任務中也有類似的思想和手段。

  5. NLP中常見的手段:

    language model作爲輔助任務,萬精油的輔助任務。

    那推薦系統裏的點擊序列是不是也可以看作文本、每一個點擊iterm就是單詞,也可以來試一試language model呢?

    (純類比想象,雖然個人感覺有點難,畢竟推薦系統的點擊序列iterm不斷變化,是個非閉集,而NLP中的單詞基本就那些,相對來說是個閉集)。

  6. Pretrain,某正程度上這屬於transfer learning,但是放這裏應該也是可以的。

    預訓練本質上是在更好的初始化模型參數,隨意想辦法加一個幫助初始化模型參數的輔助任務也是可以的~~。

  7. 預測要做的任務該不該做,句子中的詞位置對不對,該不該放這裏,點擊序列中該不該出現這個iterm?

    這也是一個有趣的方向。

    比如文本糾錯任務,可不可以先預測一下這個文本是不是錯誤的呢?

對推薦系統感興趣的同學可以閱讀阿里的DIN:Deep Interest Evolution Network for Click-Through Rate Prediction,看看阿里爸爸如何科學的加入輔助loss。另一篇ESSM也可以從輔助任務設計這個角度學習學習:Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate。

對NLP感興趣的同學呢,也可以從如下角度入手看看是否可行:

比如對於問答(QA)任務而言,除了預測答案的起始位置,結束位置之外,預測一下哪一句話,哪個段落是否包含答案?其實個人實踐中,先過濾掉一些噪聲段落,再進行QA大概率都是會提升QA效果的~~特別是有了預訓練BERT、Roberta、XLNET這些大規模語言模型之後,把句子、段落是否包含答案作爲二分類任務,同時預測答案的位置,模型的Capacity是完全夠的!

對於信息抽取任務,是否可以把詞/短語級別的sequence labeling 任務和關係抽取任務放一起呢?比如SRL和關係抽取,entity識別和entity關係抽取。不過在那之前,建議看看danqi chen這個令人絕望的模型:A Frustratingly Easy Approach for Joint Entity and Relation Extraction。

對於multilingual task和MT(機器翻譯),其實有個比較簡單的思路就是多個語言、多模態一起學,天然的輔助任務/多任務。另外在以前的機器翻譯任務裏)大家還喜歡加上POS/NER這種任務來輔助翻譯。

比較有資源的大廠呢,比如微軟,Multi-Task Deep Neural Networks for Natural Language Understanding,百度的ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding,好傢伙,相似的任務都放一起吧哈哈。

多任務學習在實際使用的時候有什麼技巧和注意事項

其實這一章的內容或多或少已經在上一章節中提到了不少,畢竟改進方向也就是要注意的地方了。但爲什麼還要有這一章?想強調一下,在一頭扎入多任務模型共享參數改進、loss設計的時候不要忘記了深度學習/機器學習最純真的東西:

數據!洗掉你的髒數據!

NLP領域大家都專注於幾個數據集,很大程度上這個問題比較小,但推薦系統的同學們,這個問題就更常見了,靜下心來理解你的數據、特徵的含義、監督信號是不是對的,是不是符合物理含義的(比如你去預測視頻點擊,結果你的APP有自動播放,自動播放算點擊嗎?播放多久算點擊?)。

對於想快速提升效果的同學,也可以關注以下幾點:

  1. 如果MTL中有個別任務數據十分稀疏,可以直接嘗試一下何凱明大神的Focal loss!

    筆者在短視頻推薦方向嘗試過這個loss,對於點贊/分享/轉發這種特別稀疏的信號,加上它說不定你會啪一下站起來的。

  2. 仔細分析和觀察數據分佈,如果某個任務數據不稀疏,但負例特別多,或者簡單負例特別多,對負例進行降權/找更難的負例也可能有奇效果哦。正所謂:負例爲王。

  3. 另外一個其實算trick吧?

    將任務A的預測作爲任務B的輸入。

    實現的時候需要注意:

    任務B的梯度在直接傳給A的預測了。

最後是:讀一讀機器學習/深度學習訓練技巧,MTL終歸是機器學習,不會逃離機器學習的範圍的。該搜的超參數也得搜,Dropout,BN都得上。無論是MTL,還是single task,先把baseline做高了做對了,走在正確的道路上,你設計的模型、改正的loss,纔有置信的效果~~。

筆者水平有限,望大家批評指正,也希望能對閱讀的你有幫助,感覺不錯的幫點個贊/在看/分享吧(這纔是我的榴蓮千層,是我分享的動力!)~謝謝。

放上幾個經典的代碼庫,方便大家操作和學習:

  1. multi task example:

    https://github.com/yaringal/multi-task-learning-example.git

  2. MMOE:

    https://github.com/drawbridge/keras-mmoe.git

  3. NLP福利庫包含各大SOTA的BERT類模型:

    https://github.com/huggingface/transformers.git

  1. 百度ERNIE:

    https://github.com/PaddlePaddle/ERNIE.git

  2. 微軟MT-DNN:

    https://github.com/namisan/mt-dnn.git

參考文獻:

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

  2. ERNIE-GEN: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation

  3. ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding

  4. Multi-Task Deep Neural Networks for Natural Language Understanding

  5. A Frustratingly Easy Approach for Joint Entity and Relation Extraction

  6. https://ruder.io/multi-task-learning-nlp/

  7. Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate

  8. Deep Interest Evolution Network for Click-Through Rate Prediction

  9. Progressive Layered Extraction (PLE): A Novel Multi-Task Learning (MTL) Model for Personalized Recommendations

  10. https://zhuanlan.zhihu.com/p/32423092

  11. Multi-Task Learning as Multi-Objective Optimization

  12. https://zhuanlan.zhihu.com/p/68846373

  13. GradNorm: Gradient Normalization for Adaptive Loss Balancing in Deep Multitask Networks

  14. Multi-Task Learning for Dense Prediction Tasks:A Survey

  15. Modeling Task Relationships in Multi-task Learning with Multi-gate Mixture-of-Experts

  16. https://zhuanlan.zhihu.com/p/27421983

  17. https://zhuanlan.zhihu.com/p/59413549

  18. https://ruder.io/multi-task/

  19. https://cs330.stanford.edu/

更多精彩推薦
☞程序員硬核“年終大掃除”,清理了數據庫 70GB 空間☞打造 AI 語音新標杆,英特爾與騰訊雲小微創新共贏

☞三種方法,用Python輕鬆提取PDF中的全部圖片
☞這25條極簡Python代碼,你還不知道
點分享點收藏點點贊點在看
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章