【Semantic Embedding】: BERT模型

時間過的是真快,bert已經是去年火起來的模型了。

論文"BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding"

地址:https://arxiv.org/abs/1810.04805   

要了解bert一定要先看看tranformer模型,就是那篇"attention is all your need"。

論文地址:https://arxiv.org/abs/1706.03762

可以看看這篇博客:http://jalammar.github.io/illustrated-transformer/ 講的很不錯。

我自己也寫過一篇博客,不過寫的一般。

本文的前提是瞭解了tranformer模型。

這樣的話其實bert就比較簡單了。

然後再看看這篇文章:https://zhuanlan.zhihu.com/p/49271699 就能瞭解bert的發展史。本文主要補充一下自己對bert的理解。

這裏我把模型的細節當成一個黑盒子進行分析。

1.輸入

模型的輸入分三個部分:

首先輸入是由兩個句子concat組成的。如果只是一個句子的話,則只用一個句子的embedding。具體細節如下:

  1. token embedding. 針對英文,作者使用的是wordPiece,可以理解爲一個hash trick,用於減少詞彙字典的大小。

  其中,句首有一個分類標識符[CLS],該標識符對應一個embedding向量,針對分類任務,該標識符,用於聚合輸入的整個embedding表示,分類的時候作爲輸出,用於分類函數進行分類。其他任務的話,該標識符可以忽略。

因爲是兩個句子合併的輸入,所以句子之間還有一個分隔符[SEP],用於區分兩個句子。

  2. Segment embedding. 有了一個分隔符還不夠,作者還單獨爲每個token加入一個句子的embedding,用於區分兩個句子。

  3. Position embedding. 位置編碼,輸入句子的每個token在句子中的位置都會訓練出一個針對該位置的embedding。因爲tranformer沒有使用類似RNN的序列模型,因此針對位置的編碼十分必要,不然無非就是個設計複雜的DNN模型。

2.訓練方式

使用兩個任務來同時預訓練embedding。

任務一:Masked LM

   和word2vec很像,這裏提到來雙向模型,即同時利用masked詞彙的上文和下文來進行訓練。具體怎麼操作呢?

隨機將一定百分比的tokens變成mask標記符,然後去預測出這些masked的tokens。這個和CBOW

就很像了,網絡把最終的隱藏層向量輸入softmax,預測masked詞即可。因爲在訓練過程中,並不像CBOW一樣,挖掉一個詞,這裏是把那個詞改寫成'[MASK]'。這就會出現一個問題,預訓練完成後,我們要在不同任務中使用就得做fine-tuning。在微調的時候是不需要這個‘[mask]’標記的,這樣就會導致前後不匹配問題。而且如何只是按這種預訓練方式來進行訓練模型的話,模型可能會趨向於去學習‘[mask]’這個詞的內在表示。因此作者在做隨機mask的時候做了如下三種操作:

    80%的情況還是將句子的token變成[mask];

    10%的情況隨機把該token替換成其他的token;

    10%的情況不做改變,讓模型有機會盡量靠近真實的情況;

這樣的話,比如隨機替換的這種情況,transformer encoder 不知道哪個詞是被預測的,所以被迫去記住整個句子的表示。

這可以被理解爲一個加強版的word2vec。

任務二:Next Sentence Prediction

任務一是從token的角度去學習,任務則是從句子的角度去學習。希望模型也能學習到句子之間的相關性。該任務是希望模型能判斷語料中前後兩句話是不是連着的。即選擇的兩個句子A和B,50%的情況B是語料中A的下一句,50%的情況A和B是隨機選擇的。

如圖所示

 

整個預訓練過程,輸入爲三種embedding向量的求和,模型行transformer encoder,目標爲masked LM 和next sentence prediction 兩個目標同時訓練。然後用大量的語料來訓練網絡。

訓練完成後就可以將預訓練好的模型經過各種fine-tuning應用到不同的場景去了。

完。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章