天天看點

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

文章目錄

      • 引言
      • 一、ELMO
        • 1.ELMO預訓練後的使用
        • 2.ELMO的優點與缺點
        • 3.ELMO把三種不同的向量疊加的意義
      • 二、GPT
        • 1.GPT缺點(與Bert相比)
      • 三、Bert
      • 四、總結

引言

  預訓練模型在NLP下遊任務上非常重要。

一、ELMO

  ELMO是"Embedding from Language Model"的簡稱,論文是《Deep Contextualized Word Representation》。在ELMO之前,word embedding 本質上是靜态的表示方式,也就是在詞向量訓練之後每個單詞的表達就固定住了,這個單詞的word embedding 不會随着上下文場景的變化而改變。缺點就是對于多義詞(如英文中的Bank),在不同語言場景下表達的是同一個word embedding,這是不應該的。ELMO的本質思想是,事先用語言模型學好一個單詞的word embedding,此時多義詞的word embedding是同一個表達,在句子中使用一個單詞的word embedding時,此時單詞已經具備了特定的上下文了,這時使用單詞的上下文語義去調整單詞的word embedding表示,這樣經過調整後的word embedding更能表達在這個上下文中的具體含義,自然也就解決了多義詞的問題。本質上ELMO是根據上下文動态調整word embedding。

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  ELMO采用了典型的兩階段過程:

  • 第一個階段是利用語言模型進行預訓練;

      上圖展示的是其預訓練過程,它的網絡結構采用了雙層雙向LSTM,目前語言模型訓練的任務目标是根據單詞 W i W_i Wi​的上下文去正确預測單詞 W i W_i Wi​ , W i W_i Wi​之前的單詞序列Context-before稱為上文,之後的單詞序列Context-after稱為下文。圖中左端的前向雙層LSTM代表正方向編碼器,輸入的是從左到右順序的除了預測單詞 W i W_i Wi​外的上文Context-before;右端的逆向雙層LSTM代表反方向編碼器,輸入的是從右到左的逆序的句子下文Context-after;每個編碼器的深度都是兩層LSTM疊加。這個網絡結構其實在NLP中是很常用的。

      使用這個網絡結構利用大量語料做語言模型任務就能預先訓練好這個網絡,如果訓練好這個網絡後,輸入一個新句子sentence,句子中每個單詞都能得到對應的三個Embedding:

    • 最底層是單詞的Word Embedding,
    • 往上走是第一層雙向LSTM中對應單詞位置的Embedding,這層編碼單詞的句法資訊更多一些;
    • 再往上走是第二層LSTM中對應單詞位置的Embedding,這層編碼單詞的語義資訊更多一些。
    也就是說,ELMO的預訓練過程不僅僅學會單詞的Word Embedding,還學會了一個雙層雙向的LSTM網絡結構,而這兩者後面都有用。
  • 第二個階段是在做下遊任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding作為新特征補充到下遊任務中。
    NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert
      那麼預訓練好網絡結構後,如何給下遊任務使用呢?上圖展示了下遊任務的使用過程,比如我們的下遊任務仍然是QA問題,此時對于問句X,我們可以先将句子X作為預訓練好的ELMO網絡的輸入,這樣句子X中每個單詞在ELMO網絡中都能獲得對應的三個Embedding,之後給予這三個Embedding中的每一個Embedding一個權重a,這個權重可以學習得來,根據各自權重累加求和,将三個Embedding整合成一個。然後将整合後的這個Embedding作為X句在自己任務的那個網絡結構中對應單詞的輸入,以此作為補充的新特征給下遊任務使用。對于上圖所示下遊任務QA中的回答句子Y來說也是如此處理。因為ELMO給下遊提供的是每個單詞的特征形式,是以這一類預訓練的方法被稱為“Feature-based Pre-Training”。

1.ELMO預訓練後的使用

  ELMO訓練好之後,對于輸入的句子序列中的每個token,一個L層(這裡L取2)的雙向語言模型就會得到 2L+1個表示,即為:

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

其中, h k , 0 L M h_{k,0}^{LM} hk,0LM​為token的表示, h k , j L M h_{k,j}^{LM} hk,jLM​為每個雙向LSTM層得到的表示。

注意:這裡是将整個句子輸入到雙向語言模型中(雙向LSTM網絡結構),正向和反向LSTM網絡共享token embedding 的輸入,源碼中token embedding、正向、反向LSTM的hidden state均為512次元,一個長度為n_sentences的句子,經過ELMO預訓練網絡,最後得到的embedding次元為:(n_sentences,3,max_sentence_length,1024)

  下遊任務将所有的表示都利用起來,并給他們配置設定權重,即為:

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

其中, s t a s k s^{task} stask是經過softmax歸一化之後的權重,标量參數 γ t a s k \gamma^{task} γtask允許任務模型縮放整個ELMO向量。需要注意的是, γ t a s k \gamma^{task} γtask是一個超參數,實際上這個參數是經驗參數,一定程度上能夠增強模型的靈活性。總結起來整個為下遊任務擷取embedding的過程即為:

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

2.ELMO的優點與缺點

  ELMo利用了深度上下文單詞表征,該模型的優點:

  • 引入雙向語言模型,其實是 2 個單向語言模型(前向和後向)的內建
  • 通過儲存預訓練好的 2 層 biLSTM,通過特征內建或 finetune 應用于下遊任務

總結來說,通過上述結構,ELMo能夠達到區分多義詞的效果,每個單詞(token)不再是隻有一個上下文無關的embedding表示。

那麼ELMo為什麼有效呢?我認為主要原因有以下幾點:

  • 首先,ELMo的假設前提是一個詞的詞向量不應該是固定的,是以在多義詞區分方面ELMo的效果必然比word2vec要好。
  • 另外,ELMo通過語言模型生成的詞向量是通過特定上下文的“傳遞”而來,再根據下遊任務,不同次元的特征表示給予一個權重,這樣既在原來的詞向量中引入了上下文的資訊,又能根據下遊任務适時調整各部分的權重(權重是在網絡中學習得來的),是以這也是ELMo有效的一個原因。

  ELMo的缺點(與GPT和Bert對比):

  • LSTM抽取特征能力遠弱于Transformer
  • 拼接方式雙向融合,特征融合能力偏弱

3.ELMO把三種不同的向量疊加的意義

  ELMo把三種不同的向量疊加的意義主要展現在以下兩個點:

  • 一是之前很多方法都隻用了最頂層LSTM的hidden state,但是通過實驗驗證,在很多任務中,将每一層hidden

    state融合在一起會取得更好的效果;

  • 二是在上述實驗中得到結論,每一層LSTM得到單詞的embedding所蘊含的資訊是不一樣的,是以将所有資訊融合起來,會讓單詞embedding的表達更豐富。

這樣做能夠起到區分多義詞的效果,而且在論文展示的6個任務中都取得了SOTA的效果。

二、GPT

  GPT來自于Transformer的decoder,它是一個生成模型。

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  GPT是“Generative Pre-Training”的簡稱,從名字看其含義是指的生成式的預訓練。GPT也采用兩階段過程:

  • 第一個階段是利用語言模型進行預訓練,

      上圖展示了GPT的預訓練過程,其實和ELMO是類似的,主要不同在于兩點:

    • 首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到過它的特征抽取能力要強于RNN,這個選擇很明顯是很明智的;
    • 其次,GPT的預訓練雖然仍然是以語言模型作為目标任務,但是采用的是單向的語言模型,所謂“單向”的含義是指:語言模型訓練的任務目标是根據 W i W_i Wi​單詞的上下文去正确預測單詞 W i W_i Wi​ , W i W_i Wi​ 之前的單詞序列Context-before稱為上文,之後的單詞序列Context-after稱為下文。ELMO在做語言模型預訓練的時候,預測單詞 W i W_i Wi​同時使用了上文和下文,而**GPT則隻采用Context-before這個單詞的上文來進行預測,而抛開了下文。**這個選擇現在看不是個太好的選擇,原因很簡單,它沒有把單詞的下文融合進來,這限制了其在更多應用場景的效果,比如閱讀了解這種任務,在做任務的時候是可以允許同時看到上文和下文一起做決策的。如果預訓練時候不把單詞的下文嵌入到Word Embedding中,是很吃虧的,白白丢掉了很多資訊。
  • 第二階段通過Fine-tuning的模式解決下遊任務。
    NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

    上圖展示了GPT在第二階段如何使用。首先,對于不同的下遊任務來說,本來你可以任意設計自己的網絡結構,現在不行了,你要向GPT的網絡結構看齊,把任務的網絡結構改造成和GPT的網絡結構是一樣的。然後,在做下遊任務的時候,利用第一步預訓練好的參數初始化GPT的網絡結構,這樣通過預訓練學到的語言學知識就被引入到你手頭的任務裡來了,這是個非常好的事情。再次,你可以用手頭的任務去訓練這個網絡,對網絡參數進行Fine-tuning,使得這個網絡更适合解決手頭的問題。

      對于NLP各種花樣的不同任務,怎麼改造才能靠近GPT的網絡結構呢?

    NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert
    GPT論文給了一個改造施工圖如上,其實也很簡單:
    • 對于分類問題,不用怎麼動,加上一個起始和終結符号即可;
    • 對于句子關系判斷問題,比如Entailment,兩個句子中間再加個分隔符即可;
    • 對文本相似性判斷問題,把兩個句子順序颠倒下做出兩個輸入即可,這是為了告訴模型句子順序不重要;
    • 對于多項選擇問題,則多路輸入,每一路把文章和答案選項拼接作為輸入即可。
    • 對于生成任務,諸如:summarization,藏頭詩、創意性寫作,則
      NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

    從上圖可看出,這種改造還是很友善的,不同任務隻需要在輸入部分施工即可。

      當然,由于GPT的基礎模型是Transformer中的decoder部分。是以,GPT在訓練過程中是一次輸入,而在預測過程中,一步一步輸入。其中,Mask Attention部分為:

    NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert
    NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

1.GPT缺點(與Bert相比)

  • GPT預訓練階段采用單向Transformer模型,而Bert模型是雙向的。

三、Bert

  GPT來自于Transformer的decoder,而Bert來自于Transformer的encoder。Bert的模型架構可參考:BERT模型—1.BERT模型架構。

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  Bert采用和GPT完全相同的兩階段模型,首先是語言模型預訓練;其次是使用Fine-Tuning模式解決下遊任務。和GPT的最主要不同在于在預訓練階段采用了類似ELMO的雙向語言模型,當然另外一點是語言模型的資料規模要比GPT大。

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

第二階段,Fine-Tuning階段,這個階段的做法和GPT是一樣的。當然,它也面臨着下遊任務網絡結構改造的問題,在改造任務方面Bert和GPT有些不同。

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  在介紹Bert如何改造下遊任務之前,先大緻說下NLP的幾類問題,說這個是為了強調Bert的普适性有多強。通常而言,絕大部分NLP問題可以歸入上圖所示的四類任務中:

  • 第一類是序列标注,這是最典型的NLP任務,比如中文分詞,詞性标注,命名實體識别,語義角色标注等都可以歸入這一類問題,它的特點是句子中每個單詞要求模型根據上下文都要給出一個分類類别。
  • 第二類是分類任務,比如我們常見的文本分類,情感計算等都可以歸入這一類。它的特點是不管文章有多長,總體給出一個分類類别即可。
  • 第三類任務是句子關系判斷,比如Entailment,QA,語義改寫,自然語言推理等任務都是這個模式,它的特點是給定兩個句子,模型判斷出兩個句子是否具備某種語義關系;
  • 第四類是生成式任務,比如機器翻譯,文本摘要,寫詩造句,看圖說話等都屬于這一類。它的特點是輸入文本内容後,需要自主生成另外一段文字。
NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  對于種類如此繁多而且各具特點的下遊NLP任務,Bert如何改造輸入輸出部分使得大部分NLP任務都可以使用Bert預訓練好的模型參數呢?上圖給出示例:

  • 對于句子關系類任務,很簡單,和GPT類似,加上一個起始和終結符号,句子之間加個分隔符即可。對于輸出來說,把第一個起始符号對應的Transformer最後一層位置上面串接一個softmax分類層即可。
  • 對于分類問題,與GPT一樣,隻需要增加起始和終結符号,輸出部分和句子關系判斷任務類似改造;
  • 對于序列标注問題,輸入部分和單句分類是一樣的,隻需要輸出部分Transformer最後一層每個單詞對應位置都進行分類即可。

  從這裡可以看出,上面列出的NLP四大任務裡面,除了生成類任務外,Bert其它都覆寫到了,而且改造起來很簡單直覺。盡管Bert論文沒有提,但是稍微動動腦子就可以想到,其實對于機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。隻需要附着在seq2seq結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不同的預訓練資料初始化encoder和decoder即可。這是相當直覺的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隐層産生輸出也是可以的。不論如何,從這裡可以看出,NLP四大類任務都可以比較友善地改造成Bert能夠接受的方式。這其實是Bert的非常大的優點,這意味着它幾乎可以做任何NLP的下遊任務,具備普适性,這是很強的。

四、總結

NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert
NLP學習—24.Pre-trained Word Embedding—ELMO、GPT、Bert

  從上圖可見,Bert其實和ELMO及GPT存在千絲萬縷的關系,比如:如果我們把GPT預訓練階段換成雙向語言模型,那麼就得到了Bert;而如果我們把ELMO的特征抽取器換成Transformer,那麼我們也會得到Bert。是以你可以看出:Bert最關鍵兩點,一點是特征抽取器采用Transformer;第二點是預訓練的時候采用雙向語言模型。

  那麼新問題來了:對于Transformer來說,怎麼才能在這個結構上做雙向語言模型任務呢?乍一看上去好像不太好搞。我覺得吧,其實有一種很直覺的思路,怎麼辦?看看ELMO的網絡結構圖,隻需要把兩個LSTM替換成兩個Transformer,一個負責正向,一個負責反向特征提取,其實應該就可以。當然這是我自己的改造,Bert沒這麼做。那麼Bert是怎麼做的呢?我們前面不是提過Word2Vec嗎?我前面肯定不是漫無目的地提到它,提它是為了在這裡引出那個CBOW訓練方法,所謂寫作時候埋伏筆的“草蛇灰線,伏脈千裡”,大概就是這個意思吧?前面提到了CBOW方法,它的核心思想是:在做語言模型任務的時候,我把要預測的單詞摳掉,然後根據它的上文Context-Before和下文Context-after去預測單詞。其實Bert怎麼做的?Bert就是這麼做的。從這裡可以看到方法間的繼承關系。

  Bert模型使用了雙向Transformer;GPT采用了從左到右的Transformer;ELMo隻是将單獨訓練的從左到右與從右到左的LSTM模型的特征進行拼接,并沒有在内部進行融合;Bert模型融合了所有層從左到右與從右到左的資訊。

  經驗:拿到word embedding,如果想在上面接很多層的話,用ELMo的效果比Bert效果好;如果想在上面接一些簡單的層的話,用Bert的效果比ELMo的效果好。

參考:

  • 語言模型ELMO
  • 從Word Embedding到Bert模型

繼續閱讀