乘風破浪的PTM:兩年來預訓練模型的技術進展
作者 | 張俊林
來源 | 深度學習前沿筆記專欄
Bert模型自18年10月推出,到目前為止快兩年了。它卜一問世即引起轟動,之後,各種改進版本的預訓練模型(Pre-Training Model, PTM)與應用如過江之鯽,層出不窮。Bert及它的繼任者們,確實也不負眾望,在NLP各個領域攻城略地,所向披靡,多種NLP資料集競賽榜單,連續多年被各種新出現的預訓練模型霸榜,有些榜單,個別模型已經把指標刷到超過人類。
那麼,在近兩年的時間裡,諸多改進模型中,有哪些令人印象深刻的新模型?在那些表現突出的新模型中,是哪些因素導致它們的良好表現?預訓練模型技術本身有重大的改動或創新麼?或者,關於預訓練模型,目前有哪些相對明確的結論?根據目前的技術發展水準,如何根據現有結論,來打造最強的預訓練模型?本文透過梳理現有技術文獻,試圖來回答上述一系列問題。本文的資料都客觀有出處,但是對資料的解讀,帶有嚴重的個人色彩,偏頗難免,還請謹慎參考。另外,如要透徹理解本文,需要有關於預訓練模型的先導基礎知識,對這個不太瞭解的同學,建議先閱讀下文打個基礎:
張俊林:從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史
我們知道,在預訓練模型框架下,解決NLP問題,會劃分為序列進行的兩階段:第一階段是預訓練階段,然後是Fine-tuning階段,本文集中在預訓練階段。
如果我們一句話宏觀地歸納預訓練模型要做的事情(參考上圖),其實很好理解,就是下面這句話:
在Transformer作為特徵抽取器基礎上,選定合適的模型結構,透過某種自監督學習任務,逼迫Transformer從大量無標註的自由文字中學習語言知識。這些語言知識以模型引數的方式,儲存在Transformer結構中,以供下游任務使用。
我們見到的形形色色的預訓練模型,無非就是,實現上述思路的具體做法而已。你可以換個模型結構,可以換個學習任務,也可以換個其它的部件,無非就是各種試,當然,有些做法相對有效,有些做法效果差些。一般而言,通常所說的預訓練模型,都是從自由文字中學習語言知識,很明顯,我們可以引入新型的知識或資料,比如人類已經挖掘好的結構化知識、多模態資料、多語言資料等,引入這些知識來促進模型理解語言,或者解決特殊型別的任務。
後文會先介紹預訓練模型中常見的幾種模型結構,並給出目前能得出的結論。然後,我們會找出目前表現比較好的那些預訓練模型,並分析它們起作用的主要因素是什麼。接下來,會簡要介紹幾種非自由文字類知識學習的預訓練基本方法。
在談這些之前,我們先從RoBERTa講起。如果時光倒退半年多,你會發現,這是一個價值被嚴重低估的模型,其實,它很重要。
預訓練模型中的強基準:RoBERTa
嚴格來說,原始的Bert模型是個未完成的半成品,而RoBERTa才是遵循Bert思路的完成品,或者說,Bert是進行時中的RoBERTa,也就是說下列等式成立Bert=RoBERTing。為什麼這麼說呢?因為,我們可以把RoBERTa看作是得到充分訓練的Bert模型,而原始版本的Bert模型訓練不夠充分,這種模型是否得到充分訓練的微小差異,能夠極大提升原始版本Bert模型的效果。
在原始Bert模型的基礎上,RoBERTa透過實驗,證明了如下幾點:
-
進一步增加預訓練資料數量,能夠改善模型效果;
-
延長預訓練時間或增加預訓練步數,能夠改善模型效果;
-
急劇放大預訓練的每個Batch的Batch Size,能夠明顯改善模型效果;
-
拿掉預訓練任務中的Next Sentence Prediction子任務,它不必要存在;
-
輸入文字的動態Masking策略有幫助;
上面列出的五項改進中,第四項和第五項改動,對最終的模型效果影響不大,暫時可忽略。第一點改進增加預訓練資料對模型效果有幫助,這個符合直覺。第二項和第三項則涉及到模型是否得到充分訓練,本質上這兩項相結合,代表了更充分訓練的Bert模型。如上面的效能對比圖所示,如果以Bert Large作為對比基準,可以發現:僅僅將Batch Size放大,三個資料集上的效果就獲得了明顯提升,如果再加入新的資料,以及不斷增加訓練步數,還能持續獲得效果的進一步提升。可以看出,RoBERTa效果明顯比Bert large好,在相同資料情況下,甚至超過了知名度很高的XLNet。這主要歸功於資料規模的增加,以及更充分的訓練過程,其中更充分的訓練過程發揮的作用更大些。這是為何說RoBERTa 在某種意義上,其實是一個完成版本或者加強版本的Bert模型。
縱觀目前公開的預訓練模型,我們可以發現,RoBERTa是其中一個效果非常好的超強基準模型。這句話有幾個意思:
首先,儘管看上去RoBERTa也沒做啥技術或者模型改進,只是把Bert模型訓練得更充分了一些,但是,它的效果是非常好的。目前為止,效果能夠明顯超過它的模型很少,屈指可數,這個“屈指可數”,不是虛指,是它的字面含義。這個事實,其實隱含了很大的資訊量,它說明了一個什麼問題呢?您可以想一想,我的看法在後面小節內容會提到。
其次,對於一個改進模型來說,理論上都應該引入RoBERTa作為對比Baseline,而改進模型的效果,如果不能具備說服力地超過RoBERTa的話,那麼這種改進的有效性,多少是成問題的,除非你強調改進模型的優勢不在效果好,而在其它方面,比如更小更快等。
再次,後續的改進預訓練模型,從策略角度講,應該在設計之初,就站在RoBERTa的巨人肩膀上,就是說在增加一定資料量的前提下,增大Batch Size,加長預訓練時間,讓模型得到充分訓練。因為,如果你不這麼做,大機率你的效果是很難比過RoBERTa的,而目前我們能夠見到的效果很突出的模型,你如果細究,會發現其實都已經引入了RoBERTa的關鍵要素了,關於這一點,在後面小節我們會做分析。
還有,對於追求落地效果的人來說,比如公司裡做業務的同學,建議以RoBERTa為基礎模型來做應用。
預訓練的發動機:模型結構
對於預訓練模型來說,目前的主流模型大都採用Transformer作為特徵抽取器,現階段看,Transformer的潛力仍然沒有被充分挖掘,還有很大潛力可挖,意思是,Transformer效果足夠好,而且還可以更好,貌似改進Transformer並非當務之急的事情。預訓練模型的知識,是透過Transformer在訓練迭代中從資料中不斷學習,並以模型引數的形式編碼到模型中的。雖然,大家都是用的Transformer,但是怎麼用它搭建模型結構學習效率更高?這是一個問題。所謂學習效率高,就是給定相同大小規模的訓練資料,它能編碼更多的知識到模型裡,這就意味著它的學習效率更高。不同的Transformer用法,會產生不同的模型結構,就會導致不同結構的差異化的學習效率。本節我們歸納下目前能得到的,關於模型結構的現有研究結論,會介紹常見的五種模型結構。當然,這裡用模型結構來表達不足夠確切,因為除了模型結構外,一般還包含自監督的學習方法,常見的學習方法包括AutoEncoding(簡稱AE)和AutoRegressive(簡稱AR)。AE即我們常說的雙向語言模型,而AR則代表從左到右的單向語言模型。
Encoder-AE結構
Encoder-AE結構如上圖所示。這其實是包括原始版本Bert在內的,大多數後續改進模型採取的結構。整個結構就是一個標準的Transformer,在語言模型預訓練的時候,採用AE方法。也就是說,輸入句中的未被Mask的任意單詞兩兩可見,但是被Mask掉的單詞之間都相互獨立,互不可見。在預測某個被Mask掉的單詞的時候,所有其它被Mask的單詞都不起作用,但是句內未被Mask掉的所有單詞,都可以參與當前單詞的預測。可以看出,Encoder-AE是個採用雙向語言模型的單Transformer結構。
從目前對比實驗看(上面兩圖),除了下文要講述的Encoder-Decoder結構外,貌似對於語言理解類的NLP任務,這種結構都是效果最好的,但是對於語言生成類的任務,這種結構效果相對很差。也就是說,這種結構比較適合做語言理解類的任務。
Decoder-AR結構
Decoder-AR結構如上圖所示。它和Encoder-AE結構相同,都是採用單個的標準Transformer,主要區別在於:語言模型預訓練的時候,採用AR方法,就是從左到右逐個生成單詞,第i個單詞 只能看到它之前的第1到第(i-1)個單詞 ,不能看到後面的單詞。採用這種結構的典型模型就是GPT1、GPT2、GPT3系列了。GPT3在文字生成任務方面的表現,確實是出乎意料地好。當然,這不能僅僅歸功於這個結構本身,更復雜的模型和更大量的資料可能是主因。可以看出,Decoder-AR結構是個單向語言模型的單Transformer結構。
從目前對比實驗看(參考Encoder-AE小節的兩張效果對比圖),除了Encoder-Decoder結構外,貌似對於語言生成類的任務,這種結構是效果最好的結構之一。但是相應的,語言理解類的任務,採用這種結構,效果比Encoder-AE結構差距非常明顯,這也好理解,因為只看到上文看不到下文,對於很多語言理解類任務而言,資訊損失很大,所以效果不好也在情理之中。也就是說,這種結構比較適合做語言生成類的任務。
Encoder-Decoder結構
既然Encoder-AE比較適合做語言理解類的任務,Encoder-AR比較適合做語言生成類的任務。那麼,我們能否結合兩者的優勢,使得預訓練模型既能做好生成類NLP任務,又能做好理解類任務呢?這是個很自然的想法,而Encoder-Decoder結構就是如此將兩者結合的。最早明確提出使用Encoder-Decoder結構做通用領域預訓練的,應該是微軟提出的MASS模型,不過和這裡介紹的做法有差異。
Encoder-Decoder結構如上圖所示。這種結構在Encoder側,單獨使用一個Transformer,採用了Encoder-AE的結構。也就是說,編碼階段採用雙向語言模型,任意兩個單詞兩兩可見,以更充分地編碼輸入資訊;而在Decoder側,使用另外一個Transformer,採用了Decoder-AR結構,從左到右逐個生成單詞。
當然,Decoder側和標準的Decoder-AR不同的地方還是有的:Decoder側生成的單詞 ,除了像Decoder-AR結構一樣能看到在它之前生成的單詞序列 外,還能看到Encoder側的所有輸入單詞 。而這一般是透過Decoder側對Encoder側單詞,進行Attention操作方式來實現的,這種Attention一般放在Encoder頂層Transformer Block的輸出上。
在進行預訓練的時候,Encoder和Decoder會同時對不同Mask部分進行預測:Encoder側雙向語言模型生成被隨機Mask掉的部分單詞;Decoder側單向語言模型從左到右生成被Mask掉的一部分連續片斷。兩個任務聯合訓練,這樣Encoder和Decoder兩側都可以得到比較充分地訓練。
從目前對比實驗看,無論是語言理解類的任務(參考Encoder-AE部分Google T5論文中展示的效果對比圖),還是語言生成類的任務(參考上面來自於UniLM v2的效果對比),貌似Encoder-Decoder結構相對其它幾種結構來說,效果都是最好的之一。而且,它有另外一個優點,就是用這個結構,可以同時做生成類和理解類的NLP任務,基本做到了不同任務在模型結構上的統一,這點還是很好的,一個結構可以到處使用,比較方便。但是,它也有個問題,因為兩側各用了一個Transformer,所以相對其它結構引數量翻倍,計算量也增加了,就是說比其它模型笨重。而且,Encoder-Decoder結構比其它結構效果好,很可能主要原因來自於引數量增加導致的模型容量增大,當然這是個人猜測。目前,採用這個結構的效果很好的模型包括Google T5以及BART等模型。
Prefix LM
Prefix LM結構是Google T5論文中給出的叫法,這種結構最早由UniLM模型提出,我們沿用Google T5的這種稱謂。如果深入分析的話,Prefix LM其實是Encoder-Decoder模型的變體:標準的Encoder-Decoder模型,Encoder和Decoder各自使用一個獨立的Transformer;而Prefix LM,相當於Encoder和Decoder透過分割的方式,分享了同一個Transformer結構,Encoder部分佔用左部,Decoder部分佔用右部,這種分割佔用是透過在Transformer內部使用Attention Mask來實現的。與標準Encoder-Decoder類似,Prefix LM在Encoder部分採用AE模式,就是任意兩個單詞都相互可見,Decoder部分採用AR模式,即待生成的單詞可以見到Encoder側所有單詞和Decoder側已經生成的單詞,但是不能看未來尚未產生的單詞,就是說是從左到右生成。
目前的一些對比實驗證明,在其它條件相同的情況下,關於語言理解類的任務(參考Encoder-AE部分Google T5論文中的相關實驗),Prefix LM結構的效果要弱於標準Encoder-Decoder結構。這裡是值得深入思考下的,因為看上去Prefix LM和標準的Encoder-Decoder結構是等價的。那麼,為什麼它的效果比不過Encoder-Decoder結構呢?我想,一方面的原因估計是兩者的引數規模差異導致的;另外一方面,可能與它這種模式的Decoder側對Encoder側的Attention機制有關。在Decoder側,Transformer的每層 Block對Encoder做Attention的時候,標準的Encoder-Decoder模式,Attention是建立在Encoder側的最後輸出上,這樣可以獲得更全面完整的全域性整合資訊;而Prefix LM這種結構,Decoder側的每層Transformer對Encoder側的Attention,是建立在Encoder的對應層上的,因為這種模式的Encoder和Decoder分割了同一個Transformer結構,Attention只能在對應層內的單詞之間進行,很難低層跨高層。這可能是影響這種結構效果的原因之一。當然這只是個人猜測,無證據證明,還請謹慎參考。
關於語言生成類的任務,Prefix LM效果雖然要弱於Encoder-Decoder結構(參考Encoder-Decoder小節UniLM v2論文效果對比圖),但是總體而言,兩者相差不大,相對其它模型,Prefix LM結構在生成類任務表現也比較突出。
Prefix LM因為是Encoder-Decoder的變體,所以可以看出,它的優勢也在於可以同時進行語言理解和語言生成類任務,而且相對Encoder-Decoder來說,因為只用了一個Transformer,所以模型比較輕,這是Prefix LM的優勢。缺點則是在效果方面,貌似要弱於Encoder-Decoder模型的效果,語言理解類任務相對有明顯差距,生成類任務的效果相差不大。
Permuted Language Model(PLM)
PLM最早是在XLNet的論文中提出的,目前有些後續模型也在PLM上進行改進,所以我們把PLM也放在這裡一起說一下。對於不熟悉XLNet的同學,可以參考去年XLNet剛出來時候我寫的解讀文章,補充下基礎知識:
XLNet:執行機制及和Bert的異同比較
PLM一樣採用單個Transformer模型作為主幹結構,但是從訓練方法上來說,是個很另類也很有創意的做法,是種“形為AR,實為AE”的做法。在語言模型預訓練過程中,它看上去遵循AR從左到右的輸入過程,這符合一般生成任務的外在表現形式,但是在內部透過Attention Mask,實際做法其實是AE的做法,無非是把AE的做法隱藏在Transformer內部。它和AE從細節來說,主要有兩個區別:首先,預訓練過程中,輸入句子去掉了Mask標記,改為內部Attention Mask,以保持預訓練過程和下游任務Fine-tuning的一致性。關於這一點,目前有實驗證明這個雖然有積極影響,但是影響不大(ELECTRA針對預訓練過程是否帶Mask 標記做了效果對比,帶Mask標記的Bert模型GLUE得分82.2,去掉Mask標記利用其它單詞代替的對比模型GLUE得分82.4);其次,也是它和AE的最主要區別,PLM認為被Mask掉的單詞之間是相互有影響的,先產生的被Mask掉的單詞,應該對後生成的被Mask掉的單詞,在預測的時候發生作用,而標準的AE則認為被Mask掉的單詞是相互獨立的,相互之間不產生作用。
其實,如果你仔細分析下PLM的預訓練過程,會發現本質上PLM是Prefix LM的一種變體。上圖給出了個例子來說明這種情況,對於某個輸入句子,PLM首先會進行單詞順序隨機變換,然後選定變換後句子的末尾一部分單詞進行Mask,被Mask的單詞預測順序是有序的,按照變換後在句中先後順序來預測,上面例子中會先預測 ,然後再預測 。在預測 的時候,未被Mask的上下文[ , , ]會對預測 有幫助;假設已經預測並輸出了 ,在預測 的時候,未被Mask掉的上下文[ , , ],以及剛預測出的 ,會對預測 有幫助。其實你想,這等價於什麼?等價於以 作為邊界切割開的Prefix LM模型,Encoder端包含[ , , ],Decoder側包含[ , ],在預測 的時候,不僅能看到Encoder側的所有輸入,也能看到Decoder側之前的輸出 。當然,因為每個輸入句子的長度各異,被Mask掉的單詞個數也不固定,所以看上去Encoder和Decoder的邊界根據輸入句子,邊界是在動態變化的。所以,PLM其實是一種邊界變化的Prefix LM變體結構。當然,上面純屬個人推理過程,不保證正確性,謹慎參考。
如果不考慮XLNet裡的其它因素,單純看PLM結構的話,目前有些對比實驗,貌似PLM在語言理解類任務中,效果不及Encoder-AE(參考UniLM v2論文中的對比實驗,未在本文列出,可參考論文);在語言生成類任務中,效果略微優於Encoder-AE,但是距離Decoder-AR差距較大(參考Encoder-AE描述部分BART的對比實驗)。在兩類任務中,都有點上不著村,下不著店的感覺,就是都還可以,但都不夠好的感覺。XLNet效果確實是很好的,但是,這說明XLNet效果好,真正起作用的貌似不是PLM,而是其它因素。
上面內容簡述了常見的五種預訓練模型結構,如果總結一下的話:
首先,從模型效果來看,Encoder-Decoder結構無論在語言理解類還是語言生成類任務中,都是效果最好的。當然,效果好的原因很可能在於模型引數多,模型容量大,而不一定是自身結構帶來的優勢。它的優點一個是效果好,一個是能夠將理解和生成任務統一在一個框架下;缺點是引數多計算多,所以模型比較重。採用這個結構的代表模型包括Google T5和BART。
其次,因為Encoder-Decoder模型比較重,所以,如果從相對輕量結構裡進行選擇的話,對於語言理解類任務,Encoder-AE結構相對而言效果較好,代表模型很多,典型的比如ALBert、RoBERTa;對於語言生成類任務,Decoder-AR結構和Prefix LM結構相對而言效果較好,都可考慮,Decoder-AR的代表模型是GPT系列,Prefix LM的代表模型是UniLM。語言理解類任務應該用AE任務,語言生成類任務應該用AR任務,這點也很明確了。
談完了模型結構,下面我們來盤點下表現比較好的預訓練模型,並分析下效果好背後的原因。
強者的狂歡:為什麼有些模型表現這麼好
目前Bert的改進模型有很多,有的表現非常突出,有的表現一般。我的主要目的是想找出那些表現好的模型,並分析下,到底是哪些因素導致這些模型效果超群的。
首先,我們需要先找出那些表現特別好的模型出來,我這裡說的表現好,主要是從模型效果角度來說的,就是那些在公開資料集上指標比較高的模型。一種比較簡單的方法就是:找GLUE、SuperGLUE、SQuAD 2.0這幾個大規模NLP資料上,那些打榜模型中排名前列的。你可以看一下,自從Bert出現後,這幾個榜單,都長年被預訓練模型霸榜,指標在被各種新的預訓練模型快速刷高,直到超過人類的水準。一般而言,能夠打榜把指標刷到前列的,都是好模型,說明這些模型真的能打(插句閒話,這點其實特別值得推薦領域借鑑,就是有個大規模高難度資料集,供各種模型長年刷榜,這其實是促進領域技術進步很好的手段)。當然,也有一些新模型,可能未必會去打榜,所以作為補充措施,我又從比較新的文獻中,找出一些模型,前提是它在文獻中報導的效果要比RoBERTa好。這樣,我篩出了一批表現優秀的模型,包括:RoBERTa,Google T5,ALBERT,ELECTRA,XLNet,GPT3,BART,UNILM v2, StructBert,MacBert。這些模型要麼在某個榜單前幾名,要麼論文實驗結果顯示效果非常好,二者佔其一。這裡面,GPT3是個純生成模型,ELECTRA相對而言方法比較特殊,在後面我會單獨說下它。需要說明的是,ERNIE和NEZHA模型,效果也是非常好的,能夠排在某些榜單前列。但是因為它們對應的論文比較早,我猜測現在打榜的模型,估計和原始論文中的做法,已經做了變動,但是具體怎麼變的不清楚,所以沒有在上面列表中列出。上述表單,應該基本囊括了目前時間(2020年9月)絕大多數效果最好的預訓練模型了。
上述模型,都能找到對應的文章,可供仔細分析模型的有效因素。如果你仔細分析上述各個模型的共性,會發現,那些真正有效的因素會慢慢浮出水面。我在這裡歸納一下:促進模型效能快速提高的因素,主要包含下列幾方面。而且,這幾方面的因素是可疊加的,就是說,如果一個模型採納其中越多的因素,那麼這個模型的效果表現可能會更好。
首先,更高質量、更多數量的預訓練資料。
關於預訓練資料對模型效果的影響,Google T5做了大量對比實驗,目前的結論,如果歸納一下的話,應該是這樣的:在保證預訓練資料質量的前提下,資料規模越大模型效果越好。這裡需要注意的是,資料規模越大越好,這點其實從Bert一出來,就是一個容易想到的重要因素。因為資料量越多,資料裡蘊含的知識也越多,那麼模型能學到的東西越多,所以模型效果會更好,這是一個靠簡單推理就能得出的結論。但是,它是有前提的,前提是資料質量要高,光資料量大不行,很多亂七八糟的資料,反而會對模型效果帶來負面影響。
第二,增加模型容量及複雜度。
所謂增加模型容量及複雜度,指的是增加Transformer模型的引數量,一般而言,模型容量越大,模型的表達能力越強。最直接的增加模型容量的方式就是增加Transformer Block層深,比如可以從Bert base的12層,增加到Bert Large的24層,還可以繼續增加到比如36層,這是縱向增加複雜度,Google T5走的這條路(從上圖可以看出,模型容量增加到4倍後,有些資料集效果相對Baseline有大幅度的提升)。除此外,還可以橫向增加模型複雜度,比如在固定Transformer層深的情況下,可以透過放大Transformer中構件的大小,比如Hidden Size的增大,FFN層對隱層的放大,Multi-Head Self Attention的Attention頭的增加,等多種方式來做到這一點。ALBERT走的這條路,它的xxLarge模型效果最好,只用了12層Transformer Block,但是Hidden Size達到了4096。
這兩種模式還可以相互結合,就是同時縱向和橫向增加模型複雜度,GPT 3即是如此,將模型複雜度這點推到了極致。單詞特徵的Embedding不會放的太大,一般採用64或者128大小,ALBERT證明了如果單詞特徵Embedding跟著Transformer內部的Hidden Size同步放大,效果反而會降低。也就是說,增加模型容量指的是放大Transformer模型本身的引數量,但不包括輸入層Embedding的引數。
第三,更充分地訓練模型;
這裡所謂的“更充分”,一般指的是放大Batch Size、增加預訓練步數,就是RoBERTa做的那兩個事情。這塊上文有述,這裡不再贅述。
第四,有難度的預訓練任務;
原始的Bert預訓練,有兩個訓練任務:一個是單詞級的Mask語言模型MLM,一個是句子級的下一句預測任務NSP。RoBERTa證明了NSP對於模型效果沒什麼影響,所以拿掉了這個任務。有很多研究集中在這一塊,採取了五花八門的預訓練任務(如上圖所示)。那麼哪些預訓練任務相對而言更有效呢?目前已經能夠得出些比較明確的結論。
如果歸納一下的話,應該是這樣的:對於單詞級的Mask語言模型來說,Span類的預訓練任務效果最好。所謂Span類的任務,就是Mask掉的不是一個獨立的單詞,而是一個連續的單詞片斷,要求模型正確預測片斷內的所有單詞。Span類任務,只是一個統稱,它會有一些衍生的變體,比如N-Gram,就是Span模型的一個變體,再比如Mask掉的不是單詞而是短語,本質上也是Span類任務的變體,這裡我們統稱為Span類任務。
目前有相當多的研究證明Span類任務是效果最好的,最近有些工作(微軟的ProphetNet和百度的ERNIE-GEN)進一步說明,Span內多個單詞獨立被生成效果會更好。所謂獨立生成,舉個例子,假設被Mask掉的片斷是: ,之前一般Span類的預訓練是順序生成片斷內的單詞,就是先生成 ,然後根據上下文及 ,生成 ,這麼個順序,就是說序列生成片斷內單詞。而獨立生成,就是根據上下文,同時生成 , 和 ,被生成的單詞之間無影響。所以目前單詞級的Mask語言模型,獨立生成的Span類任務,應該是目前效果最好的。
對於句子級的任務,NSP任務學習兩個句子是否連續句:正例由兩個連續句子構成,負例則隨機選擇一句跟在前一句之後,要求模型預測兩者是否連續句子。本質上,NSP在預測兩個句子是否表達相近主題,而這個任務,相對MLM來說,過於簡單了,導致模型學不到什麼知識。ALBERT採用了句子順序預測SOP(Sentence Order Prediction):跟NSP一樣,兩個連續出現的句子作為正例,但是在構造負例的時候,則交換句子正確順序,要求模型預測兩個句子出現順序是否正確,這樣增加任務難度,StructBERT也採取了類似的做法。實驗證明SOP是有效的句子級預測任務。
總而言之,目前證明Span類任務是有效的單詞級任務,SOP是有效的句子級任務。目前看,預訓練任務越有難度,則預訓練模型越能高效率地學習知識,所以尋找更新的更有難度的預訓練任務是有較大探索空間以及成功可能的。
上面列了四個主要因素,那麼,還有其它因素麼?我的猜測是基本沒有了,儘管可能還有一些差異化的改進點是有效的,但它對最終效果的貢獻,應該不是特別大,起碼不像上述四個因素那麼大。上面四個因素,如果進一步要劃分重要性的話,估計前三個都很重要,第四個相對而言影響稍小一些。當然,同樣地,這是我個人的猜測,謹慎參考。
如果我們根據上述可疊加的有效因素,來分析現有模型,可得出如上圖所示列表(具備某因素的模型,對應的格子做了標記)。從上表中,我們可以得出一些結論:
首先,所有這些效果表現突出的模型,都增加了更多的高質量預訓練資料。另外,透過增大Batch Size以及增加預訓練步數方式,都使得模型得到更充分地訓練。也就是說,所有這些表現突出的模型,都是站在RoBERTa模型的肩膀上的。其實,只要你站在RoBERTa肩膀上,效果都不會太差,剩下的問題是能比它好多少的問題。
其次,如果我來冒昧地做個判斷的話,貌似對於語言理解類任務來說,估計Google T5和ALBERT是效果最好的預訓練模型;而對於語言生成類的任務來說,估計GPT3是效果最好的模型。對於Google T5和ALBERT模型來說,兩者都採納了絕大部分有效因素,主要不同在於預訓練任務,Google T5採用了Span類單詞級任務,而ALBERT採用了SOP類句子級任務。這三個表現最突出的模型,和其它模型最大的區別,大機率在於它們在增加更多高質量資料的同時,走了大規模提升模型容量的路子。也就是說,在增加資料規模基礎上大規模增加模型容量,這應該是拉開不同模型效果最主要的因素。
再次,我們可以據此預測,如果一個模型,採納了上述所有有效因素,那麼可以獲得當前技術水準下的最好模型效果,就如上表中最後一行展示的,目前仍未知的Model X那樣。就是說,這個模型應該是這樣的:在RoBERTa模型基礎上,增加更多高質量資料的同時,充分放大模型容量,而預訓練任務則是單詞類Span任務和句子類SOP任務的結合。當然,估計這裡面起到主要作用的還是大量資料+大模型的因素。
這裡單獨說下ELECTRA,這是一個比較獨特的預訓練方法(參考上圖)。它形式上採取了類似GAN的模式,但是本質上並非GAN,因為缺乏GAN最關鍵的生成器和判別器的對抗訓練過程。ELECTRA聯合訓練了小的生成器以及大的判別器,它強迫判別器對生成器產生的所有單詞,做個是否經過改寫的判斷,這無疑增加了模型的學習效率,因為原先的MLM只學習15%的被Mask單詞,而ELECTRA對所有單詞都要進行判斷,並從中學習。ELECTRA論文做了分析,模型的絕大多數收益來自於全部單詞參與訓練這一步。這意味著,ELECTRA這種所有單詞全員參與訓練過程的模式,能夠在其它條件相同的情況下(模型複雜度,資料量等),使得模型獲得更高的學習效率,這個結論和做法還是很有價值的。本質上,ELECTRA這種提升模型效率的方法,和上面所述其它模型的各種做法,是相互互補的。就是說,在ELECTRA的訓練模式下,增加訓練資料、增加模型規模、模型充分訓練,有可能獲得更好的模型效果。
暴力美學: 簡單粗暴但有效
前文有述,RoBERTa是個非常強的Baseline,相對目前表現最強的Google T5和ALBERT模型,其實RoBERTa與這兩個天花板模型之間,它們之間的效能Gap並不是特別大。其它表現突出的模型,要我猜,效能應該介於RoBERTa這個Baseline和兩個天花板模型之間。而所有這些模型之間的主要差異,極有可能是模型容量的大小差異帶來的。
從某種角度上看,我們可以認為:RoBERTa可以被看作是經過更充分訓練的Bert模型,而ALBERT/Google T5可以理解為進一步增加了模型複雜度的RoBERTa增強版本。從Bert到RoBERTa,再到ALBERT/Google T5,這三類模型,很可能代表了自Bert出現來的最主要技術進展。所以,從模型改進的角度看,自從Bert誕生後近兩年,並沒有出現特別有效的模型改進方法。儘管從解決NLP任務效果的角度看,新的預訓練模型相比Bert有了巨大的提升,但是這些提升,大致可以理解為是因為引入更多高質量資料、採用更多模型引數、模型訓練更充分以及增加訓練任務難度這幾點綜合導致的。而其中,在RoBERTa這種充分訓練的模型基礎上,增加資料,並加上更大的模型,可能在其中起到了主導作用。
由此進一步推理,我們可以得出如下結論:目前預訓練模型都採用的Transformer結構,從模型容量或模型複雜度來說是足夠複雜的。就是說,Transformer結構本身,目前並非制約預訓練模型效果的瓶頸,我們可以僅僅透過增加高質量資料、增加模型複雜度配以更充分地模型訓練,就仍然能夠極大幅度地提升Bert的效能。
這說明了什麼呢?這說明了大資料+大模型的暴力美學,這條粗暴簡潔但有效的路子,還遠遠沒有走到盡頭,還有很大的潛力可挖。儘管這帶來的副作用是:好的預訓練模型,訓練成本會非常高,這不是每個研究者都能夠承受的。但是,我的意見,這其實是個好事情。如果僅僅透過加資料、擴模型就能獲得更好的效果,這麼簡單的方式就能推動模型效果不斷上升,推動更多應用獲得更好效果,這不是天大的好事麼?至於由此帶來的大模型落地難的問題,我相信可以透過搭配知識蒸餾等把模型做小的方案來獲得解決。就是說,很可能預訓練模型發展會走出一個啞鈴模式:兩頭大,中間小。兩個大頭中,一頭是越來越大的預訓練模型,一頭是追求各種技術來實用化地把模型做小,這兩端會越來越重要。
如果上述假設成立,即預訓練領域的暴力美學依然暴力且美麗,那麼從今往後的模型改進,我們應該怎麼走呢?我的感覺,應該優先探索大資料+大模型的路,先走到暴力美學的盡頭,然後再集中精力探索模型本身的改進。就是說,我們應該先把資料紅利吃完,而不是優先發展新型模型,當然兩者可以並行做,但是原則上,新型模型優先順序不如先把資料紅利吃完。為什麼這麼說呢?因為,目前很多研究表明:大多數改進新模型帶來的提升,根本比不過提升資料質量數量的同時擴充模型容量帶來的收益。而一些新模型的有效性,在資料量小的時候可能是有效的,但很可能發生的一幕是,當資料增大模型容量加大後,很多改進不再有效。也就是說,目前很多新模型的作用,很可能是增加了特殊型別的語言知識的編碼和泛化能力,但是,這是完全可以透過增加資料數量和質量,並加大模型來達成的,這種方式又比較簡單直觀。所以,這是為何我覺得應該先把精力放到“大資料+大模型” 上,然後再集中精力進行模型改進的主要原因。
知識補習班:其它知識的引入
本文開頭講過,大多數預訓練模型是從自由文字中學習語言知識。但是,很明顯,我們能讓模型學的,肯定不止自由文字這一種型別。理論上,任何包含知識的資料,都有些先驗知識可供預訓練模型學習。我的感覺,預訓練模型的發展,會越來越像人腦,日益變成一個黑盒子。就是說,我們可以透過一定手段,餵給它資料,它就會學會其中包含的知識。但是,它是怎麼學會的,學到了什麼,這很可能對我們來說,會越來越難以理解,就是說,隨著預訓練模型學習領域的擴充,這個黑盒子,可能會越來越黑。下面我們介紹兩個典型的其它領域,看看預訓練模型是怎麼學的。當然,我相信這種預訓練方式,會擴充到越來越多的其它型別的資料或領域,這也是預訓練模型領域,一個比較明晰的發展趨勢。
顯示知識的引入
原始Bert的語言學知識,是從大量自由文字中自主學習的,那麼很自然的一個問題就是:我們過去已經透過一些技術手段,歸納出大量的結構化知識,比如知識圖譜;或者已經建立了很多知識分析工具,比如命名實體識別系統等。那麼能否利用這些知識識別工具,抑或已有的結構化知識,讓預訓練模型能夠直接學到這些知識?
目前也有很多工作在做這個事情,就是讓預訓練模型能夠編碼更多的結構化知識或者語言知識。至於如何做,有兩種典型的思路:一種以百度ERNIE為代表;一種以清華ERNIE為代表。這兩個工作是最早做這個事情的,差不多同時出來,但思路不同,正好是兩種具備代表性的方案。
百度ERNIE的思路是:在預訓練階段被Mask掉的物件上做文章,我們可以使用比如命名實體識別工具/短語識別工具,將輸入中的命名實體或者部分短語Mask掉(參考上圖),這些被Mask掉的片斷,代表了某種型別的語言學知識,透過這種方式,強迫預訓練模型去強化地學習相關知識。
清華ERNIE則是另外一種思路:我們已經有些結構化知識或者實體關係知識等現成的外部知識庫,可以在預訓練的過程中,透過工具找出句中的命名實體,句中的命名實體可以觸發知識庫中其它相關實體,然後預訓練模型透過特殊的結構,來融合文字和結構化知識,以進一步促進語言的理解(參考上圖)。這是另外一種思路。
關於知識的融入,後續還有很多工作,但是大體走的是上面兩條路線之一。關於將顯示知識或者結構化知識引入預訓練模型,我是這麼看的,純屬個人意見:
我覺得,假設說我們用來預訓練的資料量特別特別大,而且特徵抽取器的能力特別強。理論上,結構化知識是蘊含在這些文字內的,因為我們的外部知識庫也是透過技術手段從自由文字里挖掘出來的。假設上面兩個條件同時能夠被滿足,理論上,不太需要單獨再把結構化知識獨立補充給Bert這類預訓練模型,預訓練模型應該能夠直接從自由文字中就學會這些知識。但是,以我們目前的技術條件,上面兩個條件完全被滿足,還是有一定難度的。於是,在這種約束下,感覺獨立強化知識,讓Bert在編碼的時候更重視這些結構化知識,看上去是有一定補充作用的。我猜測,比較高頻出現的知識,已經能夠透過常規的語言模型預訓練能夠捕獲了,很可能對於那些偏冷門的知識,引入結構化知識,會對預訓練模型做下游任務有直接促進作用。而可以預見的是:隨著機器資源能力越來越強大,如果在第一個預訓練階段,不斷加大資料數量和質量,不斷增加Transformer模型容量,那麼,單獨補充結構化知識給預訓練模型,收益可能會越來越小。當然,以目前的技術發展階段,感覺這個事情還有空間和潛力可挖掘。當然,上面說的是通用知識,如果手上的外部知識庫,領域性很強,通用訓練資料中包含的相關領域資料很少,那麼,直接把知識引入,對於解決問題還是很有必要的。
多模態預訓練
隨著儲存容量越來越大、網路傳輸速度越來越快、計算速度越來越強,除了傳統的文字內容外,圖片、影片、音訊等各種多模態資訊在網際網路的內容佔比中越來越多。如何融合多種模態資訊進行內容理解,就變得越來越重要。那麼,能否將多模態資訊納入預訓練的框架之內呢?這是個非常有現實價值的問題。
前文有述,自由文字的預訓練,本質上是讓模型從海量自由文字中,透過語言模型等任務,來學習其中蘊含的的語言學知識。由此自然引發的問題就是:多模態預訓練也是要將某種新型的知識塞到模型引數裡,那麼,這是一種什麼樣的知識呢?本質上,多模態預訓練要學習的知識是兩種模態之間,或者多種模態之間,的知識單元對映關係。比如對於文字-圖片這兩種多模態資訊來說,我們可以把圖片想像成一種特殊型別的語言,多模態預訓練希望讓模型學會這兩種不同模態之間的語義對映關係,比如能夠將單詞“蘋果”和圖片中出現的蘋果區域建立起聯絡。或者說,希望透過將不同模態的資訊對映到相同的語義空間,來學會兩者之間的語義對映關係。
如果我們能夠成功地學會這種不同媒介間的語義對映,那麼就可以做很多有意思的事情,比如說句話,搜出與這句話語義相近的圖片(參考上圖);或者反過來,輸入一個圖片,能夠找到或者生成對應的文字描述。再比如VQA(參考上圖),就是給定一張圖片,你可以針對圖片提出一些問題,AI系統能夠回答你的問題,給出正確答案。這涉及到圖片-文字的跨媒體問答以及一些跨媒體的知識推理。而要想實現這種能力,如何透過預訓練模型,讓模型學會兩種模態之間的語義對映關係就是至關重要的。
我們面臨的第一個問題是:從什麼樣的資料裡來學習不同模態之間的語義對映關係呢?自由文字的預訓練模型,可以採納海量無標註資料來做,然而,多模態預訓練要學習不同模態資訊間的語義對映關係,所以需要有標註好的“模態1-模態2”的對齊資料,比如:標註好的“文字-圖片”或者“文字-影片”平行資料。只有具備跨模態對齊資料,模型才有可能從中學習不同媒介型別之間的語義對映關係。從這個角度講,相對自由文字預訓練來說,多模態預訓練因為需要模態對齊訓練資料,而這種資料往往是需要人工標註的,所以可獲得的資料難度及成本就高了很多,明顯不如文字預訓練那麼自由。
總體而言,目前的多模態預訓練任務中,通常都是“雙模態”預訓練,常見的包括“文字-圖片”、“文字-影片”、“影片-音訊”等模態型別組合。其中, 相對而言,“文字-圖片”型別的任務技術發展比較快,其它型別的多模態型別發展相對緩慢,我猜測這裡的主要原因在於可用標註資料的差異。“文字-圖片”目前有一些規模達到幾十萬到上百萬規模的標註資料集合,典型的比如MS-COCO、Visual Gnome等,而其它型別的模態組合資料貌似缺乏大規模資料集合,這嚴重影響了領域技術進展。下面我們從“文字-圖片”這種模態組合來宏觀介紹下多模態預訓練的常規做法,其它模態組合的技術方案差不太多,所缺的可能主要是標註好的模態對齊資料。
我們從模型結構和訓練目標這兩個角度來闡述。目前的大多數技術方案大同小異,主要差異在於採用了不同的模型結構及與不同訓練目標的差異組合。
假設我們有“文字-圖片”兩種模態資料,需要聯合學習三種預訓練模型:文字模態自身的預訓練模型,圖片模態自身的預訓練模型,以及兩個模態之間的語義對齊預訓練模型。從模型結構來說,目前主流的結構有兩種:雙流互動模型以及單流互動模型。
典型雙流互動模型結構如上圖LXMERT模型所示。文字編碼器代表一個流,一般採用Transformer模型捕捉文字單詞之間的關係;圖片編碼器代表另外一個流,一般也是採用Transformer模型,對於圖片來說,一般用Faster-RCNN模型識別出圖片中包含的多個物體及其對應的矩形位置資訊,將高置信度的物體及其對應的位置資訊作為圖片側Transformer的輸入,用來學習圖片中物品的相互關係;在兩個流之上,再加入額外的Transformer模型,用於融合兩個模態的語義對映關係。在這種雙流結構上,模型同時學習文字預訓練目標、圖片預訓練目標,以及圖片-文字對齊預訓練目標。一般文字預訓練目標和標準的Bert做法類似,透過隨機Mask一部分文字單詞的語言模型來做;圖片預訓練目標類似,可以Mask掉圖片中包含的部分物品,要求模型正確預測物品類別或者預測物品Embedding編碼;為了能夠讓兩個模態語義對齊,一般還要學習一個跨模態目標,常規做法是將對齊語料中的“文字-圖片”作為正例,隨機選擇部分圖片或者文字作為負例,來要求模型正確做二分類問題,透過這種方式逼迫模型學習兩種模態間的對齊關係。典型的雙流模型包括LXMERT、ViLBERT等。
典型的單流互動模型結構如上圖Unicoder-VL模型所示。單流和雙流的區別在於:單流模型只用一個Transformer,而雙流模型,如上所述,需要三個Transformer各自分工協作。輸入的圖片,經過上述的Faster-RCNN物體識別和位置編碼後,和文字單詞拼接,整體作為Transformer模型的輸入。也就是說,單流模型靠單個Transformer,同時學習文字內部單詞互動、圖片中包含物體之間大的互動,以及文字-圖片之間的細粒度語義單元之間的互動資訊。單流模型的預訓練目標,與雙流互動模型是類似的,往往也需要聯合學習文字預訓練、圖片預訓練以及對齊預訓練三個目標。典型的單流模型包括Unicoder-VL、VisualBERT、VL-VERT、UNITER等。
經過多模態預訓練之後,是否模型能夠建立起不同模態資訊之間的語義對映關係呢?答案可以參考上圖:經過預訓練後,輸入一句話以及對應的圖片進入模型,對於文字中的某個單詞,我們可以觀察這個單詞與圖片中哪塊區域聯絡密切(根據Attention強度資訊可以看出)。從上圖示例可以看出,預訓練模型確實學會了不同模態單詞語義之間的對映關係。
多模態模型經過預訓練之後,針對具體的應用任務,可以採取第二階段Fine-tuning的模式增強應用效果。從上述描述可見,單流模型結構相對簡單,模型引數也相對少些,而且能夠在模型底層及早對不同模態之間的語義直接建立聯絡,所以看起來比雙流模式更有發展前景,但是從目前的各種研究對比實驗結果看,貌似兩種方法的效果在伯仲之間。不過,可以得出的結論是,採用預訓練模型的多模態方法,比不用預訓練的傳統方法,在應用效果上是有明顯提升的。
目前來看,如果希望多模態預訓練有更快速的技術發展,以下幾個方面是需要重點關注的:
首先,也是最重要的,可能是急需構建不同模態間的大規模對齊資料。目前,“圖片-文字”型別的對齊資料規模尚可,但是繼續擴大資料規模無疑是有益的;對其它型別的模態組合而言,大規模的標準對齊資料比較缺乏,這會嚴重製約多模態預訓練的發展。所以明顯需要資料先行,這是發展技術的前提條件;
其次,感覺在自由文字預訓練研究領域中,目前得到的一些得到驗證的經驗,推理起來,應該是能夠直接遷移到多模態預訓練領域的。典型的經驗,比如:在擴大資料規模的同時,增加模型複雜度。增加模型複雜度包括圖片特徵抽取器模型複雜度(已經有實驗驗證加深ResNet模型對效果提升明顯),以及增加對應的Transformer層深,放大Transformer的Hidden Size等,相信這是能夠大幅提升多模態預訓練的首選手段;再比如文字預訓練任務中的Mask物件,採用Span方式而非單詞方式(已有工作這麼做了),加大Batch Size延長訓練時間等訓練方法最佳化手段,想來都應該是有益的;從訓練目標來說,目前的模態間對齊任務還是有點類似NSP這種句子分類任務,明顯偏簡單了一些,這塊可以考慮引入更有難度的對齊任務,以及實體級別細粒度的對齊任務,來增強模態對齊模型的效果。
再次,可以考慮由目前的兩模態向真正的多模態擴充套件,比如三模態動態聯合訓練,目前常見的是“文字-圖片”,或者“文字-影片”,通常是兩模態結構,後面可以考慮“文字-圖片-音訊”,或者“文字-影片-音訊”等三模態甚至更多模態的聯合預訓練。當然,這麼做的前提,仍然是得先有多模態的對齊資料。
多多益善:從兩階段模型到四階段模型
經典的預訓練模型框架下,一般我們解決NLP問題有兩個階段:第一階段是模型預訓練階段,預訓練模型從文字等資訊中學習語言知識;第二階段是Fine-tuning階段,根據手上的有監督資料,對模型引數進行微調,以獲得更好的任務效果。
前文有述,預訓練階段的最明顯發展趨勢是大資料+大模型,在資料質量有保障的前提下,資料量越大,模型容量越大,預訓練階段學到的語言知識效果越好。其實,關於預訓練資料,目前還有很多研究,能夠得出另外一個結論:從領域、題材、型別等不同角度看,如果預訓練資料和手上任務資料越接近,則預訓練模型帶來的收益就越大。
很多時候,我們手頭上的任務資料有很強的領域性,比如可能是計算機領域的,因為預訓練資料一般具備通用性,即使大量預訓練文字里包含部分計算機類的文字,整體佔比也很小。於是,這種情況下,由於領域差異比較大,預訓練模型帶給手頭任務的收益,就沒期望中那麼大。一種直觀的,也是不少人在用的解決方案是:把領域性文字,也加入到預訓練資料中,一同參與預訓練過程,這樣能夠增加預訓練文字和手上任務的相似性,就能提升任務效果。事實上,這樣做也確實能解決這個問題。但是,有一個問題:預訓練階段往往會兼顧模型的通用性,儘可能兼顧各種下游任務,希望模型能在不同領域都有效。而且,從趨勢看,資料規模和模型規模會越來越大,也就是訓練成本會越來越高。所以,這種把領域資料新增到預訓練資料一起訓練的做法,一則影響模型通用性,二則實現成本高,看上去就不是特別好的方法。
目前看,要解決這個問題,比較好的方法是把兩個階段分離:第一階段仍然採取大資料、大模型,走通用普適、各種任務都能受益的路子,不特意考慮領域特點,因為兼顧不過來;第二階段,在第一階段訓練好的通用預訓練模型基礎上,利用領域資料,再做一次預訓練,等於把通用的預訓練模型往領域方向拉動一下。這樣兩個階段各司其職,有獨立的最佳化目標,也能兼顧通用性和領域適配性。
上面這個方法,我猜應該不少人都已經在這麼做了,論文“Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks”也透過大量實驗驗證了領域資料預訓練(DAPT)的有效性,再結合它得出的另外一個重要結論:用手上的任務資料,無論大小,如果做一次任務級資料預訓練(TAPT),也就是拿著手上任務資料,在通用預訓練模型基礎上,再做一次預訓練,也能夠有效提升任務效果。綜合這個文章和其它有關文章的結論,我們不難看出,要想更好地提升任務效果,我們應該從傳統的兩階段模型,擴充到如下四階段模型(參考上圖):
第一個階段:通用預訓練
這就是傳統兩階段模式中的第一階段。這個階段不僅僅追求效果好,也追求領域通用性。它的最佳化目標是:在儘可能多的下游任務場景中,效果都儘可能好,但不單獨考慮某個特殊領域的效果如何。這個階段,目前看總的發展趨勢是:在資料質量有保證的前提下,增加資料數量,以及資料的多樣性,同時提升模型複雜度,這樣可以提供普遍有效的模型增強能力。很明顯,這個階段,一般只有土豪公司才能做得起,而且從趨勢看,會越來越如此。將來的發展模式可能是,超級土豪公司不斷最佳化這個模型,然後放出來供大家用,有能力做這個事情的人,應該會越來越少。
第二個階段:領域預訓練
在第一階段訓練好的通用預訓練模型基礎上,利用不同領域的自由文字,構建多個、不同領域的領域預訓練模型。比如我們可以分別收集計算機領域、生物領域、電商領域…等等,多個不同領域的無標註自由文字資料。在第一階段通用模型基礎上,分別用各個領域資料,再分別做一次預訓練,這樣我們就得到了適合解決各個不同領域的預訓練模型:計算機領域、生物領域、電商領域…..等等多個不同的預訓練模型。下游任務可以根據自己任務的領域,選擇適配性好的領域預訓練模型來使用。
這個階段的預訓練模型,在訓練的時候,有個獨特的問題需要解決:災難遺忘問題。所謂“災難遺忘”,就是說,當你用領域資料進行預訓練的時候,因為會調整第一階段預訓練模型的引數,這種偏向領域性的引數調整,可能會導致第一階段模型學好的引數被改寫,這意味著:經過第二階段預訓練,第一階段預訓練模型裡學會的很多通用語言知識,可能會被沖掉。災難遺忘就是這個意思。災難遺忘問題,對於預訓練模型,尤其是領域預訓練模型來說,是個很關鍵也很重要的問題,目前也有一些解決方案,限於篇幅,這裡就不展開了。
這個階段的預訓練,因為資料量相比第一階段會小很多,所以其實中農公司甚至貧農公司也能做得起,不存在土豪門檻,大家應該都能做。當然,一般我們只做跟自己手頭任務相關的領域的預訓練模型。如果你想做很多領域的預訓練模型,那估計也要備足銀行卡。估計後續也會有土豪公司做好很多不同領域的預訓練模型,供大家個性化適配使用,雖說目前還沒有,但是推斷起來,這是個大機率會發生的事件。
第三個階段:任務預訓練
在前兩個預訓練模型基礎上,比如從第二個階段裡面的多個不同的領域預訓練模型中,選擇和手頭任務適配的那個領域預訓練模型,在這個模型基礎上,用手頭資料,拋掉資料標籤,再做一次預訓練,無論手上任務資料有多少。比如手上任務是計算機領域的,那麼從第二階段的多個領域模型裡面,選擇計算機領域適配過的預訓練模型,在這個模型基礎上進行一次任務級別的預訓練。這樣應該能明顯提升任務效果。
第四階段:任務Fine-tuning
這是傳統兩階段的第二階段,做法一樣,沒什麼好講的。
當然,如果你手上的任務沒有那麼強的領域性,可以跳過第二階段,也就是那個領域預訓練模型階段,走剩餘的三階段模式即可,無論如何,任務預訓練都是值得做的一個事情。
聚沙成塔:如何建造強大的預訓練模型
上文從不同角度或維度,總結了預訓練模型某個方面的一些結論,我們綜合起來看一下。不論出於什麼目的,打榜也好,把手頭應用做得更出色也好,如果我們綜合各個維度的現有資訊,那麼,在當前技術水準下,如何構造強大的預訓練模型,貌似是可以得出相對明晰結論的。因為NLP裡面既有語言理解類任務,也有語言生成類任務,兩者差異較大,所以我們分頭來看。
對於語言理解類任務,我假設你的任務不是領域性特別強那種型別的,建議採取如下技術方案:
使用三階段模型:通用預訓練+任務預訓練+任務Fine-tuning。在做完第一階段預訓練後,用手頭任務資料,拋掉標籤,再做一次任務預訓練,然後任務Fine-tuning。
模型結構建議採取Encoder+Decoder結構,或者Encoder-AE結構;預訓練任務配置兩個:獨立生成Span類語言模型及SOP句子任務;在質量優先的前提下,增加預訓練資料的數量;比較關鍵的一點是,一定要增加模型容量:可以縱向增加Transformer Block層深,或者橫向調大Transformer相應位置可配置引數大小。當然,如果你不差錢,兩個可以一起上。另外,要使得模型得到充分訓練,就是說增大訓練過程中的Batch Size和訓練步長。
對於語言生成類任務,建議採取如下技術方案:
使用兩階段模型:通用預訓練+任務Fine-tuning。模型結構建議採取Encoder+Decoder結構,或者Decoder-AR結構;預訓練任務採用獨立生成Span類語言模型;在質量優先的前提下,增加預訓練資料的數量;同樣,比較關鍵的一點是,一定要增加模型容量:可以縱向增加Transformer Block層深,或者橫向調大Transformer相應位置可配置引數大小。當然,如果你不差錢,兩個可以一起上。另外,也要使得模型得到充分訓練,就是說增大訓練過程中的Batch Size和訓練步長。
相信採取上述技術方案,你能在打榜過程中獲得很好的名次,或者在實際工作中能比較快地完成自己的KPI或OKR。當然,如果是走落地應用的路子,關於知識蒸餾等一系列如何將模型做小這方面,記得要多花點功夫。
https://blog.csdn.net/weixin_42137700/article/details/108912436
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2725419/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 乘風破浪
- 從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史模型自然語言處理
- 【預訓練語言模型】 使用Transformers庫進行BERT預訓練模型ORM
- 孟子小樣本和檢索式預訓練模型進展模型
- 從Word Embedding到Bert模型——自然語言處理預訓練技術發展史模型自然語言處理
- TorchVision 預訓練模型進行推斷模型
- 周明:預訓練模型在多語言、多模態任務的進展模型
- 【預訓練語言模型】使用Transformers庫進行GPT2預訓練模型ORMGPT
- 乘風破浪,抓住良機
- BERT預訓練模型的演進過程!(附程式碼)模型
- 自訓練 + 預訓練 = 更好的自然語言理解模型模型
- 乘風破浪 :佈局下一個新興醫藥技術時代
- MxNet預訓練模型到Pytorch模型的轉換模型PyTorch
- 程式設計師如何乘風破浪?從資料庫歷史看技術人發展 | 週四直播程式設計師資料庫
- PyTorch預訓練Bert模型PyTorch模型
- 乘風破浪的免費OA辦公系統
- 講堂丨周明:預訓練模型在多語言、多模態任務的進展模型
- 谷歌開源 BERT:最先進的 NLP 預訓練技術,支援中文和更多語言谷歌
- 乘風破浪,Windows11預覽版升級和安裝,積極準備中的大躍進Windows
- 預訓練模型 & Fine-tuning模型
- 【AI】Pytorch_預訓練模型AIPyTorch模型
- 一文講透預訓練模型的改進訓練演算法 ,輕鬆達到State of the Art模型演算法
- 預訓練模型ProphetNet:根據未來文字資訊進行自然語言生成模型
- TensorFlow 呼叫預訓練好的模型—— Python 實現模型Python
- keras中VGG19預訓練模型的使用Keras模型
- 七一建黨節|乘風破浪 向前!向前!
- 新型大語言模型的預訓練與後訓練正規化,谷歌的Gemma 2語言模型模型谷歌Gemma
- 新型大語言模型的預訓練與後訓練正規化,Meta的Llama 3.1語言模型模型
- 知識增強的預訓練語言模型系列之ERNIE:如何為預訓練語言模型注入知識模型
- 二十年曆經坎坷多磨練,GBASE南大通用乘風破浪新起航
- 人工智慧的預訓練基礎模型的分類人工智慧模型
- 新型大語言模型的預訓練與後訓練正規化,阿里Qwen模型阿里
- NLP領域預訓練模型的現狀及分析模型
- 「NLP」GPT:第一個引入Transformer的預訓練模型GPTORM模型
- COLING 2020 | CharBERT:字元敏感的預訓練語言模型字元模型
- 取出預訓練模型中間層的輸出(pytorch)模型PyTorch
- 新型大語言模型的預訓練與後訓練正規化,蘋果的AFM基礎語言模型模型蘋果
- 都已經十歲的 Apache Dubbo,還能再乘風破浪嗎?Apache