1. 程式人生 > >【NLP】Google BERT詳解

【NLP】Google BERT詳解

11號論文放上去,12號各個公眾號推送,13號的我終於在最晚時間完成了前沿追蹤,驚覺上一篇論文竟然是一個月前。。。立個flag以後保持一週一更的頻率。下週開始終於要在工作上接觸NLP了,之後希望會帶來更多自己的東西而不是論文解析。


Attention和Transformer還不熟悉的請移步之前的文章:

  1. 【NLP】Attention原理和原始碼解析

2. 【NLP】Transformer詳解

NLP遷移學習中的三個state of the art模型可以參考前面的文章:

【NLP】語言模型和遷移學習


正文分割線


1.BERT模型

BERT的全稱是Bidirectional Encoder Representation from Transformers,即雙向Transformer的Encoder,因為decoder是不能獲要預測的資訊的。模型的主要創新點都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。

1.1 模型結構

由於模型的構成元素Transformer已經解析過,就不多說了,BERT模型的結構如下圖最左:

對比OpenAI GPT(Generative pre-trained transformer),BERT是雙向的Transformer block連線;就像單向rnn和雙向rnn的區別,直覺上來講效果會好一些。

對比ELMo,雖然都是“雙向”,但目標函式其實是不同的。ELMo是分別以P(w_i| w_1, ...w_{i-1})P(w_i|w_{i+1}, ...w_n) 作為目標函式,獨立訓練處兩個representation然後拼接,而BERT則是以 P(w_i|w_1,  ...,w_{i-1}, w_{i+1},...,w_n) 作為目標函式訓練LM。

1.2 Embedding

這裡的Embedding由三種Embedding求和而成:

其中:

  • Token Embeddings是詞向量,第一個單詞是CLS標誌,可以用於之後的分類任務
  • Segment Embeddings用來區別兩種句子,因為預訓練不光做LM還要做以兩個句子為輸入的分類任務
  • Position Embeddings和之前文章中的Transformer不一樣,不是三角函式而是學習出來的

1.3 Pre-training Task 1#: Masked LM

第一步預訓練的目標就是做語言模型,從上文模型結構中看到了這個模型的不同,即bidirectional。關於為什麼要如此的bidirectional,作者在reddit上做了解釋,意思就是如果使用預訓練模型處理其他任務,那人們想要的肯定不止某個詞左邊的資訊,而是左右兩邊的資訊。而考慮到這點的模型ELMo只是將left-to-right和right-to-left分別訓練拼接起來。直覺上來講我們其實想要一個deeply bidirectional的模型,但是普通的LM又無法做到,因為在訓練時可能會“穿越”(關於這點我不是很認同,之後會發文章講一下如何做bidirectional LM

)。所以作者用了一個加mask的trick。

在訓練過程中作者隨機mask 15%的token,而不是把像cbow一樣把每個詞都預測一遍。關於為什麼這樣做,我覺得可能是模型結構本身的原因,從結構上看輸入輸出是長度一樣的sequence,這樣模型實際上在做sequence-level的LM。

Mask如何做也是有技巧的,如果一直用標記[MASK]代替(在實際預測時是碰不到這個標記的)會影響模型,所以隨機mask的時候10%的單詞會被替代成其他單詞,10%的單詞不替換,剩下80%才被替換為[MASK]。具體為什麼這麼分配,作者沒有說。。。要注意的是Masked LM預訓練階段模型是不知道真正被mask的是哪個詞,所以模型每個詞都要關注。

1.4 Pre-training Task 2#: Next Sentence Prediction

因為涉及到QA和NLI之類的任務,增加了第二個預訓練任務,目的是讓模型理解兩個句子之間的聯絡。訓練的輸入是句子A和B,B有一半的機率是A的下一句,輸入這兩個句子,模型預測B是不是A的下一句。預訓練的時候可以達到97-98%的準確度。

1.5 Fine-tunning

分類:對於sequence-level的分類任務,BERT直接取第一個[CLS]token的final hidden state C\in\Re^H ,加一層權重 W\in\Re^{K\times H} 後softmax預測label proba: P=softmax(CW^T) \\

其他預測任務需要進行一些調整,如圖:

因為大部分引數都和預訓練時一樣,精調會快一些,所以作者推薦多試一些引數。

2. 優缺點

2.1 優點

BERT是截至2018年10月的最新state of the art模型,通過預訓練和精調橫掃了11項NLP任務,這首先就是最大的優點了。而且它還用的是Transformer,也就是相對rnn更加高效、能捕捉更長距離的依賴。對比起之前的預訓練模型,它捕捉到的是真正意義上的bidirectional context資訊。

2.2 缺點

作者在文中主要提到的就是MLM預訓練時的mask問題:

  1. [MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現
  2. 每個batch只有15%的token被預測,所以BERT收斂得比left-to-right模型要慢(它們會預測每個token)

3. 總結

一遍讀下來,感覺用到的都是現有的東西,可沒想到效果會這麼好,而別人又沒想到。不過文章中沒有具體解釋的很多點可以看出這樣出色的結果也是通過不斷地實驗得出的,而且訓練的資料也比差不多結構的OpenAI GPT多,所以資料、模型結構,都是不可或缺的東西。


以上。


【參考資料】:

  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  2. 全面超越人類!Google稱霸SQuAD,BERT橫掃11大NLP測試
  3. 知乎:如何評價BERT模型?