多任務學習之深度學習部分(待續)
- 2021 年 4 月 6 日
- AI

下面就介紹一些重點,不重要的部分略過:
1、multi task learning=joint learning,=learning to learn=learning with auxiliary tasks
同一個東西的不同說法;
2、看loss損失函數,有多個項就是多任務學習,特別的,L1或L2正則化也可以看作一種簡單的多任務學習,這個任務的目標是盡量讓參數小並且不同參數保持在大致相同的量綱里,小參數穩定;
3、為啥用多任務:
(1)方便,不用一個任務一個model,一個model做所有任務
(2)提升泛化能力,
多任務的loss是多個loss的求和,這個求和可以是加權的也可以是其它的方式(這涉及到多目標優化,多目標優化不僅局限於多任務學習中的多個loss的權衡,多任務學習中多個loss的設計往往依賴於多目標優化中的一些理論和方法,二者關係是這樣的),這樣看來和加入正則項的形式很類似:

你看這個loss,是不是很像一個雙任務學習的問題的形式。
所以,多任務在多個任務之間相關的時候,可以提高模型的泛化能力,這個提高泛化能力的說法有很多,不過我覺得從L1和L2正則化的角度考慮更好理解,簡單來說就是引入了一些先驗知識,並且這個先驗知識對於model訓練來說效果很不錯,比如l1正則化強制讓model認為他的參數應該滿足拉普拉斯分佈(至於讓參數滿足拉普拉斯分佈是不是真的對下游任務能產生積極的效果,暫時沒看到什麼嚴謹地推導結果),多任務也是通過在loss中增加其它的loss從而引入先驗知識,至於怎麼引入好的輔助任務,靠人的經驗(比如後bert時代,預訓練任務的各種組合,nsp+mlm,sop+mlm,這個我們完全可以自己靈活的定義,甚至可以mlm+sop+下游的文本分類、文本匹配任務等等);
4、深度學習中的兩種基本的multi task learning的實現

hard parameter share,這種最好實現,我們在輸出的時候加多個任務層就行,torch寫起來非常的方便快捷easy。

soft parameter sharing
這種實現起來也不複雜,不過會麻煩一點,首先根據n個不同任務獨立構建n個結構相同的網絡,然後對網絡的參數進行限制,希望這些參數接近,這個時候,讓參數接近的問題就變成了一個計算distance的問題,我們可以計算不同子網絡的相同層之間的歐幾里得距離,把這個距離作為損失函數放到loss里,比如cosineloss就是一種很經典的通過nn實現metric learning的例子,除此之外還有trace的方法,沒了解過,先放着。
5、關於為啥MTL能夠提升泛化能力的問題
1、隱式/顯式數據增強
對於A任務,某些數據樣本可能是噪聲,則A任務訓練的時候這些噪聲樣本起不到什麼作用,
這裡用噪聲來指代這類樣本感覺有點偏頗,我覺得更好的說法是對任務loss的優化貢獻度不高的樣本更恰當一些。
比如lightgbm中的goss tree或者是focal loss,前者刪除當前任務中的小梯度樣本,更快更好更迅速的收斂,但是這些小梯度樣本可能在B任務中就不是小梯度的,這種處理方式隱式得減少了訓練樣本的數量,
後者,focol loss會對貢獻度不高的樣本降權,當權重特別小的時候,對應的樣本其實也等同於被刪除了,但是對另外一個任務這種樣本可能就比較重要了。
除此之外,我覺得也會有顯式的數據增強,例如nsp和mlm任務,雖然使用的是同一個語料,但是這兩個任務實際上需要分別對原始數據進行兩次改造,一次改造是對原始數據進行mask處理來對應mlm任務需要的input的數據形式,一次改造是直接以句子為單位改造成正負樣本對,所以其實類似於對input進行改造從而得到更多類型的input。這個我在實現nsp+mlm任務的時候發現有這個問題,一個樣本最終要拆成兩種樣本形式進入model去train。
2、幫模型注意更重要的特徵
如果一個任務非常困難或數據有限,同時數據高維太高,那麼一個模型可能很難區分相關的特徵和不相關的特徵。MTL可以幫助模型將注意力集中在那些實際上很重要的特徵上,因為其他任務將為這些特徵的相關性或不相關性提供額外的證據(這建立在多個任務對應的最好的特徵大致相同的前提下)。
3、Eavesdropping
這個詞翻譯過來叫竊聽。。感覺怪怪的。某些特徵在A任務上難以學習,可能A對標的loss無法有效地利用這種特徵,但在另一個任務B上就很好學習,任務B可以更好地把這些特徵represent出來,舉個不嚴謹地例子,比如組隊打比賽,我對nlp熟悉,另一個隊友對graph熟悉,那麼他把GNN的model做好了提供一個輸出的api,我直接用這個GNn的網絡結構拼上nlp的一些網絡結構一起輸出來更好地完成任務
4、更大的假設空間
比如說對任務A來說,nn的適合的參數解可能就在某個固定的高維空間中的一塊超立方體里,對於任務B來說,可能在另外一個立方體里,MTL迫使model在更大的不同的超立方體里尋找最合適的參數解,這樣未來的新任務可能可以更好的讓model去學習,前提是這個新任務的合適的參數解也在這麼多超立方體構成的空間里。
5、正則化
前面說過了,不贅述。
MTL in non-neural models
這個上一篇已經大概介紹完了,這裡不贅述了。
簡單總結:
寫到這邊,我發現如果擴展來看,將hard share和soft share擴展為網絡局部單元的share方式,現有的網絡結構可以做一個歸類
首先是單源input的情況
(1)單個input源+單個loss(任務)+沒有share的概念,很常見了;
圖片來源:

(2)單個input源,多個loss+no share,
典型的,multi-head機制的閹割版

把concat的部分化成不同任務的任務層即可。
上述都是不考慮share的網絡結構,也是比較常見的網絡結構,下面是引入share的概念之後的網絡結構,個人認為hard share,soft share可以作為一種網絡構建的機制靈活的應用於網絡中的部分模塊不一定要按照原文的架構來看。
(3)單個input源,多個loss+hard share/softshare/noshare,

如果hard share可以擴展來看,作為一種局部結構的話,這樣其實還有更多的情況,比如input部分可以接n個子網絡結構,這些子網絡結構不進行任何形式的share,然後n個自網絡的結果concat之後再進入shared layers。比如multi head attention的模型結構(看這個網絡結構就好。。。)
concat之後就linear這層算是共享的


同樣啊,我們也可以就對上圖中,某兩層進行softshare,最後一層不share或者concat做成no share或者concat之後再加兩三層做hard share也可以。。。頭痛
然後是多源input的情況:
多個input源的思路和單源類似,一個經典圖:
下面是
一個多input源+單個loss+hard share(2 dense layers其實勉強算是做了一層的hard share,如果直接concat不接任何共享層則為no share的形式)
binary cross entropy部分換成多個任務層,則變成了 多input源+多loss+hard share
如果下圖的三個dense之間做soft share

則變成 多input源+多個loss+hard/soft/no share 。。。腦子疼
包大人:Kaggle Avito賽後分享-多源異構數據的神經網絡和遷移學習

nn中的新的一些MTL的架構方式
前面介紹了hard/soft的parameter sharing,後來,研究人員開始不滿足於這些簡單的MTL的設計,於是又開始折騰了,目前MTL的改進方向主要有三個方向:
1、從soft parameter sharing出發,soft share可以看作hard share和no share的一種中間情況。
簡單來說就是從模型結構出發,去做模型結構的各種魔改,更簡單來說就是想解決哪些參數共享,哪些參數不共享的問題
Take a rest~~~~~~~~~~~~~~~~~~~~~~~~~~
下面介紹了一些新一點的更複雜的架構方式。
1、Deep Relationship Networks
在計算機視覺的MTL中,方法通常共享卷積層,同時學習特定於任務的完全連接層。通過提出深度關係網絡,改進了這些模型。除了共享層和任務特定層的結構,如圖3中可以看到,它們還將矩陣先驗放在全連接的層上,這允許模型學習任務之間的關係,類似於我們之前看到的一些貝葉斯模型。然而,這種方法仍然依賴於預定義的結構來共享,這可能足以解決充分研究的計算機視覺問題,但證明新任務容易出錯。
對cv不是太了解,這裡看圖感覺像是對不同任務層的參數做了一些先驗假設之類的。

2、完全自適應的特徵共享

從另一個極端開始,提出了一種自下而上的方法,從一個見到那網絡開始,並在訓練期間使用促進類似任務分組的標準,貪婪地擴展它。動態創建分支的拓寬過程如上圖所示。然而,貪婪方法可能無法發現全局最優的模型,而將每個分支分配給恰好一個任務並不允許模型學習任務之間更複雜的交互。
居然還能這麼玩兒。。。這樣問題挺明顯,每一個round得到的最優model不一定在全局層面最優。
3、十字綉網絡