論文來源: 2019 發在arXiv上
論文連結:https://arxiv.org/abs/1907.11692v1
🚀主要内容
現有的一些預訓練模型在NLP領域取得了不錯的成績,但是要确定哪些方面對模型性能的提升貢獻最大是困難的。畢竟這些模型訓練成本比較高,調優麻煩。且我們在訓練的時候通常是在不同大小的私有資料集上進行的,限制了對模型效果的評測。
是以該篇論文主要就是重新對BERT模型進行了研究及調整,提出了一種改價方法來訓練BERT模型,稱為RoBERTa。細緻地評估了其中的關鍵超參數、資料集大小對性能的影響。
實驗表明,BERT的預訓練不夠充分,且經過調整BERT能超越在其後面釋出的一些改進模型。實驗在一些下遊任務上達到了SOTA。這也充分說明先前忽視掉的一些訓練時的設計選擇。
⭐主要貢獻:
1.對BERT的設計選擇以及一些訓練政策進行了調整,并引入了一些能使下遊任務達到更好性能的替代方案。
2.建構了一個新的資料集CC-NEWS(其大小與其他的一些私有資料集大小相當,以更好的控制訓練集大小的影響),并證明了在預訓練階段使用更多的資料訓練,能夠提升下遊任務的性能。
3.經過訓練上的一些調整,實驗證明了性能得到了提升,同時能夠說明在合适的設計選擇下,MLM預訓練任務能夠和最近釋出的一些方法相抗衡。
【注:預訓練和微調代碼開源在了github】
論文對BERT的修改也比較簡單,如下:
1.加長訓練時間、加大批次大小、加大訓練資料量。
2.去掉NSP預訓練任務。
3.對更長的序列進行訓練。
3.動态地對訓練資料進行MASK。
⭐模型結構:
使用的是BERT_base(L=12, H = 768, A = 12, 110M params),結構不作變化。
⭐動态Maksing:
之前BERT裡MLM預訓練任務的mask政策是:
先随機選擇15%的token,80%替換成[MASK],10%不變,10%替換别的詞。
但是這個過程是靜态的,也就是在訓練前的資料預處理階段已經結束,後面就當成訓練集訓練。是以叫靜态Making。
而RoBERTa中則是将每條資料複制10份當成資料集,每份也是随機選擇15%token,但是每份都采用了不同的mask方式。也就是說在一個epoch内(一個epoch會周遊完資料集),同一個序列将會訓練10次,但是這10次都是不同的mask方式。其實這就叫動态Masking了。大概像下面這樣:
N = N * 10 # N:資料集大小
for epoch in range(epoches):
for step in range(N / 10): # 按每次都是全部資料 來了解
對mask1訓練
.....
for step in range(N / 10):
對mask10訓練
作者在固定其他參數不變,對比了靜态和動态Masking,确實帶來了性能的輕微提升。當資料集更大或者訓練步數較多時,這變得至關重要。
下面實驗都使用動态Masking進行。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn1UNVpmTwkleNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxY2N1AzMhJTNilzNlZmM5I2M1QDMiVDMmFGZkFjM1czLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
⭐去除NSP預訓練任務:
在BERT裡,使用NSP預訓練任務是為了捕捉句子之間的關系,每次輸入兩句話判斷其是否連續。而RoBERTa去除了NSP,每次連續輸入多個句子,直到最大長度(可以跨文章),這種方式叫FULL-SENTENCES。實驗表明在MNLI這種推斷句子關系的任務上RoBERTa也能有更好性能。
本文設計了以下4種訓練方式:
【注:SEGMENT-PAIR和SENTENCE-PAIR就是BERT裡的那種形式,一個SEGMENT包含多個SENTENCES。DOC-SENTENCES:也是和FULL-SENTENCES一樣(不過不能跨文章)】
去掉NSP損失在下遊任務的性能上能夠與原始BERT持平或略微升高。可能的原因:原始 BERT 實作采用僅僅是去掉NSP的損失項,但是仍然保持 SEGMENT-PARI的輸入形式。對比沒有NSP的兩種情況,DOC會好些,他的SENTENCES來自同一文章。由于DOC在同一篇文章采樣時到了文章末尾處,可能采樣小于512token(作者預訓練統一将輸入長度設定為了512tokens。)而作者是通過動态調整batch_size來平衡和FULL-SENTENCES有差不多的tokens。
為了友善對比,作者還是使用了FULL-SENTENCES實驗。
⭐使用更大的batch_size訓練:
BERT_base中:batch_size = 256
而RoBERTa中:batch_size = 8K。
這主要是作者借鑒了在過去的機器翻譯任務中,适當增大學習率時,更大的batch_size配合能提升模型優化速率和模型性能。且近期的一些工作表明BERT适合用大批量資料訓練。
同時更大批次也容易通過并行處理。
⭐更多的資料,更長的訓練時長
借鑒XLNet用了比Bert多10倍的資料,RoBERTa也用了更多的資料。性能确實再次提升。當然,也需要配合更長時間的訓練。
⭐對Text Encoding的調整:
位元組對編碼(BPE)(Sennrich et al.,2016)是字元級和單詞級表示的混合,該編碼方案可以處理自然語言語料庫中常見的大量詞彙。BPE不依賴于完整的單詞,而是依賴于子詞(sub-word)單元,這些子詞單元是通過對訓練語料庫進行統計分析而提取的,其詞表大小通常在 1萬到 10萬之間。當對海量多樣語料模組化時,unicode characters占據了該詞表的大部分。Radford et al.(2019)的工作中介紹了一個簡單但高效的BPE, 該BPE使用位元組對而非unicode characters作為子詞單元。
總結下兩種BPE實作方式:
基于 char-level :原始 BERT 的方式,它通過對輸入文本進行啟發式的詞幹化之後處理得到。
基于 bytes-level:與 char-level 的差別在于bytes-level 使用 bytes 而不是 unicode 字元作為 sub-word 的基本機關,是以可以編碼任何輸入文本而不會引入 UNKOWN 标記。
當采用 bytes-level 的 BPE 之後,詞表大小從3萬(原始 BERT 的 char-level )增加到5萬。這分别為 BERT-base和 BERT-large增加了1500萬和2000萬額外的參數。
之前有研究表明,這樣的做法在有些下遊任務上會導緻輕微的性能下降。但是本文作者相信:這種統一編碼的優勢會超過性能的輕微下降。
⭐評估benchmarks:
使用如下3個benchmarks對在下遊任務上的性能進行評估:
1.GLUE
2.SQuAD
3.RACE
結合上述的所有調整,通過BERT_Large預訓練模型 (L = 24, H = 1024, A = 16, 355M parameters)來微調下遊任務。在GLUE,RACE和SQuAD上實作了SOTA。
⭐總結:
RoBERTa通過更長時間地訓練模型,處理更多資料,增大batch_size可以顯著提高模型性能;去除NSP預訓練,在更長的序列上訓練。并動态地改變應用于訓練資料的遮蔽模式。該方案在GLUE,RACE和SQuAD上實作了SOTA。【注:在GLUE上沒有進行多任務微調,在SQuAD上沒有使用附加資料。】這些結果說明這些先前被忽視的設計決策的重要性,并表明BERT的預訓練目标與最近提出的替代方案相比仍然具有競争性。