BERT是在OpenAI GPT基礎(chǔ)上發(fā)展起來的噪矛,是一種動(dòng)態(tài)詞向量技術(shù)量蕊。與傳統(tǒng)靜態(tài)詞向量不同,動(dòng)態(tài)詞向量可以根據(jù)具體的上下文信息艇挨,動(dòng)態(tài)生成詞向量危融。對(duì)于一詞多義等現(xiàn)象較為友好。BERT的牛逼之處在于對(duì)于許多具體的下游任務(wù)雷袋,預(yù)訓(xùn)練的BERT表示可以通過僅僅一個(gè)額外的輸出層的微調(diào)便可以取得state-of-the-art的結(jié)果吉殃,而不需要為特定的任務(wù)在結(jié)構(gòu)上做很大的改動(dòng)。
作者認(rèn)為當(dāng)前的技術(shù)手段嚴(yán)重的限制了預(yù)訓(xùn)練表示的力量楷怒,特別是fine-tuning蛋勺。最主要的限制是標(biāo)準(zhǔn)的語言模型是單向的,這限制了可以被用來做預(yù)訓(xùn)練的結(jié)構(gòu)的選擇鸠删。比如抱完,在OpenAI GPT中,作者使用了從左至右的結(jié)構(gòu)刃泡,其中每一個(gè)字詞在Transformer中的self-attention中只能關(guān)注前一個(gè)字詞巧娱,這種約束對(duì)于句子級(jí)的任務(wù)是一種次優(yōu)的解決方案。并且當(dāng)把fine-tuning應(yīng)用到諸如SQuAD這樣的問答系統(tǒng)中會(huì)造成很嚴(yán)重的錯(cuò)誤烘贴。因?yàn)殡p向的相關(guān)上下文對(duì)這種系統(tǒng)至關(guān)重要禁添。
這篇文章的貢獻(xiàn)主要在于以下幾點(diǎn):
- 闡述了語言表示雙向與訓(xùn)練的重要性,BERT使用Masked LM (Language Model)來做深度雙向表示預(yù)訓(xùn)練
- 展示了預(yù)訓(xùn)練表示(BERT)可以消除為任務(wù)設(shè)計(jì)的特定網(wǎng)絡(luò)結(jié)構(gòu)桨踪。BERT是第一個(gè)在大量句子級(jí)和字詞級(jí)任務(wù)中都達(dá)到state-of-the-art結(jié)果的基于微調(diào)的表示模型老翘,比很多任務(wù)特定結(jié)構(gòu)的系統(tǒng)表現(xiàn)得更好
- BERT在11個(gè)自然語言處理任務(wù)上都得到state-of-the-art結(jié)果。并且闡述了BERT的擴(kuò)展能力
Background
- Transformer
- 動(dòng)態(tài)詞向量
BERT
Model Architecture
BERT的模型結(jié)構(gòu)是一個(gè)多層雙向Transformer锻离。與OpenAI GPT和ELMo的對(duì)比如下圖所示铺峭,它與OpenAI GPT的區(qū)別就在于采用了Transformer Encoder,也就是每個(gè)時(shí)刻的Attention計(jì)算都能夠得到全部時(shí)刻的輸入汽纠,而OpenAI GPT采用了Transformer Decoder卫键,每個(gè)時(shí)刻的Attention計(jì)算只能依賴于該時(shí)刻前的所有時(shí)刻的輸入,因?yàn)镺penAI GPT是采用了單向語言模型虱朵。
![image.png](https://upload-images.jianshu.io/upload_images/13134843-8cb0fb86333300b2.png&originHeight=428&originWidth=1147&size=118456&status=done&width=918?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Input Representation
BERT的輸入為如圖所示三個(gè)部分的求和:
- token embedding:文章采用的是WordPiece embedding莉炉。
- segment embedding:在做兩個(gè)序列任務(wù)(比如Q&A)的時(shí)候?qū)Σ煌蛄凶鰳?biāo)識(shí)
- position embedding:文章對(duì)512長(zhǎng)度的序列都做了position embedding啤呼。由于預(yù)訓(xùn)練的時(shí)候,position embedding的長(zhǎng)度已經(jīng)固定死了呢袱,因此這樣設(shè)定實(shí)際上阻礙了BERT的擴(kuò)展性
![image.png](https://upload-images.jianshu.io/upload_images/13134843-b3c27701d913ef23.png&originHeight=410&originWidth=1189&size=64263&status=done&width=951?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
為了一個(gè)輸入能夠針對(duì)兩個(gè)任務(wù)官扣,輸入構(gòu)造規(guī)則如下:
- 為了能夠同時(shí)表示單句子和句子對(duì),多句子(例如QA中的Q/A)需要進(jìn)行拼接作為單個(gè)句子羞福,用segment embedding和[SEG]來進(jìn)行區(qū)分
- 句子第一個(gè)token總是有特殊含義惕蹄,例如分類問題中是類別,如果不是分類問題那么就忽略
- 三個(gè)embedding進(jìn)行sum得到輸入的向量
Pre-training Tasks
Task #1: Masked LM
現(xiàn)有的語言模型的問題在于治专,沒有同時(shí)利用到Bidirectional信息卖陵,現(xiàn)有的語言模型例如ELMo號(hào)稱是雙向LM(BiLM),但是實(shí)際上是兩個(gè)單向RNN構(gòu)成的語言模型的拼接张峰。
因?yàn)檎Z言模型本身的定義是計(jì)算句子的概率:
前向RNN構(gòu)成的語言模型計(jì)算的是:
而后向RNN構(gòu)成的語言模型計(jì)算的是:
也就是當(dāng)前詞的概率只依賴后面出現(xiàn)的詞的概率泪蔫。
那么如何才能同時(shí)利用好前面詞和后面詞的概率呢?BERT提出了Masked Language Model喘批,也就是隨機(jī)去掉句子中的部分token撩荣,然后模型來預(yù)測(cè)被去掉的token是什么。這樣實(shí)際上已經(jīng)不是傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)語言模型(類似于生成模型)了饶深,而是單純作為分類問題餐曹,根據(jù)這個(gè)時(shí)刻的hidden state來預(yù)測(cè)這個(gè)時(shí)刻的token應(yīng)該是什么,而不是預(yù)測(cè)下一個(gè)時(shí)刻的詞的概率分布了敌厘。
這里的操作是隨機(jī)mask語料中15%的token台猴,然后預(yù)測(cè)masked token,那么masked token 位置輸出的final hidden vectors喂給softmax網(wǎng)絡(luò)即可得到masked token的預(yù)測(cè)結(jié)果俱两。
這樣操作存在一個(gè)問題饱狂,fine-tuning的時(shí)候沒有[MASK] token,因此存在pre-training和fine-tuning之間的mismatch宪彩,為了解決這個(gè)問題休讳,采用了下面的策略:
- 80%的時(shí)間中:將選中的詞用[MASK]token來代替,例如
my dog is hairy → my dog is [MASK]
- 10%的時(shí)間中:將選中的詞用任意的詞來進(jìn)行代替毯焕,例如
my dog is hairy → my dog is apple
- 10%的時(shí)間中:選中的詞不發(fā)生變化衍腥,例如
my dog is hairy → my dog is hairy
這樣存在另一個(gè)問題在于在訓(xùn)練過程中只有15%的token被預(yù)測(cè),正常的語言模型實(shí)際上是預(yù)測(cè)每個(gè)token的纳猫,因此Masked LM相比正常LM會(huì)收斂地慢一些,后面的實(shí)驗(yàn)也的確證實(shí)了這一點(diǎn)竹捉。
Task #2: Next Sentence Prediction
很多需要解決的NLP tasks依賴于句子間的關(guān)系芜辕,例如問答任務(wù)等,這個(gè)關(guān)系語言模型是獲取不到的块差,因此將下一句話預(yù)測(cè)作為了第二個(gè)預(yù)訓(xùn)練任務(wù)侵续。該任務(wù)的訓(xùn)練語料是兩句話倔丈,來預(yù)測(cè)第二句話是否是第一句話的下一句話,如下所示
![image.png](https://upload-images.jianshu.io/upload_images/13134843-9ea2a03efc4b37f4.png&originHeight=376&originWidth=720&size=74170&status=done&width=576?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
fine-tuning
這里fine-tuning之前對(duì)模型的修改非常簡(jiǎn)單状蜗,例如針對(duì)sequence-level classification problem(例如情感分析)需五,取第一個(gè)token的輸出表示,喂給一個(gè)softmax層得到分類結(jié)果輸出轧坎;對(duì)于token-level classification(例如NER)宏邮,取所有token的最后層transformer輸出,喂給softmax層做分類缸血。
總之不同類型的任務(wù)需要對(duì)模型做不同的修改蜜氨,但是修改都是非常簡(jiǎn)單的,最多加一層神經(jīng)網(wǎng)絡(luò)即可捎泻。如下圖所示
![image.png](https://upload-images.jianshu.io/upload_images/13134843-ac1bfbce064ca56c.png&originHeight=706&originWidth=720&size=373693&status=done&width=576?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)