nlp中的多任務學習手段小結
- 2021 年 4 月 9 日
- AI
之前看的多任務學習太泛了,其實我主要只是想了解一下nlp里可以有哪些多任務的手段能夠提高pretrained model的效果。。。
綜述什麼的就暫時不介紹了。。過兩天重新寫一篇,之前寫的太亂了我自己看了都沒法用,無語。
不過總的來說,就應用層面來看,劃分為三個方向是比較容易讓人理解和接受並且容易找到解決問題的思路和方向:
1、為多任務學習開發更好的網絡架構,而不僅僅局限於常見的hard share或者soft share上,這類工作往往集中在開發更好的多任務學習的網絡結構的設計上;
網絡結構的魔改方面主要集中在找到更好的 任務層次結構上,簡單來說就是做低層監督,然後將低層監督得到的representation用做上層網絡結構訓練的素材。


一個典型的工作是:HMTL a Hierarchical Multi-Task Learning model
HMTL for NLP
//github.com/huggingface/hmtl
這個相對於後面要介紹的第三個方向也不多
2、多目標優化,多目標優化本身涉及到的領域是非常廣泛的,多任務學習是多目標優化可以發揮作用的一個應用方向;比較少看到關於loss的一些multi object optimization的風騷的loss處理,當然這個其實是可以做的沒什麼問題,只不過目前nlp里的玩法重點暫時不在於此(個人淺薄,暫時沒有找到太多關於multi object optimization應用於nlp的比較出名的工作),
3、更好的輔助任務,這一點在nlp中特別的明顯,mlm+nsp,mlm+sop,mlm+rtd等等,都是為了能夠通過多個任務的協同訓練來得到更好的represent從而滿足下游的各種需求。一個典型的代表就是MTDNN了:
本文主要討論的是第三種情況
關於第一點,更好的網絡結構,這個目前用的比較少,因為目前我主要研究的nlp方向中,做複雜的多任務交互模型構建的需求很少,所以暫時不會太深入研究;第二點多目標優化,在另一篇文章里已經做了比較深入的總結了(還沒寫完),簡單來說,多目標優化應用到nlp中的多任務學習上,就是要回答nn中的多loss如何權衡的問題。這個方向的工程壓力整體是最小的,因為幾乎不需要改動多少核心代碼,僅僅是數據構建和loss設計上需要做一些自定義,說到這裡,理一下transformer-based的兩個可以做mtl of nlp的library
1、huggingface transformers;
huggingface本身的api設計都是針對於單任務的,目前官方正式的api沒有包含mtl of nlp的部分,不過這裡官方提供了一個很好的demo,從demo上可以看到,通過繼承和重寫可以很方便地擴展huggingface 的功能(推薦多看看源碼,設計還是很不錯的)
2、MTDNN
另外就是MTDNN已經實現了一個基於torch和transformer開發的nlp多任務學習框架,代碼上來看,設計思路大概是 以XXXmodel,例如bertmodel,xlnetmodel這類不帶任務頭的模型為hard share的backbone,然後下游的任務頭可以定製多個,這實際上是實現了第三種也就是不同輔助任務的設計,下游任務可以是mlm,qa等。(MTDNN=multi task dnn),暫時還沒有找到自定義多目標優化的loss設計的接口,不過肯定有吧。。。
2、allennlp;
//medium.com/huggingface/beating-the-state-of-the-art-in-nlp-with-hmtl-b4e1d5c3faf
更接近原生torch的語法,靈活度更高
3、pytorch lightning;(半自動封裝,更更接近torch語法)
5、pytorch(我就是torch);
靈活性從上到下依次遞增,開發能力從上到下依次遞減。
輔助任務的設計(這裡用輔助任務的說法感覺有一些不太準確,實際上mlm+sop這類的沒有那麼主任務和輔助任務之說,相對於下游實際對標的qa、文本匹配這類的任務,他們都是輔助任務):
目前做的最多的工作的方向也是比較多熱門論文的方向主要在於輔助任務的設計上,多目標優化從loss層面入手,任務層次結構從網絡結構層面入手,輔助任務則是直接思考任務之間的關係,希望尋找到最相關的多個任務來進行多任務學習。單純從結合上來看,輔助任務+多目標優化的結合是比較自然的。
在這部分上,前人已經總結的挺多的了:

可以看到,大部分的工作還是集中在無監督不帶標籤的相關任務的設計上,畢竟大部分語料要去打標還是非常費勁的,現在解決問題的範式基本上是:pretrain+finetune獨立,或者是下游在自己的語料上先pretrain一下再針對實際應用任務finetune,當然,我個人覺得下游部分也可以在自己的語料上pretrain+finetune多任務學習,一步到位。
總的來說,從個人應用的層面來看,任務的設計是比較複雜的,在現有任務的基礎上做搭配是比較簡單的,比如pretrain的時候可以靈活組合mlm+不同的nlp中的對比學習式任務(目前比較火,sop,nsp都算是對比學習中的context-instance 類型的,主要考慮把空間和順序關係拿來做任務用)
參考自:
//ruder.io/multi-task/index.html



