1. 前言
Google 在論文《BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding》中提出了 BERT 模型,BERT 模型主要利用了 Transformer 的 Encoder 結構,採用的是最原始的 Transformer,對 Transformer 不熟悉的童鞋能夠參考一下以前的文章Transformer 模型詳解或者 Jay Alammar 的博客:The Illustrated Transformer。總的來講 BERT 具備如下的特色:app
結構:採用了 Transformer 的 Encoder 結構,可是模型結構比 Transformer 要深。Transformer Encoder 包含 6 個 Encoder block,BERT-base 模型包含 12 個 Encoder block,BERT-large 包含 24 個 Encoder block。ide
訓練:訓練主要分爲兩個階段:預訓練階段和 Fine-tuning 階段。預訓練階段與 Word2Vec,ELMo 等相似,是在大型數據集上根據一些預訓練任務訓練獲得。Fine-tuning 階段是後續用於一些下游任務的時候進行微調,例如文本分類,詞性標註,問答系統等,BERT 無需調整結構就能夠在不一樣的任務上進行微調。性能
預訓練任務1:BERT 的第一個預訓練任務是 Masked LM,在句子中隨機遮蓋一部分單詞,而後同時利用上下文的信息預測遮蓋的單詞,這樣能夠更好地根據全文理解單詞的意思。Masked LM 是 BERT 的重點,和 biLSTM 預測方法是有區別的,後續會講到。學習
預訓練任務2:BERT 的第二個預訓練任務是 Next Sentence Prediction (NSP),下一句預測任務,這個任務主要是讓模型可以更好地理解句子間的關係。編碼
2. BERT 結構
BERT 結構spa
上圖是 BERT 的結構圖,左側的圖表示了預訓練的過程,右邊的圖是對於具體任務的微調過程。3d
2.1 BERT 的輸入
BERT 的輸入能夠包含一個句子對 (句子 A 和句子 B),也能夠是單個句子。同時 BERT 增長了一些有特殊做用的標誌位:code
- [CLS] 標誌放在第一個句子的首位,通過 BERT 獲得的的表徵向量 C 能夠用於後續的分類任務。
- [SEP] 標誌用於分開兩個輸入句子,例如輸入句子 A 和 B,要在句子 A,B 後面增長 [SEP] 標誌。
- [MASK] 標誌用於遮蓋句子中的一些單詞,將單詞用 [MASK] 遮蓋以後,再利用 BERT 輸出的 [MASK] 向量預測單詞是什麼。
例如給定兩個句子 "my dog is cute" 和 "he likes palying" 做爲輸入樣本,BERT 會轉爲 "[CLS] my dog is cute [SEP] he likes play ##ing [SEP]"。BERT 裏面用了 WordPiece 方法,會將單詞拆成子詞單元 (SubWord),因此有的詞會拆出詞根,例如 "palying" 會變成 "paly" + "##ing"。orm
BERT 獲得要輸入的句子後,要將句子的單詞轉成 Embedding,Embedding 用 E表示。與 Transformer 不一樣,BERT 的輸入 Embedding 由三個部分相加獲得:Token Embedding,Segment Embedding,Position Embedding。
Token Embedding:單詞的 Embedding,例如 [CLS] dog 等,經過訓練學習獲得。
Segment Embedding:用於區分每個單詞屬於句子 A 仍是句子 B,若是隻輸入一個句子就只使用 EA,經過訓練學習獲得。
Position Embedding:編碼單詞出現的位置,與 Transformer 使用固定的公式計算不一樣,BERT 的 Position Embedding 也是經過學習獲得的,在 BERT 中,假設句子最長爲 512。
2.2 BERT 預訓練
BERT 輸入句子中單詞的 Embedding 以後,經過預訓練方式訓練模型,預訓練有兩個任務。
第一個是 Masked LM,在句子中隨機用 [MASK] 替換一部分單詞,而後將句子傳入 BERT 中編碼每個單詞的信息,最終用 [MASK] 的編碼信息 T[MASK] 預測該位置的正確單詞。
第二個是下一句預測,將句子 A 和 B 輸入 BERT,預測 B 是否 A 的下一句,使用 [CLS] 的編碼信息 C進行預測。
BERT 預訓練的過程能夠用下圖來表示。
2.3 BERT 用於具體 NLP 任務
預訓練獲得的 BERT 模型能夠在後續用於具體 NLP 任務的時候進行微調 (Fine-tuning 階段),BERT 模型能夠適用於多種不一樣的 NLP 任務,以下圖所示。
一對句子的分類任務:例如天然語言推斷 (MNLI),句子語義等價判斷 (QQP) 等,如上圖 (a) 所示,須要將兩個句子傳入 BERT,而後使用 [CLS] 的輸出值 C進行句子對分類。
單個句子分類任務:例如句子情感分析 (SST-2),判斷句子語法是否能夠接受 (CoLA) 等,如上圖 (b) 所示,只須要輸入一個句子,無需使用 [SEP] 標誌,而後也是用 [CLS] 的輸出值 C進行分類。
問答任務:如 SQuAD v1.1 數據集,樣本是語句對 (Question, Paragraph),Question 表示問題,Paragraph 是一段來自 Wikipedia 的文本,Paragraph 包含了問題的答案。而訓練的目標是在 Paragraph 找出答案的起始位置 (Start,End)。如上圖 (c) 所示,將 Question 和 Paragraph 傳入 BERT,而後 BERT 根據 Paragraph 全部單詞的輸出預測 Start 和 End 的位置。
單個句子標註任務:例如命名實體識別 (NER),輸入單個句子,而後根據 BERT 對於每一個單詞的輸出 T預測這個單詞的類別,是屬於 Person,Organization,Location,Miscellaneous 仍是 Other (非命名實體)。
3. 預訓練任務
預訓練部分是 BERT 的重點,接下來了解 BERT 預訓練的細節。BERT 包括兩個預訓練任務 Masked LM和 下一句預測。
3.1 Masked LM
咱們先回顧一下以往語言模型的預訓練方法,使用句子 "我/喜歡/學習/天然/語言/處理" 爲例。在訓練語言模型的時候一般須要進行一些 Mask操做,防止信息泄露問題,信息泄露指在預測單詞 "天然" 的時候,提早得知 "天然" 的信息。後面會講到 Transformer Encoder 信息泄露的緣由。
Word2Vec 的 CBOW:經過單詞 i 的上文和下文信息預測單詞 i,可是採用的是詞袋模型,不知道單詞的順序信息。例如預測單詞 "天然" 的時候,會同時採用上文 "我/喜歡/學習" 和下文 "語言/處理" 進行預測。CBOW 在訓練時是至關於把 "天然" 這個單詞 Mask 的。
ELMo:ELMo 在訓練的時候使用 biLSTM,預測 "天然" 的時候,前向 LSTM 會 Mask "天然" 以後的全部單詞,使用上文 "我/喜歡/學習" 預測;後向 LSTM 會 Mask "天然" 以前的單詞,使用下文 "語言/處理" 進行預測。而後再將前向 LSTM 和後向 LSTM 的輸出拼接在一塊兒,所以 ELMo 是將上下文信息分隔開進行預測的,而不是同時利用上下文信息進行預測。
OpenAI GPT:OpenAI GPT 是另一種使用 Transformer 訓練語言模型的算法,可是 OpenAI GPT 使用的是 Transformer 的 Decoder,是一種單向的結構。預測 "天然" 的時候只使用上文 "我/喜歡/學習",Decoder 中包含了 Mask 操做,將當前預測詞以後的單詞都 Mask。
下圖顯示了 BERT 和 ELMo、OpenAI GPT 的區別。
BERT 的做者認爲在預測單詞時,要同時利用單詞 left (上文) 和 right (下文) 信息才能最好地預測。將 ELMo 這種分別進行 left-to-right 和 right-to-left 的模型稱爲 shallow bidirectional model (淺層雙向模型),BERT 但願在 Transformer Encoder 結構上訓練出一種深度雙向模型 deep bidirectional model,所以提出了 Mask LM 這種方法進行訓練。
Mask LM 是用於防止信息泄露的,例如預測單詞 "天然" 的時候,若是不把輸入部分的 "天然" Mask 掉,則預測輸出的地方是能夠直接得到 "天然" 的信息。
BERT 在訓練時只預測 [Mask] 位置的單詞,這樣就能夠同時利用上下文信息。可是在後續使用的時候,句子中並不會出現 [Mask] 的單詞,這樣會影響模型的性能。所以在訓練時採用以下策略,隨機選擇句子中 15% 的單詞進行 Mask,在選擇爲 Mask 的單詞中,有 80% 真的使用 [Mask] 進行替換,10% 不進行替換,剩下 10% 使用一個隨機單詞替換。
例如句子 "my dog is hairy",選擇了單詞 "hairy" 進行 Mask,則:
- 80% 的機率,將句子 "my dog is hairy" 轉換爲句子 "my dog is [Mask]"。
- 10% 的機率,保持句子爲 "my dog is hairy" 不變。
- 10% 的機率,將單詞 "hairy" 替換成另外一個隨機詞,例如 "apple"。將句子 "my dog is hairy" 轉換爲句子 "my dog is apple"。
以上是 BERT 的第一個預訓練任務 Masked LM。
3.2 下一句預測
BERT 的第二個預訓練任務是 Next Sentence Prediction (NSP),即下一句預測,給定兩個句子 A 和 B,要預測句子 B 是不是句子 A 的下一個句子。
BERT 使用這一預訓練任務的主要緣由是,不少下游任務,例如問答系統 (QA),天然語言推斷 (NLI) 都須要模型可以理解兩個句子之間的關係,可是經過訓練語言模型達不到這個目的。
BERT 在進行訓練的時候,有 50% 的機率會選擇相連的兩個句子 A B,有 50% 的機率會選擇不相連獲得兩個句子 A B,而後經過 [CLS] 標誌位的輸出 C預測句子 A 的下一句是否是句子 B。
- 輸入 = [CLS] 我 喜歡 玩 [Mask] 聯盟 [SEP] 我 最 擅長 的 [Mask] 是 亞索 [SEP]類別 = B 是 A 的下一句
- 輸入 = [CLS] 我 喜歡 玩 [Mask] 聯盟 [SEP] 今天 天氣 很 [Mask] [SEP]類別 = B 不是 A 的下一句
4. BERT 總結
由於 BERT 預訓練時候採用了 Masked LM,每一個 batch 只會訓練 15% 的單詞,所以須要更多的預訓練步驟。ELMo 之類的順序模型,會對每個單詞都進行預測。
BERT 使用了 Transformer 的 Encoder 和 Masked LM 預訓練方法,所以能夠進行雙向預測;而 OpenAI GPT 使用了 Transformer 的 Decoder 結構,利用了 Decoder 中的 Mask,只能順序預測。