BERT:深度雙向預(yù)訓練語言模型

論文標題:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
論文鏈接:https://arxiv.org/abs/1810.04805

一、概述

  1. 簡介

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)。

  1. 預(yù)訓練模型使用方法

在下游任務(wù)中應(yīng)用預(yù)訓練語言模型表示的方法有兩種:feature-based的方法和fine-tuning的方法。舉例來說,ELMo這種預(yù)訓練語言模型使用feature-based的方法,通過將ELMo的預(yù)訓練的表示作為額外的特征輸入到特定于任務(wù)的模型中去;GPT使用fine-tuning的方法,通過引入少量的特定于任務(wù)的參數(shù),在下游任務(wù)中訓練時所有的預(yù)訓練參數(shù)。

  1. 語言模型的單向與雙向

截止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ù)訓練方法。

  1. 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)即可使用。

  1. 模型架構(gòu)

BERT的模型架構(gòu)是一個多層雙向的Transformer的encoder。我們標記模型的層數(shù)(每一層是一個Tranformer的block)為L,模型的hidden size為H,self-attention head的數(shù)量為A。兩個比較通用的BERT架構(gòu)為BERT_{BASE}(L=12,H=768,A=12,Total\; Parameters=110M)BERT_{LARGE}(L=24,H=1024,A=16,Total\; Parameters=340M)。

對比GPT,BERT使用了雙向self-attention架構(gòu),而GPT使用的是受限的self-attention, 即限制每個token只能attend到其左邊的token。

  1. 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 input
  1. BERT的預(yù)訓練

BERT使用兩個無監(jiān)督的任務(wù)進行預(yù)訓練,分別是Masked LM和Next Sentence Prediction(NSP)。如下圖所示,我們定義輸入的embedding為E,BERT最終輸出的[CLS]的embedding為C\in \mathbb{R}^{H},最終輸出的第i^{th}個token的embedding為T_{i}\in \mathbb{R}^{H}。

pre-training
  • 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不被改變。然后T_i將使用交叉熵損失來預(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ù)模型。

  1. 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)的表示輸入到一個輸出層。

三、實驗

  1. GLUE

我們使用[CLS]這個token的最后一層的隱層向量C\in \mathbb{R}^{H}作為聚合的表示,可以認為是sentence embedding。在微調(diào)時只引入一個新的權(quán)重W\in R^{K\times H},這里的K代表標簽的數(shù)量,然后計算標準分類損失log(softmax(CW^{T}))。下圖展示了BERT在GLUE上的效果:

GLUE
  1. SQuAD v1.1

在這個數(shù)據(jù)集上,我們將question和passage拼接起來作為一個輸入序列(中間是[SEP])。在微調(diào)時引入一個start向量S\in \mathbb{R}^{H}和一個end向量E\in \mathbb{R}^{H},計算T_iS的點積然后通過softmax函數(shù)作為wordi是答案的span起始位置的概率:P_{i}=\frac{e^{S\cdot T_{i}}}{\sum _{j}e^{S\cdot T_{j}}}。答案的終止位置也做上述類似處理。從ij的候選區(qū)間的得分記作S\cdot T_{i}+E\cdot T_{j},我們挑選j>i的最大得分區(qū)間作為預(yù)測的結(jié)果。下圖展示了BERT在SQuAD v1.1上的效果:

SQuAD v1.1
  1. SQuAD v2.0

SQuAD v2.0有的question在提供的passage中沒有答案存在。在微調(diào)時我們設(shè)置沒有答案的問題的span的起始和結(jié)束位置都是[CLS]這個token,也就是start和end的可能性空間包含進了[CLS]的位置。在預(yù)測時,我們比較沒有答案的span得分s_{null}=S\cdot C+E\cdot C和最優(yōu)的有答案得分\hat{s}_{i,j}=max_{j\geq i}S\cdot T_{i}+E\cdot T_{j}。當\hat{s}_{i,j}>s_{null}+\tau時,我們預(yù)測這是一個有答案的問題,這里的\tau用來在dev set上選擇最優(yōu)的F1。下圖展示了BERT在SQuAD v2.0上的效果:

SQuAD v2.0
  1. SWAG

微調(diào)時我們?yōu)锽ERT構(gòu)建4個輸入序列,每一個是所給的句子(句子A)和一個可能的延續(xù)(句子B)。然后引入一個向量,該向量和每一個輸入對應(yīng)的[CLS]的embedding的點積再通過一個softmax層來得到每個選擇的得分。下圖展示了BERT在SWAG上的效果:

SWAG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容