1. 程式人生 > >Devlin2018Google_BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

Devlin2018Google_BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

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

1. Abstract

  • BERT是一個基於上下文資訊的深度雙向表示預訓練模型
  • 對於一個具體任務(QA、機器翻譯等),只需在BERT模型基礎上新增一個輸出層進行fine-tuned即可(得到一個針對這個任務的、效能優良的模型),無需再做大規模修改

2. Introduction

目前兩種主流預訓練語言表示的應用策略:

  1. feature-based:將預訓練表示作為額外特徵,並使用tasks-specific結構的方法,如ELMo1
  2. fine-tuning:儘可能少地引入task-specific引數,並在預訓練引數的基礎上,利用實際任務的訓練進行微調,如Generative Pre-trained Transformer (OpenAI GPT)2

作者認為,當下的技術未能將預訓練表示(尤其是fine-tuning方法)的作用完全開發,原因在於單向(只基於上文或只基於下文)的標準語言模型限制了預訓練時結構的選擇。因此作者在雙向遮蔽語言模型(masked language model)思想的基礎上提出了BERT方法:

Bidirectional Encoder Representations from Transofrmers

主要貢獻:

  1. 首個基於微調的表示模型,在大量句子級和token級任務上實現最先進的效能,強於許多面向特定任務體系架構的系統
  2. 證明了雙向預訓練對於語言表示的重要性。與使用OpenAI和ELMo等單向語言模型進行預訓練不同,BERT使用遮蔽語言模型來;實現預訓練的深度雙向表示證明了雙向預訓練對於語言表示的重要性。與使用OpenAI和ELMo等單向語言模型進行預訓練不同,BERT使用遮蔽語言模型來;實現預訓練的深度雙向表示
  3. 重新整理11項NLP記錄重新整理11項NLP記錄

3. BERT

3.1 Model Architecture

模型結構:

多層雙向Transformer3編碼器

引數:

層(Transformer blocks)數 隱層大小 self-Attention heads 個數 feed-forward/filter size
L L H H A A 4 H 4H

文中使用的兩個模型:

L L H H A A T o t a P a r a m e t e r s Tota Parameters
BERT_ base 12 12 768 768 12 12 110 M 110M
BERT_large 24 24 1024 1024 16 16 340 M 340M

其中,和OpenAI GPT有完全相同大小的BERT_base用以與GPT作效能比較。BERT與GPT、ELMo的結構對比圖如下圖所示,三種結構中,只有BERT在所有層中都聯合使用了上下文資訊。
在這裡插入圖片描述

3.2 Input Representation

文章給出的輸入表示既可以明確表示單個文字句子,也可以明確表示一個文字句子對(如問答對)。對於一個給定的token,輸入表示為token embeddingsegment embeddingposition embedding之和。
在這裡插入圖片描述
具體內容如下:

  • 使用包含30,000個token詞彙表的WordPiece embeddings,用##代表分詞
  • 支援最長為512個token的文字序列
  • 每個句子的第一個token為特殊分類embedding[CLS],對應於這個token的Transformer輸出用於分類任務中的聚合序表示,對於非分類任務此向量可忽略。
  • 句子對被打包成一個句子,並以特殊token[SEP]進行分隔,此外,文中還將已學習好的sentence A embedding新增到第一個句子的每個token中,也即 E A E_A ,將sentence B embedding新增到第二個句子的每個token中,也即 E B E_B 。如果輸入的是單個句子,則只需使用sentence A embedding。

3.3 Pre-training Tasks

文中沒有像GPT(從左至右訓練)和ELMo(將正反向預測結果簡單拼接)模型一樣預訓練BERT模型,而是採用了兩種新的無監督預測任務進行預訓練。實際上也很難通過標準語言模型訓練一個深度雙向表示,因為必然會導致token間接接觸到自己,從而使預測變得毫無意義。

3.3.1 Task #1: Masked LM

為了訓練一個深度雙向表示,論文考慮隨機遮蔽輸入文字的部分token,並在輸出層預測這些遮蔽詞,也即遮蔽語言模型MLM(在之後的實驗中,將隨機遮蔽每個WordPiece句子15%的token)。與之前的一些工作(如denoising auto-encoders)不同,此處只預測遮蔽詞,而非重構整個輸入。

但使用MLM模型可能存在兩個缺陷

  1. 首先是fine-tuning中不會出現[MASK]token,因此容易導致預訓練和fine-tuning間失配。因此文中考慮並不始終利用[MASK]代替被遮蔽的token,而是隨機選用15%的token代替之:
    - 80%時間內,用[MASK]代替:my dog is hairymy dog is [MASK]
    - 10%時間內,用隨機詞彙代替:my dog is hairymy dog is apple
    - 10%時間內,保持不變:my dog is hairymy dog is hairy,用以平衡真實token的學習
  2. 每個batch中只有15%的token被預測,因此為了保證收斂需要更多的預訓練次數,但最終收益遠高於傳統模型。

由於不知道哪些詞將要被預測或哪些詞會被隨機替換,Transformer編碼器將被迫保持每個輸入token的分散式上下文表示。此外,由於隨機替換隻發生1.5%,因此不會導致模型的語言理解能力惡化。

3.3.2 Task #2: Next Sentence Prediction

大多數下游任務中需要學習兩個文字句子之間的關係,如問答系統、自然語言推理等。文中使用了一種可以從任何語料庫中簡單生成的二進位制next sentence預測任務來訓練模型。

具體而言,當選定句子A和句子B當作預訓練樣本時,B以50%的機率被替換為另外一個隨機句子,並以1/0輸出判斷AB是否為Next關係

基於這種方式的預訓練模型最終達到了97%—98%的正確率,對QA和NLI任務有所幫助。

3.4 Pre-training Procedure

  • 預訓練語料:BooksCorpus(800M words),English Wikipedia(2,500M words)
  • 訓練過程:
    - 從語料庫中取樣兩段文字
    - 第一個句子獲得A embedding,第二個句子獲得B embedding,同時將50%的B隨機替換為其他句子(注意結合長度要小於512token)
    - 使用WordPiece進行分詞,並將15%token進行遮蔽
  • 損失為平均MLM似然和平均NSP似然之和

3.5 Fine-tuning Procedure

  • 對於sequence級的分類任務,將Transformer的輸出作為輸入序列的第一個token,也即特殊詞嵌入[CLS],其向量表示為 C R H C∈R^H 。此時只需在最後新增一個分類層 W R K × H W∈R^{K×H} K K 為類別個數。類別概率 P R K P∈R^K P = s o f t m a x ( C W T ) P=softmax(CW^T) 。通過最大對數似然概率法對BERT和 W W 的引數進行微調。
  • 對於span級和token級的預測任務,上述過程需要根據具體任務進行部分調整。

3.6 Comparison of BERT and OpenAI GPT

GBT BERT
基於BooksCorpus訓練 基於BooksCorpus和Wikipedia訓練
fine-tuning階段引入分句符號[SEP]和分類token[CLS] 預訓練階段學習[SEP][CLS]和句子A/B嵌入
1M; 32,000words/batch 1M steps; 128,000words/batch
對於所有fine-tuning實驗,學習率為5e-5 根據不同任務選擇最佳的fine-tuning學習率

總結

總而言之,本篇論文主要解決了一個問題:給出了一個預訓練好的通用語言模型,以及該模型的結構和預訓練方法。

這種通用語言模型在具體應用中只需要簡單新增一個輸出層,並對引數進行fine-tuning就可以實現非常好的效果,原因在於通過在預訓練中加入遮蔽詞,使之成為一個真正意義上結合上下文資訊進行預訓練的語言模型。

此外,通過在預訓練中加入Next sentence prediction,使該語言模型在處理句子級問題時也能有非常好的效果。

最後附上一個BERT的中文文字分類code

[1]: Peters2017ACL_Semi-supervised sequence tagging with bidirectional language models
[2]: Radford2018OpenAI_Improving Language Understanding by Generative Pre-Training
[3]: Vaswani2017NIPS_Attention is all you need


  1. 1 ↩︎

  2. 2 ↩︎

  3. 3 ↩︎