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

論文地址:https://arxiv.org/pdf/1810.04805.pdf
論文標(biāo)題:
- Bert - Bidirectional Encoder Representations from Transformers
- 一種從Transformers模型得來的雙向編碼表征模型。
GitHub地址:https://github.com/google-research/bert
機(jī)構(gòu):谷歌
0、摘要:
我們介紹了一種新的語言表示模型,稱為BERT,它來自Transformer的雙向編碼表示。與最近的語言表征模型(Peters等人,2018a;Radford等人,2018)不同,BERT的設(shè)計目的是通過對標(biāo)記的文本上進(jìn)行預(yù)訓(xùn)練,調(diào)節(jié)各個層的參數(shù),學(xué)習(xí)上下文表示。因此只需要增加一個輸出層進(jìn)行微調(diào),就能在多個任務(wù)上達(dá)到 SOTA 水平。
預(yù)訓(xùn)練的BERT模型可以通過fine-tuned 在廣泛的任務(wù)中創(chuàng)造新的最佳記錄,比如問答任務(wù),語言推理任務(wù)等,而不需要對BERT本身架構(gòu)做實質(zhì)性的修改。
1、介紹:
○ 將預(yù)訓(xùn)練語言模型應(yīng)用在下游任務(wù)中,一般有兩種策略:
- (1)feature-based: 例子是 ELMo 。
- (2)fine-tuning: 例子是 GPT。
作者認(rèn)為影響當(dāng)前預(yù)訓(xùn)練語言模型的瓶頸是——“模型是單向的”。如 GPT 選擇從左到右的架構(gòu),這使得每個 token 只能注意到它前面的 token,這對 sentence 級的任務(wù)影響還是次要的,但對于 token 級的任務(wù)來說影響就很巨大。例如問答任務(wù),從兩個方向結(jié)合上下文是至關(guān)重要的。
BERT 通過使用受完形填空任務(wù)啟發(fā)的 Mask Language Model (MLM)緩解了先前模型的單向性約束問題。MLM 隨機(jī) mask 掉一些輸入文本中的 token,然后根據(jù)剩下的上下文預(yù)測 masked 的 token。除了 Mask Language Model,作者還提出了 Next Sequence Predict 任務(wù),來聯(lián)合訓(xùn)練文本對表示。
論文中BERT的改進(jìn)如下:
- (1)證明了雙向預(yù)訓(xùn)練對于語言表示模型的重要性。
- (2)證明了預(yù)訓(xùn)練表示減少了為特定任務(wù)精心設(shè)計網(wǎng)絡(luò)架構(gòu)的必要性。BERT是第一個基于微調(diào)的表示模型,實現(xiàn)了在一套進(jìn)行語句級和標(biāo)記級任務(wù)中的最出色的表現(xiàn),優(yōu)于許多特定任務(wù)的體系結(jié)構(gòu)。
- (3)BERT 在11個 NLP 任務(wù)上達(dá)到了 SOTA 水平。代碼位置:https://github.com/google-research/bert
2 相關(guān)工作:
預(yù)訓(xùn)練前的一般語言表征有著悠久歷史,本節(jié)我們簡要回顧一下最廣泛使用的方法。
2.1 基于特征的無監(jiān)督方法:
幾十年來,學(xué)習(xí)廣泛適用的詞匯表征一直是一個活躍的研究領(lǐng)域,包括非神經(jīng)系統(tǒng)、神經(jīng)系統(tǒng)方法。預(yù)訓(xùn)練的詞嵌入是現(xiàn)代NLP系統(tǒng)的一個組成部分,與從頭學(xué)習(xí)的嵌入相比,它提供了顯著的改進(jìn)(Turian等人,2010)。為了預(yù)先訓(xùn)練單詞嵌入向量,已經(jīng)使用了從左到右的語言建模目標(biāo)(Mnih和Hinton,2009),以及在左右上下文中區(qū)分正確單詞和錯誤單詞的目標(biāo)(Mikolov等人,2013)。
這些方法已被推廣到更粗糙的粒度,例如句子嵌入(Kiros等人,2015;Logeswaran和Lee,2018)或段落嵌入(Le和Mikolov,2014)。為了訓(xùn)練句子表征,之前的工作已經(jīng)使用了目標(biāo)對候選下一個句子進(jìn)行排序(Jernite等人,2017;Logeswaran和Lee,2018),根據(jù)前一個句子的表征從左到右生成下一個句子單詞(Kiros等人,2015),或去噪自動編碼器衍生的目標(biāo)(Hill等人,2016)。
ELMo及其前身(Peters等人,20172018a)從不同的維度概括了傳統(tǒng)的單詞嵌入研究。它們通過從左到右和從右到左的語言模型中提取上下文敏感的特征。每個標(biāo)記的上下文表示是從左到右和從右到左表示的串聯(lián)。在將上下文單詞嵌入與現(xiàn)有任務(wù)特定架構(gòu)相結(jié)合時,ELMo推進(jìn)了幾個主要NLP基準(zhǔn)(Peters等人,2018a)的最新技術(shù),包括問答(Rajpurkar等人,2016年)、情感分析(Socher等人,2013年)和命名實體識別(Tjong Kim-Sang和De Meulder,2003年)。Melamud等人(2016年)提出通過一項任務(wù)來學(xué)習(xí)語境表征,即使用LSTM從左右語境中預(yù)測單個單詞。與ELMo類似,他們的模型是基于特征的,而不是深度雙向的。Fedus等人(2018)表明,完形填空任務(wù)可以用來提高文本生成模型的穩(wěn)健性。
2.2 無監(jiān)督微調(diào)方法:
與基于特征feature-based的方法一樣,第一種方法只在未標(biāo)記文本中預(yù)先訓(xùn)練單詞嵌入?yún)?shù)的情況下才朝這個方向工作。最近,產(chǎn)生上下文標(biāo)記表示的句子或文檔編碼器已經(jīng)從未標(biāo)記的文本和文本中預(yù)訓(xùn)練出來針對受監(jiān)督的下游任務(wù)進(jìn)行了微調(diào)fine-tuned。
這些方法的優(yōu)點是,很少有參數(shù)需要從頭學(xué)習(xí)。至少部分由于這一優(yōu)勢,OpenAI GPT在GLUE基準(zhǔn)測試的許多句子級任務(wù)上取得了之前的最新成果。從左到右的語言建模和自動編碼器目標(biāo)已用于此類模型的預(yù)訓(xùn)練。
-
BERT 模型有兩個步驟:預(yù)訓(xùn)練、微調(diào):
○ 預(yù)訓(xùn)練時,模型在不同的預(yù)訓(xùn)練任務(wù)中基于未標(biāo)記數(shù)據(jù)進(jìn)行訓(xùn)練;
○ 微調(diào)時,先使用預(yù)訓(xùn)練模型的參數(shù)初始化 BERT 模型,再在特定任務(wù)的標(biāo)注數(shù)據(jù)上對參數(shù)進(jìn)行微調(diào)。以問答為例,如下圖所示:

注解:BERT的整體預(yù)訓(xùn)練和微調(diào)程序。除了輸出層之外,在預(yù)訓(xùn)練和微調(diào)中使用相同的體系結(jié)構(gòu)。相同的預(yù)訓(xùn)練模型參數(shù)用于初始化不同下游任務(wù)的模型。在微調(diào)過程中,所有參數(shù)都會微調(diào)。
- [CLS] 是每個輸入示例開頭的特殊標(biāo)記;
- [SEP] 是一個特殊的標(biāo)記用于區(qū)分 question/answer。
2.3 基于監(jiān)督數(shù)據(jù)的遷移學(xué)習(xí):
也有研究表明,在大數(shù)據(jù)集的監(jiān)督任務(wù)中,如自然語言推理和機(jī)器翻譯可以有效地進(jìn)行轉(zhuǎn)換。計算機(jī)視覺研究也證明了從大型預(yù)訓(xùn)練模型中進(jìn)行遷移學(xué)習(xí)的重要性,其中一個有效的方法是對使用ImageNet預(yù)訓(xùn)練模型進(jìn)行微調(diào)。
3 BERT:
本節(jié)將介紹BERT及其詳細(xì)實現(xiàn)。在我們的框架中有兩個步驟:預(yù)訓(xùn)練和微調(diào)。
- 在預(yù)訓(xùn)練期間,模型在不同的預(yù)訓(xùn)練任務(wù)中基于未標(biāo)記的數(shù)據(jù)進(jìn)行訓(xùn)練。
- 對于微調(diào),首先,使用預(yù)先訓(xùn)練的參數(shù)初始化BERT模型,然后,使用來自下游任務(wù)的標(biāo)記數(shù)據(jù)微調(diào)所有參數(shù)。每個下游任務(wù)都有單獨的微調(diào)模型,即使它們是用相同的預(yù)訓(xùn)練參數(shù)初始化的。這個圖1中的問答示例將作為本節(jié)的運(yùn)行示例。
BERT的一個顯著特點是其跨不同任務(wù)的統(tǒng)一體系結(jié)構(gòu)。預(yù)訓(xùn)練的體系結(jié)構(gòu)和最終的下游體系結(jié)構(gòu)之間的差異最小。
-
模型架構(gòu):
BERT 的模型架構(gòu)是一種多層的雙向 transformer encoder,BERT 在實現(xiàn)上與 transformer encoder 幾乎完全相同。
定義:transformer block 的個數(shù)為 L ; hidden 大小為 H; self-attentions head 的個數(shù)為 A. 作者主要展示了兩種規(guī)模的 BERT 模型:
在這項工作中,我們將層數(shù)(即Transformer blocks)表示為L,隱藏大小表示為H,自我注意頭的數(shù)量表示為A。我們主要報告兩種型號的結(jié)果:
- BERT - base : L=12, H=768, A=12, Total Parameters=110M。
- BERT - large: L=24, H=1024,A=16, Total Parameters=340M。

為了進(jìn)行比較,選擇BERT-base與OpenAI GPT具有相同的模型大小。然而,關(guān)鍵的是,BERT Transformer使用雙向自注意力機(jī)制self-attention,而GPT Transformer使用受限自注意力機(jī)制constrained self-attention,其中每個標(biāo)記只能關(guān)注其左側(cè)的上下文。
輸入/輸出表示:
為了使 BERT 能處理大量不同的下游任務(wù),作者將模型的輸入設(shè)計成可以輸入單個句子或句子對,這兩種輸入被建模成同一個 token 序列。作者使用了有 30000 個 token 的 vocabulary 詞嵌入。
輸入序列:第一個 token 都是一個特殊標(biāo)記 [CLS],該標(biāo)記的最終隱藏狀態(tài)用來聚合句子的表征,從而實現(xiàn)分類任務(wù)。對于 sentence 對,作者使用特殊標(biāo)記 [SEP] 來區(qū)分不同的句子。
輸出序列:用 E 來表示輸入的 embedding,[CLS] 的最終隱藏狀態(tài)為 C∈R H ,輸入序列的第 i 個 token 的隱藏向量為 T i ∈ R H T 。對于 Ti ,都是通過 token embedding、segment embedding、position embedding 加和構(gòu)造出來的。如下圖所示:

3.1 Pre-training BERT:
我們不使用傳統(tǒng)的從左到右或從右到左的語言模型來預(yù)訓(xùn)練BERT。相反,我們使用本節(jié)所述的兩個無監(jiān)督任務(wù)對BERT進(jìn)行預(yù)訓(xùn)練。這一步如圖1的左半部分所示。
Task #1: Masked LM
標(biāo)準(zhǔn)的語言模型只能實現(xiàn)從左到右或從右到左的訓(xùn)練,不能實現(xiàn)真正的雙向訓(xùn)練,這是因為雙向的條件是每個單詞能直接“看到自己”,并且模型可以在多層上下文中輕松的預(yù)測出目標(biāo)詞。
為了能夠?qū)崿F(xiàn)雙向的深度預(yù)訓(xùn)練,作者選擇隨機(jī) mask 掉一些比例的 token,然后預(yù)測這些被 masked 的 token,在這種設(shè)置下,被 masked 的 token 的隱向量表示被輸出到詞匯表的 softmax 上,這就與標(biāo)準(zhǔn)語言模型設(shè)置相同。作者將這個過程稱為“Masked LM”,也被稱為“完形填空”。
○ Masked LM 預(yù)訓(xùn)練任務(wù)的缺點:
在于由于 [MASK] 標(biāo)記不會出現(xiàn)在微調(diào)階段,這就造成了預(yù)訓(xùn)練和微調(diào)階段的不一致。為了解決該問題,作者提出了一種折中的方案:
○ BERT 的 mask策略:
- 隨機(jī)選擇 15% 的 token;
- 這些15%要被 masked 的 token 并不會真的全替換成 [MASK],而是從這些 token 中:
(1)隨機(jī)選擇 80% 替換成 [MASK] ;
(2)隨機(jī)選擇 10% 替換成隨機(jī) token;
(3)隨機(jī)選擇 10% 不改變原 token。
然后 T i 使用交叉熵?fù)p失來預(yù)測原始的 token。
Task #2: Next Sentence Prediction (NSP)
很多下游任務(wù)都是基于對兩句話之間的關(guān)系的理解,語言模型不能直接捕獲這種信息。為了訓(xùn)練模型理解這種句間關(guān)系,作者設(shè)計了 next sentence prediction 的二分類任務(wù)。具體來說,就是選擇兩個句子作為一個訓(xùn)練樣本,有 50% 的概率是下一句關(guān)系,有 50% 的概率是隨機(jī)選擇的句子對,預(yù)測將 [CLS] 的最終隱狀態(tài) C 輸入 sigmoid 實現(xiàn)。
○ Pre-training data:
作者選用了BooksCorpus (800M words) 和 English Wikipedia (2,500M words) 作為預(yù)訓(xùn)練的語料庫,作者只選取了 Wikipedia 中的文本段落,忽略了表格、標(biāo)題等。為了獲取長的連續(xù)文本序列,作者選用了 BIllion Word Benchmark 這樣的文檔級語料庫,而非打亂的句子級語料庫。
3.2 Fine-tuning BERT:
因為 transformer 中的 self-attention 機(jī)制適用于很多下游任務(wù),所以可以直接對模型進(jìn)行微調(diào)。對于涉及文本對的任務(wù),一般的做法是獨立 encode 文本對,然后再應(yīng)用雙向的 cross attention 進(jìn)行交互。Bert 使用 self-attention 機(jī)制統(tǒng)一了這兩個階段,該機(jī)制直接能夠?qū)崿F(xiàn)兩個串聯(lián)句子的交叉編碼。
對于不同的任務(wù),只需要簡單地將特定于該任務(wù)的輸入輸出插入到 Bert 中,然后進(jìn)行 end2end 的fine-tuning。
對于輸入,預(yù)訓(xùn)練中的 sentence A 和 sentence B 能夠替換成:
(1)同義關(guān)系中的句子對;
(2)蘊(yùn)含關(guān)系中的“假設(shè)-前提對”;
(3)問答中的“段落-問題對”;
(4)文本分類或序列標(biāo)注中的“文本-null”。對于輸出,對于 token-level 的任務(wù),如序列標(biāo)注、問答,將 Bert 輸出的 token 編碼輸入到輸出層;對于 sentence-level 的任務(wù),如句子的蘊(yùn)含關(guān)系、情感分析等,將 [CLS] 作為輸入序列的聚合編碼,輸入到輸出層。
與預(yù)訓(xùn)練相比,微調(diào)相對便宜。從完全相同的預(yù)訓(xùn)練模型開始,本文中的所有結(jié)果最多可以在單個云TPU上復(fù)制1小時,或在GPU上復(fù)制幾個小時。
4 實驗:
在本節(jié)中,我們將介紹11個NLP任務(wù)的BERT微調(diào)結(jié)果。
4.1 GLUE:
GLUE (General Language Understanding Evaluation) 是多個 NLP 任務(wù)的集合。作者設(shè)置 batch size 為 32;訓(xùn)練 3 個 epochs;在驗證集上從(5e-5, 4e-5, 3e-5, 2e-5)中選擇最優(yōu)的學(xué)習(xí)率。結(jié)果如下:

結(jié)果見表1。BERT-base和BERT-large在所有任務(wù)上都比所有系統(tǒng)表現(xiàn)出色,與現(xiàn)有技術(shù)相比,平均準(zhǔn)確率分別提高了4.5%和7.0%。請注意,除了注意掩蔽,BERT-base和OpenAI GPT在模型架構(gòu)方面幾乎相同。
對于最大和最廣泛報道的GLUE任務(wù)MNLI,BERT獲得了4.6%的絕對準(zhǔn)確率提高。在官方的GLUE排行榜10中,BERT-lagle獲得80.5分,而OpenAI GPT在撰寫本文之日獲得72.8分。我們發(fā)現(xiàn)BERT-large在所有任務(wù)中都顯著優(yōu)于BERT-base,尤其是那些訓(xùn)練數(shù)據(jù)很少的任務(wù)。
4.2 SQuAD v1.1:
斯坦福問答數(shù)據(jù)集(SQuAD v1.1)收集了10萬對眾包問答對。給出一個問題和一段維基百科中包含答案的文章,任務(wù)是預(yù)測文章中的答案文本。
如圖1所示,在問答任務(wù)中,我們將輸入的問題和段落表示為單個壓縮序列,問題使用A嵌入,段落使用B嵌入。在微調(diào)過程,我們只引入一個起始向量S和一個端向量E。單詞i作為答案范圍開始的概率計算為Ti和S之間的點積,然后是段落中所有單詞的softmax:

答案范圍結(jié)束時使用類似公式。候選人從位置 i 到位置 j 的得分定義為:S·Ti + E·Tj ,最大得分跨度為 j≥ i 被用作預(yù)測。訓(xùn)練目標(biāo)是正確起始位置和結(jié)束位置的對數(shù)概率之和。我們微調(diào)了3個階段,學(xué)習(xí)率為5e-5,批量大小為32。
表2顯示了頂級排行榜條目以及頂級發(fā)布系統(tǒng)的結(jié)果。SQuAD排行榜的前幾名沒有最新的公共系統(tǒng)描述,并且允許在訓(xùn)練系統(tǒng)時使用任何公共數(shù)據(jù)。因此,在我們的系統(tǒng)中使用適度的數(shù)據(jù)擴(kuò)充,首先在TriviaQA上進(jìn)行微調(diào),然后再對團(tuán)隊進(jìn)行微調(diào)。

我們表現(xiàn)最好的系統(tǒng)在ensembling方面的表現(xiàn)優(yōu)于排名第一的系統(tǒng),在ensembling方面的表現(xiàn)優(yōu)于排名第一的系統(tǒng)+1.5 F1,在單一系統(tǒng)方面的表現(xiàn)優(yōu)于排名第一的系統(tǒng)+1.3 F1得分。事實上,我們的單BERT模型在F1成績方面優(yōu)于頂級合奏系統(tǒng)。如果沒有TriviaQA微調(diào)數(shù)據(jù),我們只會損失0.1-0.4 F1,仍然遠(yuǎn)遠(yuǎn)超過所有現(xiàn)有系統(tǒng)。
其他實驗:略
5 消融研究:
在本節(jié)中,我們對BERT的許多方面進(jìn)行了消融實驗,以便更好地了解它們的相對重要性。其他消融研究見附錄C。
5.1 預(yù)訓(xùn)練任務(wù)的效果:
○ 進(jìn)行了如下消融測試:
- “No NSP” :不進(jìn)行 nsp 任務(wù),只進(jìn)行 Masked LM task;
- “LTR & No NSP” :不進(jìn)行 nsp 任務(wù),且使用標(biāo)準(zhǔn)語言模型采用的 Left-to-Right 訓(xùn)練方法。
○ 結(jié)果如下:

如果采用像 ELMo 那樣訓(xùn)練 LTR 和 RTL 模型,再對結(jié)果進(jìn)行拼接,有以下缺點:
(1)相對于單個雙向模型來說,表征長度翻倍,代價相對提高.
(2)這種拼接不直觀,因為對于 QA 任務(wù)來說,RTL 任務(wù)做的事實際上是 “根據(jù)答案推導(dǎo)問題” 這是不靠譜的。
(3)與深度雙向模型相比,這種在上下文上的雙向交互的能力較弱,因為雙向模型在每層都能進(jìn)行雙向的上下文交互。
5.2 模型大小的影響:
○ 結(jié)果如下:

作者證明了:如果模型經(jīng)過充分的預(yù)訓(xùn)練,即使模型尺寸擴(kuò)展到很大,也能極大改進(jìn)訓(xùn)練數(shù)據(jù)規(guī)模較小的下游任務(wù)。
5.3 將 Bert 應(yīng)用于 Feature-based 的方法:
○ feature-based 的方法是從預(yù)訓(xùn)練模型中提取固定的特征,不對具體任務(wù)進(jìn)行微調(diào)。
○ 這樣的方法也有一定的優(yōu)點:
- (1) 并非所有任務(wù)都能用 transformer 架構(gòu)簡單表示,因此這些任務(wù)都需要添加特定的架構(gòu);
- (2) feature-based 的方法還有一定的計算成本優(yōu)勢。
作者進(jìn)行了如下實驗:在 CoNLL-2003 數(shù)據(jù)集上完成 NER 任務(wù),不使用 CRF 輸出,而是從一到多個層中提取出激活值,輸入到 2 層 768 維的 BiLSTM 中,再直接分類。結(jié)果如下:

結(jié)果說明:無論是否進(jìn)行微調(diào),Bert 模型都是有效的。
6 總結(jié):
個人認(rèn)為 Bert 的意義在于:
- 成功實踐了 pre-training + fine-tuning 的深度學(xué)習(xí)范式;
- 發(fā)掘了在 NLP 中“深度雙向架構(gòu)”在預(yù)訓(xùn)練任務(wù)中的重要意義。
由于語言模型的遷移學(xué)習(xí),最近的經(jīng)驗改進(jìn)表明,豐富的、無監(jiān)督的預(yù)訓(xùn)練是許多語言理解系統(tǒng)的一個組成部分。特別是,這些結(jié)果使得即使是低資源任務(wù)也能從深層單向體系結(jié)構(gòu)中受益。我們的主要貢獻(xiàn)是將這些發(fā)現(xiàn)進(jìn)一步推廣到深層雙向體系結(jié)構(gòu)中,使相同的預(yù)訓(xùn)練模型能夠成功地處理廣泛的NLP任務(wù)。