論文地址:https://arxiv.org/pdf/1810.04805.pdf
簡介
bert是google2018年提出的一種兩階段語言模型,全稱Bidirectional Encoder Representations from Transformers,它本質上是基於Denoising AutoEncoding模型,即bert是AE語言模型,好處是能夠雙向編碼獲取上下文信息,缺點是它會在輸入側引入噪聲——[MASK]標記符號,造成預訓練-微調兩個階段的數據不一致,引起誤差。雖然如此,bert依然有不可小覷的優勢,它在發布之初,橫掃nlp領域,在11項自然語言處理的任務中都拿到了第一的好成績,接下來我會詳細介紹一下bert。
BERT的總體思路
bert分為兩個階段:預訓練階段和fine-tunning階段。預訓練階段利用Transformer結構進行訓練,輸入文本是大量的無監督文本,通過對無監督數據的訓練獲取一個泛化能力較強的預訓練模型;fine-tuning階段即微調階段,在這一階段會使用跟任務相關的有監督數據,基於上一步訓練出的預訓練模型進行針對性訓練(只增加一個輸出層即可),最終獲取一個跟任務相關的模型。
bert的整體結構如下圖所示:
bert主要用了Transformer的encoder,而沒有使用其decoder,主要是因為BERT是一個預訓練模型,只要學到其中語義關系即可,不需要去解碼完成具體的任務。多個Transformer encoder一層一層的堆疊起來,就組裝成了bert.
網絡結構
BERT使用的網絡結構是標准的Transformer,即《Attention is all you need》論文中提出的多層Transformer結構,它不再使用傳統的RNN(RNN的缺陷是不能很好的處理長文本,且不能並行處理數據),而是使用attention機制來解決長距離依賴問題。關於Transformer的詳細內容可查看我之前的博客。
論文中分別畫出了bert,GPT,ELMO的三個結構,如下圖所示:
由上述結構對比圖可知,BERT每一層都是用雙向信息,gpt使用的是單向信息,即只能利用上文,卻不能利用下文進行特征提取,elmo是使用了兩個lstm獲取信息,一個lstm獲取上文信息,一個lstm獲取下文信息,再將兩個lstm計算的結果進行簡單的拼接,看起來雖然也是獲取了雙向信息,但是其本質還是考慮單向信息,這從他們的目標函數上可以看出來,目標函數如下所述:
- Elmo: lstm1-> P(ωi | ω1,ω2,…,ωi-1) -> 獲取上文信息
lstm2-> P(ωi | ωi+1,ωi+2,…,ωn) -> 獲取下文信息
- Bert:P(ωi | ω1,ω2,…,ωi-1,ωi+1,ωi+2,…,ωn) -> 獲取雙向信息
Embedding
如上圖所示,BERT的輸入表征由三部分組成,具體內容如下所述:
- Token Embeddings:是指輸入單詞的詞向量第一個單詞是[CLS]標志,可用於之后的分類任務,輸入如果是由兩句話組成,則在第一句話與第二句話之間使用[SEP]符號分隔開。
- Segment Embeddings:用來判斷輸入的是否是兩句話,不同的語句要用不同的向量特征來表示,如上圖所示,用EA表示第一個語句,用EB表示第二個語句。
- Position Embeddings:用來表征單詞在語句中的絕對位置。
最終的輸入表征是將上述三個向量表征進行相加即可。
預訓練過程
BERT的預訓練階段包括兩個任務:Masked Language Model,Next Sentence Prediction,以下分別介紹這兩個任務。
1、Masked Language Model:可以將其理解為完形填空,作者會隨機mask掉一個句子中15%的單詞,並用其上下文來做預測。對語句進行mask的方法有三種,假設原句是:My dog is hairy. 具體的方法如下所述:
- 80%是使用mask符號來代替語句中的詞:My [MASK] is hairy.
- 10%是隨機選擇一個單詞代替需mask掉的詞:My dirty is hairy.
- 10%是使用原詞:My dog is hairy.
作者之所以這樣設計,是因為如果輸入語句中的某個token100%被mask掉的話,那么在微調階段模型就會遇到一些沒有遇見過的單詞,並且不知道這些單詞可能存在於哪些上下文中。加入隨機token是因為需要Transformer保持對每個token的分布式特征,否則模型就會記住某個mask對應的token。
2、Next Sentence Prediction[1]:該任務的主要目的是為了判斷語句B是否是語句A的下文。是的話會輸出’IsNext’,否則輸出’NotNext’。生成訓練數據的方式是從語料庫中隨機抽取一批連續的兩句話,其中50%會原樣保留語句,作為’IsNext’的訓練樣本,另外50%的數據會將其第二句話替換成任意一句話(替換的新語句一定不是原來的第二句話),作為’NotNext’的訓練樣本。並將這個語句關系保存在[CLS]符號中。
微調過程
在無監督語料中訓練完BERT后,便可將其應用到nlp的各個任務中。下圖展示了BERT用於不同任務的模型微調過程的訓練。
如上圖所示,微調階段只要在預訓練階段訓練出的BERT模型上增加一個輸出層即可完成對特定任務的微調。關於每一個數據集其具體的處理方法,可以看[1],這里有詳細的描述。
總結
BERT的主要貢獻如下[3]:
- 引入了Masked LM
- 預訓練過程中增加了NSP的訓練,可以學習兩個語句間的關系
- 它驗證了更大的模型效果更好:12->24層
- 做出了泛化能力較強的通用的預訓練模型,並開源,方便其他研究者使用它做自己的任務
- 刷新了多項NLP任務的記錄
參考資料
[1] https://zhuanlan.zhihu.com/p/48612853
[2] https://zhuanlan.zhihu.com/p/46652512
[3] https://blog.csdn.net/sunhua93/article/details/102764783