關於最近的NLP模型Bert、Elmo、GPT(下--2)

這篇這個系列的最後一篇文章,還是關於Bert,的下半部分。
今天又讀了一遍Bert的論文,這篇結尾主要從兩個方面來介紹bert,一個是怎麼用,一個是比較這個三個模型


Bert使用方法

  1. 將bert當做一個詞向量的模型,bert的輸出可以作爲你模型的輸入,然後主要任務是你的模型做。這樣的任務可以用在文本分類,語義分析等多種場景,比transformer,elmo,word2vector的效果要好。
  1. 利用bert的結構來做多種任務。
    在論文的原文裏是這樣寫的


    13790629-9139d050aa0850dc.jpg
    bert下游任務

我們具體於特定任務的模型是通過給 BERT 加一個額外的輸出層構成,所以僅需要從頭學
習最小數量的參數。其中(a)和(b)是序列級任務,(c)和(d)是標記級任務。圖中E表示
嵌入的輸入,Ti 表示第 i 個標記的上下文表示,[CLS] 是分類輸出的特殊符號,[SEP] 是分離非
連續標記(分離兩個句子)序列的特殊符號。

對於句子關係類任務,很簡單,和GPT類似,加上一個起始和終結符號,句子之間加個分隔符即可。對於輸出來說,把第一個起始符號對應的Transformer最後一層位置上面串接一個softmax分類層即可。對於分類問題,與GPT一樣,只需要增加起始和終結符號,輸出部分和句子關係判斷任務類似改造;對於序列標註問題,輸入部分和單句分類是一樣的,只需要輸出部分Transformer最後一層每個單詞對應位置都進行分類即可。從這裏可以看出,上面列出的NLP四大任務裏面,除了生成類任務外,Bert其它都覆蓋到了,而且改造起來很簡單直觀。儘管Bert論文沒有提,但是稍微動動腦子就可以想到,其實對於機器翻譯或者文本摘要,聊天機器人這種生成式任務,同樣可以稍作改造即可引入Bert的預訓練成果。只需要附着在S2S結構上,encoder部分是個深度Transformer結構,decoder部分也是個深度Transformer結構。根據任務選擇不同的預訓練數據初始化encoder和decoder即可。這是相當直觀的一種改造方法。當然,也可以更簡單一點,比如直接在單個Transformer結構上加裝隱層產生輸出也是可以的。不論如何,從這裏可以看出,NLP四大類任務都可以比較方便地改造成Bert能夠接受的方式。這其實是Bert的非常大的優點,這意味着它幾乎可以做任何NLP的下游任務,具備普適性,這是很強的。

Bert、GPT、Elmo的比較

首先是結構的不同


13790629-0b3e8e46ff92c2ad.jpg
三種模型結構

BERT 使用雙向 Transformer。OpenAI GPT 使用 從左到右的Transformer。ELMo 使用獨立訓練的從左到右和從右到左的 LSTM 的連接來爲下游任務生成特徵。其中,只有 BERT 表示在所有層中同時受到左右語境的制約。

13790629-f962ce9002529416.jpg
bert比較

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


都這裏,這個系列的文章就全部結束了,我寫的東西只是非常皮毛,一些細節如果想深究還需要讀論文原文,看源代碼以及查閱其他資料。
這裏介紹一篇相關資料,講的非常非常好的文章。 最近還在找工作,等找到工作了再更新下個系列。