不同預訓練模型的總結對比


持續更新 2020-06-28

 

目錄

ELMO

BERT

SpanBERT

structBERT(Alice)

RoBERTa

ERNIE2

XLNet

ELECTRA

MASS

BART

UniLM

T5

C4

Smaller Model:

ALBERT

Distill BERT

Tiny BERT

Mobile BERT

Q8BERT

DynaBERT

使用相關

 

BERT家族

 

 

圖片來源:李宏毅老師的課程

ELMO

 

 Encoder是雙向的LSTM。

 

BERT

encoder由ELMO的LSTM換成了Transformer。

mask機制 

輸入時,隨機遮蓋或替換一句話里面任意字或詞, 然后讓模型通過上下文的理解預測那一個被遮蓋或替換的部分, 之后做𝐿𝑜𝑠𝑠的時候只計算被遮蓋部分的𝐿𝑜𝑠𝑠。

隨機把一句話中 15% 的 𝑡𝑜𝑘𝑒𝑛 替換成以下內容:

  • 1) 這些 𝑡𝑜𝑘𝑒𝑛 有 80% 的幾率被替換成 [𝑚𝑎𝑠𝑘]
  • 2) 有 10% 的幾率被替換成任意一個其他的 𝑡𝑜𝑘𝑒𝑛
  • 3) 有 10% 的幾率原封不動。

讓模型預測和還原被遮蓋掉或替換掉的部分,損失函數只計算隨機遮蓋或替換部分的Loss。

 

 

 讓模型去預測被mask or 被替換的token。

 

SpanBert

不同長度的『mask』。這里不用[mask],而是用空格。

 

 

 

 

 

 

 

 

 

RoBERTa

RoBERTa 在模型規模、算力和數據上,主要比 BERT 提升了以下幾點:

  • 更大的模型參數量(從 RoBERTa 論文提供的訓練時間來看,模型使用 1024 塊 V 100 GPU 訓練了 1 天的時間)

  • 更多的訓練數據(包括:CC-NEWS 等在內的 160GB 純文本)

此外如下所示,RoBERTa 還有很多訓練方法上的改進。

 

 

 

1. 動態掩碼:mask更隨機

BERT 依賴隨機掩碼和預測 token。原版的 BERT 實現在數據預處理期間執行一次掩碼,得到一個靜態掩碼。而 RoBERTa 使用了動態掩碼:每次向模型輸入一個序列時都會生成新的掩碼模式。這樣,在大量數據不斷輸入的過程中,模型會逐漸適應不同的掩碼策略,學習不同的語言表征。

static masking: 原本的BERT采用的是static mask的方式,就是在create pretraining data中,先對數據進行提前的mask,為了充分利用數據,定義了dupe_factor,這樣可以將訓練數據復制dupe_factor份,然后同一條數據可以有不同的mask。注意這些數據不是全部都喂給同一個epoch,是不同的epoch,例如dupe_factor=10, epoch=40, 則每種mask的方式在訓練中會被使用4次。

dynamic masking: 每一次將訓練example喂給模型的時候,才進行隨機mask。

2. 更大批次

RoBERTa 在訓練過程中使用了更大的批數量。研究人員嘗試過從 256 到 8000 不等的批數量。

3. 文本編碼

Byte-Pair Encoding(BPE)是字符級和詞級別表征的混合,支持處理自然語言語料庫中的眾多常見詞匯。

原版的 BERT 實現使用字符級別的 BPE 詞匯,大小為 30K,是在利用啟發式分詞規則對輸入進行預處理之后學得的。Facebook 研究者沒有采用這種方式,而是考慮用更大的 byte 級別 BPE 詞匯表來訓練 BERT,這一詞匯表包含 50K 的 subword 單元,且沒有對輸入作任何額外的預處理或分詞。

基於bytes的編碼可以有效防止unknown問題。

 

中文RoBERTa

中文預訓練RoBERTa-zh模型,使用了大量文本進行數據訓練,包含新聞、社區問答、百科數據等。

作者按照 RoBERTa 論文主要精神訓練了這一模型,並進行了多項改進和調整:

  1. 數據生成方式和任務改進:取消下一個句子預測,並且數據從一個文檔中連續獲得 (見:Model Input Format and Next Sentence Prediction,DOC-SENTENCES);

  2. 更大更多樣性的數據:使用 30G 中文訓練,包含 3 億個句子,100 億個字 (即 token)。由於新聞、社區討論、多個百科,保羅萬象,覆蓋數十萬個主題;

  3. 訓練更久:總共訓練了近 20 萬,總共見過近 16 億個訓練數據 (instance); 在 Cloud TPU v3-256 上訓練了 24 小時,相當於在 TPU v3-8(128G 顯存) 上需要訓練一個月;

  4. 更大批次:使用了超大(8k)的批次 batch size;

  5. 調整優化器參數;

  6. 使用全詞 mask(whole word mask)。

圖注:全詞 Mask 和其他文本處理方法對比。

 

ERNIE2

持續學習的機制(continual learning)

持續學習包括持續構建預訓練任務和增量多任務學習兩個部分,具體如下圖:

 

 

連續預訓練包含一系列共享的文本編碼層來編碼上下文信息,編碼器的參數能通過所有預訓練任務更新

 

 

Multi-Level & More Task

不同於ERNIE1僅有詞級別的Pretraining Task,ERNIE2考慮了詞級別、結構級別和語義級別3類Pretraining Task,詞級別包括Knowledge Masking(短語Masking)、Capitalization Prediction(大寫預測)和Token-Document Relation Prediction(詞是否會出現在文檔其他地方)三個任務,結構級別包括Sentence Reordering(句子排序分類)和Sentence Distance(句子距離分類)兩個任務,語義級別包括Discourse Relation(句子語義關系)和IR Relevance(句子檢索相關性)兩個任務。三者關系如圖:

 

 

 

XLNet

XLNet是一種大型雙向transformer,它使用的是改進過的訓練方法,這種訓練方法擁有更大的數據集和更強的計算能力,在20個語言任務中XLNet比BERT的預測指標要更好。

為了改進訓練方法,XLNet引入了置換語言建模,其中所有標記都是按隨機順序預測的。 這與BERT的掩蔽語言模型形成對比,后者只預測了掩蔽(15%)標記。 這也顛覆了傳統的語言模型,在傳統語言模型中,所有的標記都是按順序而不是按隨機順序預測的。 這有助於模型學習雙向關系,從而更好地處理單詞之間的關系和銜接。此外使用Transformer XL做基礎架構,即使在不統一排序訓練的情況下也能表現出良好的性能。

Transformer XL

 

 

XLNet使用了超過130 GB的文本數據和512 TPU芯片進行訓練,運行時間為2.5天,XLNet用於訓練的資料庫要比BERT大得多。

推薦閱讀 XLNet:運行機制及和Bert的異同比較,講得十分細致。

 

 “雙流自注意力機制”

一個是內容流自注意力,其實就是標准的Transformer的計算過程;主要是引入了Query流自注意力,就是用來代替Bert的那個[Mask]標記的,因為XLNet希望拋掉[Mask]標記符號,但是比如知道上文單詞x1,x2,要預測單詞x3,此時在x3對應位置的Transformer最高層去預測這個單詞,但是輸入側不能看到要預測的單詞x3,Bert其實是直接引入[Mask]標記來覆蓋掉單詞x3的內容的,等於說[Mask]是個通用的占位符號。而XLNet因為要拋掉[Mask]標記,但是又不能看到x3的輸入,於是Query流,就直接忽略掉x3輸入了,只保留這個位置信息,用參數w來代表位置的embedding編碼。其實XLNet只是扔了表面的[Mask]占位符號,內部還是引入Query流來忽略掉被Mask的這個單詞。和Bert比,只是實現方式不同而已。

Attention Mask

引入的Permutation Language Model這種新的預訓練目標,本質上和bert的mask標記是類似的。區別主要在於:Bert是直接在輸入端顯示地通過引入Mask標記,在輸入側隱藏掉一部分單詞,讓這些單詞在預測的時候不發揮作用,要求利用上下文中其它單詞去預測某個被Mask掉的單詞;而XLNet則拋棄掉輸入側的Mask標記,通過Attention Mask機制,在Transformer內部隨機Mask掉一部分單詞(這個被Mask掉的單詞比例跟當前單詞在句子中的位置有關系,位置越靠前,被Mask掉的比例越高,位置越靠后,被Mask掉的比例越低),讓這些被Mask掉的單詞在預測某個單詞的時候不發生作用。

 

XLNet相對Bert性能提升因素:

1. 與Bert采取De-noising Autoencoder方式不同的新的預訓練目標:Permutation Language Model(簡稱PLM);這個可以理解為在自回歸LM模式下,如何采取具體手段,來融入雙向語言模型。這個是XLNet在模型角度比較大的貢獻,確實也打開了NLP中兩階段模式潮流的一個新思路。

2. 引入了Transformer-XL的主要思路:相對位置編碼以及分段RNN機制。實踐已經證明這兩點對於長文檔任務是很有幫助的;

3. 加大增加了預訓練階段使用的數據規模;Bert使用的預訓練數據是BooksCorpus和英文Wiki數據,大小13G。XLNet除了使用這些數據外,另外引入了Giga5,ClueWeb以及Common Crawl數據,並排掉了其中的一些低質量數據,大小分別是16G,19G和78G。可以看出,在預訓練階段極大擴充了數據規模,並對質量進行了篩選過濾。這個明顯走的是GPT2.0的路線。

 

 

 

UniLM 

 

 

 

Smaller Model

模型壓縮方法:

  • 模型剪枝
  • 知識蒸餾
  • 參數量化
  • 框架設計

Excellent reference: all-the-ways-to-compress-BERT

Albert

A Lite Bert For Self-Supervised Learning Language Representations 

https://github.com/brightmart/albert_zh

ALBERT模型是BERT的改進版,與最近其他State of the art的模型不同的是,這次是預訓練小模型,效果更好、參數更少。

它對BERT進行了三個改造 Three main changes of ALBert from Bert:

1)詞嵌入向量參數的因式分解 Factorized embedding parameterization

 O(V * H) to O(V * E + E * H)
 
 如以ALBert_xxlarge為例,V=30000, H=4096, E=128
   
 那么原先參數為V * H= 30000 * 4096 = 1.23億個參數,現在則為V * E + E * H = 30000*128+128*4096 = 384萬 + 52萬 = 436萬,
   
 詞嵌入相關的參數變化前是變換后的28倍。

2)跨層參數共享 Cross-Layer Parameter Sharing

 參數共享能顯著減少參數。共享可以分為全連接層、注意力層的參數共享;注意力層的參數對效果的減弱影響小一點。

3)段落連續性任務 Inter-sentence coherence loss.

 使用段落連續性任務。正例,使用從一個文檔中連續的兩個文本段落;負例,使用從一個文檔中連續的兩個文本段落,但位置調換了。
 
 避免使用原有的NSP任務,原有的任務包含隱含了預測主題這類過於簡單的任務。

  We maintain that inter-sentence modeling is an important aspect of language understanding, but we propose a loss 
  based primarily on coherence. That is, for ALBERT, we use a sentence-order prediction (SOP) loss, which avoids topic 
  prediction and instead focuses on modeling inter-sentence coherence. The SOP loss uses as positive examples the 
  same technique as BERT (two consecutive segments from the same document), and as negative examples the same two 
  consecutive segments but with their order swapped. This forces the model to learn finer-grained distinctions about
  discourse-level coherence properties. 

其他變化:

1)去掉了dropout  Remove dropout to enlarge capacity of model.
    最大的模型,訓練了1百萬步后,還是沒有過擬合訓練數據。說明模型的容量還可以更大,就移除了dropout
    (dropout可以認為是隨機的去掉網絡中的一部分,同時使網絡變小一些)
    We also note that, even after training for 1M steps, our largest models still do not overfit to their training data. 
    As a result, we decide to remove dropout to further increase our model capacity.
    其他型號的模型,在我們的實現中我們還是會保留原始的dropout的比例,防止模型對訓練數據的過擬合。
    
2)為加快訓練速度,使用LAMB做為優化器 Use LAMB as optimizer, to train with big batch size
  使用了大的batch_size來訓練(4096)。 LAMB優化器使得我們可以訓練,特別大的批次batch_size,如高達6萬。

3)使用n-gram(uni-gram,bi-gram, tri-gram)來做遮蔽語言模型 Use n-gram as make language model
   即以不同的概率使用n-gram,uni-gram的概率最大,bi-gram其次,tri-gram概率最小。
   本項目中目前使用的是在中文上做whole word mask,稍后會更新一下與n-gram mask的效果對比。n-gram從spanBERT中來。

訓練語料/訓練配置 Training Data & Configuration

30g中文語料,超過100億漢字,包括多個百科、新聞、互動社區。

預訓練序列長度sequence_length設置為512,批次batch_size為4096,訓練產生了3.5億個訓練數據(instance);每一個模型默認會訓練125k步,albert_xxlarge將訓練更久。

作為比較,roberta_zh預訓練產生了2.5億個訓練數據、序列長度為256。由於albert_zh預訓練生成的訓練數據更多、使用的序列長度更長,

我們預計albert_zh會有比roberta_zh更好的性能表現,並且能更好處理較長的文本。

訓練使用TPU v3 Pod,我們使用的是v3-256,它包含32個v3-8。每個v3-8機器,含有128G的顯存。

 

使用相關

寶藏庫:

https://github.com/huggingface/transformers

幾乎包含所有主流的預訓練語言模型,並且使用起來非常便捷。它從 Tokenize、轉化為字符的 ID 到最終計算出隱藏向量表征,提供了整套 API,我們可以快速地將其嵌入到各種 NLP 系統中。

但是在使用過程中,我們會發現中文的預訓練模型非常少,只有 BERT-Base 提供的那種 hhhh

pytorch-transformers 同時支持導入 TensorFlow 預訓練的模型與 PyTorch 預訓練的模型,它們倆都可以導入到庫中。

 

 

參考:

RoBERTa中文預訓練模型,你離中文任務的「SOTA」只差個它

RoBERTa、ERNIE2、BERT-wwm-ext和SpanBERT

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM