RoBERTa: A Robustly Optimized BERT Pretraining Approach(一種魯棒優化的 BERT預訓練方法)
細讀,半天
Motivation
目前自訓練方法例如Elmo,GPT,Bert,XLNet在NLP領域取得了很不錯的成績,但是要確定哪些方法對效果的提升貢獻最為明顯,這是比較困難的。
這主要是因為以下幾個原因:
-
第一是因為訓練成本比較高,要對模型進行徹底的調優成本很高;
-
第二是因為我們在進行訓練的時候通常是在不同大小的私有訓練數據上進行的,限制了對模型效果的評測。
基於以上問題,作者重新研究了Bert的預訓練機制,評估了超參 和 訓練集大小對效果影響。
發現了Bert的預訓練並不充分,因此作者提出了改進Bert的方法,即,RoBERTa。
解決方法
-
使用更大的batch,在更大的數據集上對Bert進行訓練
-
不再使用NSP(Next Sentence Prediction)任務
-
使用更長的序列進行訓練
-
動態調整Masking機制
-
更大的 byte-level BPE
模型結構
-
We keep the model architecture fixed.
-
Specifically, we begin by training BERT models with the same configuration as \(BERT_{BASE}\) (L=12, H = 768, A = 12, 110M params).
改進:
1. 靜態Masking vs 動態Masking
原始Bert:對每一個序列隨機選擇15%的Tokens替換成[MASK],為了消除與下游任務的不匹配,還對這15%的Tokens進行
(1)80%的時間替換成[MASK];
(2)10%的時間不變;
(3)10%的時間替換成其他詞。但整個訓練過程,這15%的Tokens一旦被選擇就不再改變,也就是說從一開始隨機選擇了這15%的Tokens,之后的N個epoch里都不再改變了。這就叫做靜態Masking。
RoBERTa: 一開始把預訓練的數據復制10份,每一份都隨機選擇15%的Tokens進行Masking,也就是說,同樣的一句話有10種不同的mask方式。
然后每份數據(同一個mask)都訓練N/10個epoch。這就相當於在這N個epoch的訓練中,每個序列的被mask的tokens是會變化的。這就叫做動態Masking。
N = N * 10
for epoch in range(epoches):
for step in range(N / 10): # 按每次都是全部數據 來理解
對mask1訓練
.....
for step in range(N / 10):
對mask10訓練
那么這樣改變是否真的有效果?作者在只將靜態Masking改成動態Masking,其他參數不變的情況下做了實驗,動態Masking確實能提高性能。
2. with NSP vs without NSP
原始的Bert:為了捕捉句子之間的關系,使用了NSP任務進行預訓練,就是輸入一對句子A和B,判斷這兩個句子是否是連續的。在訓練的數據中,50%的B是A的下一個句子,50%的B是隨機抽取的。
RoBERTa:去除了NSP,而是每次輸入連續的多個句子,直到最大長度512(可以跨文章)。這種訓練方式叫做(FULL-SENTENCES),而原來的Bert每次只輸入兩個句子。實驗表明在MNLI這種推斷句子關系的任務上RoBERTa也能有更好性能。
3. 更大的mini-batch
原始的\(BERT_{base}\): batch size 是 256,訓練 1M 個steps。
RoBERTa: batch size 為 8k。為什么要用更大的batch size呢?作者借鑒了在機器翻譯中,用更大的batch size配合更大學習率能提升模型優化速率 和 模型性能的現象,並且也用實驗證明了確實Bert還能用更大的batch size。
4. Text Encoding
- BPE:使用字節可以學習一個中等大小(50K units)的子單詞詞匯表,它仍然可以編碼任何輸入文本,而不會引入任何“un-known”標記。
5. 更多的數據,更長時間的訓練
借鑒XLNet用了比Bert多10倍的數據,RoBERTa也用了更多的數據。性能確實再次彪升。當然,也需要配合更長時間的訓練。