作者:吳金龍,愛因互動技術(shù)合伙人,算法負責(zé)人
知乎專欄:智能對話機器人技術(shù)
2018年是NLP的收獲大年,模型預(yù)訓(xùn)練技術(shù)終于被批量成功應(yīng)用于多項NLP任務(wù)。之前搞NLP的人一直羨慕搞CV的人,在ImageNet上訓(xùn)練好的模型,居然拿到各種任務(wù)里用都非常有效?,F(xiàn)在情形有點逆轉(zhuǎn)了。搞CV的人開始羨慕搞NLP的人了。CV界用的還是在有監(jiān)督數(shù)據(jù)上訓(xùn)練出來的模型,而NLP那幫家伙居然直接搞出了在無監(jiān)督數(shù)據(jù)上的通用預(yù)訓(xùn)練模型!要知道NLP中最不缺的就是無監(jiān)督的文本數(shù)據(jù),幾乎就是要多少有多少。還有個好消息是目前NLP中通用預(yù)訓(xùn)練模型的效果還遠沒達到極限。目前發(fā)現(xiàn)只要使用更多的無監(jiān)督數(shù)據(jù)訓(xùn)練模型,模型效果就會更優(yōu)。這種簡單粗暴的優(yōu)化方法對大公司來說實在再經(jīng)濟不過。而且,算法本身的效果也在快速迭代中。NLP的未來真是一片光明啊~
BERT發(fā)布之后,點燃了NLP各界的歡騰,各路神仙開始加班加點各顯神通,很多相關(guān)工作被發(fā)表出來。本文會介紹其中的一些代表性工作,但更重要的是希望理清這些背后的邏輯,為它們歸歸類。通過這些思考,我自己也對NLP以后的工作方向有些預(yù)測,供大家參考。
本文的內(nèi)容主要包括以下幾部分:
我對遷移學(xué)習(xí)和模型預(yù)訓(xùn)練的一些思考,以及對未來工作方向的粗略預(yù)測
各類代表性工作的具體介紹(熟悉的同學(xué)可忽略),又細分為以下幾大類:
有監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練
自監(jiān)督訓(xùn)練
無監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練
多個有監(jiān)督數(shù)據(jù)同時訓(xùn)練:多任務(wù)學(xué)習(xí)
3. 一些我們的實踐經(jīng)驗、別人和自己的觀點、以及總結(jié)和感想
第一和第三部分內(nèi)容相對少,原創(chuàng)密度大點,大家要是趕時間的話看這兩部分就夠了。第二部分的內(nèi)容都是具體技術(shù),有很多很好的文章都介紹過。放在本文當(dāng)中一是為了文章的完備性,另一個是里面提到的一些知識點在其他地方?jīng)]怎么提到。第三部分也會涉及到我們(愛因互動)自己在一些任務(wù)上的實驗工作,期望這些結(jié)果能堅定大家在自己的工作中把模型預(yù)訓(xùn)練技術(shù)用起來。
終于可以開始了。
把我們當(dāng)前要處理的NLP任務(wù)叫做T(T稱為目標(biāo)任務(wù)),遷移學(xué)習(xí)技術(shù)做的事是利用另一個任務(wù)S(S稱為源任務(wù))來提升任務(wù)T的效果,也即把S的信息遷移到T中。至于怎么遷移信息就有很多方法了,可以直接利用S的數(shù)據(jù),也可以利用在S上訓(xùn)練好的模型,等等。
依據(jù)目標(biāo)任務(wù)T是否有標(biāo)注數(shù)據(jù),可以把遷移學(xué)習(xí)技術(shù)分為兩大類,每個大類里又可以分為多個小類。
第一大類是T沒有任何標(biāo)注數(shù)據(jù),比如現(xiàn)在很火的無監(jiān)督翻譯技術(shù)。但這類技術(shù)目前主要還是偏學(xué)術(shù)研究,離工業(yè)應(yīng)用還有挺長距離的。工業(yè)應(yīng)用中的絕大部分任務(wù),我們總是能想辦法標(biāo)注一些數(shù)據(jù)的。而且,目前有監(jiān)督模型效果要顯著優(yōu)于無監(jiān)督模型。所以,面對完全沒有標(biāo)注數(shù)據(jù)的任務(wù),最明智的做法是先借助于無監(jiān)督技術(shù)(如聚類/降維)分析數(shù)據(jù),然后做一些數(shù)據(jù)標(biāo)注,把原始的無監(jiān)督任務(wù)轉(zhuǎn)變?yōu)橛斜O(jiān)督任務(wù)進行求解?;谶@些原因,本文不再介紹這大類相關(guān)的工作。
第二大類是T有標(biāo)注數(shù)據(jù),或者說T是個有監(jiān)督任務(wù)。這類遷移學(xué)習(xí)技術(shù)又可以依據(jù)源任務(wù)是否有監(jiān)督,以及訓(xùn)練順序兩個維度,大致分為四小類:
源任務(wù)S是無監(jiān)督的,且源數(shù)據(jù)和目標(biāo)數(shù)據(jù)同時用于訓(xùn)練:此時主要就是自監(jiān)督(self-supervised)學(xué)習(xí)技術(shù),代表工作有之后會講到的CVT。
源任務(wù)S是有監(jiān)督的,且源數(shù)據(jù)和目標(biāo)數(shù)據(jù)同時用于訓(xùn)練:此時主要就是多任務(wù)(multi-task)學(xué)習(xí)技術(shù),代表工作有之后會講到的MT-DNN。
源任務(wù)S是無監(jiān)督的,且先使用源數(shù)據(jù)訓(xùn)練,再使用目標(biāo)數(shù)據(jù)訓(xùn)練(序貫訓(xùn)練):此時主要就是以BERT為代表的無監(jiān)督模型預(yù)訓(xùn)練技術(shù),代表工作有ELMo、ULMFiT、GPT/GPT-2、BERT、MASS、UNILM。
源任務(wù)S是有監(jiān)督的,且先使用源數(shù)據(jù)訓(xùn)練,再使用目標(biāo)數(shù)據(jù)訓(xùn)練(序貫訓(xùn)練):此時主要就是有監(jiān)督模型預(yù)訓(xùn)練技術(shù),類似CV中在ImageNet上有監(jiān)督訓(xùn)練模型,然后把此模型遷移到其他任務(wù)上去的范式。代表工作有之后會講到的CoVe。
先說說上表中四個類別的各自命運。以BERT為代表的無監(jiān)督模型預(yù)訓(xùn)練技術(shù)顯然是最有前途的。之前也說了,NLP中最不缺的就是無監(jiān)督數(shù)據(jù)。只要堆計算資源就能提升效果的話,再簡單不過了。
而無監(jiān)督預(yù)訓(xùn)練的成功,也就基本擠壓掉了自監(jiān)督學(xué)習(xí)提升段位的空間。這里說的自監(jiān)督學(xué)習(xí)不是泛指,而是特指同時利用無監(jiān)督數(shù)據(jù)和當(dāng)前有監(jiān)督數(shù)據(jù)一起訓(xùn)練模型的方式。既然是同時訓(xùn)練,就不太可能大規(guī)模地利用無監(jiān)督數(shù)據(jù)(要不然就要為每個特定任務(wù)都訓(xùn)練很久,不現(xiàn)實),這樣帶來的效果就沒法跟無監(jiān)督預(yù)訓(xùn)練方式相比。但自監(jiān)督學(xué)習(xí)還是有存在空間的,比如現(xiàn)在發(fā)現(xiàn)在做有監(jiān)督任務(wù)訓(xùn)練時,把語言模型作為輔助損失函數(shù)加入到目標(biāo)函數(shù)中,可以減輕精調(diào)或多任務(wù)學(xué)習(xí)時的災(zāi)難性遺忘(Catastrophic Forgetting)問題,提升訓(xùn)練的收斂速度。所以有可能在訓(xùn)練時加入一些同領(lǐng)域的無監(jiān)督數(shù)據(jù),不僅能減輕遺忘問題,還可能因為讓模型保留下更多的領(lǐng)域信息而提升最終模型的泛化性。但這個方向迎來大的發(fā)展可能性不大。
而類似CV中使用大規(guī)模有監(jiān)督數(shù)據(jù)做模型預(yù)訓(xùn)練這條路,看著也比較暗淡,它自己單獨不太可能有很大前景。幾個原因:1) 這條路已經(jīng)嘗試了很久,沒有很顯著的效果提升。2) NLP中獲取大規(guī)模標(biāo)注數(shù)據(jù)很難,而且還要求對應(yīng)任務(wù)足夠復(fù)雜以便學(xué)習(xí)出的模型包含各種語言知識。雖然機器翻譯任務(wù)很有希望成為這種任務(wù),但它也存在很多問題,比如小語種的翻譯標(biāo)注數(shù)據(jù)很少,翻譯標(biāo)注數(shù)據(jù)主要還是單句形式,從中沒法學(xué)習(xí)到背景信息或多輪等信息。但從另一個方面看,NLP搞了這么久,其實還是積累了很多標(biāo)注或者結(jié)構(gòu)化數(shù)據(jù),比如知識圖譜。如何把這些信息融合到具體任務(wù)中最近一直都是很活躍的研究方向,相信將來也會是。只是BERT出來后,這種做法的價值更像是打補丁,而不是搭地基了。
多任務(wù)學(xué)習(xí)作為代價較小的方法,前景還是很光明的。多個同領(lǐng)域甚至同數(shù)據(jù)上的不同任務(wù)同時訓(xùn)練,不僅能降低整體的訓(xùn)練時間,還能降低整體的預(yù)測時間(如果同時被使用),還能互相提升效果,何樂而不為。當(dāng)然,多任務(wù)學(xué)習(xí)的目標(biāo)一開始就不是搭地基。
上面說了這么多,其實想說的重點在下面。這些技術(shù)不一定非要單獨使用啊,組合起來一起用,取長補短不是就皆大歡喜了嘛。
先回顧下現(xiàn)在的無監(jiān)督模型預(yù)訓(xùn)練流程,如下圖:
首先是利用大的無監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練通用模型,優(yōu)化目標(biāo)主要是語言模型(或其變種)。第二步,利用有監(jiān)督數(shù)據(jù)精調(diào)上一步得到的通用模型。這么做的目的是期望精調(diào)以后的通用模型更強調(diào)這個特定任務(wù)所包含的語言信息。這一步是可選的(所以圖中對應(yīng)加了括號
),有些模型框架下沒有這個步驟,比如BERT里面就沒有。第三步才是利用有監(jiān)督數(shù)據(jù)中對應(yīng)的標(biāo)注數(shù)據(jù)訓(xùn)練特定任務(wù)對應(yīng)的模型。
那這個流程接下來會怎么發(fā)展呢?
上面我已經(jīng)對四類方法做了分別的介紹,包括對它們各自前途的簡單判斷,也介紹了當(dāng)下效果最好的模型預(yù)訓(xùn)練流程。相信未來NLP的很多工作都會圍繞這個流程的優(yōu)化展開。我判斷這個流程會繼續(xù)發(fā)展為下面這個樣子:
詳細說明下每個步驟:
第一步還是利用大的無監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練通用模型。但這里面目前可以改進的點有很多,比如發(fā)展比Transformer更有效的特征抽取結(jié)構(gòu),現(xiàn)在的Evolved Transformer和Universal Transformer等都是這方面的探索。發(fā)展更有效更多樣化的預(yù)訓(xùn)練模型目標(biāo)函數(shù)。目前預(yù)訓(xùn)練模型的目標(biāo)函數(shù)主要是(Masked) LM和Next Sentence Prediction (NSP),還是挺單一的。面向文檔級背景或多輪這種長文本信息,未來應(yīng)該會發(fā)展出更好的目標(biāo)函數(shù)。比如有可能會發(fā)展出針對多輪對話這種數(shù)據(jù)的目標(biāo)函數(shù)。
BERT主要面向的是NLU類型的任務(wù),目前微軟提出的MASS、UNILM從不同的角度把BERT框架推廣到NLG類型的任務(wù)上了,細節(jié)我們之后會講到。GPT-2利用更大的模型獲得了更好的語言模型。更多更好的數(shù)據(jù),更大的模型帶來的改進有沒有極限?目前還不知道,相信很多公司已經(jīng)在做這方面的探索了。但這個游戲目前還是只有大公司能玩得起,訓(xùn)練通用大模型太耗錢了。提升訓(xùn)練效率,很自然的就是另一個很重要的優(yōu)化方向。
第二步是利用其他大任務(wù)的標(biāo)注數(shù)據(jù)或已有結(jié)構(gòu)化知識精調(diào)第一步獲得的通用模型。這一步不一定以單獨的形式存在,它也可以放到第一步中,在預(yù)訓(xùn)練通用模型時就把這些額外信息注入進去,比如百度的ERNIE就是在預(yù)訓(xùn)練時就把實體信息注入進去了。既然人類在漫長的AI研究史上積累了大量各式各樣的結(jié)構(gòu)化數(shù)據(jù),比如機器翻譯標(biāo)注數(shù)據(jù),沒理由不把它們用起來。相信未來會有很多知識融合(注入)這方面的工作。
第三步和前面流程的第二步相同,即利用當(dāng)前任務(wù)數(shù)據(jù)進一步精調(diào)上一步得到的通用模型。這么做的目的是期望精調(diào)后的模型更強調(diào)這個特定任務(wù)所包含的語言信息。ELMo的實驗結(jié)論是,加入這一步往往能提升下一步的特定任務(wù)有監(jiān)督訓(xùn)練的收斂速度,但僅在部分任務(wù)上最終模型獲得了效果提升(在另一部分任務(wù)上持平)。
另一種做法是把這一步與下一步的特定任務(wù)有監(jiān)督訓(xùn)練放在一塊進行,也即在特定任務(wù)有監(jiān)督訓(xùn)練時把語言模型作為輔助目標(biāo)函數(shù)加入到訓(xùn)練過程中,以期提升模型收斂速度,降低模型對已學(xué)到知識的遺忘速度,提升最終模型的效果。GPT的實驗結(jié)論是,如果特定任務(wù)有監(jiān)督訓(xùn)練的數(shù)據(jù)量比較大時,加入輔助語言模型能改善模型效果,但如果特定任務(wù)有監(jiān)督訓(xùn)練的數(shù)據(jù)量比較小時,加入輔助語言模型反而會降低模型效果。但ULMFiT上的結(jié)論剛好相反。。所以就試吧。
利用多任務(wù)或者單任務(wù)建模方式在有監(jiān)督數(shù)據(jù)集上訓(xùn)練特定任務(wù)模型。多任務(wù)的很多研究相信都能移植到這個流程當(dāng)中。我們之后會介紹的微軟工作MT-DNN就是利用BERT來做多任務(wù)學(xué)習(xí)的底層共享模型。論文中的實驗表明加入多任務(wù)學(xué)習(xí)機制后效果有顯著提升。相信在這個方向還會有更多的探索工作出現(xiàn)。在單任務(wù)場景下,原來大家發(fā)展出的各種任務(wù)相關(guān)的模型,是否能在無監(jiān)督預(yù)訓(xùn)練時代帶來額外的收益,這也有待驗證。
總結(jié)下,未來NLP的主要工作可能都會圍繞這個流程展開。對流程前面步驟的優(yōu)化帶來的收益比后面步驟大,也更難。所以諸君請自己拿捏吧~。
套用下前面對遷移學(xué)習(xí)分類的方式,把接下來要介紹的具體模型放到對應(yīng)的模塊里,這樣邏輯會更清楚一些。
我們先介紹CoVe和CVT。
CoVe是在 McCann et al., Learned in Translation: Contextualized Word Vectors 這個論文中提出的。自然語言中的一詞多義非常常見,比如“蘋果手機”和“蘋果香蕉”里的“蘋果”,含義明顯不同。以Word2Vec為代表的詞表示方法沒法依據(jù)詞所在的當(dāng)前背景調(diào)整表示向量。所以NLPer一直在嘗試找背景相關(guān)的詞表示法(Contextualized Word Representation)。CoVe就是這方面的一個嘗試。
CoVe首先在翻譯標(biāo)注數(shù)據(jù)上預(yù)訓(xùn)練encoder2decoder模型。其中的encoder模塊使用的是BiLSTM。訓(xùn)練好的encoder,就可以作為特征抽取器,獲得任意句子中每個token的帶背景詞向量:
使用的時候,只要把
和 拼接起來就行。論文作者在分類和匹配下游任務(wù)對CoVe的效果做過驗證,效果肯定是有一些提升了,但提升也不是很明顯。
總結(jié)下CoVe的特點:
預(yù)訓(xùn)練依賴于有監(jiān)督數(shù)據(jù)(翻譯數(shù)據(jù))。
CoVe結(jié)果以特征抽取的方式融合到下游任務(wù)模型中,但下游任務(wù)還是要自定義對應(yīng)的模型。
CVT (Cross-View Training)在利用有監(jiān)督數(shù)據(jù)訓(xùn)練特定任務(wù)模型時,同時會使用無監(jiān)督數(shù)據(jù)做自監(jiān)督學(xué)習(xí)。Encoder使用的是2層的CNN-BiLSTM,訓(xùn)練過程使用標(biāo)注數(shù)據(jù)和非標(biāo)注數(shù)據(jù)交替訓(xùn)練。利用標(biāo)注數(shù)據(jù)訓(xùn)練主預(yù)測模塊,同時構(gòu)造多個輔助模塊,輔助模塊利用非標(biāo)注數(shù)據(jù)擬合主模塊的預(yù)測概率。輔助模塊的輸入僅包含所有輸入中的部分信息,這個思想和dropout有點像,可以提高模型的穩(wěn)定性。不同的特定任務(wù),輔助模塊的構(gòu)造方式不同,如何選輸入中部分信息的方式也不同。
例如,對于序列標(biāo)注任務(wù),論文中以biLSTM第一層和第二層的狀態(tài)向量拼接后輸入進主預(yù)測模塊。而4個輔助模塊則使用了第一層的各個單向狀態(tài)向量作為輸入。
使用的是第一層前向LSTM當(dāng)前詞的狀態(tài)向量, 使用的是第一層后向LSTM當(dāng)前詞的狀態(tài)向量。 使用的是第一層前向LSTM前一個詞的狀態(tài)向量,而 使用的是第一層后向LSTM后一個詞的狀態(tài)向量。作者也在多任務(wù)學(xué)習(xí)上驗證了CVT帶來效果提升。CVT使用多個標(biāo)注數(shù)據(jù)和非標(biāo)注數(shù)據(jù)交替訓(xùn)練。使用標(biāo)注數(shù)據(jù)訓(xùn)練時,CVT隨機選擇一個任務(wù),優(yōu)化對應(yīng)任務(wù)的主模塊目標(biāo)函數(shù)。使用非標(biāo)注數(shù)據(jù)訓(xùn)練時,CVT為所有任務(wù)產(chǎn)生對應(yīng)的輔助模塊。這些輔助模塊同時被訓(xùn)練,相當(dāng)于構(gòu)造了一些所有任務(wù)共用的標(biāo)注數(shù)據(jù)。這種共用的訓(xùn)練數(shù)據(jù)能提升模型收斂速度。作者認為效果提升的主要原因是,同時訓(xùn)練多個任務(wù)能降低模型訓(xùn)練一個任務(wù)時遺忘其他任務(wù)知識的風(fēng)險。
總結(jié)下CVT的特點:
在訓(xùn)練特定任務(wù)模型時加入無監(jiān)督數(shù)據(jù)做自監(jiān)督學(xué)習(xí),獲得了精度的提升。其中輔助模塊的構(gòu)建是關(guān)鍵。
嗯,需要為不同任務(wù)定制不同的輔助模塊。
應(yīng)用于MTL問題效果比ELMo好。
ELMo (Embedding from Language Models) 的目的是找到一種帶背景的詞向量表示方法,以期在不同的背景下每個詞能夠獲得更準(zhǔn)確的表示向量。
ELMo的使用過程分為以下三個步驟:
第一步是預(yù)訓(xùn)練階段,ELMo利用2層的biLSTM和無監(jiān)督數(shù)據(jù)訓(xùn)練兩個單向的語言模型,它們統(tǒng)稱為biLM。
第二步利用特定任務(wù)的數(shù)據(jù)精調(diào)第一步得到的biLM。作者發(fā)現(xiàn)這步能顯著降低biLM在特定任務(wù)數(shù)據(jù)上的PPL,結(jié)果如下圖。但對特定任務(wù)最終的任務(wù)精度未必有幫助(但也不會降低任務(wù)精度)。作者發(fā)現(xiàn)在SNLI(推斷)任務(wù)上效果有提升,但在SST-5(情感分析)任務(wù)上效果沒變化。
第三步是訓(xùn)練特定的任務(wù)模型。任務(wù)模型的輸入是上面已訓(xùn)練biLM的各層狀態(tài)向量的組合向量。
其中
是經(jīng)過softmax歸一化后的權(quán)重, 是整體的scale參數(shù)。它們都是任務(wù)模型中待學(xué)習(xí)的參數(shù)。 可以以額外特征的方式,加入到特定任務(wù)的輸入和輸出特征中。作者發(fā)現(xiàn),對于某些任務(wù),把 同時加入到輸入和輸出特征中效果最好,具體見下圖。作者發(fā)現(xiàn),biLM底層LSTM的輸出狀態(tài)對句法任務(wù)(如POS)更有幫助,而高層LSTM的輸出狀態(tài)對語義任務(wù)(如WSD)更有幫助。ELMo對(標(biāo)注)數(shù)據(jù)量少的有監(jiān)督任務(wù)精度提升較大,對數(shù)據(jù)量多的任務(wù)效果提升就不明顯了。這說明ELMo里存儲的信息比較少,還是它主要功能是幫助有監(jiān)督數(shù)據(jù)更好地提煉出其中的信息?
總結(jié)下ELMo的特點:
把無監(jiān)督預(yù)訓(xùn)練技術(shù)成功應(yīng)用于多類任務(wù),獲得了效果提升。
ELMo以特征抽取的形式融入到下游任務(wù)中,所以不同下游任務(wù)依舊需要使用不同的對應(yīng)模型。
ELMo改進的效果依賴于下游任務(wù)和對應(yīng)的模型,且改進效果也不是特別大。
ULMFiT (Universal Language Model Fine-tuning) 使用和ELMo類似的流程:
使用通用數(shù)據(jù)預(yù)訓(xùn)練LM,模型使用了3層的AWD-LSTM。
在特定任務(wù)數(shù)據(jù)上精調(diào)LM,其中使用到差異精調(diào)和傾斜三角lr兩個策略。
以LM作為初始值,精調(diào)特定任務(wù)分類模型,其中使用到逐層解凍、差異精調(diào)和傾斜三角lr三個策略。經(jīng)過AWD-LSTM之后,輸出給分類器的向量為三個向量的拼接:
。最后一層最后一個詞對應(yīng)的向量;
最后一層每個詞向量做max pooling;
最后一層每個詞向量做mean pooling。
論文中提出了幾個優(yōu)化策略,能夠提升精調(diào)后模型的最終效果。
論文中的實驗主要針對各種分類任務(wù),相比于之前最好的結(jié)果,ULMFiT把分類錯誤率降低了18-24%。
論文中也設(shè)計了實驗來說明流程中第二步(在特定任務(wù)數(shù)據(jù)上精調(diào)LM)的作用。結(jié)果表明第二步的加入,能夠讓第三步的分類任務(wù)在很少的數(shù)據(jù)量下獲得好的結(jié)果。只要使用 1%~10%
的標(biāo)注數(shù)據(jù),就能達到不加第二步時的模型效果。
作者也設(shè)計了去除實驗驗證論文中提出的三個策略的效果:差異精調(diào)(discr)、傾斜三角lr(stlr)、逐層解凍(Freez)。結(jié)果表明相比于其他人提出的策略,這幾個策略能獲得更好的結(jié)果。而且,相比于不使用discr和stlr機制的精調(diào)策略(Full),ULMFiT模型更穩(wěn)定,沒出現(xiàn)災(zāi)難性遺忘。
之后的另一篇論文 An Embarrassingly Simple Approach for Transfer Learning from Pretrained Language Models 建議了一些新的策略,解決精調(diào)時的災(zāi)難性遺忘問題。模型稱為 SiATL (Single-step Auxiliary loss Transfer Learning)。SiATL只包含兩個步驟:無監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練LM、精調(diào)分類模型。但在精調(diào)分類模型時,SiATL把LM作為輔助目標(biāo)加入到優(yōu)化目標(biāo)函數(shù)當(dāng)中。SiATL的第二步相當(dāng)于把ULMFiT的第二步和第三步一起做了。所以它們的流程其實是一樣的。
預(yù)訓(xùn)練模型使用的是兩層LSTM+Linear,而分類模型在預(yù)訓(xùn)練模型的上面增加了一層帶self-attention的LSTM和輸出層。SiATL建議的幾個策略:
論文發(fā)現(xiàn)輔助LM目標(biāo)對于小數(shù)據(jù)集更有用,可能是輔助LM減輕了小數(shù)據(jù)集上的過擬合問題。其中的系數(shù)
,論文實驗發(fā)現(xiàn)初始取值為0.2
,然后指數(shù)下降到 0.1
效果最好。 的取值需要考慮到 和 的取值范圍。這個結(jié)論和ULMFiT中驗證第二步流程作用的實驗結(jié)果相同,也側(cè)面說明了它們本質(zhì)上差不多。另一個發(fā)現(xiàn)是如果預(yù)訓(xùn)練用的無監(jiān)督數(shù)據(jù)和任務(wù)數(shù)據(jù)所在領(lǐng)域不同,序貫解凍帶來的效果更明顯。這也是合理的,領(lǐng)域不同說明災(zāi)難性遺忘問題會更嚴重,所以遷移知識時要更加慎重,遷移過程要更慢。序貫解凍主要就是用途就是減輕災(zāi)難性遺忘問題。
論文還發(fā)現(xiàn),和ULMFiT相比,SiATL在大數(shù)據(jù)集上效果差不多,但在小數(shù)據(jù)集要好很多。
總結(jié)下 ULMFiT 和 SiATL:
ULMFiT使用序貫訓(xùn)練的方式組合特定任務(wù)LM和任務(wù)目標(biāo)函數(shù),而SiATL使用同時訓(xùn)練的方式,也即加入輔助LM目標(biāo)函數(shù)。
它們建議的策略都是在解決災(zāi)難性遺忘問題,也都解決的不錯??梢钥紤]組合使用這些策略。
它們在小數(shù)據(jù)集上都提升明顯,只要使用 1%~10% 的標(biāo)注數(shù)據(jù),就能達到之前的效果。
雖然它們只在分類任務(wù)上驗證了各自的效果,但這些策略應(yīng)該可以推廣到其他任務(wù)上。
前面介紹的工作中預(yù)訓(xùn)練模型用的都是多層LSTM,而OpenAI GPT首次使用了Transformer作為LM預(yù)訓(xùn)練模型。GPT使用12層的Transformer Decoder訓(xùn)練單向LM,也即mask掉當(dāng)前和后面的詞。
在做精調(diào)時,使用最高層最后一個詞的向量作為后續(xù)任務(wù)的輸入,類似SiATL也加入了輔助LM目標(biāo)函數(shù)。
GPT的另一個大貢獻是為下游任務(wù)引入了統(tǒng)一的模型框架,也即不再需要為特定任務(wù)定制復(fù)雜的模型結(jié)構(gòu)了。不同的任務(wù)只需把輸入數(shù)據(jù)做簡單的轉(zhuǎn)換即可。
GPT在多種類型的任務(wù)上做了實驗,12個任務(wù)中的9個任務(wù)有提升,最高提升幅度在9%左右,效果相當(dāng)不錯。
針對預(yù)訓(xùn)練、輔助LM和Transformer,論文中做了去除實驗,結(jié)果表明預(yù)訓(xùn)練最重要,去掉會導(dǎo)致指標(biāo)下降14.8%,而Transformer改為LSTM也會導(dǎo)致指標(biāo)下降5.6%。比較詭異的是去掉輔助LM的實驗結(jié)果。去掉輔助LM,只在QQP (Quora Question Pairs)和NLI上導(dǎo)致指標(biāo)下降。在其他任務(wù)上反而提升了指標(biāo)。作者觀察到的趨勢是輔助LM對于大的數(shù)據(jù)集比小的數(shù)據(jù)集更有幫助。。這也跟ULMFiT和SiATL中的結(jié)論相反。
總結(jié)下GPT的主要貢獻:
驗證了Transformer在Unsupervised Pretraining中的有效性。
驗證了更大的模型效果更好:6 --> 12 層。
為下游任務(wù)引入了通用的求解框架,不再為任務(wù)做模型定制。
之后OpenAI又訓(xùn)練一個更大的模型,叫GPT-2。GPT-2把GPT中12層的Transformer提升到48層,參數(shù)數(shù)量是GPT的十幾倍,達到了15億。
GPT-2依舊使用單向LM訓(xùn)練語言模型,但使用數(shù)量更多、質(zhì)量更好、覆蓋面更廣的數(shù)據(jù)進行訓(xùn)練。而且,GPT-2沒有針對特定模型的精調(diào)流程了。作者想強調(diào)的是,預(yù)訓(xùn)練模型中已經(jīng)包含很多特定任務(wù)所需的信息了,只要想辦法把它們?nèi)〕鰜碇苯佑眉纯?,可以不用為特定任?wù)標(biāo)注數(shù)據(jù),真正達到通用模型的能力。
那,沒有精調(diào)如何做特定任務(wù)呢?一些任務(wù)說明如下:
不做精調(diào)的GPT-2不僅在很多特定任務(wù)上已經(jīng)達到了SOTA,還在生成任務(wù)上達到了嚇人的精度。
和GPT一樣,BERT的基本模型使用了Transformer,只是模型又變大了(12層變成了24層)。
相比于GPT的單向LM,BERT使用了雙向LM。但顯然預(yù)測時不能讓待預(yù)測的詞看到自己,所以需要把待預(yù)測詞mask掉。BERT建議了masked LM機制,即隨機mask輸入中的 k%
個詞,然后利用雙向LM預(yù)測這些詞。
但mask時需要把握好度。mask太少的話,訓(xùn)練時每次目標(biāo)函數(shù)中包含的詞太少,訓(xùn)練起來就要迭代很多步。mask太多的話,又會導(dǎo)致背景信息丟失很多,與預(yù)測時的情景不符。而且,簡單的mask會帶來預(yù)訓(xùn)練和精調(diào)訓(xùn)練的不一致性:精調(diào)階段,輸入數(shù)據(jù)里是不mask詞的。
BERT建議了以下的策略,解決這些問題:
BERT的另一大貢獻,是引入了新的預(yù)訓(xùn)練目標(biāo) Next Sentence Prediction (NSP) 。對于兩個句子A和B,NSP預(yù)測B是不是A的下一個句子。訓(xùn)練時NSP的正樣本就是從文檔從隨機選的兩個臨近句子,而負樣本就是B是隨機從文檔中選取的,與A的位置沒關(guān)系。NSP可以學(xué)習(xí)句子與句子間的關(guān)系。
預(yù)訓(xùn)練的目標(biāo)函數(shù)是Masked LM和NSP的加和。
BERT的輸入詞向量是三個向量之和:
Token Embedding:WordPiece tokenization subword詞向量。
Segment Embedding:表明這個詞屬于哪個句子(NSP需要兩個句子)。
Position Embedding:學(xué)習(xí)出來的embedding向量。這與Transformer不同,Transformer中是預(yù)先設(shè)定好的值。
BERT也為下游任務(wù)引入了通用的求解框架,不再為任務(wù)做模型定制。對于分類和匹配任務(wù),下游任務(wù)只要使用第一個詞 [CLS]
對應(yīng)的最上層輸出詞向量作為分類器的輸入向量即可。對于抽取式QA和序列標(biāo)注問題,使用每個詞對應(yīng)的最上層輸出詞向量作為下游任務(wù)的輸入即可。
BERT的驚艷結(jié)果,引爆了NLP行業(yè)。BERT在11個任務(wù)上獲得了最好效果,GLUE上達到了80.4%,提升了整整7.6個點,把SQuAD v1.1 F1又往上提升了1.5個點,達到了93.2 。
BERT的去除實驗表明,雙向LM和NSP帶了的提升最大。
另一個結(jié)論是,增加模型參數(shù)數(shù)量可以提升模型效果。
BERT預(yù)訓(xùn)練模型的輸出結(jié)果,無非就是一個或多個向量。下游任務(wù)可以通過精調(diào)(改變預(yù)訓(xùn)練模型參數(shù))或者特征抽?。ú桓淖冾A(yù)訓(xùn)練模型參數(shù),只是把預(yù)訓(xùn)練模型的輸出作為特征輸入到下游任務(wù))兩種方式進行使用。BERT原論文使用了精調(diào)方式,但也嘗試了特征抽取方式的效果,比如在NER任務(wù)上,最好的特征抽取方式只比精調(diào)差一點點。但特征抽取方式的好處可以預(yù)先計算好所需的向量,存下來就可重復(fù)使用,極大提升下游任務(wù)模型訓(xùn)練的速度。
后來也有其他人針對ELMo和BERT比較了這兩種使用方式的精度差異。下面列出基本結(jié)論:
總結(jié)下BERT的主要貢獻:
引入了Masked LM,使用雙向LM做模型預(yù)訓(xùn)練。
為預(yù)訓(xùn)練引入了新目標(biāo)NSP,它可以學(xué)習(xí)句子與句子間的關(guān)系。
進一步驗證了更大的模型效果更好:12 --> 24 層。
為下游任務(wù)引入了很通用的求解框架,不再為任務(wù)做模型定制。
刷新了多項NLP任務(wù)的記錄,引爆了NLP無監(jiān)督預(yù)訓(xùn)練技術(shù)。
BERT只能做NLU類型的任務(wù),無法直接用于文本產(chǎn)生式(NLG)類型的任務(wù),如摘要、翻譯、對話生成。NLG的基本框架是encoder2decoder,微軟的MASS (MAsked Sequence to Sequence pre-training)把BERT推廣到NLG任務(wù)。MASS的結(jié)構(gòu)如下,它的訓(xùn)練數(shù)據(jù)依舊是單句話,但是會隨機mask這句話中連續(xù)的 k
個詞,然后把這些詞放入decoder模塊的相同位置,而encoder中只保留未被mask的詞。MASS期望decoder利用encoder的信息和decoder前面的詞,預(yù)測這些被mask的詞。
比較有意思的是,BERT和GPT都是MASS的特例。當(dāng) k=1
時,也即隨機mask單個詞時,MASS就退化成BERT;當(dāng) k=句子長度
時,也即mask所有詞時,MASS就退化成GPT,或者標(biāo)準(zhǔn)的單向LM。
論文中使用了4層的Transformer作為encoder和decoder,跟encoder使用BERT,decoder
使用標(biāo)準(zhǔn)單向LM的框架BERT+LM做了效果對比,PPL上降低了不少。而且作者也對比了 k
取不同值時的效果變化,結(jié)果發(fā)現(xiàn)在多個任務(wù)上它取50%句子長度都是最優(yōu)的。
為什么MASS能取得比較好的效果?作者給出了以下解釋:
Encoder中mask部分tokens,迫使它理解unmasked tokens。
Decoder中需要預(yù)測masked的連續(xù)tokens,讓decoder能獲取更多的語言信息。
Decoder中只保留了masked的tokens,而不是所有的tokens,迫使decoder也會盡量從encoder中抽取信息。
作者也做了兩個去除實驗驗證上面的后兩條解釋。
總結(jié)下MASS的特點:
把BERT推廣到NLG類型任務(wù),并且統(tǒng)一了BERT和傳統(tǒng)單向LM框架。
實驗表明MASS效果比BERT+LM好,但實驗使用的模型太小,不確定這種優(yōu)勢在模型變大后是否還會存在。
UNILM (UNIfied pretrained Language Model)是微軟另一波人最近放出的論文。UNILM同時訓(xùn)練BERT中的雙向LM、GPT中的單向LM和seq2seq中的LM。用的方法也很自然,核心思想在Transformer那篇論文中其實就已經(jīng)在用了。
UNILM中的核心框架還是Transformer,只是用無監(jiān)督數(shù)據(jù)預(yù)訓(xùn)練模型時,同時以雙向LM、單向LM和seq2seq LM為目標(biāo)函數(shù)。這些目標(biāo)函數(shù)共享一個Transformer結(jié)構(gòu),訓(xùn)練也都使用了類似BERT中的 [MASK]
機制。
和BERT的雙向LM不同的是,單向LM在做self-attention時不能使用這個詞后面的詞。seq2seq LM在做decoder 預(yù)測時也有類似的約束,做self-attention時能使用encoder中的所有詞,以及decoder中當(dāng)前詞(替換為 [MASK]
了)和前面的詞,而不能使用decoder中這個詞后面的詞。UNILM在做self-attention時通過mask機制來滿足這些約束,也即在softmax函數(shù)中把后面詞對應(yīng)的向量元素值改為 -∞
。
seq2seq LM是把兩個句子拼起來(和BERT相同)直接輸入一個Transformer(只是預(yù)測encoder和decoder中被mask的詞時,對self-attention使用了不同的約束條件),所以encoder和decoder使用的是同一個Transformer。seq2seq LM的訓(xùn)練樣本,和NSP任務(wù)類似,為連續(xù)的兩個句子,然后隨機mask掉兩個句子中的詞讓模型進行預(yù)測。
對詞隨機mask的機制和BERT類似,只是會以一定概率mask臨近的兩個或三個詞,具體說明如下:
訓(xùn)練時目標(biāo)函數(shù)的設(shè)定也參照BERT,只是要同時兼顧雙向LM、單向LM和seq2seq LM。作者使用的模型大小同
,也即用了24層的Transformer。精調(diào)階段,對于NLU類型的任務(wù)UNILM和BERT相同。對于NLG類型的任務(wù),UNILM隨機mask decoder中的一些詞,然后再預(yù)測它們。以下是UNILM應(yīng)用于生成式QA任務(wù)的做法,效果提升很明顯。
對于GLUE的所有任務(wù),UNILM據(jù)說是首次不添加外部數(shù)據(jù)打贏BERT的模型!
總結(jié)下UNILM的特點:
預(yù)訓(xùn)練同時訓(xùn)練雙向LM、單向LM和seq2seq LM,使用 mask
機制解決self-attention中的約束問題。
可以處理NLU和NLG類型的各種任務(wù)。
在GLUE上首次不加外部數(shù)據(jù)打贏了BERT。
MT-DNN (Multi-Task Deep Neural Network)是去年年底微軟的一篇工作,思路很簡單,就是在MTL中把BERT引入進來作為底層共享的特征抽取模塊。
預(yù)訓(xùn)練就是BERT,精調(diào)時每個batch隨機選一個任務(wù)進行優(yōu)化。整體算法步驟如下:
MT-DNN在GLUE上效果比BERT好不少,當(dāng)然主要原因可能是加入了額外的數(shù)據(jù)了。作者也對比了多任務(wù)與單任務(wù)的結(jié)果,多任務(wù)確實能給每個任務(wù)都帶來效果提升。
總結(jié)下MT-DNN的特點:
框架簡單明了:MT-DNN = BERT + MTL。
雖然前面介紹的很多模型都能找到實現(xiàn)代碼。但從可用性來說,對于NLU類型的問題,基本只需考慮ELMo,ULMFiT和BERT。而前兩個沒有中文的預(yù)訓(xùn)練模型,需要自己找數(shù)據(jù)做預(yù)訓(xùn)練。BERT有官方發(fā)布的中文預(yù)訓(xùn)練模型,很多深度學(xué)習(xí)框架也都有BERT的對應(yīng)實現(xiàn),而且BERT的效果一般是最好的。但BERT的問題是速度有點慢,使用12層的模型,對單個句子(30個字以內(nèi))的預(yù)測大概需要100~200毫秒。如果這個性能對你的應(yīng)用沒問題的話,建議直接用BERT。
對于分類問題,如果特定任務(wù)的標(biāo)注數(shù)據(jù)量在幾千到一兩萬,可以直接精調(diào)BERT,就算在CPU上跑幾十個epoches也就一兩天能完事,GPU上要快10倍以上。如果標(biāo)注數(shù)據(jù)量過大或者覺得訓(xùn)練時間太長,可以使用特征抽取方式。先用BERT抽取出句子向量表達,后續(xù)的分類器只要讀入這些向量即可。
我們目前在很多分類問題上測試了BERT的效果,確實比之前的模型都有提升,有些問題上提升很明顯。下圖給出了一些結(jié)果示例。
愛因互動作為企業(yè)對話機器人服務(wù)提供商,我們會處理很多的QA (Query Answer)和QQ (Query Question)匹配任務(wù)。比如在常用的檢索機器人FAQBot中,用戶的一個query來了,F(xiàn)AQBot首先從標(biāo)準(zhǔn)問答庫中檢索出一些候選問題/答案,然后排序或匹配模塊再計算query跟每個候選問題/答案的匹配度,再按這些匹配度從高到低排序,top1的結(jié)果返回給用戶。上圖中給出了一個QQ 匹配的結(jié)果,原始模型的準(zhǔn)確度為83.5%,BERT精調(diào)后的模型準(zhǔn)確度提升到88.3%。
BERT當(dāng)然可以直接用來計算兩個句子的匹配度,只要把query和每個候選句子拼起來,然后走一遍BERT就能算出匹配度。這樣做的問題是,如果有100個候選結(jié)果,就要算100次,就算把它們打包一起算,CPU上的時間開銷在線上場景也是扛不住的。但如果使用Siamese結(jié)構(gòu),我們就可以把候選句子的BERT向量表達預(yù)先算好,然后線上只需要計算query的BERT向量表達,然后再計算query和候選句子向量的匹配度即可,這樣時間消耗就可以控制在200ms以內(nèi)了。
使用Siamese這種結(jié)構(gòu)理論上會降低最終的匹配效果,之前也有相關(guān)工作驗證過在一些問題上確實如此。我們目前在自己的三個數(shù)據(jù)上做了對比實驗(見下圖),發(fā)現(xiàn)在兩個問題上效果確實略有下降,而在另一個問題上效果基本保持不變。我估計只要后續(xù)交互層設(shè)計的合理,Siamese結(jié)構(gòu)不會比原始BERT精調(diào)差很多。
按理ELMo的想法很簡單,也沒什么模型創(chuàng)新,為什么之前就沒人做出來然后引爆無監(jiān)督模型預(yù)訓(xùn)練方向?BERT的一作Jacob Devlin認為主要原因是之前使用的數(shù)據(jù)不夠多,模型不夠大。無監(jiān)督預(yù)訓(xùn)練要獲得好效果,付出的代價需要比有監(jiān)督訓(xùn)練大到1000到10w倍才能獲得好的效果。之前沒人想到要把數(shù)據(jù)和模型規(guī)模提高這么多。
為了讓預(yù)訓(xùn)練的模型能對多種下游任務(wù)都有幫助,也即預(yù)訓(xùn)練模型要足夠通用,模型就不能僅僅只學(xué)到帶背景的詞表示這個信息,還需要學(xué)到很多其他信息。而預(yù)測被mask的詞,就可能要求模型學(xué)到很多信息,句法的,語義的等等。所以,相對于只解決某個下游特定任務(wù),預(yù)訓(xùn)練模型要通用的話,就要大很多。目前發(fā)現(xiàn)只要使用更多(數(shù)量更多、質(zhì)量更好、覆蓋面更廣)的無監(jiān)督數(shù)據(jù)訓(xùn)練更大的模型,最終效果就會更優(yōu)。目前還不知道這個趨勢的極限在什么量級。
BERT雖然對NLU的各類任務(wù)都提升很大,但目前依舊存在很多待驗證的問題。比如如何更高效地進行預(yù)訓(xùn)練和線上預(yù)測使用,如何融合更長的背景和結(jié)構(gòu)化知識,如何在多模態(tài)場景下使用,在BERT之后追加各種任務(wù)相關(guān)的模塊是否能帶來額外收益等等。這些機會我在第一部分已經(jīng)講到,就不再贅述了。
最后,簡單總結(jié)一下。
無監(jiān)督預(yù)訓(xùn)練技術(shù)已經(jīng)在NLP中得到了廣泛驗證。BERT成功應(yīng)用于各種NLU類型的任務(wù),但無法直接用于NLG類型的任務(wù)。微軟最近的工作MASS把BERT推廣到NLG類型任務(wù),而UNILM既適用于NLU也適用于NLG任務(wù),效果還比BERT好一點點。
相信未來NLP的很多工作都會圍繞以下這個流程的優(yōu)化展開:
在這個過程中,我們還收獲了諸多副產(chǎn)品:
相對于biLSTM,Transformers在知識抽取和存儲上效果更好,潛力還可發(fā)掘。它們之間的具體比較,推薦俊林老師的“放棄幻想,全面擁抱Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較”,里面介紹的很清楚。
目前無監(jiān)督模型預(yù)訓(xùn)練常用以下幾種目標(biāo)函數(shù):
一般的LM?;趖oken的交叉熵。
Masked LM。相比于一般的LM,masked LM能夠使用雙向tokens,且在模型訓(xùn)練和預(yù)測時的數(shù)據(jù)使用方式更接近,降低了它們之間的gap。
Consecutive masked LM。Mask時不僅隨機mask部分離散的token,還隨機mask一些連續(xù)的tokens,如bi-grams、tri-grams等。這種consecutive mask機制是否能帶來普遍效果提升,還待驗證。
Next Sentence Prediction。預(yù)測連續(xù)的兩個句子是否有前后關(guān)系。
精調(diào)階段,除了任務(wù)相關(guān)的目標(biāo)函數(shù),還可以考慮把LM作為輔助目標(biāo)加到目標(biāo)函數(shù)中。加入LM輔助目標(biāo)能降低模型對已學(xué)到知識的遺忘速度,提升模型收斂速度,有些時候還能提升模型的精度。精調(diào)階段,學(xué)習(xí)率建議使用linear warmup and linear decay機制,降低模型對已學(xué)到知識的遺忘速度。如果要精調(diào)效果,可以考慮ULMFiT中引入的gradual unfreezing和discriminative fine-tuning:機制。
使用數(shù)量更多、質(zhì)量更好、覆蓋面更廣的無監(jiān)督數(shù)據(jù)訓(xùn)練更大的模型,最終效果就會更優(yōu)。目前還不知道這個趨勢的極限在什么地方。
最后說一點自己的感想。
NLP中有一部分工作是在做人類知識或人類常識的結(jié)構(gòu)化表示。有了結(jié)構(gòu)化表示后,使用時再想辦法把這些表示注入到特定的使用場景中。比如知識圖譜的目標(biāo)就是用結(jié)構(gòu)化的語義網(wǎng)絡(luò)來表達人類的所有知識。這種結(jié)構(gòu)化表示理論上真的靠譜嗎?人類的知識真的能完全用結(jié)構(gòu)化信息清晰表示出來嗎?顯然是不能,我想這點其實很多人都知道,只是在之前的技術(shù)水平下,也沒有其他的方法能做的更好。所以這是個折中的臨時方案。
無監(jiān)督預(yù)訓(xùn)練技術(shù)的成功,說明語言的很多知識其實是可以以非結(jié)構(gòu)化的方式被模型學(xué)習(xí)到并存儲在模型中的,只是目前整個過程我們并不理解,還是黑盒。相信以后很多其他方面的知識也能找到類似的非結(jié)構(gòu)化方案。所以我估計知識圖譜這類折中方案會逐漸被替代掉。當(dāng)然,這只是我個人的理解或者疑惑,僅供他人參考。
張俊林,【知乎專欄】深度學(xué)習(xí)前沿筆記
Lilian Weng,Generalized Language Models
McCann et al.2017,Learned in Translation: Contextualized Word Vectors
ELMo: Deep Contextual Word Embeddings, AI2 & University of Washington, 2018
The Illustrated Transformer
The Annotated Transformer
Ashish Vaswani, et al. “Attention is all you need.” NIPS 2017
Jacob Devlin, BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
自然語言處理中的語言模型預(yù)訓(xùn)練方法(ELMo、GPT和BERT)
To Tune or Not to Tune? Adapting Pretrained Representations to Diverse Tasks
Kevin Clark et al. “Semi-Supervised Sequence Modeling with Cross-View Training.” EMNLP 2018
Matthew E. Peters, et al. “Deep contextualized word representations.” NAACL-HLT 2017
Jeremy Howard and Sebastian Ruder. “Universal language model fine-tuning for text classification.” ACL 2018
Alec Radford et al. “Improving Language Understanding by Generative Pre-Training”. OpenAI Blog, June 11, 2018
聯(lián)系客服