論文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,2019
代碼:[tensorflow],[pytorch]
來源:李沐精度BERT
0、摘要
與之前模型的區別:
-
GPT考慮的是一個單向預測,用左邊的詞預測右邊的詞;但BERT則是同時利用左邊和右邊的詞,來預測中間的詞
-
ELMO用的BiLSTM,但是它使用的是RNN結構,在應用到下游任務時它需要對模型結構做調整;但BERT使用的是transformer,在下游任務中只需要改上層的一小部分就可以了
基本效果:
-
11個任務上取得更高的精度
-
GLUE提升7.7%,至80.5%;MultiL1提升4.6%,至86.7%;SQuAD v1.1提升1.5,至93.2;SQuAD v2提升5.1,至83.1
1、導言
句子層面的任務:情感識別
單詞層面的任務:命名實體識別
下游任務使用預訓練模型的兩種方式:
-
Feature-based:下游任務先用訓練好的預訓練模型來提取訓練語料的特征,這個特征可能是預訓練模型encoder的輸出,也可能是某個中間層的隱藏狀態;然后下游任務再用這個特征對自己的模型做訓練。簡單來說,就是用預訓練模型做一個特征提取器?
-
Fine-tuning:根據下游特定的任務,在原來的預訓練模型上進行一些結構方面的修改,這些修改通常是在模型的最后一層,使得模型輸出是當前任務所需要的;然后在新的語料上重新訓練修改后的模型。
之前工作的局限性:從左到右,單向,不太符合人類對語言的理解
MLM:Masked Language Model,帶掩碼的語言模型
貢獻:
(1)展示了雙向信息的重要性
(2)第一個基于微調、且在各項任務上都取得優越性能的預訓練模型
2、相關工作
非監督的基于特征的方法:代表作是ELMo
非監督的微調方法:代表作是GPT
在有標注的數據上做遷移學習
3、BERT
Pre-training:在無標注的數據上做訓練
Fine-tuning:模型首先用預訓練好的模型做參數初始化,然后用下游任務標注好的數據對所有的參數做訓練
L:transformer塊的個數
H:隱藏層的大小
A:自注意力機制模塊head的數量
L | H | A | Total parameters | |
---|---|---|---|---|
BERT_Base | 12 | 768 | 12 | 110M |
BERT_Large | 24 | 1024 | 16 | 340M |
切詞方式:WordPiece(類似于BPE,字節對編碼??)
句子的第一個 token 永遠是 [CLS],它代表 classification,其在最后一個隱藏層的輸出就代表整個序列在句子層面的信息。
句子與句子之間用一個 [SEP] 分割,它代表 separate。
上圖即為BERT嵌入層的做法,分為三部分:
- Token Embedding:詞元的嵌入,就是正常的單詞嵌入向量
- Segment Embedding:詞元屬于哪一個句子的嵌入,是屬于第一個句子,還是屬于第二個句子(第一個[SEP]屬于第一個句子)
- Position Embedding:詞元的位置嵌入,是在整個輸入序列中的位置(不是在單獨某一個句子中的位置)
BERT用的是transformer的編碼器(沒用decoder),所以它的每一個詞都會跟句子中的其他詞計算注意力關系。
預訓練中兩個比較重要的點:(1)目標函數;(2)數據。
任務一:Masked LM,預訓練的數據有Mask,但是微調的數據沒有Mask,這會帶來一些問題(什么問題??),解決方案是:
- 15%被選中的待預測詞,有80%的概率被替換成 [Mask] 掩碼符號,有10%的概率被替換成隨機的詞元,有10%的概率保持不變但依然去做預測。
任務二:Next Sentence Prediction(NSP),預測下一個句子
- 兩個句子A和B,50%的概率B是在A之后(正例),有50%的概率B就是從其他地方選取出來的、跟A無關的一個句子(負例)

注:上面的 ## 表示后面的那個詞跟前面的詞是一個單詞,因為 flightless 是一個不常見的單詞,所以就把它分開成兩個常見的單詞flight和less。
BERT的Fine-Tuning:根據下游任務的形式,設計模型的輸入和輸出(模型本身不需要做太多改變)
- 如果做分類,就用第一個詞元 [CLS] 的輸出來做分類;
- 如果做句子預測,就對每個詞元的輸出再加一個輸出層,做softmax做預測;
4、實驗
GLUE:分類任務,對第一個詞元 [CLS] 的輸出做softmax,然后分類。
SQuAD v1.1:Q&A任務,給模型一段話,然后提一個問題,需要在這段話中找出這個問題的答案,這個答案已經在這段話里面了,模型只需要找出答案片段的開始和結尾。
5、消融實驗
BERT用作Feature-Based的效果并不好,用作Fine-Tuning更好一些。
6、結論
(1)使用非監督的預訓練是很好的,這使得那些數據量很小的下游任務也能使用神經網絡
(2)主要的貢獻就是把前人的工作成果擴展到雙向的深度結構上