https://zhuanlan.zhihu.com/p/46997268
NLP突破性成果 BERT 模型詳細解讀
不懂算法的產品經理不是好的程序員
關注她
82 人贊了該文章
Google發布的論文《Pre-training of Deep Bidirectional Transformers for Language Understanding》,提到的BERT模型刷新了自然語言處理的11項記錄。最近在做NLP中問答相關的內容,抽空寫了篇論文詳細解讀。我發現大部分關注人工智能領域的朋友看不懂里面的主要結論,為了讓你快速了解論文精髓,這里特地為初學者和剛接觸深度學習的朋友們奉上技能點突破roadmap。如果別人寫的論文解讀你看不懂,代表你需要補充基礎知識啦。另外給了主要論文參考,在第五部分,希望對你在NLP領域全面的了解有所幫助。
一、 總體介紹
BERT模型實際上是一個語言編碼器,把輸入的句子或者段落轉化成特征向量(embedding)。論文中有兩大亮點:1.雙向編碼器。作者沿用了《attention is all you need》里提到的語言編碼器,並提出雙向的概念,利用masked語言模型實現雙向。2.作者提出了兩種預訓練的方法Masked語言模型和下一個句子的預測方法。作者認為現在很多語言模型低估了預訓練的力量。Masked語言模型比起預測下一個句子的語言模型,多了雙向的概念。
二、 模型框架
BERT模型復用OpenAI發布的《Improving Language Understanding with Unsupervised Learning》里的框架,BERT整體模型結構與參數設置都盡量做到OpenAI GPT一樣,只在預訓練方法做了改造。而GPT讓編碼器只學習每一個token(單詞)與之前的相關內容。
上圖是根據OpenAI GPT的架構圖做的改動,以便讀者更清楚的了解整個過程。
整體分為兩個過程:1.預訓練過程(左邊圖)預訓練過程是一個multi-task learning,遷移學習的任務,目的是學習輸入句子的向量。2微調過程(右邊圖)可基於少量監督學習樣本,加入Feedword神經網絡,實現目標。因為微調階段學習目標由簡單的feedward神經網絡構成,且用少量標注樣本,所以訓練時間短。
1.輸入表示
對比其他語言模型輸入是一個句子或者文檔,Bert模型對輸入做了更寬泛的定義,輸入表示即可以是一個句子也可以一對句子(比如問答和答案組成的問答對)。
輸入表示為每個詞對應的詞向量,segment向量,位置向量相加而成。(位置向量參考《attention is all you need》)
2.預訓練過程-Masked語言模型
Masked語言模型是為了訓練深度雙向語言表示向量,作者用了一個非常直接的方式,遮住句子里某些單詞,讓編碼器預測這個單詞是什么。
訓練方法為:作者隨機遮住15%的單詞作為訓練樣本。
(1)其中80%用masked token來代替。
(2)10%用隨機的一個詞來替換。
(3)10%保持這個詞不變。
作者在論文中提到這樣做的好處是,編碼器不知道哪些詞需要預測的,哪些詞是錯誤的,因此被迫需要學習每一個token的表示向量。另外作者表示,每個batchsize只有15%的詞被遮蓋的原因,是性能開銷。雙向編碼器比單項編碼器訓練要慢。
3.預測下一個句子。
預訓練一個二分類的模型,來學習句子之間的關系。預測下一個句子的方法對學習句子之間關系很有幫助。
訓練方法:正樣本和負樣本比例是1:1,50%的句子是正樣本,隨機選擇50%的句子作為負樣本。
[CLS]為句子起始符,[MASK]為遮蔽碼,[SEP]為分隔符和截止符
4.預訓練階段參數
(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的數量。)
5.微調階段
微調階段根據不同任務使用不同網絡模型。在微調階段,大部分模型的超參數跟預訓練時差不多,除了batchsize,學習率,epochs。
訓練參數:
Batch size: 16, 32
Learning rate (Adam): 5e-5, 3e-5, 2e-5
Number of epochs: 3, 4
三、實驗效果
1.分類數據集上的表現
2.問答數據集上的表現
在問答數據集SQuAD v1.1上的表現,TriviaQA是一個問答數據集。EM的基本算法是比較兩個字符串的重合率。F1是綜合衡量准確率和召回率的一個指標。
3.命名實體識別上的表現
4.常識推理上的表現
四、模型簡化測試
Blation study就是為了研究模型中所提出的一些結構是否有效而設計的實驗。對該模型推廣和工程化部署有極大作用。
1.預訓練效果測試
NO NSP: 用masked語言模型,沒用下一個句子預測方法(next sentence prediction)
LTR&NO NSP: 用從左到右(LTR)語言模型,沒有masked語言模型,沒用下一個句子預測方法
+BiLSTM: 加入雙向LSTM模型做預訓練。
2.模型結構的復雜度對結果的影響
L代表網絡層數,H代表隱藏層數,A代表self attention head的數量。
3.預訓練中training step對結果的影響
4.基於特征的方法對結果的影響
五、重要參考論文
如何你想了解2017年到2018年NLP領域重要發展趨勢,你可以參考以下幾篇論文。google直接就可以下載。
《Attention is all you need》2017年NLP領域最重要突破性論文之一。
《Convolutional Sequence to Sequence Learning》2017年NLP領域最重要突破性論文之一。
《Deep contextualized word representations》2018年NAACL最佳論文,大名鼎鼎的ELMO。
《Improving Language Understanding by Generative PreTraining》,OpenAI GPT,Bert模型主要借鑒和比較對象。
《An efficient framework for learning sentence representations》句子向量表示方法。
《Semi-supervised sequence tagging with bidirectional language models》提出雙向語言模型。
六、個人觀點
個人覺得如果你大概了解近兩年NLP的發展的話,BERT模型的突破在情理之中,大多思想是借用前人的突破,比如雙向編碼器想法是借助這篇論文《Semi-supervised sequence tagging with bidirectional language models》。並且,他提出的一些新的思想,是我們自然而然就會想到的。(十一在家的時候,在做問答模型的時候,我就在想,為什么不能把前一個句子和后一個句子作為標注數據,組成一個二分類模型來訓練呢。)
整片論文最有價值的部分,我認為是預訓練的兩種方法,不需要大量標注數據,在工程實踐和一些NLP基礎訓練中具有很大借鑒意義。
自然語言處理領域2017年和2018年的兩個大趨勢:一方面,模型從復雜回歸到簡單。另一方面,遷移學習和半監督學習大熱。這兩個趨勢是NLP從學術界向產業界過渡的苗頭,因為現實情況往往是,拿不到大量高質量標注數據,資源設備昂貴解決不了效率問題。