本文儘可能貼合BERT的原論文,但考慮到要易於理解,因此並不是逐句翻譯,而是根據筆者的我的理解進行翻譯,其中有一些論文沒有解釋清楚或者筆者未能深刻理解的地方,都有放出原文,若有不當之處,請各位多多包含,並但願獲得指導和糾正。git
BERT的設計是經過在全部層中對左右上下文進行聯合調節,來預先訓練來自未標記文本的深層雙向表示。github
預訓練的BERT模型能夠經過fine-tuned 在普遍的任務中創造新的最佳記錄,好比問答任務,語言推理任務等,而不須要對BERT自己架構作實質性的修改。算法
BERT是一個概念上簡單,實踐結果強大的模型。其在11項天然語言處理任務中創造了新的最佳記錄。express
ELMo是基於feature-based【註解2】的方法應用pre-trained language representations的。網絡
OpenAI GPT是基於fine-tuning【註解3】 的方法應用pre-trained language representations的。架構
上面兩個方法在與訓練階段,共享相同的目標函數,它們使用單項語言模型來學習通用語言表徵。app
做者認爲對於句子來講,單向注意力是次優的,對於token級別的任務,好比問答任務來講,就會帶來很差的做用。由於在相似問答任務中,基於兩個方向的上下文的結合很是重要。less
本論文,做者經過提出BERT模型,來改善基於fine-tuning的方法。
BERT:Bidirectional Encoder Representations from Transformers.
BERT受到完型填空任務的啓發,經過使用一個「masked language model」(MLM)預訓練目標來減輕上面提到的單向約束問題。
MLM隨機masks掉input中的一些tokens,目標是從這些tokens的上下文中預測出它們在原始詞彙表中的id。不想left-to-right 的預訓練語言模型,MLM目標使得表徵融合了left和right的上下文信息,這容許做者預訓練一個深度雙向的Transformer模型。除了MLM,做者還使用了一個「next sentence prediction」任務,連帶的預訓練text-pair表徵。本篇論文的貢獻以下:dom
展現了雙向預訓練語言表徵的重要性。BERT使用MLM使得模型能夠預訓練深度雙向表徵;GPT在預訓練上使用單向語言模型;ELMo使用分別訓練好的left-to-right 和right-to-left表徵,而後僅僅是簡單的串聯在一塊兒。ide
BERT 打破了11項NLP任務的最佳記錄。代碼和預訓練模型能夠從這裏獲取 。
預訓練通用語言表徵已經有至關長的歷史了。本節簡略看一下使用最普遍的預訓練通用語言表徵的方法。
數十年來,學習普遍適用的單詞表示形式一直是一個活躍的研究領域,包括非神經領域和神經領域的方法。預訓練詞嵌入是現代NLP系統的主要部分,提供了從零開始學習詞嵌入的顯著改進。爲了預訓練詞嵌入向量,人們使用過left-to-right語言建模目標,以及從左右上下文中區分出正確和不正確的單詞的建模目標。
這些方法已經推廣到更粗的粒度,好比句子嵌入,或段落嵌入。爲了訓練句子表徵,以前的工做已經用過這些目標:下個候選句子排名;給定上一個句子的表徵,left-to-right生成下一個句子;從自動編碼器去噪。
ELMo和它的前身從不一樣的維度歸納了傳統的詞嵌入研究。它們從left-to-right和right-to-left語言模型中提取上下文敏感的特徵。每一個token(單詞、符號等)的上下文表徵是經過串聯left-to-right和right-to-left的表徵獲得的。在將上下文詞嵌入和已有的特定任務的架構結合後,ELMo在幾個主要NLP基準測試(包括:問答,情感分析,命名實體識別)上取得了最佳記錄。Melamud等人在2016年提出了使用LSTMs模型經過一個預測單詞左右上下文的任務來學習上下文表徵。與ELMo相似,他們的模型也是基於feature-based方法,而且沒有深度雙向(註解1)。Fedus等人在2018年展現了完型填空任務能夠用來改善文本生成模型的魯棒性。
與feature-based方法同樣,該方向剛開始只是在未標記的文本上預訓練詞嵌入參數(無監督學習)。
最近,句子和文檔等生成上下文token表徵的編碼器已經從未標記的文本中預訓練出來,而且經過fine-tuned的方式用在下游任務中。這些方法的優點在於不多須要從零開始學習參數。至少有部分是由於這個優勢,OpenAI GPT以前在許多來自GLUE基準測試的句子級別的任務上達到了最佳水平。Left-to-right 語言建模和自動編碼器目標用於訓練這種模型。
也有工做展現了從大數據集的監督任務的作遷移學習的有效性,就像天然語言推理(NLI),和機器翻譯。計算機視覺研究也展現了遷移學習的重要性,一個有效的技巧就是微調(fine-tune)ImageNet的預訓練模型。
本節介紹BERT的詳細實現。使用BERT有2個步驟:pre-training 和 fine-tuning。在預訓練期間,BERT模型在不一樣任務的未標記數據上進行訓練。微調的時候,BERT模型用預訓練好的參數進行初始化,而且是基於下游任務的有標籤的數據來訓練的。每一個下游任務有本身的微調模型,儘管最初的時候都是用的預訓練好的BERT模型參數。圖1中,問答領域的例子做爲本節一個運行示例。
圖1:BERT的pre-training和fine-tuning運行過程。除了output層,這兩個階段的架構是同樣的。預訓練模型的參數會作爲不一樣下游任務的模型的初始化參數。在fine-tuning時,全部參數參與微調。[CLS]時一個特別設置的符號,添加在每一個輸入樣本的前面,表示這是一個輸入樣本的開始,[SEP]是特別設置的一個分隔標記。好比分隔questions/answers。
BERT的一個不同凡響的特性是它的跨任務的統一架構,即在預訓練架構和下游的架構之間的差別最小。
BERT的模型架構是一個多層雙向Transformer編碼器,(關於Transformer能夠看這篇文章)。由於Transformer的使用變得廣泛,並且BERT的與Transformer相關的實現和原Tranformer幾乎同樣,因此本論文中再也不詳述,推薦讀者去看原Transformer論文,以及「The Annotated Transformer」(這是對原論文中闡述的Transformer的一個極好的講解)。
這裏,做者指明L表示層數,H表示每一個隱藏單元的維數大小,A表示self-attention頭數。BERT有2種大小的模型,分別是BERT(base,L=12, H=768, A=12, Total Parameters=110M)和BERT(large,L=24, H=1024, A=16, Total Parameters=340M)。
BERT(base)設定爲和OpenAI GPT的模型大小相同,以便做比較。須要重點說明的是,BERT Transformer使用雙向self-attention,而GPT
Transformer 使用帶約束的self-attention,每一個token只能注意到它左邊的上下文。
使用BERT作各類下游任務,輸入表徵能夠在一個token序列裏清楚的表示一個句子或者一對句子(好比<Question,Answer>)。這裏的「句子」不是必須是語言句子,而能夠是任意範圍的連續文本。「sequence」指BERT的輸入序列,能夠是一個句子,也能夠是兩個打包在一塊兒的句子。
做者使用了WordPiece embeddings來作詞嵌入,對應的詞彙表有30000個token。每一個序列的首個token老是一個特定的classification token([CLS])。這個token對應的最後的隱藏狀態被用做分類任務的聚合序列表徵。句子對打包成一個序列。有兩種區分句子對中的句子的方法。第一種,經過分隔符[SEP];第二種,模型架構中添加了一個通過學習的嵌入(learned embedding)到每一個token,以表示它是屬於句子A或者句子B。如圖1中,E表示輸入的詞嵌入,C表示最後隱藏層的[CLS]的向量,Ti表示第i個輸入token在最後隱藏層的向量。
對一個給定的token,其輸入表徵由對應的token,segment和position embeddings的相加來構造。如圖2。
直觀上來講,做者有理由相信,一個深度雙向模型確實會比單向或者淺度雙向模型要強大。
惋惜,標準的條件語言模型只能從按照left-to-right或者right-to-left的方式訓練,直至雙向條件能夠容許每一個詞間接的「see itself」,而且能夠在多層上下文中預測目標單詞。
Unfortunately, standard conditional language models can only be trained left-to-right or right-to-left, since bidirectional conditioning would allow each word to indirectly 「see itself」, and the model could trivially predict the target word in a multi-layered context.(原句)
爲了訓練一個深度雙向表徵,做者簡單的隨機mask一些百分比的輸入tokens,而後預測那些被mask掉的tokens。這一步稱爲「masked LM」(MLM),儘管在文獻中它一般被稱爲完型填空任務(Cloze task)。
mask掉的tokens對應的最後的隱藏層向量餵給一個輸出softmax,像在標準的LM中同樣。在實驗中,做者爲每一個序列隨機mask掉了15%的WordPiece tokens。和 denoising auto-encoders相比,BERT的作法是隻預測被mask掉的詞,而不是重建完整的輸入。
儘管這容許做者得到雙向預訓練模型,其帶來的負面影響是在預訓練和微調模型之間創造了不匹配,由於[MASK]符號不會出如今微調階段。因此要想辦法讓那些被mask掉的詞的本來的表徵也被模型學習到,因此這裏做者採用了一些策略,具體參見:附錄 A.1。
許多下游任務,好比問答,天然語言推理等,須要基於對兩個句子之間的關係的理解,而這種關係不能直接經過語言建模來獲取到。爲了訓練一個能夠理解句子間關係的模型,做者爲一個二分類的下一個句子預測任務進行了預訓練,這些句子對能夠從任何單語言的語料中獲取到。特別是,當爲每一個預測樣例選擇一個句子對A和B,50%的時間B是A後面的下一個句子(標記爲IsNext), 50%的時間B是語料庫中的一個隨機句子(標記爲NotNext)。圖1中,C用來預測下一個句子(NSP)。儘管簡單,可是該方法QA和NLI任務都很是有幫助。5.1節對此有展現。
NSP任務和 Jernite et al. (2017) and Logeswaran and Lee (2018)中的表示學習的目標密切相關。任務,先前的工做中,只將句子嵌入轉移到了下游任務中,而BERT轉移了全部參數來初始化終端任務模型的參數。
Pre-training data 預訓練過程很大程度上參考了已有的語言模型預訓練文獻。預訓練語料方面,做者使用了BooksCorpus(800M words),English Wikipedia(2500M words) 。做者只提取Wikipedia的文本段落,忽略列表,表格和標題。爲了提取長連續序列,關鍵是使用文檔級語料庫,而不是像十億詞基準(Chelba et al., 2013)這樣的無序的句子級語料庫。
微調很簡單,由於Transformer中的self-attention機制容許BERT經過交換合適的輸入和輸出來爲許多下游任務建模——不管是單個文本仍是文本對。對於涉及到文本對的應用,常見的模式是分辨編碼文本對中的文本,而後應用雙向交叉的注意力。BERT使用self-attention機制統一了這兩個步驟,BERT使用self-attention編碼一個串聯的文本對,其過程當中就包含了2個句子之間的雙向交叉注意力。
輸入端,句子A和句子B能夠是:(1)釋義句子對(2)假設條件句子對(3)問答句子對 (4)文本分類或序列標註中的text-∅對。
輸出端,對於,token表徵餵給一個針對token級別的任務的輸出層,序列標註和問答是相似的,[CLS]表徵餵給一個分類器輸出層,好比情感分析。
微調的代價要比預訓練小的多。論文中的不少結果都從一個徹底相同的預訓練模型開始,在TPU上只要花費1小時的時間就能夠復現,GPU上也只要幾個小時。更多細節能夠查看附錄 A.5
本節展現了BERT在11項NLP任務上的fine-tuning結果。
GLUE基準測試是一系列不一樣的天然語言理解任務。GLUE數據集的詳細描述在附錄B.1中。
GLUE上的fine-tune,做者使用第3節描述的句子和句子對,用最後的隱藏向量C做爲表徵,C對應首個輸入token([CLS])。分類器層的權重係數矩陣W (形狀:K×H),K是類別的個數。 做者使用C和W計算標準的分類損失,好比log(softmax(C·W )).
在全部的GLUE任務上,做者使用了batch-size=32,epochs=3。對於每一個任務,都經過開發集的驗證來選擇了最佳的微調學習率(在5e- 5,4e - 5,3e -5和2e-5之間)。另外,對於BERT的large模型,做者發現微調有時候在小數據集上不穩定,因此隨機重啓了幾回,並選擇了開發集上表現最佳的模型。With random restarts, we use the same pre-trained checkpoint but perform different fine-tuning data shuffling and classifier layer initialization.9(?)
BERT base版本的模型架構和OpenAI GPUT除了attention masking之外,幾乎相同。
BERT large 版本明顯比base版本要表現的更好。關於模型大小的影響,在5.2節有更深刻的探討。
這是一個100k的問答對集合。給定一個問題和一篇短文,以及對應的答案,任務是預測出短文中的答案文本span(the answer text span in the passage)。
圖1所示,在問答任務中,做者將輸入問題和短文表示成一個序列,其中,使用A嵌入表示問題,B嵌入表示短文。在微調的時候,做者引入一個start向量S,和一個end向量E,維數都爲H。answer span的起始詞word i的機率計算公式:
答案末尾詞的機率表示原理同樣。
位置i到位置j的候選span的分數定義以下:
並將知足j>i的最大得分的span最爲預測結果。訓練目標是正確的開始和結束位置的對數似然估計的和。
做者微調了3個epochs,學習率設置爲5e-5,batch-size設置爲32。
Table2 顯示了頂級排行耪和結果。其中SQuAD排行耪中的公共系統描述沒有最新的,而且容許使用任何公開數據訓練各自的網絡。
所以,做者在系統中使用適度的數據加強,首先對TriviaQA進行微調(Joshi et al., 2017),而後再對SQuAD進行微調。
We treat questions that do not have an answer as having an answer span with start and end at the [CLS] token. The probability space for the start and end answer span positions is extended to include the position of the [CLS] token. For prediction, we compare the score of the no-answer span: snull = S·C + E·C to the score of the best non-null span
sˆi,j = maxj≥i S·Ti + E·Tj . We predict a non-null answer when sˆi,j > snull + τ , where the threshold τ is selected on the dev set to maximize F1. We did not use TriviaQA data for this model. We fine-tuned for 2 epochs with a learning rate of 5e-5 and a batch size of 48.
The Situations With Adversarial Generations (SWAG)數據集包含113k個句子對完整示例,用於評估基於常識的推理。給定一個句子,任務是從四個選項中選擇出最有多是對的的continuation(延續/擴展)。
在微調的時候,做者構造了4個輸入序列,每一個包含給定句子A的序列和continuation(句子B)。引入的惟一特定於任務的參數是一個向量,它與[CLS]token作點積,獲得每一個選項的分數,該分數會經過一個softmax層來歸一化。
做者微調的時候,使用了3個epochs,lr設置爲2e-5,batch-size設置爲16。Table4中有對應的結果,BERT在該領域的表現接近人類。
本節經過在BERT的各方面作消融實驗,來理解相對重要的部分。
經過去掉NSP後,對比BERT的雙向表徵和Left-to-Right表徵,做者得證實了有NSP更好,且雙向表徵更有效。
經過引入一個雙向的LSTM,做者證實了BILSTM比Left-to-Right能獲得更好的結果,可是仍然沒有BERT的base版本效果好。
具體對比結果如圖:
另外,關於ELMo那樣的分別訓練LTR和RTL的方式,做者也給出了其不如BERT的地方:
本節介紹模型大小對任務表現的影響。做者訓練了一些不一樣層數、隱藏單元數、注意力頭的BERT模型,但使用相同的超參數和訓練過程。
Table6展現了對比結果。大模型帶來更好的表現。
For example,
the largest Transformer explored in Vaswani et al. (2017) is (L=6, H=1024, A=16) with 100M parameters for the encoder, the largest Transformer we have found in the literature is (L=64, H=512, A=2) with 235M parameters (Al-Rfou et al., 2018). By contrast,
BERT(base) contains 110M parameters
BERT(large) contains 340M parameters.
本節做者最後給出的結論以下:
we hypothesize that when the model is fine-tuned directly on the downstream tasks and uses only a very small number of randomly initialized additional parameters, the taskspecific models can benefit from the larger, more expressive pre-trained representations even when downstream task data is very small.
大體意思是,經過微調,下游任務即便能提供的數據量很是小,依然能夠利用預訓練模型獲得不錯的訓練效果。
相比於上面一直在說的fine-tuning的方式,feature-based的方式也有着其關鍵的優點。
首先,不是全部的任務均可以輕易的表示成Trasformer encoder 架構,因此會有須要添加一個基於特定任務的模型架構的需求。
其次,預先計算一次訓練數據的昂貴表示,而後在此表示之上使用更便宜的模型運行許多實驗,這對計算有很大的好處。
本節,做者在BERT的命名實體識別應用上比較了fine-tuning和feature-based方式。
在BERT的輸入中,使用了一個保留大小寫的單詞模型,幷包含了數據提供的最大文檔上下文。按照標準實踐,做者將其表示爲標記任務,但在輸出中不使用CRF層。做者使用第一個sub-token的表徵,做爲token-level的NER分類器的輸入。
爲了和fine-tuning方法作消融實驗,做者以從沒有微調任何參數的一層或多層提取activations的方式應用feature-based方法。這些上下文的嵌入用作一個隨機初始化的兩層768維BiLSTM的輸入,而後送入分類器層。
Table 7顯示了實驗結果:
能夠看到,feature-based方法中,拼接最後4個隱藏層的方式,能夠達到96.1的F1分數,僅比BERT(base)少了0.3。
實驗結果代表,BERT的2種應用方法都是有效的。
近來經過遷移學習改善模型學習的例子代表了豐富的,無監督的預訓練是許多語言理解系統的重要組成部分。特別是,這些結果使得即便是低資源的任務也能夠從深層單向架構中獲益。
BERT的主要貢獻是進一步將這些發現推廣到深層雙向架構,使得相同的預訓練模型能夠成功應對一組普遍的NLP任務。
做者在這裏提供了預訓練的樣例。
Masked LM and the Masking Procedure 假設原句子是「my dog is hairy」,做者在3.1節 Task1中提到,會隨機選擇句子中15%的tokens位置進行mask,假設這裏隨機選到了第四個token位置要被mask掉,也就是對hairy進行mask,那麼mask的過程能夠描述以下:
上面的過程,須要結合訓練過程的epochs來理解,每一個epoch表示學完了一遍全部的樣本,因此每一個樣本在多個epochs過程當中是會重複輸入到模型中的,知道了這個概念,上面的80%,10%,10%就好理解了,也就是說在某個樣本每次餵給模型的時候,用[MASK]替換目標單詞的機率是80%;用隨機的單詞替換目標單詞的機率是10%;不改變目標單詞的機率是10%。
有的介紹BERT的文章中,講解MLM過程的時候,將這裏的80%,10%,10%解釋成替換原句子被隨機選中的15%的tokens中的80%用[MASK]替換目標單詞,10%用隨機的單詞替換目標單詞,10%不改變目標單詞。這個理解是不對的。
而後,做者在論文中談到了採起上面的mask策略的好處。大體是說採用上面的策略後,Transformer encoder就不知道會讓其預測哪一個單詞,或者說不知道哪一個單詞會被隨機單詞給替換掉,那麼它就不得不保持每一個輸入token的一個上下文的表徵分佈(a distributional contextual representation)。也就是說若是模型學習到了要預測的單詞是什麼,那麼就會丟失對上下文信息的學習,而若是模型訓練過程當中沒法學習到哪一個單詞會被預測,那麼就必須經過學習上下文的信息來判斷出須要預測的單詞,這樣的模型才具備對句子的特徵表示能力。另外,因爲隨機替換相對句子中全部tokens的發生機率只有1.5%(即15%的10%),因此並不會影響到模型的語言理解能力。對此,本論文的C.2節作了對此過程影響的評估。
相比標準的語言模型訓練,masked LM在每一個batch中僅對tokens的15%的部分進行預測,因此模型收斂須要更多的預訓練步驟。C.1節演示了MLM比left-to-right模型(會對每一個token進行預測)收斂的稍慢,可是學習效果的改善遠遠超過了增長的訓練成本。
Next Sentence Prediction
」下個句子預測「的任務的例子:
Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP] Label = IsNext Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP] Label = NotNext
本節首先介紹了下一句預測任務的樣本獲取策略,大體是從語料庫文本中選取2個span,這裏的span能夠理解爲一個完整話。而後,2個span分別對應句子A和句子B。其中,50%的狀況下,句子B是句子A的下一句,而50%的狀況下,B不是A的下一句。而且,句子A和B組合起來的長度要<=512個tokens。
而後介紹了LM的分詞狀況:
The LM masking is applied after WordPiece tokenization with a uniform masking rate of 15%, and no special consideration given to partial word pieces.?
做者預訓練的時候採用batch-size=256,也就是說每一個batch由256*512=128000個tokens,總共訓練了1,000,000步,將近40個epochs,超過33億個單詞。梯度優化算法採用Adam,學習率=1e-4,β1=0.9,β2=0.999,0.01的L2權重衰減,學習率在首個10000步進行warmup【註釋4】 ,而後進行線性衰減。做者在全部層使用了0.1機率的的dropout。在激活函數上,做者選擇了gelu,而不是標準的relu,這個選擇跟隨了OpenAI GPT。The training loss is the sum of the mean masked LM likelihood and the mean next sentence prediction likelihood.(訓練損失是masked掉的語言模型的似然均值與下一句預測的似然均值之和。)
BERT base模型在4塊雲TPU上訓練(共16塊TPU芯片)。BERT large在16塊雲TPU上訓練(共64塊TPU芯片)。每一個預訓練持續4天的時間完成。
因爲注意力的計算複雜度是序列長度的平方,因此更長的序列所增長的成本是昂貴的。爲了加速實驗中的預訓練過程,做者對90%的步驟使用128長度的序列預訓練,而後用512長度的序列訓練剩餘的10%的步驟,以便學習到位置嵌入(positional embeddings)。
在fine-tuning的時候,模型的大多數超參數和預訓練的時候是同樣的,除了batch-size,learning rate和epochs。dropout的機率始終保持在0.1。優化超參數的值是特定於任務來作的,可是做者提到了下面的可能的值的範圍,該範圍內的值在跨任務上也工做的很好:
做者也觀察了10萬+的訓練樣本,超參數選擇的敏感度遠低於小數據集。Fine-tuning仍然很是快,因此簡單粗暴的在上面的參數上運行一個窮舉搜索來選擇出可讓模型在開發集上表現最好的那些參數的方式也是能夠接受的。
圖3展現了這3個模型架構的對比:
除了MLM和NSP,BERT和GPT在訓練的時候還有以下幾處不一樣:
做者爲了證實BERT模型是由於2個預訓練任務和雙向的Transformer才比其餘模型表現更好,因此在5.1節中闡述了他們作的消融實驗過程和結果。
如圖4所示:
(a)和(b)是序列級別的任務;(c)和(d)是token級別的任務。
圖中的E表示輸入的詞嵌入,Ti表示第i個token的上下文表徵,[CLS]是分類輸出的特定符號,[SEP]是分隔非連續token序列的特定符號。
如下是模型訓練和評測使用的各類下游任務的數據集:
圖5展現了在MNLI開發集上使用預訓練了k步的模型進行微調後獲得的準確度。
經過此圖,就能夠回答下面的問題了:
- BERT真的須要這麼巨大的預訓練量級嗎(128,000 words/batch * 1000,000 steps)?
是的。相對於500k的steps,準確度能提升1.0%
- MLM預訓練收斂速度比LTR慢嗎?由於每一個batch中只有15%的單詞被預測,而不是全部單詞都參與。
確實稍稍有些慢。可是準確度所以而馬上超過了LTR模型,因此是值得的。
以前說過,mask策略的目的是減輕預訓練和微調之間的不匹配,由於[MASK]符號在微調的時候幾乎不會出現。Table8展現了基於Fine-tune和基於Feature-based的方式下,不一樣的MASK策略對結果的影響:
能夠看到,Feature-based的方式下,MASK形成的不匹配的影響更大,由於模型在訓練的時候,特徵提取層沒有機會調整特徵表示(由於被凍結了)。
在feature-based方法中,做者將BERT的最後4層輸出拼接起來做爲特徵,由於這樣的效果最好,具體見5.3節。
另外,咱們還能夠看到,fine-tuning方式在不一樣的mask策略下都具備驚人的魯棒性。然而,如做者所料,徹底使用MASK的策略在feature-based方式下應用到NER領域是有問題的。有趣的是,所有使用隨機的策略也比第一行的策略差的多。
ok,本篇就這麼多內容啦~,感謝閱讀O(∩_∩)O。