常用中文預訓練語言模型接口:
https://mp.weixin.qq.com/s/v5wijUi9WgcQlr6Xwc-Pvw
接口RoBERTa中文預訓練模型:RoBERTa for Chinese:
https://mp.weixin.qq.com/s/K2zLEbWzDGtyOj7yceRdFQ
在XLNet全面超越Bert后沒多久,Facebook提出了RoBERTa(a Robustly Optimized BERT Pretraining Approach)。再度在多個任務上達到SOTA。那么它到底改進了什么?它在模型層面沒有改變Google的Bert,改變的只是預訓練的方法。

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方式。然后每份數據都訓練N/10個epoch。這就相當於在這N個epoch的訓練中,每個序列的被mask的tokens是會變化的。這就叫做動態Masking。
那么這樣改變是否真的有效果?作者在只將靜態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
原本的BERTbase 的batch size是256,訓練1M個steps。RoBERTa的batch size為8k。為什么要用更大的batch size呢?(除了因為他們有錢玩得起外)作者借鑒了在機器翻譯中,用更大的batch size配合更大學習率能提升模型優化速率和模型性能的現象,並且也用實驗證明了確實Bert還能用更大的batch size。直接看圖吧,不細說了。

4. 更多的數據,更長時間的訓練
借鑒XLNet用了比Bert多10倍的數據,RoBERTa也用了更多的數據。性能確實再次彪升。當然,也需要配合更長時間的訓練。

這一套下來,最終在GLUE, RACE, SQuAD上都達到了SOTA的性能。