當前位置:
首頁 > 科技 > 奇點已過?聊聊BERT之後的NLP時代

奇點已過?聊聊BERT之後的NLP時代

作者 吳金龍,愛因互動技術合伙人,演算法負責人。本文轉自知乎專欄「智能對話機器人技術」,歡迎大家關注。

2018年是NLP的收穫大年,模型預訓練技術終於被批量成功應用於多項NLP任務。之前搞NLP的人一直羨慕搞CV的人,在ImageNet上訓練好的模型,居然拿到各種任務里用都非常有效。現在情形有點逆轉了。搞CV的人開始羨慕搞NLP的人了。CV界用的還是在有監督數據上訓練出來的模型,而NLP那幫傢伙居然直接搞出了在無監督數據上的通用預訓練模型!要知道NLP中最不缺的就是無監督的文本數據,幾乎就是要多少有多少。還有個好消息是目前NLP中通用預訓練模型的效果還遠沒達到極限。目前發現只要使用更多的無監督數據訓練模型,模型效果就會更優。這種簡單粗暴的優化方法對大公司來說實在再經濟不過。而且,演算法本身的效果也在快速迭代中。NLP的未來真是一片光明啊~

BERT發布之後,點燃了NLP各界的歡騰,各路神仙開始加班加點各顯神通,很多相關工作被發表出來。本文會介紹其中的一些代表性工作,但更重要的是希望理清這些背後的邏輯,為它們歸歸類。通過這些思考,我自己也對NLP以後的工作方向有些預測,供大家參考。

本文的內容主要包括以下幾部分:

  1. 我對遷移學習和模型預訓練的一些思考,以及對未來工作方向的粗略預測

  2. 各類代表性工作的具體介紹(熟悉的同學可忽略),又細分為以下幾大類:

  • 有監督數據預訓練

  • 自監督訓練

  • 無監督數據預訓練

  • 多個有監督數據同時訓練:多任務學習

3. 一些我們的實踐經驗、別人和自己的觀點、以及總結和感想

第一和第三部分內容相對少,原創密度大點,大家要是趕時間的話看這兩部分就夠了。第二部分的內容都是具體技術,有很多很好的文章都介紹過。放在本文當中一是為了文章的完備性,另一個是裡面提到的一些知識點在其他地方沒怎麼提到。第三部分也會涉及到我們(愛因互動)自己在一些任務上的實驗工作,期望這些結果能堅定大家在自己的工作中把模型預訓練技術用起來。

終於可以開始了。

一、遷移學習與模型預訓練:何去何從遷移學習分類

把我們當前要處理的NLP任務叫做T(T稱為目標任務),遷移學習技術做的事是利用另一個任務S(S稱為源任務)來提升任務T的效果,也即把S的信息遷移到T中。至於怎麼遷移信息就有很多方法了,可以直接利用S的數據,也可以利用在S上訓練好的模型,等等。

依據目標任務T是否有標註數據,可以把遷移學習技術分為兩大類,每個大類里又可以分為多個小類。

第一大類是T沒有任何標註數據,比如現在很火的無監督翻譯技術。但這類技術目前主要還是偏學術研究,離工業應用還有挺長距離的。工業應用中的絕大部分任務,我們總是能想辦法標註一些數據的。而且,目前有監督模型效果要顯著優於無監督模型。所以,面對完全沒有標註數據的任務,最明智的做法是先藉助於無監督技術(如聚類/降維)分析數據,然後做一些數據標註,把原始的無監督任務轉變為有監督任務進行求解。基於這些原因,本文不再介紹這大類相關的工作。

第二大類是T有標註數據,或者說T是個有監督任務。這類遷移學習技術又可以依據源任務是否有監督,以及訓練順序兩個維度,大致分為四小類:

  • 源任務S是無監督的,且源數據和目標數據同時用於訓練:此時主要就是自監督(self-supervised)學習技術,代表工作有之後會講到的CVT。

  • 源任務S是有監督的,且源數據和目標數據同時用於訓練:此時主要就是多任務(multi-task)學習技術,代表工作有之後會講到的MT-DNN。

  • 源任務S是無監督的,且先使用源數據訓練,再使用目標數據訓練(序貫訓練):此時主要就是以BERT為代表的無監督模型預訓練技術,代表工作有ELMo、ULMFiT、GPT/GPT-2、BERT、MASS、UNILM。

  • 源任務S是有監督的,且先使用源數據訓練,再使用目標數據訓練(序貫訓練):此時主要就是有監督模型預訓練技術,類似CV中在ImageNet上有監督訓練模型,然後把此模型遷移到其他任務上去的範式。代表工作有之後會講到的CoVe。

奇點已過?聊聊BERT之後的NLP時代

何去何從現狀分析

先說說上表中四個類別的各自命運。以BERT為代表的無監督模型預訓練技術顯然是最有前途的。之前也說了,NLP中最不缺的就是無監督數據。只要堆計算資源就能提升效果的話,再簡單不過了。

而無監督預訓練的成功,也就基本擠壓掉了自監督學習提升段位的空間。這裡說的自監督學習不是泛指,而是特指同時利用無監督數據和當前有監督數據一起訓練模型的方式。既然是同時訓練,就不太可能大規模地利用無監督數據(要不然就要為每個特定任務都訓練很久,不現實),這樣帶來的效果就沒法跟無監督預訓練方式相比。但自監督學習還是有存在空間的,比如現在發現在做有監督任務訓練時,把語言模型作為輔助損失函數加入到目標函數中,可以減輕精調或多任務學習時的災難性遺忘(Catastrophic Forgetting)問題,提升訓練的收斂速度。所以有可能在訓練時加入一些同領域的無監督數據,不僅能減輕遺忘問題,還可能因為讓模型保留下更多的領域信息而提升最終模型的泛化性。但這個方向迎來大的發展可能性不大。

而類似CV中使用大規模有監督數據做模型預訓練這條路,看著也比較暗淡,它自己單獨不太可能有很大前景。幾個原因:1) 這條路已經嘗試了很久,沒有很顯著的效果提升。2) NLP中獲取大規模標註數據很難,而且還要求對應任務足夠複雜以便學習出的模型包含各種語言知識。雖然機器翻譯任務很有希望成為這種任務,但它也存在很多問題,比如小語種的翻譯標註數據很少,翻譯標註數據主要還是單句形式,從中沒法學習到背景信息或多輪等信息。但從另一個方面看,NLP搞了這麼久,其實還是積累了很多標註或者結構化數據,比如知識圖譜。如何把這些信息融合到具體任務中最近一直都是很活躍的研究方向,相信將來也會是。只是BERT出來後,這種做法的價值更像是打補丁,而不是搭地基了。

多任務學習作為代價較小的方法,前景還是很光明的。多個同領域甚至同數據上的不同任務同時訓練,不僅能降低整體的訓練時間,還能降低整體的預測時間(如果同時被使用),還能互相提升效果,何樂而不為。當然,多任務學習的目標一開始就不是搭地基。

奇點已過?聊聊BERT之後的NLP時代

上面說了這麼多,其實想說的重點在下面。這些技術不一定非要單獨使用啊,組合起來一起用,取長補短不是就皆大歡喜了嘛。

先回顧下現在的無監督模型預訓練流程,如下圖:

奇點已過?聊聊BERT之後的NLP時代

首先是利用大的無監督數據預訓練通用模型,優化目標主要是語言模型(或其變種)。第二步,利用有監督數據精調上一步得到的通用模型。這麼做的目的是期望精調以後的通用模型更強調這個特定任務所包含的語言信息。這一步是可選的(所以圖中對應加了括弧),有些模型框架下沒有這個步驟,比如BERT裡面就沒有。第三步才是利用有監督數據中對應的標註數據訓練特定任務對應的模型。

那這個流程接下來會怎麼發展呢?

未來可期

上面我已經對四類方法做了分別的介紹,包括對它們各自前途的簡單判斷,也介紹了當下效果最好的模型預訓練流程。相信未來NLP的很多工作都會圍繞這個流程的優化展開。我判斷這個流程會繼續發展為下面這個樣子:

奇點已過?聊聊BERT之後的NLP時代

詳細說明下每個步驟:

  1. 第一步還是利用大的無監督數據預訓練通用模型。但這裡面目前可以改進的點有很多,比如發展比Transformer更有效的特徵抽取結構,現在的Evolved Transformer和Universal Transformer等都是這方面的探索。發展更有效更多樣化的預訓練模型目標函數。目前預訓練模型的目標函數主要是(Masked) LM和Next Sentence Prediction (NSP),還是挺單一的。面向文檔級背景或多輪這種長文本信息,未來應該會發展出更好的目標函數。比如有可能會發展出針對多輪對話這種數據的目標函數。BERT主要面向的是NLU類型的任務,目前微軟提出的MASS、UNILM從不同的角度把BERT框架推廣到NLG類型的任務上了,細節我們之後會講到。GPT-2利用更大的模型獲得了更好的語言模型。更多更好的數據,更大的模型帶來的改進有沒有極限?目前還不知道,相信很多公司已經在做這方面的探索了。但這個遊戲目前還是只有大公司能玩得起,訓練通用大模型太耗錢了。提升訓練效率,很自然的就是另一個很重要的優化方向。

  2. 第二步是利用其他大任務的標註數據或已有結構化知識精調第一步獲得的通用模型。這一步不一定以單獨的形式存在,它也可以放到第一步中,在預訓練通用模型時就把這些額外信息注入進去,比如百度的ERNIE就是在預訓練時就把實體信息注入進去了。既然人類在漫長的AI研究史上積累了大量各式各樣的結構化數據,比如機器翻譯標註數據,沒理由不把它們用起來。相信未來會有很多知識融合(注入)這方面的工作。

  3. 第三步和前面流程的第二步相同,即利用當前任務數據進一步精調上一步得到的通用模型。這麼做的目的是期望精調後的模型更強調這個特定任務所包含的語言信息。ELMo的實驗結論是,加入這一步往往能提升下一步的特定任務有監督訓練的收斂速度,但僅在部分任務上最終模型獲得了效果提升(在另一部分任務上持平)。另一種做法是把這一步與下一步的特定任務有監督訓練放在一塊進行,也即在特定任務有監督訓練時把語言模型作為輔助目標函數加入到訓練過程中,以期提升模型收斂速度,降低模型對已學到知識的遺忘速度,提升最終模型的效果。GPT的實驗結論是,如果特定任務有監督訓練的數據量比較大時,加入輔助語言模型能改善模型效果,但如果特定任務有監督訓練的數據量比較小時,加入輔助語言模型反而會降低模型效果。但ULMFiT上的結論剛好相反。。所以就試吧。

  4. 利用多任務或者單任務建模方式在有監督數據集上訓練特定任務模型。多任務的很多研究相信都能移植到這個流程當中。我們之後會介紹的微軟工作MT-DNN就是利用BERT來做多任務學習的底層共享模型。論文中的實驗表明加入多任務學習機制後效果有顯著提升。相信在這個方向還會有更多的探索工作出現。在單任務場景下,原來大家發展出的各種任務相關的模型,是否能在無監督預訓練時代帶來額外的收益,這也有待驗證。

總結下,未來NLP的主要工作可能都會圍繞這個流程展開。對流程前面步驟的優化帶來的收益比後面步驟大,也更難。所以諸君請自己拿捏吧~。

二、各類代表性工作

套用下前面對遷移學習分類的方式,把接下來要介紹的具體模型放到對應的模塊里,這樣邏輯會更清楚一些。

奇點已過?聊聊BERT之後的NLP時代

我們先介紹CoVe和CVT。

有監督模型預訓練:CoVe

CoVe是在 McCann et al., Learned in Translation: Contextualized Word Vectors 這個論文中提出的。自然語言中的一詞多義非常常見,比如「蘋果手機」和「蘋果香蕉」里的「蘋果」,含義明顯不同。以Word2Vec為代表的詞表示方法沒法依據詞所在的當前背景調整表示向量。所以NLPer一直在嘗試找背景相關的詞表示法(Contextualized Word Representation)。CoVe就是這方面的一個嘗試。

CoVe首先在翻譯標註數據上預訓練encoder2decoder模型。其中的encoder模塊使用的是BiLSTM。訓練好的encoder,就可以作為特徵抽取器,獲得任意句子中每個token的帶背景詞向量:

使用的時候,只要把 和 拼接起來就行。

奇點已過?聊聊BERT之後的NLP時代

論文作者在分類和匹配下游任務對CoVe的效果做過驗證,效果肯定是有一些提升了,但提升也不是很明顯。

奇點已過?聊聊BERT之後的NLP時代

總結下CoVe的特點:

  • 預訓練依賴於有監督數據(翻譯數據)。

  • CoVe結果以特徵抽取的方式融合到下游任務模型中,但下游任務還是要自定義對應的模型。

自監督學習同時訓練:CVT

CVT (Cross-View Training)在利用有監督數據訓練特定任務模型時,同時會使用無監督數據做自監督學習。Encoder使用的是2層的CNN-BiLSTM,訓練過程使用標註數據和非標註數據交替訓練。利用標註數據訓練主預測模塊,同時構造多個輔助模塊,輔助模塊利用非標註數據擬合主模塊的預測概率。輔助模塊的輸入僅包含所有輸入中的部分信息,這個思想和dropout有點像,可以提高模型的穩定性。不同的特定任務,輔助模塊的構造方式不同,如何選輸入中部分信息的方式也不同。

奇點已過?聊聊BERT之後的NLP時代

例如,對於序列標註任務,論文中以biLSTM第一層和第二層的狀態向量拼接後輸入進主預測模塊。而4個輔助模塊則使用了第一層的各個單向狀態向量作為輸入。 使用的是第一層前向LSTM當前詞的狀態向量, 使用的是第一層後向LSTM當前詞的狀態向量。 使用的是第一層前向LSTM前一個詞的狀態向量,而 使用的是第一層後向LSTM後一個詞的狀態向量。

奇點已過?聊聊BERT之後的NLP時代

作者也在多任務學習上驗證了CVT帶來效果提升。CVT使用多個標註數據和非標註數據交替訓練。使用標註數據訓練時,CVT隨機選擇一個任務,優化對應任務的主模塊目標函數。使用非標註數據訓練時,CVT為所有任務產生對應的輔助模塊。這些輔助模塊同時被訓練,相當於構造了一些所有任務共用的標註數據。這種共用的訓練數據能提升模型收斂速度。作者認為效果提升的主要原因是,同時訓練多個任務能降低模型訓練一個任務時遺忘其他任務知識的風險。

總結下CVT的特點:

  • 在訓練特定任務模型時加入無監督數據做自監督學習,獲得了精度的提升。其中輔助模塊的構建是關鍵。

  • 嗯,需要為不同任務定製不同的輔助模塊。

  • 應用於MTL問題效果比ELMo好。

無監督模型預訓練ELMo

ELMo (Embedding from Language Models) 的目的是找到一種帶背景的詞向量表示方法,以期在不同的背景下每個詞能夠獲得更準確的表示向量。

ELMo的使用過程分為以下三個步驟:

奇點已過?聊聊BERT之後的NLP時代

第一步是預訓練階段,ELMo利用2層的biLSTM和無監督數據訓練兩個單向的語言模型,它們統稱為biLM。

奇點已過?聊聊BERT之後的NLP時代

第二步利用特定任務的數據精調第一步得到的biLM。作者發現這步能顯著降低biLM在特定任務數據上的PPL,結果如下圖。但對特定任務最終的任務精度未必有幫助(但也不會降低任務精度)。作者發現在SNLI(推斷)任務上效果有提升,但在SST-5(情感分析)任務上效果沒變化。

奇點已過?聊聊BERT之後的NLP時代

第三步是訓練特定的任務模型。任務模型的輸入是上面已訓練biLM的各層狀態向量的組合向量。

其中 是經過softmax歸一化後的權重, 是整體的scale參數。它們都是任務模型中待學習的參數。

可以以額外特徵的方式,加入到特定任務的輸入和輸出特徵中。作者發現,對於某些任務,把 同時加入到輸入和輸出特徵中效果最好,具體見下圖。

奇點已過?聊聊BERT之後的NLP時代

作者發現,biLM底層LSTM的輸出狀態對句法任務(如POS)更有幫助,而高層LSTM的輸出狀態對語義任務(如WSD)更有幫助。ELMo對(標註)數據量少的有監督任務精度提升較大,對數據量多的任務效果提升就不明顯了。這說明ELMo里存儲的信息比較少,還是它主要功能是幫助有監督數據更好地提煉出其中的信息?

總結下ELMo的特點:

  • 把無監督預訓練技術成功應用於多類任務,獲得了效果提升。

  • ELMo以特徵抽取的形式融入到下游任務中,所以不同下游任務依舊需要使用不同的對應模型。

  • ELMo改進的效果依賴於下游任務和對應的模型,且改進效果也不是特別大。

ULMFiT & SiATL

ULMFiT (Universal Language Model Fine-tuning) 使用和ELMo類似的流程:

  1. 使用通用數據預訓練LM,模型使用了3層的AWD-LSTM。

  2. 在特定任務數據上精調LM,其中使用到差異精調和傾斜三角lr兩個策略。

  3. 以LM作為初始值,精調特定任務分類模型,其中使用到逐層解凍、差異精調和傾斜三角lr三個策略。經過AWD-LSTM之後,輸出給分類器的向量為三個向量的拼接: 。

  • 最後一層最後一個詞對應的向量;

  • 最後一層每個詞向量做max pooling;

  • 最後一層每個詞向量做mean pooling。

奇點已過?聊聊BERT之後的NLP時代

論文中提出了幾個優化策略,能夠提升精調後模型的最終效果。

奇點已過?聊聊BERT之後的NLP時代

論文中的實驗主要針對各種分類任務,相比於之前最好的結果,ULMFiT把分類錯誤率降低了18-24%。

奇點已過?聊聊BERT之後的NLP時代

論文中也設計了實驗來說明流程中第二步(在特定任務數據上精調LM)的作用。結果表明第二步的加入,能夠讓第三步的分類任務在很少的數據量下獲得好的結果。只要使用 1%~10%的標註數據,就能達到不加第二步時的模型效果。

奇點已過?聊聊BERT之後的NLP時代

作者也設計了去除實驗驗證論文中提出的三個策略的效果:差異精調(discr)、傾斜三角lr(stlr)、逐層解凍(Freez)。結果表明相比於其他人提出的策略,這幾個策略能獲得更好的結果。而且,相比於不使用discr和stlr機制的精調策略(Full),ULMFiT模型更穩定,沒出現災難性遺忘。

奇點已過?聊聊BERT之後的NLP時代

之後的另一篇論文 An Embarrassingly Simple Approach for Transfer Learning from Pretrained Language Models 建議了一些新的策略,解決精調時的災難性遺忘問題。模型稱為 SiATL (Single-step Auxiliary loss Transfer Learning)。SiATL只包含兩個步驟:無監督數據預訓練LM、精調分類模型。但在精調分類模型時,SiATL把LM作為輔助目標加入到優化目標函數當中。SiATL的第二步相當於把ULMFiT的第二步和第三步一起做了。所以它們的流程其實是一樣的。

奇點已過?聊聊BERT之後的NLP時代

預訓練模型使用的是兩層LSTM+Linear,而分類模型在預訓練模型的上面增加了一層帶self-attention的LSTM和輸出層。SiATL建議的幾個策略:

奇點已過?聊聊BERT之後的NLP時代

論文發現輔助LM目標對於小數據集更有用,可能是輔助LM減輕了小數據集上的過擬合問題。其中的係數 gamma ,論文實驗發現初始取值為 0.2,然後指數下降到 0.1效果最好。 gamma 的取值需要考慮到 L_{task} 和 L_{LM} 的取值範圍。這個結論和ULMFiT中驗證第二步流程作用的實驗結果相同,也側面說明了它們本質上差不多。

另一個發現是如果預訓練用的無監督數據和任務數據所在領域不同,序貫解凍帶來的效果更明顯。這也是合理的,領域不同說明災難性遺忘問題會更嚴重,所以遷移知識時要更加慎重,遷移過程要更慢。序貫解凍主要就是用途就是減輕災難性遺忘問題。

論文還發現,和ULMFiT相比,SiATL在大數據集上效果差不多,但在小數據集要好很多。

奇點已過?聊聊BERT之後的NLP時代

總結下 ULMFiT 和 SiATL:

ULMFiT使用序貫訓練的方式組合特定任務LM和任務目標函數,而SiATL使用同時訓練的方式,也即加入輔助LM目標函數。

它們建議的策略都是在解決災難性遺忘問題,也都解決的不錯。可以考慮組合使用這些策略。

它們在小數據集上都提升明顯,只要使用 1%~10% 的標註數據,就能達到之前的效果。

雖然它們只在分類任務上驗證了各自的效果,但這些策略應該可以推廣到其他任務上。

GPT/GPT-2

前面介紹的工作中預訓練模型用的都是多層LSTM,而OpenAI GPT首次使用了Transformer作為LM預訓練模型。GPT使用12層的Transformer Decoder訓練單向LM,也即mask掉當前和後面的詞。

在做精調時,使用最高層最後一個詞的向量作為後續任務的輸入,類似SiATL也加入了輔助LM目標函數。

奇點已過?聊聊BERT之後的NLP時代

GPT的另一個大貢獻是為下游任務引入了統一的模型框架,也即不再需要為特定任務定製複雜的模型結構了。不同的任務只需把輸入數據做簡單的轉換即可。

奇點已過?聊聊BERT之後的NLP時代

GPT在多種類型的任務上做了實驗,12個任務中的9個任務有提升,最高提升幅度在9%左右,效果相當不錯。

針對預訓練、輔助LM和Transformer,論文中做了去除實驗,結果表明預訓練最重要,去掉會導致指標下降14.8%,而Transformer改為LSTM也會導致指標下降5.6%。比較詭異的是去掉輔助LM的實驗結果。去掉輔助LM,只在QQP (Quora Question Pairs)和NLI上導致指標下降。在其他任務上反而提升了指標。作者觀察到的趨勢是輔助LM對於大的數據集比小的數據集更有幫助。。這也跟ULMFiT和SiATL中的結論相反。

奇點已過?聊聊BERT之後的NLP時代

總結下GPT的主要貢獻:

  • 驗證了Transformer在Unsupervised Pretraining中的有效性。

  • 驗證了更大的模型效果更好: 6 --> 12 層。

  • 為下游任務引入了通用的求解框架,不再為任務做模型定製。

之後OpenAI又訓練一個更大的模型,叫GPT-2。GPT-2把GPT中12層的Transformer提升到48層,參數數量是GPT的十幾倍,達到了15億。

GPT-2依舊使用單向LM訓練語言模型,但使用數量更多、質量更好、覆蓋面更廣的數據進行訓練。而且,GPT-2沒有針對特定模型的精調流程了。作者想強調的是,預訓練模型中已經包含很多特定任務所需的信息了,只要想辦法把它們取出來直接用即可,可以不用為特定任務標註數據,真正達到通用模型的能力。

那,沒有精調如何做特定任務呢?一些任務說明如下:

奇點已過?聊聊BERT之後的NLP時代

不做精調的GPT-2不僅在很多特定任務上已經達到了SOTA,還在生成任務上達到了嚇人的精度。

奇點已過?聊聊BERT之後的NLP時代

BERT

和GPT一樣,BERT的基本模型使用了Transformer,只是模型又變大了(12層變成了24層)。

奇點已過?聊聊BERT之後的NLP時代

相比於GPT的單向LM,BERT使用了雙向LM。但顯然預測時不能讓待預測的詞看到自己,所以需要把待預測詞mask掉。BERT建議了masked LM機制,即隨機mask輸入中的 k%個詞,然後利用雙向LM預測這些詞。

奇點已過?聊聊BERT之後的NLP時代

但mask時需要把握好度。mask太少的話,訓練時每次目標函數中包含的詞太少,訓練起來就要迭代很多步。mask太多的話,又會導致背景信息丟失很多,與預測時的情景不符。而且,簡單的mask會帶來預訓練和精調訓練的不一致性:精調階段,輸入數據里是不mask詞的。

BERT建議了以下的策略,解決這些問題:

奇點已過?聊聊BERT之後的NLP時代

BERT的另一大貢獻,是引入了新的預訓練目標 Next Sentence Prediction (NSP) 。對於兩個句子A和B,NSP預測B是不是A的下一個句子。訓練時NSP的正樣本就是從文檔從隨機選的兩個臨近句子,而負樣本就是B是隨機從文檔中選取的,與A的位置沒關係。NSP可以學習句子與句子間的關係。

預訓練的目標函數是Masked LM和NSP的加和。

奇點已過?聊聊BERT之後的NLP時代

BERT的輸入詞向量是三個向量之和:

  • Token Embedding:WordPiece tokenization subword詞向量。

  • Segment Embedding:表明這個詞屬於哪個句子(NSP需要兩個句子)。

  • Position Embedding:學習出來的embedding向量。這與Transformer不同,Transformer中是預先設定好的值。

奇點已過?聊聊BERT之後的NLP時代

BERT也為下游任務引入了通用的求解框架,不再為任務做模型定製。對於分類和匹配任務,下游任務只要使用第一個詞 [CLS]對應的最上層輸出詞向量作為分類器的輸入向量即可。對於抽取式QA和序列標註問題,使用每個詞對應的最上層輸出詞向量作為下游任務的輸入即可。

奇點已過?聊聊BERT之後的NLP時代

BERT的驚艷結果,引爆了NLP行業。BERT在11個任務上獲得了最好效果,GLUE上達到了80.4%,提升了整整7.6個點,把SQuAD v1.1 F1又往上提升了1.5個點,達到了93.2 。

BERT的去除實驗表明,雙向LM和NSP帶了的提升最大。

奇點已過?聊聊BERT之後的NLP時代

另一個結論是,增加模型參數數量可以提升模型效果。

奇點已過?聊聊BERT之後的NLP時代

BERT預訓練模型的輸出結果,無非就是一個或多個向量。下游任務可以通過精調(改變預訓練模型參數)或者特徵抽取(不改變預訓練模型參數,只是把預訓練模型的輸出作為特徵輸入到下游任務)兩種方式進行使用。BERT原論文使用了精調方式,但也嘗試了特徵抽取方式的效果,比如在NER任務上,最好的特徵抽取方式只比精調差一點點。但特徵抽取方式的好處可以預先計算好所需的向量,存下來就可重複使用,極大提升下游任務模型訓練的速度。

奇點已過?聊聊BERT之後的NLP時代

後來也有其他人針對ELMo和BERT比較了這兩種使用方式的精度差異。下面列出基本結論:

奇點已過?聊聊BERT之後的NLP時代

奇點已過?聊聊BERT之後的NLP時代

總結下BERT的主要貢獻:

  • 引入了Masked LM,使用雙向LM做模型預訓練。

  • 為預訓練引入了新目標NSP,它可以學習句子與句子間的關係。

  • 進一步驗證了更大的模型效果更好: 12 --> 24 層。

  • 為下游任務引入了很通用的求解框架,不再為任務做模型定製。

  • 刷新了多項NLP任務的記錄,引爆了NLP無監督預訓練技術。

MASS

BERT只能做NLU類型的任務,無法直接用於文本產生式(NLG)類型的任務,如摘要、翻譯、對話生成。NLG的基本框架是encoder2decoder,微軟的MASS (MAsked Sequence to Sequence pre-training)把BERT推廣到NLG任務。MASS的結構如下,它的訓練數據依舊是單句話,但是會隨機mask這句話中連續的 k個詞,然後把這些詞放入decoder模塊的相同位置,而encoder中只保留未被mask的詞。MASS期望decoder利用encoder的信息和decoder前面的詞,預測這些被mask的詞。

奇點已過?聊聊BERT之後的NLP時代

比較有意思的是,BERT和GPT都是MASS的特例。當 k=1時,也即隨機mask單個詞時,MASS就退化成BERT;當k=句子長度時,也即mask所有詞時,MASS就退化成GPT,或者標準的單向LM。

奇點已過?聊聊BERT之後的NLP時代

論文中使用了4層的Transformer作為encoder和decoder,跟encoder使用BERT,decoder使用標準單向LM的框架BERT+LM做了效果對比,PPL上降低了不少。而且作者也對比了 k取不同值時的效果變化,結果發現在多個任務上它取50%句子長度都是最優的。

奇點已過?聊聊BERT之後的NLP時代

為什麼MASS能取得比較好的效果?作者給出了以下解釋:

  • Encoder中mask部分tokens,迫使它理解unmasked tokens。

  • Decoder中需要預測masked的連續tokens,讓decoder能獲取更多的語言信息。

  • Decoder中只保留了masked的tokens,而不是所有的tokens,迫使decoder也會盡量從encoder中抽取信息。

作者也做了兩個去除實驗驗證上面的後兩條解釋。

奇點已過?聊聊BERT之後的NLP時代

總結下MASS的特點:

  • 把BERT推廣到NLG類型任務,並且統一了BERT和傳統單向LM框架。

  • 實驗表明MASS效果比BERT+LM好,但實驗使用的模型太小,不確定這種優勢在模型變大後是否還會存在。

UNILM

UNILM (UNIfied pretrained Language Model)是微軟另一波人最近放出的論文。UNILM同時訓練BERT中的雙向LM、GPT中的單向LM和seq2seq中的LM。用的方法也很自然,核心思想在Transformer那篇論文中其實就已經在用了。

UNILM中的核心框架還是Transformer,只是用無監督數據預訓練模型時,同時以雙向LM、單向LM和seq2seq LM為目標函數。這些目標函數共享一個Transformer結構,訓練也都使用了類似BERT中的 [MASK]機制。

奇點已過?聊聊BERT之後的NLP時代

和BERT的雙向LM不同的是,單向LM在做self-attention時不能使用這個詞後面的詞。seq2seq LM在做decoder 預測時也有類似的約束,做self-attention時能使用encoder中的所有詞,以及decoder中當前詞(替換為 [MASK]了)和前面的詞,而不能使用decoder中這個詞後面的詞。UNILM在做self-attention時通過mask機制來滿足這些約束,也即在softmax函數中把後面詞對應的向量元素值改為-∞

seq2seq LM是把兩個句子拼起來(和BERT相同)直接輸入一個Transformer(只是預測encoder和decoder中被mask的詞時,對self-attention使用了不同的約束條件),所以encoder和decoder使用的是同一個Transformer。seq2seq LM的訓練樣本,和NSP任務類似,為連續的兩個句子,然後隨機mask掉兩個句子中的詞讓模型進行預測。

對詞隨機mask的機制和BERT類似,只是會以一定概率mask臨近的兩個或三個詞,具體說明如下:

奇點已過?聊聊BERT之後的NLP時代

訓練時目標函數的設定也參照BERT,只是要同時兼顧雙向LM、單向LM和seq2seq LM。作者使用的模型大小同 ,也即用了24層的Transformer。

奇點已過?聊聊BERT之後的NLP時代

精調階段,對於NLU類型的任務UNILM和BERT相同。對於NLG類型的任務,UNILM隨機mask decoder中的一些詞,然後再預測它們。以下是UNILM應用於生成式QA任務的做法,效果提升很明顯。

奇點已過?聊聊BERT之後的NLP時代

對於GLUE的所有任務,UNILM據說是首次不添加外部數據打贏BERT的模型!

奇點已過?聊聊BERT之後的NLP時代

總結下UNILM的特點:

  • 預訓練同時訓練雙向LM、單向LM和seq2seq LM,使用 mask機制解決self-attention中的約束問題。

  • 可以處理NLU和NLG類型的各種任務。

  • 在GLUE上首次不加外部數據打贏了BERT。

多任務學習:MT-DNN

MT-DNN (Multi-Task Deep Neural Network)是去年年底微軟的一篇工作,思路很簡單,就是在MTL中把BERT引入進來作為底層共享的特徵抽取模塊。

奇點已過?聊聊BERT之後的NLP時代

預訓練就是BERT,精調時每個batch隨機選一個任務進行優化。整體演算法步驟如下:

奇點已過?聊聊BERT之後的NLP時代

MT-DNN在GLUE上效果比BERT好不少,當然主要原因可能是加入了額外的數據了。作者也對比了多任務與單任務的結果,多任務確實能給每個任務都帶來效果提升。

奇點已過?聊聊BERT之後的NLP時代

總結下MT-DNN的特點:

  • 框架簡單明了:MT-DNN = BERT + MTL。

三、實踐、觀點、總結實踐與建議

雖然前面介紹的很多模型都能找到實現代碼。但從可用性來說,對於NLU類型的問題,基本只需考慮ELMo,ULMFiT和BERT。而前兩個沒有中文的預訓練模型,需要自己找數據做預訓練。BERT有官方發布的中文預訓練模型,很多深度學習框架也都有BERT的對應實現,而且BERT的效果一般是最好的。但BERT的問題是速度有點慢,使用12層的模型,對單個句子(30個字以內)的預測大概需要100~200毫秒。如果這個性能對你的應用沒問題的話,建議直接用BERT。

對於分類問題,如果特定任務的標註數據量在幾千到一兩萬,可以直接精調BERT,就算在CPU上跑幾十個epoches也就一兩天能完事,GPU上要快10倍以上。如果標註數據量過大或者覺得訓練時間太長,可以使用特徵抽取方式。先用BERT抽取出句子向量表達,後續的分類器只要讀入這些向量即可。

我們目前在很多分類問題上測試了BERT的效果,確實比之前的模型都有提升,有些問題上提升很明顯。下圖給出了一些結果示例。

奇點已過?聊聊BERT之後的NLP時代

愛因互動作為企業對話機器人服務提供商,我們會處理很多的QA (Query Answer)和QQ (Query Question)匹配任務。比如在常用的檢索機器人FAQBot中,用戶的一個query來了,FAQBot首先從標準問答庫中檢索出一些候選問題/答案,然後排序或匹配模塊再計算query跟每個候選問題/答案的匹配度,再按這些匹配度從高到低排序,top1的結果返回給用戶。上圖中給出了一個QQ 匹配的結果,原始模型的準確度為83.5%,BERT精調後的模型準確度提升到88.3%。

BERT當然可以直接用來計算兩個句子的匹配度,只要把query和每個候選句子拼起來,然後走一遍BERT就能算出匹配度。這樣做的問題是,如果有100個候選結果,就要算100次,就算把它們打包一起算,CPU上的時間開銷在線上場景也是扛不住的。但如果使用Siamese結構,我們就可以把候選句子的BERT向量表達預先算好,然後線上只需要計算query的BERT向量表達,然後再計算query和候選句子向量的匹配度即可,這樣時間消耗就可以控制在200ms以內了。

奇點已過?聊聊BERT之後的NLP時代

使用Siamese這種結構理論上會降低最終的匹配效果,之前也有相關工作驗證過在一些問題上確實如此。我們目前在自己的三個數據上做了對比實驗(見下圖),發現在兩個問題上效果確實略有下降,而在另一個問題上效果基本保持不變。我估計只要後續交互層設計的合理,Siamese結構不會比原始BERT精調差很多。

奇點已過?聊聊BERT之後的NLP時代

觀點

按理ELMo的想法很簡單,也沒什麼模型創新,為什麼之前就沒人做出來然後引爆無監督模型預訓練方向?BERT的一作Jacob Devlin認為主要原因是之前使用的數據不夠多,模型不夠大。無監督預訓練要獲得好效果,付出的代價需要比有監督訓練大到1000到10w倍才能獲得好的效果。之前沒人想到要把數據和模型規模提高這麼多。

為了讓預訓練的模型能對多種下游任務都有幫助,也即預訓練模型要足夠通用,模型就不能僅僅只學到帶背景的詞表示這個信息,還需要學到很多其他信息。而預測被mask的詞,就可能要求模型學到很多信息,句法的,語義的等等。所以,相對於只解決某個下游特定任務,預訓練模型要通用的話,就要大很多。目前發現只要使用更多(數量更多、質量更好、覆蓋面更廣)的無監督數據訓練更大的模型,最終效果就會更優。目前還不知道這個趨勢的極限在什麼量級。

BERT雖然對NLU的各類任務都提升很大,但目前依舊存在很多待驗證的問題。比如如何更高效地進行預訓練和線上預測使用,如何融合更長的背景和結構化知識,如何在多模態場景下使用,在BERT之後追加各種任務相關的模塊是否能帶來額外收益等等。這些機會我在第一部分已經講到,就不再贅述了。

總結和一點感(敢)想

最後,簡單總結一下。

無監督預訓練技術已經在NLP中得到了廣泛驗證。BERT成功應用於各種NLU類型的任務,但無法直接用於NLG類型的任務。微軟最近的工作MASS把BERT推廣到NLG類型任務,而UNILM既適用於NLU也適用於NLG任務,效果還比BERT好一點點。

相信未來NLP的很多工作都會圍繞以下這個流程的優化展開:

在這個過程中,我們還收穫了諸多副產品:

  • 相對於biLSTM,Transformers在知識抽取和存儲上效果更好,潛力還可發掘。它們之間的具體比較,推薦俊林老師的「放棄幻想,全面擁抱Transformer:自然語言處理三大特徵抽取器(CNN/RNN/TF)比較」,裡面介紹的很清楚。

  • 目前無監督模型預訓練常用以下幾種目標函數:

    • 一般的LM。基於token的交叉熵。

    • Masked LM。相比於一般的LM,masked LM能夠使用雙向tokens,且在模型訓練和預測時的數據使用方式更接近,降低了它們之間的gap。

    • Consecutive masked LM。Mask時不僅隨機mask部分離散的token,還隨機mask一些連續的tokens,如bi-grams、tri-grams等。這種consecutive mask機制是否能帶來普遍效果提升,還待驗證。

    • Next Sentence Prediction。預測連續的兩個句子是否有前後關係。

  • 精調階段,除了任務相關的目標函數,還可以考慮把LM作為輔助目標加到目標函數中。加入LM輔助目標能降低模型對已學到知識的遺忘速度,提升模型收斂速度,有些時候還能提升模型的精度。精調階段,學習率建議使用linear warmup and linear decay機制,降低模型對已學到知識的遺忘速度。如果要精調效果,可以考慮ULMFiT中引入的gradual unfreezing和discriminative fine-tuning:機制。

  • 使用數量更多、質量更好、覆蓋面更廣的無監督數據訓練更大的模型,最終效果就會更優。目前還不知道這個趨勢的極限在什麼地方。

最後說一點自己的感想。

NLP中有一部分工作是在做人類知識或人類常識的結構化表示。有了結構化表示後,使用時再想辦法把這些表示注入到特定的使用場景中。比如知識圖譜的目標就是用結構化的語義網路來表達人類的所有知識。這種結構化表示理論上真的靠譜嗎?人類的知識真的能完全用結構化信息清晰表示出來嗎?顯然是不能,我想這點其實很多人都知道,只是在之前的技術水平下,也沒有其他的方法能做的更好。所以這是個折中的臨時方案。

無監督預訓練技術的成功,說明語言的很多知識其實是可以以非結構化的方式被模型學習到並存儲在模型中的,只是目前整個過程我們並不理解,還是黑盒。相信以後很多其他方面的知識也能找到類似的非結構化方案。所以我估計知識圖譜這類折中方案會逐漸被替代掉。當然,這只是我個人的理解或者疑惑,僅供他人參考。

GIAC全球互聯網架構大會深圳站將於2019年6月舉行,本文作者作為「大數據應用」專場的講師,會深入講解「對話機器人中的語義匹配技術」,屆時會有更多AI、深度學習相關的演講。參加2019年GIAC深圳站,可以了解業界動態,和業界專家近距離接觸。

參加 GIAC,盤點2019年最新技術,目前購買8折優惠,多人購買有更多優惠。識別二維碼了解大會更多詳情。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 高可用架構 的精彩文章:

從Spark Streaming到Apache Flink: 實時數據流在愛奇藝的演進
如何提升企業上雲效率?這裡有一份技術秘籍

TAG:高可用架構 |