論文標題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文鏈接:https://arxiv.org/abs/1810.04805
一骨稿、概述
- 簡介
BERT(Bidirectional Encoder Representations from Transformers)通過預訓練來學習無標注數(shù)據(jù)中的深度雙向表示扳肛,預訓練結(jié)束后通過添加一個額外的輸出層進行微調(diào)懒震,最終在多個NLP任務上實現(xiàn)了SOTA苟径。
預訓練語言模型在實踐中證明對提高很多自然語言處理任務有效视译,其中包括句子層級的任務徒蟆,比如自然語言推斷(natural language inference)和復述(paraphrasing)县习,還有token層級的任務迫悠,比如命名實體識別(named entity recognition)和問答(question answering)。
- 預訓練模型使用方法
在下游任務中應用預訓練語言模型表示的方法有兩種:feature-based的方法和fine-tuning的方法于购。舉例來說袍睡,ELMo這種預訓練語言模型使用feature-based的方法,通過將ELMo的預訓練的表示作為額外的特征輸入到特定于任務的模型中去肋僧;GPT使用fine-tuning的方法斑胜,通過引入少量的特定于任務的參數(shù)控淡,在下游任務中訓練時所有的預訓練參數(shù)。
- 語言模型的單向與雙向
截止BERT之前的預訓練語言模型都是單向的(unidirectional)止潘,包括GPT和ELMo掺炭,這樣的方法對句子層級的任務不是最優(yōu)的,而且對于token層級的任務比如問答非常有害凭戴。BERT使用masked language model(MLM)的方法來預訓練涧狮,這種方法能夠訓練一個雙向的(directional)語言模型。除了masked language model的預訓練的方法么夫,BERT還使用了next sentence prediction的預訓練方法者冤。
- BERT的貢獻
BERT證明了雙向預訓練的重要性;
BERT減少了對精心設計的特定于下游任務中的架構的依賴档痪;
BERT在11個下游任務上達到了SOTA涉枫。
二、BERT
BERT的使用分為兩個階段:預訓練(pre-training)和微調(diào)(fine-tuning)腐螟。預訓練階段模型通過兩種不同的預訓練任務來訓練無標注數(shù)據(jù)愿汰。微調(diào)階段模型使用預訓練參數(shù)初始化,然后使用下游任務(downstream task)的標注數(shù)據(jù)來微調(diào)參數(shù)乐纸。
BERT的一個顯著特點是它在不同的任務上有統(tǒng)一的架構衬廷,使用時只需要在BERT后面接上下游任務的結(jié)構即可使用。
- 模型架構
BERT的模型架構是一個多層雙向的Transformer的encoder锯仪。我們標記模型的層數(shù)(每一層是一個Tranformer的block)為泵督,模型的hidden size為
,self-attention head的數(shù)量為
庶喜。兩個比較通用的BERT架構為
和
小腊。
對比GPT,BERT使用了雙向self-attention架構久窟,而GPT使用的是受限的self-attention秩冈, 即限制每個token只能attend到其左邊的token。
- BERT輸入和輸出的表示
BERT的輸入表示能夠是一個句子或者是一個句子對斥扛,這是為了讓BERT能夠應對各種不同的下游任務入问。BERT的輸入是一個序列,該序列包含一個句子的token或者兩個句子結(jié)合在一起的token稀颁。
具體地芬失,我們會將輸入的自然語言句子通過WordPiece embeddings來轉(zhuǎn)化為token序列。這個token序列的開頭要加上[CLS]
這個特殊的token匾灶,最終輸出的[CLS]
這個token的embedding可以看做句子的embedding棱烂,可以使用這個embedding來做分類任務。
由于句子對被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的預訓練
BERT使用兩個無監(jiān)督的任務進行預訓練蒜胖,分別是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能夠間接地“看到自己”,并且模型能夠在多層上下文中簡單地預測目標詞怀读。
為了能夠雙向地訓練語言模型诉位,BERT的做法是簡單地隨機mask掉一定比例的輸入token(這些token被替換成[MASK]
這個特殊token),然后預測這些被遮蓋掉的token菜枷,這種方法就是Masked LM(MLM)苍糠,相當于完形填空任務(cloze task)。被mask掉的詞將會被輸入到一個softmax分類器中啤誊,分類器輸出的維度對應詞典的大小岳瞭。在預訓練時通常為每個序列mask掉15%的token。與降噪自編碼器(denoising auto-encoders)相比蚊锹,我們只預測被mask掉的token瞳筏,并不重建整個輸入。
這種方法允許我們預訓練一個雙向的語言模型牡昆,但是有一個缺點就是造成了預訓練和微調(diào)之間的mismatch姚炕,這是因為[MASK]
這個token不會在微調(diào)時出現(xiàn)。為了緩解這一點丢烘,我們采取以下做法:在生成訓練數(shù)據(jù)時我們隨機選擇15%的token進行替換柱宦,被選中的token有80%的幾率被替換成[MASK]
,10%的幾率被替換成另一個隨機的token播瞳,10%的幾率該token不被改變掸刊。然后將使用交叉熵損失來預測原來的token。
- Task 2: Next Sentence Prediction (NSP)
一些重要的NLP任務如Question Answering (QA)或者Natural Language Inference (NLI)需要理解句子之間的關系狐史,而這種關系通常不會被語言模型直接捕捉到痒给。為了使得模型能夠理解句子之間的關系说墨,我們訓練了一個二值的Next Sentence Prediction任務,其訓練數(shù)據(jù)可以從任何單語語料庫中生成苍柏。具體的做法是:當選擇句子A和句子B作為訓練數(shù)據(jù)時尼斧,句子B有50%的幾率的確是句子A的下一句(標簽是IsNext
),50%的幾率是從語料庫中隨機選擇的句子(標簽是NotNext
)试吁。[CLS]
對應的最后一個隱層輸出向量被用來訓練NSP任務棺棵,這個embedding就相當于sentence embedding。雖然這個預訓練任務很簡單熄捍,但是事實上在微調(diào)時其在QA和NLI任務上表現(xiàn)出了很好的效果烛恤。在前人的工作中,只有sentence embedding被遷移到下游任務中余耽,而BERT會遷移所有的參數(shù)來初始化下游任務模型缚柏。
- BERT的微調(diào)
Transformer的self-attention機制允許BERT建模多種下游任務。對于包含句子對的任務碟贾,通常的做法是先獨立地對句子對中的句子進行編碼币喧,然后再應用雙向交叉注意(bidirectional cross attention)。而BERT使用self-attention機制統(tǒng)一了這兩個過程袱耽,這是因為對拼接起來的句子對進行self-attention有效地包含了兩個句子之間的雙向交叉注意(bidirectional cross attention)杀餐。
對于每個任務來說,我們只需要將任務特定的輸入輸出插入到BERT中然后端到端地微調(diào)即可朱巨。舉例子來說史翘,BERT的預訓練輸入句子A和句子B在微調(diào)時可以類比為:
①paraphrasing任務中的句子對;
②entailment任務中的hypothesis-premise對冀续;
③question answering任務中的question-passage對琼讽;
④text classification或者sequence tagging任務中的text-?對(也就是只輸入一個text,不必一定需要兩個句子)沥阳。
對于BERT的輸出跨琳,對于一些token-level的任務,BERT的token表示將被輸入到一個輸出層桐罕,比如sequence tagging或者question answering任務脉让;對于entailment或者sentiment analysis這樣的任務,可以將[CLS]
對應的表示輸入到一個輸出層功炮。
三溅潜、實驗
- GLUE
我們使用[CLS]
這個token的最后一層的隱層向量作為聚合的表示,可以認為是sentence embedding薪伏。在微調(diào)時只引入一個新的權重
滚澜,這里的
代表標簽的數(shù)量,然后計算標準分類損失
嫁怀。下圖展示了BERT在GLUE上的效果:
- SQuAD v1.1
在這個數(shù)據(jù)集上设捐,我們將question和passage拼接起來作為一個輸入序列(中間是[SEP]
)借浊。在微調(diào)時引入一個start向量和一個end向量
,計算
和
的點積然后通過
函數(shù)作為word
是答案的span起始位置的概率:
萝招。答案的終止位置也做上述類似處理蚂斤。從
到
的候選區(qū)間的得分記作
,我們挑選
的最大得分區(qū)間作為預測的結(jié)果槐沼。下圖展示了BERT在SQuAD v1.1上的效果:
- SQuAD v2.0
SQuAD v2.0有的question在提供的passage中沒有答案存在曙蒸。在微調(diào)時我們設置沒有答案的問題的span的起始和結(jié)束位置都是[CLS]
這個token,也就是start和end的可能性空間包含進了[CLS]
的位置岗钩。在預測時纽窟,我們比較沒有答案的span得分和最優(yōu)的有答案得分
。當
時兼吓,我們預測這是一個有答案的問題臂港,這里的
用來在dev set上選擇最優(yōu)的
。下圖展示了BERT在SQuAD v2.0上的效果:
- SWAG
微調(diào)時我們?yōu)锽ERT構建4個輸入序列周蹭,每一個是所給的句子(句子A)和一個可能的延續(xù)(句子B)趋艘。然后引入一個向量,該向量和每一個輸入對應的[CLS]
的embedding的點積再通過一個層來得到每個選擇的得分凶朗。下圖展示了BERT在SWAG上的效果: