什麼是BERThtml
BERT的全稱是Bidirectional Encoder Representation from Transformers,是Google2018年提出的預訓練模型,其結構採用Transformer的Encoder部分,主要創新點都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級別的representation。git
BERT雖然從結構上看創新性並不高,但其效果很是好,基本刷新了不少NLP的任務的最好性能,有些任務還被刷爆了,這個纔是關鍵。另一點是Bert具有普遍的通用性,就是說絕大部分NLP任務均可以採用相似的兩階段模式直接去提高效果。這些將NLP也帶入了相似CV領域的預訓練+微調時代,BERT也成爲了現在最熱門的NLP模型。github
從Word Embedding到Bert網絡
預訓練app
預訓練(pre-train)是CV領域十分經常使用的方法,當設計好網絡結構之後,能夠先在其餘數據集如ImageNet上進行訓練保存模型參數。運用到具體任務時,能夠選擇固定住淺層模型參數,而只訓練頂層參數(Frozen);也能夠全部岑參數一塊兒訓練(Fine-tune)。框架
這樣作的優勢是:若是當前任務的訓練集合數據量較少的話,利用預訓練出來的參數來訓練當前任務能夠極大加快任務訓練的收斂速度,而且能夠提升模型效果。ide
預訓練之因此在CV領域可行是由於對於CV領域經常使用的層級的CNN結構來講,不一樣層級的神經元學習到了不一樣類型的圖像特徵,由底向上特徵造成層級結構,因此預訓練好的網絡參數,尤爲是底層的網絡參數抽取出特徵跟具體任務越無關,越具有任務的通用性,因此這是爲什麼通常用底層預訓練好的參數初始化新任務網絡參數的緣由。而高層特徵跟任務關聯較大,實際能夠不用使用,或者採用Fine-tuning用新數據集合清洗掉高層無關的特徵抽取器。函數
Word Embedding性能
以前章節介紹的Word Embedding實際上也能夠歸爲預訓練的範疇,先使用特定任務在大規模語料上進行訓練,而後將訓練的中間產物即詞向量矩陣保存下來供下游任務使用。學習
Word Embedding最明顯的問題就是其沒法解決多義詞問題,好比多義詞play,其上下文能夠是運動相關的,也能夠是遊戲相關的,可是Word Embedding在對play這個單詞進行編碼的時候,是區分不開這兩個含義的,由於它們儘管上下文環境中出現的單詞不一樣,可是在用語言模型訓練的時候,不論什麼上下文的句子通過Word Embedding,都是預測相同的單詞bank,而同一個單詞佔的是同一行的參數空間,這致使兩種不一樣的上下文信息都會編碼到相同的Word Embedding空間裏去。
稱Word Embedding這種一旦訓練好了以後無論輸入的是哪一種上下文,其詞向量都不會改變的Embedding方法爲靜態Embedding。
ELMO
ELMO(Embedding from Language Models)的出發點就是要解決Word Embedding的多義詞問題,其出發點是根據上下文對Embedding作出動態調整。其結構以下:
ELMO的網絡結構採用了雙層雙向LSTM,採用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在作下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding做爲新特徵補充到下游任務中。
預訓練階段,使用單詞的上下文來預測當前位置的單詞,其損失函數爲:
其中sentence爲語料庫中的句子,\(w_t\)爲其第t個單詞,T爲句子長度。ELMO的損失函數是前向語言模型和後向語言模型的和,兩個方向是分開的。
將ELMO應用到具體的下游任務時,將句子輸入ELMO,將嵌入層、第一層LSTM、第二層LSTM的向量加權求和(權重可學習)便可獲得應用於下游任務的Embedding。由於ELMO在預訓練以後參數是固定的,只負責給下游任務提供相應特徵,因此這種預訓練模式成爲Feature-based Pre-Training。
因爲ELMO在Embedding的時候考慮了上下文,因此對解決多義詞問題起到了必定做用,但ELMO也存在如下缺點:
GPT
GPT(Generative Pre-Training)是由Open AI提出的生成式預訓練語言模型,其採用了Transformer的Decoder做爲網絡結構,這更適合NLG任務,但對於NLU任務因爲其丟掉了下文信息,所以效果會打折扣。
BERT
BERT(Bidirectional Encoder Representation from Transformers)與GPT最大的不一樣就是其採用的是Transformer的Encoder部分,可以同時使用上下文信息。其與GPT、ELMO的對比圖以下:
BERT的一大創新點就是其採用了Masked LM和Next Sentence Prediction兩種預訓練任務,將在第三小節具體介紹。
BERT的具體內容
Embedding
BERT的Embedding由三種Embedding求和而成:
同時BERT的分詞方法也與傳統的方法有所區別,採用的是WordPiece分詞方法,具體能夠參考:https://zhuanlan.zhihu.com/p/198964217。
Masked LM
MLM能夠理解爲完形填空,做者會隨機mask每個句子中15%的詞,用其上下文來作預測,例如:my dog is hairy → my dog is [MASK]
此處將hairy進行了mask處理,而後採用非監督學習的方法預測mask位置的詞是什麼,可是該方法有一個問題,由於是mask15%的詞,其數量已經很高了,這樣就會致使某些詞在fine-tuning階段從未見過,爲了解決這個問題,做者作了以下的處理:
80%是採用[mask],my dog is hairy → my dog is [MASK]
10%是隨機取一個詞來代替mask的詞,my dog is hairy -> my dog is apple
10%保持不變,my dog is hairy -> my dog is hairy
注意:這裏的10%是15%須要mask中的10%
關於爲何使用[MASK]標記而不是直接留空,即在Self-Attention時不與該處詞交互,我的認爲是這樣作會致使在訓練時要將該位置的詞像[PAD]符號那樣MASK掉,使得輸入的Attention mask序列中間有空缺,而測試的時候沒有,這樣帶來的先後不一致可能比引入[MASK]符號帶來的先後不一致要大。
BERT的這一作法成爲DAE(Denoise Auto Encoder),即去噪自編碼。
Next Sentence Prediction
選擇一些句子對A與B,其中50%的數據B是A的下一條句子,剩餘50%的數據B是語料庫中隨機選擇的,學習其中的相關性,添加這樣的預訓練的目的是目前不少NLP的任務好比QA和NLI都須要理解兩個句子之間的關係,從而能讓預訓練的模型更好的適應這樣的任務。
BERT的優缺點
BERT優勢
BERT缺點
基於BERT的其餘預訓練模型
XLNet
XLNet主要是爲了解決上述BERT缺點的第一條,使用自迴歸代替自編碼。自迴歸即便用前向語言模型或者後向語言模型來預測當前位置的詞,但其有單向的缺點;自編碼即BERT所使用的Masked LM的訓練方式,其能使用到雙向信息可是會形成預訓練與微調時的不一致。
XLNet使用排列的方式來解決這一問題,例如對於序列[1,2,3,4],其全排列有4!種,XLNet但願最大化每種排列下每一個詞由前向或者後向語言模型所預測的機率:
其中\(z\sim Z_T\)爲一個序列的全排列集合,z爲其中一種,T爲序列長度,\(x_{z_t}\)爲當前排列的第t個詞,\(x_{z<t}\)爲第t個詞前面的詞(或者後面的詞)。
下圖展現不一樣排列時數字3所能使用的前向信息:
但因爲全排列數太多,因此XLNet採用了抽樣全排列,且對於一種排列只預測序列中的後幾個單詞(前面的單詞信息太少)。同時,每一個Batch中一半序列作前向預測,一半序列作後向預測。
同時XLNet對Transformer的結構作了改動,使用了兩路輸入context stream和query stream,其中:
下圖很好的展現了這一過程:
其中綠色部分爲context stream,橙色部分爲query stream。能夠看到,XLNet是經過修改Attention mask來實現並行預測的。
同時,XLNet去掉了下一句預測(NSP)任務。
RoBERTa
ALBERT
Factorized Embedding Parameterization
對於 Bert,詞向量維度 E 和隱層維度 H 是相等的。這樣既會增大參數量,也會增長embedding table與transformer的耦合性。所以,做者在詞表V與第一個隱層H之間增長了一個維度E,這樣參數量由\(V*H\)減小爲了\(V*E+E*H\),同時也對embedding table和transformer進行了解耦。
Cross-layer Parameter Sharing
ALBERT經過共享全部層間的參數來下降參數量,具體分爲三種模式:只共享 attention 相關參數、只共享 FFN 相關參數、共享全部參數。
Sentence Order Prediction(SOP)
RoBERTa、XLNet等研究都證實了去除NSP的預訓練語言模型反而使得下游任務效果更好,這多是因爲NSP任務相比於Masked LM過於簡單。ALBert使用SOP任務代替NSP任務,由預測兩個句子是否相關改成預測兩個句子順序是否正確,實驗證實這樣作確實會帶來性能的提高。
BERT-wwm
wwm 即 Whole Word Masking(對全詞進行Mask),對中文來講是對詞語進行Mask而不是字,對英文來講是對詞MASK而不是子詞。
TinyBERT
TinyBERT 是華爲提出的一種蒸餾 BERT 的方法,模型大小不到 BERT 的 1/7,但速度能提升 9 倍。其對BERT的Embedding、Hidden state、Attention以及最終輸出分別進行蒸餾學習,具體能夠參考:https://www.cnblogs.com/tfknight/p/13343346.html。
UniLM
Unified Language Model Pre-training for Natural Language Understanding and Generation提出了採用BERT的模型,使用三種特殊的Mask的預訓練目標,從而使得模型能夠用於NLG,同時在NLU任務得到和BERT同樣的效果。 模型使用了三種語言模型的任務:
UniLM三個任務分別以下圖所示:
ERINE
ERINE是百度開源的中文預訓練語言模型,與BERT的主要區別是其增長了基於phrase (在這裏是短語 好比 a series of, written等)的masking策略和基於 entity(在這裏是人名,位置, 組織,產品等名詞 好比Apple, J.K. Rowling)的masking 策略,對比直接將知識類的query 映射成向量而後直接加起來,ERNIE 經過統一mask的方式能夠潛在的學習到知識的依賴以及更長的語義依賴來讓模型更具泛化性。
ERNIE 2.0構建了更多的詞法級別,語法級別,語義級別的預訓練任務,使用連續學習策略,首先,連續用大量的數據與先驗知識連續構建不一樣的預訓練任務。其次,不斷的用預訓練任務更新ERNIE 模型。
關於ERINE的更多細節能夠參考:https://baijiahao.baidu.com/s?id=1648169054540877476&wfr=spider&for=pc。
參考資料
https://github.com/NLP-LOVE/ML-NLP/tree/master/NLP/16.8%20BERT
https://zhuanlan.zhihu.com/p/151412524
https://zhuanlan.zhihu.com/p/198964217
https://blog.csdn.net/fengdu78/article/details/104744679/
https://www.jianshu.com/p/56a621e33d34