BERT

  1. 什麼是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

  2. 從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作出動態調整。其結構以下:

      yPK5ut.jpg

      ELMO的網絡結構採用了雙層雙向LSTM,採用了典型的兩階段過程,第一個階段是利用語言模型進行預訓練;第二個階段是在作下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding做爲新特徵補充到下游任務中。

      預訓練階段,使用單詞的上下文來預測當前位置的單詞,其損失函數爲:

      \[J=\sum_{sentence}\sum_{w_t \in sentence}\log P(w_t|w_1,...,w_{t-1})+\log P(w_t|w_{t+1},...,w_T) \]

      其中sentence爲語料庫中的句子,\(w_t\)爲其第t個單詞,T爲句子長度。ELMO的損失函數是前向語言模型和後向語言模型的和,兩個方向是分開的。

      將ELMO應用到具體的下游任務時,將句子輸入ELMO,將嵌入層、第一層LSTM、第二層LSTM的向量加權求和(權重可學習)便可獲得應用於下游任務的Embedding。由於ELMO在預訓練以後參數是固定的,只負責給下游任務提供相應特徵,因此這種預訓練模式成爲Feature-based Pre-Training。

      因爲ELMO在Embedding的時候考慮了上下文,因此對解決多義詞問題起到了必定做用,但ELMO也存在如下缺點:

      • 使用雙向LSTM做爲特徵抽取器,沒法並行且特徵抽取能力不強;
      • 訓練的時候先後向語言模型是分開的,只在給下游任務提供Embedding時進行融合,這種方法可能存在問題。
    • GPT

      GPT(Generative Pre-Training)是由Open AI提出的生成式預訓練語言模型,其採用了Transformer的Decoder做爲網絡結構,這更適合NLG任務,但對於NLU任務因爲其丟掉了下文信息,所以效果會打折扣。

    • BERT

      BERT(Bidirectional Encoder Representation from Transformers)與GPT最大的不一樣就是其採用的是Transformer的Encoder部分,可以同時使用上下文信息。其與GPT、ELMO的對比圖以下:

      yPgjzQ.png

      BERT的一大創新點就是其採用了Masked LM和Next Sentence Prediction兩種預訓練任務,將在第三小節具體介紹。

  3. BERT的具體內容

    • Embedding

      BERT的Embedding由三種Embedding求和而成:

      yPRg3D.png

      • Token Embeddings是詞向量,第一個單詞是CLS標誌,能夠用於以後的分類任務;
      • Segment Embeddings用來區別兩種句子,由於預訓練不光作LM還要作以兩個句子爲輸入的分類任務;
      • Position Embeddings和以前文章中的Transformer不同,不是固定的三角函數而是由網絡本身學習出來的。

      同時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都須要理解兩個句子之間的關係,從而能讓預訓練的模型更好的適應這樣的任務。

  4. BERT的優缺點

    BERT優勢

    • Transformer Encoder由於有Self-attention機制,所以BERT自帶雙向功能,特徵抽取能力和並行能力強。
    • 爲了獲取比詞更高級別的句子級別的語義表徵,BERT加入了Next Sentence Prediction來和Masked-LM一塊兒作聯合訓練。
    • 爲了適配多任務下的遷移學習,BERT設計了更通用的輸入層和輸出層,爲下游任務引入了很通用的求解框架,再也不爲任務作模型定製。

    BERT缺點

    • Bert用於下游任務微調時, [MASK] 標記不會出現,它只出如今預訓練任務中。這就形成了預訓練和微調之間的不匹配,微調不出現[MASK]這個標記,模型好像就沒有了着力點、不知從哪入手。因此只將80%的替換爲[mask],但這也只是緩解、不能解決。
    • [MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現。每一個batch只有15%的token被預測,因此BERT收斂得比left-to-right模型要慢(它們會預測每一個token)。
    • BERT對硬件資源的消耗巨大(大模型須要16個tpu,歷時四天;更大的模型須要64個tpu,歷時四天。
  5. 基於BERT的其餘預訓練模型

    • XLNet

      XLNet主要是爲了解決上述BERT缺點的第一條,使用自迴歸代替自編碼。自迴歸即便用前向語言模型或者後向語言模型來預測當前位置的詞,但其有單向的缺點;自編碼即BERT所使用的Masked LM的訓練方式,其能使用到雙向信息可是會形成預訓練與微調時的不一致。

      XLNet使用排列的方式來解決這一問題,例如對於序列[1,2,3,4],其全排列有4!種,XLNet但願最大化每種排列下每一個詞由前向或者後向語言模型所預測的機率:

      \[E_{z\sim Z_T}[\sum_{t=1}^T\log P(x_{z_t}|x_{z<t})] \]

      其中\(z\sim Z_T\)爲一個序列的全排列集合,z爲其中一種,T爲序列長度,\(x_{z_t}\)爲當前排列的第t個詞,\(x_{z<t}\)爲第t個詞前面的詞(或者後面的詞)。

      下圖展現不一樣排列時數字3所能使用的前向信息:

      yipfMQ.jpg

      但因爲全排列數太多,因此XLNet採用了抽樣全排列,且對於一種排列只預測序列中的後幾個單詞(前面的單詞信息太少)。同時,每一個Batch中一半序列作前向預測,一半序列作後向預測。

      同時XLNet對Transformer的結構作了改動,使用了兩路輸入context stream和query stream,其中:

      • context stream 就和普通的self-attention同樣編碼的是內容信息,可是是基於lookahead的mask 策略,即只能看到本身以及以前位置的內容信息。
      • query stream 編碼的是位置信息,能夠看到本身的位置信息,還有以前的內容信息可是不能看到本身的內容信息。

      下圖很好的展現了這一過程:

      yiCs9f.jpg

      其中綠色部分爲context stream,橙色部分爲query stream。能夠看到,XLNet是經過修改Attention mask來實現並行預測的。

      同時,XLNet去掉了下一句預測(NSP)任務。

    • RoBERTa

      • 去掉下一句預測(NSP)任務。
      • 動態掩碼。BERT 依賴隨機掩碼和預測 token。原版的 BERT 實如今數據預處理期間執行一次掩碼,獲得一個靜態掩碼。 而 RoBERTa 使用了動態掩碼:每次向模型輸入一個序列時都會生成新的掩碼模式。這樣,在大量數據不斷輸入的過程當中,模型會逐漸適應不一樣的掩碼策略,學習不一樣的語言表徵。
      • 文本編碼。使用Byte-Pair Encoding(BPE)代替Wordpiece。
    • 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同樣的效果。 模型使用了三種語言模型的任務:

      • unidirectional prediction
      • bidirectional prediction
      • seuqnece-to-sequence prediction

      UniLM三個任務分別以下圖所示:

      yi7Vij.jpg

      更多細節可參考:https://zhuanlan.zhihu.com/p/103202544

    • 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

  6. 參考資料

    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

    https://zhuanlan.zhihu.com/p/108744724

    https://spaces.ac.cn/archives/7427

相關文章
相關標籤/搜索