論文標題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文鏈接:https://arxiv.org/abs/1810.04805
一、概述
- 簡介
BERT(Bidirectional Encoder Representations from Transformers)通過預(yù)訓練來學習無標注數(shù)據(jù)中的深度雙向表示,預(yù)訓練結(jié)束后通過添加一個額外的輸出層進行微調(diào),最終在多個NLP任務(wù)上實現(xiàn)了SOTA。
預(yù)訓練語言模型在實踐中證明對提高很多自然語言處理任務(wù)有效,其中包括句子層級的任務(wù),比如自然語言推斷(natural language inference)和復(fù)述(paraphrasing),還有token層級的任務(wù),比如命名實體識別(named entity recognition)和問答(question answering)。
- 預(yù)訓練模型使用方法
在下游任務(wù)中應(yīng)用預(yù)訓練語言模型表示的方法有兩種:feature-based的方法和fine-tuning的方法。舉例來說,ELMo這種預(yù)訓練語言模型使用feature-based的方法,通過將ELMo的預(yù)訓練的表示作為額外的特征輸入到特定于任務(wù)的模型中去;GPT使用fine-tuning的方法,通過引入少量的特定于任務(wù)的參數(shù),在下游任務(wù)中訓練時所有的預(yù)訓練參數(shù)。
- 語言模型的單向與雙向
截止BERT之前的預(yù)訓練語言模型都是單向的(unidirectional),包括GPT和ELMo,這樣的方法對句子層級的任務(wù)不是最優(yōu)的,而且對于token層級的任務(wù)比如問答非常有害。BERT使用masked language model(MLM)的方法來預(yù)訓練,這種方法能夠訓練一個雙向的(directional)語言模型。除了masked language model的預(yù)訓練的方法,BERT還使用了next sentence prediction的預(yù)訓練方法。
- BERT的貢獻
BERT證明了雙向預(yù)訓練的重要性;
BERT減少了對精心設(shè)計的特定于下游任務(wù)中的架構(gòu)的依賴;
BERT在11個下游任務(wù)上達到了SOTA。
二、BERT
BERT的使用分為兩個階段:預(yù)訓練(pre-training)和微調(diào)(fine-tuning)。預(yù)訓練階段模型通過兩種不同的預(yù)訓練任務(wù)來訓練無標注數(shù)據(jù)。微調(diào)階段模型使用預(yù)訓練參數(shù)初始化,然后使用下游任務(wù)(downstream task)的標注數(shù)據(jù)來微調(diào)參數(shù)。
BERT的一個顯著特點是它在不同的任務(wù)上有統(tǒng)一的架構(gòu),使用時只需要在BERT后面接上下游任務(wù)的結(jié)構(gòu)即可使用。
- 模型架構(gòu)
BERT的模型架構(gòu)是一個多層雙向的Transformer的encoder。我們標記模型的層數(shù)(每一層是一個Tranformer的block)為,模型的hidden size為
,self-attention head的數(shù)量為
。兩個比較通用的BERT架構(gòu)為
和
。
對比GPT,BERT使用了雙向self-attention架構(gòu),而GPT使用的是受限的self-attention, 即限制每個token只能attend到其左邊的token。
- BERT輸入和輸出的表示
BERT的輸入表示能夠是一個句子或者是一個句子對,這是為了讓BERT能夠應(yīng)對各種不同的下游任務(wù)。BERT的輸入是一個序列,該序列包含一個句子的token或者兩個句子結(jié)合在一起的token。
具體地,我們會將輸入的自然語言句子通過WordPiece embeddings來轉(zhuǎn)化為token序列。這個token序列的開頭要加上[CLS]
這個特殊的token,最終輸出的[CLS]
這個token的embedding可以看做句子的embedding,可以使用這個embedding來做分類任務(wù)。
由于句子對被pack到了一起,因此我們需要在token序列中區(qū)分它們,具體需要兩種方式:
①在token序列中兩個句子的token之間添加[SEP]
這樣一個特殊的token;
②我們?yōu)槊總€token添加一個用來學習的embedding來區(qū)分token屬于句子A還是句子B,這個embedding叫做segment embedding。
具體地,BERT的輸入由三部分相加組成:token embeddings、segment embeddings和position embeddings。如下圖所示:
- BERT的預(yù)訓練
BERT使用兩個無監(jiān)督的任務(wù)進行預(yù)訓練,分別是Masked LM和Next Sentence Prediction(NSP)。如下圖所示,我們定義輸入的embedding為,BERT最終輸出的
[CLS]
的embedding為,最終輸出的第
個token的embedding為
。
- Task 1: Masked LM
我們有理由相信一個深度雙向模型比left-to-right模型和left-to-right和right-to-left簡單連接的模型的效果更加強大。不幸的是,標準的條件語言模型只能夠夠left-to-right或者right-to-left地訓練,這是因為雙向條件會使每個token能夠間接地“看到自己”,并且模型能夠在多層上下文中簡單地預(yù)測目標詞。
為了能夠雙向地訓練語言模型,BERT的做法是簡單地隨機mask掉一定比例的輸入token(這些token被替換成[MASK]
這個特殊token),然后預(yù)測這些被遮蓋掉的token,這種方法就是Masked LM(MLM),相當于完形填空任務(wù)(cloze task)。被mask掉的詞將會被輸入到一個softmax分類器中,分類器輸出的維度對應(yīng)詞典的大小。在預(yù)訓練時通常為每個序列mask掉15%的token。與降噪自編碼器(denoising auto-encoders)相比,我們只預(yù)測被mask掉的token,并不重建整個輸入。
這種方法允許我們預(yù)訓練一個雙向的語言模型,但是有一個缺點就是造成了預(yù)訓練和微調(diào)之間的mismatch,這是因為[MASK]
這個token不會在微調(diào)時出現(xiàn)。為了緩解這一點,我們采取以下做法:在生成訓練數(shù)據(jù)時我們隨機選擇15%的token進行替換,被選中的token有80%的幾率被替換成[MASK]
,10%的幾率被替換成另一個隨機的token,10%的幾率該token不被改變。然后將使用交叉熵損失來預(yù)測原來的token。
- Task 2: Next Sentence Prediction (NSP)
一些重要的NLP任務(wù)如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之間的關(guān)系,而這種關(guān)系通常不會被語言模型直接捕捉到。為了使得模型能夠理解句子之間的關(guān)系,我們訓練了一個二值的Next Sentence Prediction任務(wù),其訓練數(shù)據(jù)可以從任何單語語料庫中生成。具體的做法是:當選擇句子A和句子B作為訓練數(shù)據(jù)時,句子B有50%的幾率的確是句子A的下一句(標簽是IsNext
),50%的幾率是從語料庫中隨機選擇的句子(標簽是NotNext
)。[CLS]
對應(yīng)的最后一個隱層輸出向量被用來訓練NSP任務(wù),這個embedding就相當于sentence embedding。雖然這個預(yù)訓練任務(wù)很簡單,但是事實上在微調(diào)時其在QA和NLI任務(wù)上表現(xiàn)出了很好的效果。在前人的工作中,只有sentence embedding被遷移到下游任務(wù)中,而BERT會遷移所有的參數(shù)來初始化下游任務(wù)模型。
- BERT的微調(diào)
Transformer的self-attention機制允許BERT建模多種下游任務(wù)。對于包含句子對的任務(wù),通常的做法是先獨立地對句子對中的句子進行編碼,然后再應(yīng)用雙向交叉注意(bidirectional cross attention)。而BERT使用self-attention機制統(tǒng)一了這兩個過程,這是因為對拼接起來的句子對進行self-attention有效地包含了兩個句子之間的雙向交叉注意(bidirectional cross attention)。
對于每個任務(wù)來說,我們只需要將任務(wù)特定的輸入輸出插入到BERT中然后端到端地微調(diào)即可。舉例子來說,BERT的預(yù)訓練輸入句子A和句子B在微調(diào)時可以類比為:
①paraphrasing任務(wù)中的句子對;
②entailment任務(wù)中的hypothesis-premise對;
③question answering任務(wù)中的question-passage對;
④text classification或者sequence tagging任務(wù)中的text-?對(也就是只輸入一個text,不必一定需要兩個句子)。
對于BERT的輸出,對于一些token-level的任務(wù),BERT的token表示將被輸入到一個輸出層,比如sequence tagging或者question answering任務(wù);對于entailment或者sentiment analysis這樣的任務(wù),可以將[CLS]
對應(yīng)的表示輸入到一個輸出層。
三、實驗
- GLUE
我們使用[CLS]
這個token的最后一層的隱層向量作為聚合的表示,可以認為是sentence embedding。在微調(diào)時只引入一個新的權(quán)重
,這里的
代表標簽的數(shù)量,然后計算標準分類損失
。下圖展示了BERT在GLUE上的效果:
- SQuAD v1.1
在這個數(shù)據(jù)集上,我們將question和passage拼接起來作為一個輸入序列(中間是[SEP]
)。在微調(diào)時引入一個start向量和一個end向量
,計算
和
的點積然后通過
函數(shù)作為word
是答案的span起始位置的概率:
。答案的終止位置也做上述類似處理。從
到
的候選區(qū)間的得分記作
,我們挑選
的最大得分區(qū)間作為預(yù)測的結(jié)果。下圖展示了BERT在SQuAD v1.1上的效果:
- SQuAD v2.0
SQuAD v2.0有的question在提供的passage中沒有答案存在。在微調(diào)時我們設(shè)置沒有答案的問題的span的起始和結(jié)束位置都是[CLS]
這個token,也就是start和end的可能性空間包含進了[CLS]
的位置。在預(yù)測時,我們比較沒有答案的span得分和最優(yōu)的有答案得分
。當
時,我們預(yù)測這是一個有答案的問題,這里的
用來在dev set上選擇最優(yōu)的
。下圖展示了BERT在SQuAD v2.0上的效果:
- SWAG
微調(diào)時我們?yōu)锽ERT構(gòu)建4個輸入序列,每一個是所給的句子(句子A)和一個可能的延續(xù)(句子B)。然后引入一個向量,該向量和每一個輸入對應(yīng)的[CLS]
的embedding的點積再通過一個層來得到每個選擇的得分。下圖展示了BERT在SWAG上的效果: