Roberta: Bert調優

張雨石發表於2020-09-30

最近要開始使用Transformer去做一些事情了,特地把與此相關的知識點記錄下來,構建相關的、完整的知識結構體系。

以下是要寫的文章,文章大部分都發布在公眾號【雨石記】上,歡迎關注公眾號獲取最新文章。

Overall

Bert出來以後,迅速引爆了NLP領域,出現了很多的針對模型的改進。然而,Roberta用實力表明,只對原來的Bert模型調優就可以有明顯的提升。

Roberta,是Robustly Optimized BERT Approach的簡稱。

Robustly用詞很贊,既有“魯棒的”,又有”體力的”。Roberta是一片實驗為基礎的論文,有點體力活的意思,但是結果又非常的魯棒可信賴。

先來回顧一下Bert中的一些細節:

  • 在輸入上,Bert的輸入是兩個segment,其中每個segment可以包含多個句子,兩個segment用[SEP]拼接起來。
  • 模型結構上,使用Transformer,這點跟Roberta是一致的。
  • 學習目標上,使用兩個目標:
    • Masked Language Model(MLM): 其中15%的token要被Mask,在這15%裡,有80%被替換成[Mask]標記,有10%被隨機替換成其他token,有10%保持不變。
    • Next Sentence Prediction: 判斷segment對中第二個是不是第一個的後續。隨機取樣出50%是和50%不是。
  • Optimizations:
    • Adam, beta1=0.9, beta2=0.999, epsilon=1e-6, L2 weight decay=0.01
    • learning rate, 前10000步會增長到1e-4, 之後再線性下降。
    • dropout=0.1
    • GELU啟用函式
    • 訓練步數:1M
    • mini-batch: 256
    • 輸入長度: 512
  • Data
    • BookCorpus + English Wiki = 16GB

Roberta在如下幾個方面對Bert進行了調優:

  • Masking策略——靜態與動態
  • 模型輸入格式與Next Sentence Prediction
  • Large-Batch
  • 輸入編碼
  • 大語料與更長的訓練步數

Masking策略——靜態與動態

原來的Bert中是在訓練資料中靜態的標上Mask標記,然後在訓練中是不變的,這種方式就是靜態的。

Roberta嘗試了一種動態的方式,說是動態,其實也是用靜態的方式實現的,把資料複製10份,每一份中採用不同的Mask。這樣就有了10種不同的Mask資料。

從結果中,可以看到動態mask能帶來微小的提升。

Roberta: Bert調優

模型輸入格式與Next Sentence Prediction

Bert的模型輸入中是由兩個segment組成的,因而就有兩個問題:

  • 兩個segment是不是必要?
  • 為什麼是segment而不是單個的句子?

因此設定了四個實驗:

  • Segment-Pair + NSP
  • Sentence-Pair + NSP: 只用了sentence以後,輸入的長度會變少,為了使得每一步訓練見到的token數類似,在這裡會增大batch size
  • Full-Sentence: 每一個樣本都是從一個文件中連續sample出來的,如果跨過文件邊界,就新增一個[SEP]的標記,沒有NSP損失。
  • Doc-Sentence: 類似於Full-Sentence,但是不會跨過文件邊界。

從實驗結果中可以看到,改用Sentence-Pair會帶來一個較大的損失。猜測是因為這樣無法捕捉long-term的依賴。

另外,Full-Sentence和Doc-Sentence能夠帶來微小的提升,說明NSP不是必須的。

這點跟Bert中的消融實驗結論相反,但是請注意它們的輸入還是不同的,原始Bert中的輸入是Segment-Pair,有50%/50%的取樣,而Full/Doc-Sentence中則是從文章中連續sample來的句子。

在這裡插入圖片描述

因為Doc-Sentence會導致不同的batch_size(因為要保證每個batch見到的token數類似),所以在Roberta中,使用Full-Sentence模式。

Large-Batch

現在越來越多的實驗表明增大batch_size會使得收斂更快,最後的效果更好。原始的Bert中,batch_size=256,同時訓練1M steps。

在Roberta中,實驗了兩個設定:

  • batch_size=2k, 訓練125k steps。
  • batch_size=8k, 訓練31k steps。

從結果中看,batch_size=2k時結果最好。

Roberta: Bert調優

輸入編碼

不管是GPT還是Bert,都是用的BPE的編碼方式,BPE是Byte-Pair Encoding的簡稱,是介於字元和詞語之間的一個表達方式,比如hello,可能會被拆成“he”, “ll”, “o”, 其中BPE的字典是從語料中統計學習到的。

原始Bert中,採用的BPE字典是30k, Roberta中增大到了50K,相對於Bertbase和Bertlarge會增加15M/20M的引數。

增大語料和訓練步數

增大語料和訓練步數還是能帶來比較大的提升的。

在這裡插入圖片描述

Roberta

就是上面所有改進的總和。可以看到,在各項任務中的提升還是很大的。Roberta的訓練在1024個 V100GPU上訓練一天左右。

在這裡插入圖片描述
在這裡插入圖片描述
Roberta: Bert調優

思考與總結

從上面的各種實驗結果中看,可以得到如下結論:

  • NSP不是必須的loss
  • Mask的方式雖不是最優但是已接近。
  • 增大batch size和增大訓練資料能帶來較大的提升。

由於Roberta出色的效能,現在很多應用都是基於Roberta而不是原始的Bert去微調了。

勤思考, 多提問是Engineer的良好品德。

提問如下:

  • 繼續增大資料集,還有沒有可能提升?資料集的量與所帶來的提升是一個什麼分佈?
  • 不管是Bert還是Roberta,訓練時間都很長,如何進行優化?

回答後續公佈,歡迎關注公眾號【雨石記】

Roberta: Bert調優

參考文獻

  • [1]. Liu, Yinhan, et al. “Roberta: A robustly optimized bert pretraining approach.” arXiv preprint arXiv:1907.11692 (2019).