BERT的全稱是Bidirectional Encoder Representation from Transformers,即雙向Transformer的Encoder,由於decoder是不能獲要預測的信息的。模型的主要創新點都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。函數
因爲模型的構成元素Transformer已經解析過,就很少說了,BERT模型的結構以下圖最左:學習
對比OpenAI GPT(Generative pre-trained transformer),BERT是雙向的Transformer block鏈接;就像單向rnn和雙向rnn的區別,直覺上來說效果會好一些。3d
對比ELMo,雖然都是「雙向」,但目標函數實際上是不一樣的。ELMo是分別以 和
做爲目標函數,獨立訓練處兩個representation而後拼接,而BERT則是以
做爲目標函數訓練LM。code
這裏的Embedding由三種Embedding求和而成:orm
其中:blog
第一步預訓練的目標就是作語言模型,從上文模型結構中看到了這個模型的不一樣,即bidirectional。關於爲何要如此的bidirectional,做者在reddit上作了解釋,意思就是若是使用預訓練模型處理其餘任務,那人們想要的確定不止某個詞左邊的信息,而是左右兩邊的信息。而考慮到這點的模型ELMo只是將left-to-right和right-to-left分別訓練拼接起來。直覺上來說咱們其實想要一個deeply bidirectional的模型,可是普通的LM又沒法作到,由於在訓練時可能會「穿越」(關於這點我不是很認同,以後會發文章講一下如何作bidirectional LM)。因此做者用了一個加mask的trick。token
在訓練過程當中做者隨機mask 15%的token,而不是把像cbow同樣把每一個詞都預測一遍。最終的損失函數只計算被mask掉那個token。get
Mask如何作也是有技巧的,若是一直用標記[MASK]代替(在實際預測時是碰不到這個標記的)會影響模型,因此隨機mask的時候10%的單詞會被替代成其餘單詞,10%的單詞不替換,剩下80%才被替換爲[MASK]。具體爲何這麼分配,做者沒有說。。。要注意的是Masked LM預訓練階段模型是不知道真正被mask的是哪一個詞,因此模型每一個詞都要關注。it
由於涉及到QA和NLI之類的任務,增長了第二個預訓練任務,目的是讓模型理解兩個句子之間的聯繫。訓練的輸入是句子A和B,B有一半的概率是A的下一句,輸入這兩個句子,模型預測B是否是A的下一句。預訓練的時候能夠達到97-98%的準確度。io
注意:做者特地說了語料的選取很關鍵,要選用document-level的而不是sentence-level的,這樣能夠具有抽象連續長序列特徵的能力。
分類:對於sequence-level的分類任務,BERT直接取第一個[CLS]token的final hidden state ,加一層權重
後softmax預測label proba:
其餘預測任務須要進行一些調整,如圖:
能夠調整的參數和取值範圍有:
由於大部分參數都和預訓練時同樣,精調會快一些,因此做者推薦多試一些參數。
BERT是截至2018年10月的最新state of the art模型,經過預訓練和精調橫掃了11項NLP任務,這首先就是最大的優勢了。並且它還用的是Transformer,也就是相對rnn更加高效、能捕捉更長距離的依賴。對比起以前的預訓練模型,它捕捉到的是真正意義上的bidirectional context信息。
做者在文中主要提到的就是MLM預訓練時的mask問題:
一遍讀下來,感受用到的都是現有的東西,可沒想到效果會這麼好,而別人又沒想到。不過文章中沒有具體解釋的不少點能夠看出這樣出色的結果也是經過不斷地實驗得出的,並且訓練的數據也比差很少結構的OpenAI GPT多,因此數據、模型結構,都是不可或缺的東西。
以上。
轉載自:Google BERT詳解