一 前言
從現在的大趨勢來看,使用某種模型預訓練一個語言模型看起來是一種比較靠譜的方法。從之前AI2的 ELMo,到 OpenAI的fine-tune transformer,再到Google的這個BERT,全都是對預訓練的語言模型的應用。
BERT這個模型與其它兩個不同的是
1)它在訓練雙向語言模型時以減小的概率把少量的詞替成了Mask或者另一個隨機的詞。我個人感覺這個目的在于使模型被迫增加對上下文的記憶。至于這個概率,我猜是Jacob拍腦袋隨便設的。
2)增加了一個預測下一句的loss。這個看起來就比較新奇了。
BERT模型具有以下兩個特點:
第一,是這個模型非常的深,12層,并不寬(wide),中間層只有1024,而之前的Transformer模型中間層有2048。這似乎又印證了計算機圖像處理的一個觀點——深而窄 比 淺而寬 的模型更好。
第二,MLM(Masked Language Model),同時利用左側和右側的詞語,這個在ELMo上已經出現了,絕對不是原創。其次,對于Mask(遮擋)在語言模型上的應用,已經被Ziang Xie提出了:[1703.02573] Data Noising as Smoothing in Neural Network Language Models。這也是篇巨星云集的論文:Sida Wang,Jiwei Li(香儂科技的創始人兼CEO兼史上發文最多的NLP學者),Andrew Ng,Dan Jurafsky都是Coauthor。但很可惜的是他們沒有關注到這篇論文。用這篇論文的方法去做Masking,相信BRET的能力說不定還會有提升。
二、如何理解BERT模型
[1] BERT 要解決什么問題?
通常情況 transformer 模型有很多參數需要訓練。譬如 BERT BASE 模型: L=12, H=768, A=12, 需要訓練的模型參數總數是 12 * 768 * 12 = 110M。這么多參數需要訓練,自然需要海量的訓練語料。如果全部用人力標注的辦法,來制作訓練數據,人力成本太大。
受《A Neural Probabilistic Language Model》論文的啟發,BERT 也用 unsupervised 的辦法,來訓練 transformer 模型。神經概率語言模型這篇論文,主要講了兩件事兒,1. 能否用數值向量(word vector)來表達自然語言詞匯的語義?2. 如何給每個詞匯,找到恰當的數值向量?
這篇論文寫得非常精彩,深入淺出,要言不煩,而且面面俱到。經典論文,值得反復咀嚼。很多同行朋友都熟悉這篇論文,內容不重復說了。常用的中文漢字有 3500 個,這些字組合成詞匯,中文詞匯數量高達 50 萬個。假如詞向量的維度是 512,那么語言模型的參數數量,至少是 512 * 50萬 = 256M。
模型參數數量這么大,必然需要海量的訓練語料。從哪里收集這些海量的訓練語料?《A Neural Probabilistic Language Model》這篇論文說,每一篇文章,天生是訓練語料。難道不需要人工標注嗎?回答,不需要。
我們經常說,“說話不要顛三倒四,要通順,要連貫”,意思是上下文的詞匯,應該具有語義的連貫性?;谧匀徽Z言的連貫性,語言模型根據前文的詞,預測下一個將出現的詞。如果語言模型的參數正確,如果每個詞的詞向量設置正確,那么語言模型的預測,就應該比較準確。天下文章,數不勝數,所以訓練數據,取之不盡用之不竭。
深度學習四大要素,1. 訓練數據、2. 模型、3. 算力、4. 應用。訓練數據有了,接下去的問題是模型。
【2】BERT的五個關鍵詞:pre-training, Deep, Bidirectional , Transformert, Language Understanding分別是什么意思?
《A Neural Probabilistic Language Model》這篇論文講的 Language Model,嚴格講是語言生成模型(Language Generative Model),預測語句中下一個將會出現的詞匯。語言生成模型能不能直接移用到其它 NLP 問題上去?
譬如,淘寶上有很多用戶評論,能否把每一條用戶轉換成評分?-2、-1、0、1、2,其中 -2 是極差,+2 是極好。假如有這樣一條用戶評語,“買了一件鹿晗同款襯衫,沒想到,穿在自己身上,不像小鮮肉,倒像是廚師”,請問這條評語,等同于 -2,還是其它?
語言生成模型,能不能很好地解決上述問題?進一步問,有沒有 “通用的” 語言模型,能夠理解語言的語義,適用于各種 NLP 問題?BERT 這篇論文的題目很直白,《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,一眼看去,就能猜得到這篇文章會講哪些內容。
這個題目有五個關鍵詞,分別是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding。其中 pre-training 的意思是,確實存在通用的語言模型,先用文章預訓練通用模型,然后根據具體應用,用supervised 訓練數據,精加工(fine tuning)模型,使之適用于具體應用。為了區別于針對語言生成的Language model,作者給通用的語言模型取了個名字,叫做語言表征模型(Language Representation Model)。
能實現語言表征目標的模型,可能會有很多種,具體用哪一種呢?作者提議,用 Deep Bidirectional Transformers 模型。假如給一個句子 “能實現語言表征[mask]的模型”,遮蓋住其中“目標”一詞。從前往后預測[mask],也就是用“能/實現/語言/表征”,來預測[mask];或者,從后往前預測[mask],也就是用“模型/的”,來預測[mask],稱之為單向預測 unidirectional。單向預測,不能完整地理解整個語句的語義。于是研究者們嘗試雙向預測。把從前往后,與從后往前的兩個預測,拼接在一起 [mask1/mask2],這就是雙向預測 bi-directional。細節參閱《Neural Machine Translation by Jointly Learning to Align and Translate》。
BERT的作者認為,bi-directional 仍然不能完整地理解整個語句的語義,更好的辦法是用上下文全向來預測[mask],也就是用“能/實現/語言/表征/../的/模型”, 來預測[mask]。 BERT作者把上下文全向的預測方法,稱之為deep bi-directional。 如何來實現上下文全向預測呢?BERT的作者建議使用Transformer模型,這個模型由《Attention Is All You Need》一文發明。
這個模型的核心是聚焦機制,對于一個語句,可以同時啟用多個聚焦點,而不必局限于從前往后的,或者從后往前的,序列串處理。不僅要正確地選擇模型的結構,而且還要正確地訓練模型的參數,這樣才能保障模型能夠準確地理解語句的語義。BERT用了兩個步驟,試圖去正確地訓練模型的參數。第一步是把一篇文章中,15%的詞匯遮蓋,讓模型根據上下文全向地預測被遮蓋的詞。假如有1萬篇文章,每篇文章平均有100個詞匯,隨機遮蓋15%的詞匯,模型的任務是正確地預測這15萬個被遮蓋的詞匯。通過全向預測被遮蓋的詞匯,來初步訓練Transformer模型的參數。然后,用第二步繼續訓練模型的參數。譬如從上述1萬篇文章中,挑選20萬對語句,總共40萬條語句。挑選語句對的時候,其中2*10萬對語句是連續的兩條上下文語句,另外2*10萬對語句不是連續的語句,然后讓Transformer模型來識別這20萬對語句,哪些是連續的,哪些不連續。
這兩步訓練結合在一起,稱之為預訓練pre-training. 訓練結束后的Transformer模型,包括它的參數,是作者期待的通用的語言表征模型。
三、BERT模型解析
首先來看下谷歌AI團隊做的這篇論文。
BERT的新語言表示模型,代表Transformer的雙向編碼器表示。與最近的其他語言表示模型不同,BERT旨在通過聯合調節所有層中的上下文來預先訓練深度雙向表示。因此預訓練的BERT表示可以通過一個額外的輸出層進行微調,適用于廣泛任務的最先進模型的構建,比如問答任務和語言推理,無需針對具體任務做大幅構架修改。
論文作者認為現有的技術嚴重制約了預訓練表示的能力,其主要局限在于標準語言模型是單向的,這使得在模型的預訓練中可以使用的架構類型很有限。
在論文中,作者通過提出BERT:即Transformer的雙向編碼來改進基于架構微調的方法。
BERT提出一種新的預訓練目標:遮蔽語言模型(masked language model, MLM),來克服上文提到的單向性局限,MLM的靈感來自Cloze任務。MLM隨機遮蔽模型輸入中的一些token,目標在于僅基于遮蔽詞的語境來預測其原始詞匯id.
與從左到右的語言模型預訓練不同,MLM目標允許表征融合左右兩側的語境,從而預訓練一個深度雙向Transformer, 除了遮蔽語言模型之外,本文作者還引入了一個‘下一句預測’(next sentence prediction)任務,可以和MLM共同預訓練文本對的表示。
論文主要貢獻在于:
1) 證明了雙向預訓練對語言表示的重要性。與之前使用的單向語言模型進行預訓練不同,BERT使用遮蔽語言模型來實現預訓練的深度雙向表示。
2)論文表明,預訓練的表示免去了許多工程任務需要針對特定任務修改體系架構的需求。BERT是第一個基于微調的表示模型,它在大量的句子級和token 級任務上實現了最先進的性能,強于許多面向特定任務體系架構的系統。
3) BERT 刷新了11項NLP任務性能記錄,本文還報告了BERT的模型簡化研究(ablation study),表明模型的雙向性是一項重要的新成果。相關代碼和預訓練模型都已經公布。
BERT目前已經刷新的11項自然語言處理任務的最新記錄包括:將GLUE基準推至80.4%(絕對改進7.6%),MultiNLI準確度達到86.7% (絕對改進率5.6%),將SQuAD v1.1問答測試F1得分紀錄刷新為93.2分(絕對提升1.5分),超過人類表現2.0分。
論文的核心:詳解BERT模型架構
本節介紹BERT模型架構和具體實現,并介紹預訓練任務,這是這篇論文的核心創新。
模型架構
BERT的模型架構是基于Vaswani et al. (2017) 中描述的原始實現multi-layer bidirectional Transformer編碼器,并在tensor2tensor庫中發布。由于Transformer的使用最近變得無處不在,論文中的實現與原始實現完全相同,因此這里將省略對模型結構的詳細描述。
在這項工作中,論文將層數(即Transformer blocks)表示為L, 將隱藏大小表示為H,將Self-attention heads 的數量表示為A,在所有情況下,將feed-forward/filter的大小設置為4H,即H=768時 為3072,H=1024時 為4096。 論文主要展示了兩種模型大小的結果:
BERT_base: L=12, H=768, A=12, Total Parameters = 110M
BERT_Large: L = 24, H = 1024,A=16, Total Parameters = 340M
為了進行比較,論文選擇了BERT_large, 它與OpenAI GPT 具有相同的模型大小,然而,重要的是BERT Transformer 使用雙向self-attention, 而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。研究團隊注意到,在文獻中,雙向Transformer 通常被稱為‘Transformer encoder’, 而左側上下文被稱為‘Transformer decoder’.因為它可用于文本生成,BERT,OpenAI GPT和Elmo之間的比較如圖1所示。
圖1:預訓練模型架構的差異。BERT使用雙向Transformer。OpenAI GPT使用從左到右的Transformer。ELMo使用經過獨立訓練的從左到右和從右到左LSTM的串聯來生成下游任務的特征。三個模型中,只有BERT表示在所有層中共同依賴于左右上下文。
整體分為兩個過程:1.預訓練過程(左邊圖)預訓練過程是一個multi-task learning,遷移學習的任務,目的是學習輸入句子的向量。2微調過程(右邊圖)可基于少量監督學習樣本,加入Feedword神經網絡,實現目標。因為微調階段學習目標由簡單的feedward神經網絡構成,且用少量標注樣本,所以訓練時間短。
輸入表示
論文輸入表示(input representation)能夠在一個token序列中明確地表示單個文本句子或一對文本句子(例如:[question, answer])。對于給定token,其輸入表示通過對相應的token, segment 和positional embeddings 進行求和來構造。 圖2是輸入表示的直觀表示:
圖2:BERT輸入表示。輸入嵌入是token embeddings, segmentation embeddings和position emebeddings的總和。
具體如下:
1)使用WordPiece嵌入和30,000個token 的詞匯表,用##表示分詞。
2)使用學習的positional embeddings, 支持的序列長度最多為512個token.
3)? 每個序列的第一個token始終是特殊分類嵌入([CLS]),對應于該token的最終隱藏狀態(即Transformer的輸出)被用作分類任務的聚合序列表示。對于非分類任務,將忽略此向量。
4) 句子對被打包成一個序列,以兩種方式區分句子,首先,用特殊標記([SEP])將它們分開,其次,添加一個learned sentence A 嵌入到第一個句子的每一個token中,一個sentence B 嵌入到第二個句子的每個token中。
5)對于單個句子輸入,只是用sentenceA 嵌入。
關鍵創新:預訓練任務
與Peters el al.(2018)和Radford et al.(2018)不同,論文不使用傳統的從左到右或者從右到左的語言模型來預測BERT,相反,使用兩個新的無監督預測任務對BERT進行預訓練。
任務1: Masked LM
從直覺上看,研究團隊有理由相信,深度雙向模型比elft-to-right模型或者right-to-left模型的淺層連接更強大。遺憾的是,標準條件語言模型只能從左到右或者從右到左訓練,因為雙向條件作用將允許每個單詞在多層上下文中 間接地‘see itself’.
為了訓練一個深度雙向表示(deep bidirectional representiation),研究團隊采用了一種簡單的方法,即隨機屏蔽(masking)部分輸入token, 然后只預測那些被屏蔽的token.論文也將這個過程稱為‘masked LM’(MLM),盡管在文獻中它經常被稱為Cloze任務(Taylor, 1953)
在這個例子中,與masked token對應的最終隱藏向量被輸入到詞匯表上的輸出softmax中,就像在標準LM中一樣。在團隊所有實驗中,隨機屏蔽了每個序列中的15%的wordpiece token.? 與去噪的自動編碼器相反,只預測masked words而不是重建整個輸入。
雖然這確實能讓團隊獲得雙向預訓練模型,但是這種方法有兩個缺點。首先,預訓練和finetuning之間不匹配,因為在fine tuning期間從未看到[mask] token,為了解決這個問題,團隊并不能總是用實際的[MASK] token 替換被 ‘masked’的詞匯。相反,訓練數據生成器隨機選擇15%的token, 例如在這個句子‘my dog is hairy’中,它選擇的token是‘hairy’,然后執行以下過程:
數據生成器將執行以下操作,而不是始終使用[MASK]替換所有單詞:
1)80%的時間:用[MASK]標記替換單詞,例如,my dog is hairy → my dog is [MASK]
2)10%的時間:用一個隨機的單詞替換該單詞,例如,my dog is hairy → my dog is apple
3)10%的時間:保持單詞不變,例如,my dog is hairy → my dog is hairy. 這樣做的目的是將表示偏向于實際觀察到的單詞。
Transformer encoder 不知道它將被要求預測哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分布式上下文表示。此外,因為隨機替換只發生在所有tokende 1.5%(15%的10%),這似乎不會損害模型的語言理解能力。
使用MLM的第二個缺點是每個batch只預測了15%的token, 這表明模型可能需要更多的預訓練步驟才能收斂。團隊證明MLM的收斂速度略慢于 left-to-right的模型(預測每個token),但MLM模型在實驗上獲得的提升遠遠超過增加的訓練成本。
任務2:下一句預測
許多重要的下游任務,如問答(QA)和自然語言推理(NLI)都是基于理解兩個句子之間關系,這并沒有通過語言模型直接獲得。
在為了訓練一個理解句子的模型關系,預先訓練一個二進制華的下一句預測任務,這一任務可以從任何單語句語料庫中生成。具體地說:當選擇句子A和B作為預訓練樣本時,B 有50%的可能是A的下一個句子,也有50%的可能是來自語料庫的隨機句子。例如:
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
團隊完全隨機地選擇了NotNext語句,最終的預訓練模型在此任務上實現了97%-98%的準確率。
預訓練階段參數
(1)256個句子作為一個batch,每個句子最多512個token。
(2)迭代100萬步。
(3)總共訓練樣本超過33億。
(4)迭代40個epochs。
(5)用adam學習率, 1 = 0.9, 2 = 0.999。
(6)學習率頭一萬步保持固定值,之后線性衰減。
(7)L2衰減,衰減參數為0.01。
(8)drop out設置為0.1。
(9)激活函數用GELU代替RELU。
(10)Bert base版本用了16個TPU,Bert large版本用了64個TPU,訓練時間4天完成。
(論文定義了兩個版本,一個是base版本,一個是large版本。Large版本(L=24, H=1024, A=16, Total Parameters=340M)。base版本( L=12, H=768, A=12, Total Pa- rameters=110M)。L代表網絡層數,H代表隱藏層數,A代表self attention head的數量。)
微調階段
微調階段根據不同任務使用不同網絡模型。在微調階段,大部分模型的超參數跟預訓練時差不多,除了batchsize,學習率,epochs。
訓練參數:
Batch size: 16, 32
Learning rate (Adam): 5e-5, 3e-5, 2e-5
Number of epochs: 3, 4
實驗結果
如前文所述,BERT在11項NLP任務中刷新了性能表現記錄!在這一節中,團隊直觀呈現BERT在這些任務的實驗結果,具體的實驗設置和比較請閱讀原論文.
圖3:我們的面向特定任務的模型是將BERT與一個額外的輸出層結合而形成的,因此需要從頭學習最小數量的參數。在這些任務中,a和b是序列級任務,而c和d是token級任務。在圖中, E表示輸入嵌入,Ti表示tokeni的上下文表示,[CLS]是用于分類輸出的特殊符號,[SEP]是用于分隔非連續token序列的特殊符號。
圖4: GLUE 測試結果,由GLUE評估服務器給出。每個任務下方的數字表示訓練樣例的數量。‘平均’一欄中的數據與GLUE官方評分稍有不同,因為我們排除了有問題的WNL集。BERT和OpenAI GPT 的結果是單模型,單任務下的數據,所有結果來自于https://gluebenchmark.com/leaderboard和https://blog.openai.com/language-unsupervised/
圖5:SQuAD結果。BERT集成是使用不同訓練檢查點和fine-tuning? seed的7X系統。
圖6: CoNLL-2003命名實體識別結果。超參數又開發集選擇,得出的開發和測試分數是使用這些超參數進行五次隨機重啟的平均值。
四,BERT 模型的影響
BERT是一個語言表征模型(language representation model),通過超大數據、巨大模型、和極大的計算開銷訓練而成,在11個自然語言處理的任務中取得了最優(state-of-the-art, SOTA)結果。或許你已經猜到了此模型出自何方,沒錯,它產自谷歌。估計不少人會調侃這種規模的實驗已經基本讓一般的實驗室和研究員望塵莫及了,但它確實給我們提供了很多寶貴的經驗:
1)深度學習就是表征學習 (Deep learning is representation learning):"We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures". 在11項BERT刷出新境界的任務中,大多只在預訓練表征(pre-trained representation)微調(fine-tuning)的基礎上加一個線性層作為輸出(linear output layer)。在序列標注的任務里(e.g. NER),甚至連序列輸出的依賴關系都先不管(i.e. non-autoregressive and no CRF),照樣秒殺之前的SOTA,可見其表征學習能力之強大。
2)規模很重要(Scale matters):"One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work". 這種遮擋(mask)在語言模型上的應用對很多人來說已經不新鮮了,但確是BERT的作者在如此超大規模的數據+模型+算力的基礎上驗證了其強大的表征學習能力。這樣的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的實驗室提出和試驗過,只是由于規模的局限沒能充分挖掘這些模型的潛力,而遺憾地讓它們被淹沒在了滾滾的paper洪流之中。
3)預訓練價值很大(Pre-training is important):"We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained". 預訓練已經被廣泛應用在各個領域了(e.g. ImageNet for CV, Word2Vec in NLP),多是通過大模型大數據,這樣的大模型給小規模任務能帶來的提升有幾何,作者也給出了自己的答案。BERT模型的預訓練是用Transformer做的,但我想換做LSTM或者GRU的話應該不會有太大性能上的差別,當然訓練計算時的并行能力就另當別論了。
對BERT模型的觀點
0. high-performance的原因其實還是歸結于兩點,除了模型的改進,更重要的是用了超大的數據集(BooksCorpus 800M + English Wikipedia 2.5G單詞)和超大的算力(對應于超大模型)在相關的任務上做預訓練,實現了在目標任務上表現的單調增長
1. 這個模型的雙向和Elmo不一樣,大部分人對他這個雙向在novelty上的contribution 的大小有誤解,我覺得這個細節可能是他比Elmo顯著提升的原因。Elmo是拼一個左到右和一個右到左,他這個是訓練中直接開一個窗口,用了個有順序的cbow。
2.?可復現性差:有錢才能為所欲為(Reddit對跑一次BERT的價格討論)
參考文獻:
2.?https://gluebenchmark.com/leaderboard
3.?https://blog.openai.com/language-unsupervised/
轉自:?https://blog.csdn.net/qq_39521554/article/details/83062188