Roberta: Bert調優
最近要開始使用Transformer去做一些事情了,特地把與此相關的知識點記錄下來,構建相關的、完整的知識結構體系。
以下是要寫的文章,文章大部分都發布在公眾號【雨石記】上,歡迎關注公眾號獲取最新文章。
- Transformer:Attention集大成者
- GPT-1 & 2: 預訓練+微調帶來的奇蹟
- Bert: 雙向預訓練+微調
- Bert與模型壓縮
- Transformer + AutoML: 進化的Transformer
- Bert變種
- GPT-3
- 更多待續
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能帶來微小的提升。
模型輸入格式與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時結果最好。
輸入編碼
不管是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上訓練一天左右。
思考與總結
從上面的各種實驗結果中看,可以得到如下結論:
- NSP不是必須的loss
- Mask的方式雖不是最優但是已接近。
- 增大batch size和增大訓練資料能帶來較大的提升。
由於Roberta出色的效能,現在很多應用都是基於Roberta而不是原始的Bert去微調了。
勤思考, 多提問是Engineer的良好品德。
提問如下:
- 繼續增大資料集,還有沒有可能提升?資料集的量與所帶來的提升是一個什麼分佈?
- 不管是Bert還是Roberta,訓練時間都很長,如何進行優化?
回答後續公佈,歡迎關注公眾號【雨石記】
參考文獻
- [1]. Liu, Yinhan, et al. “Roberta: A robustly optimized bert pretraining approach.” arXiv preprint arXiv:1907.11692 (2019).
相關文章
- XLNet 第一作者楊植麟:為什麼預處理模型XLNet比BERT、RoBERTa更加優越模型
- Bert: 雙向預訓練+微調
- NLP新秀 : BERT的優雅解讀
- 【BERT】詳解BERT
- Spark 效能調優--資源調優Spark
- 調優 | Apache Hudi應用調優指南Apache
- MySQL調優篇 | SQL調優實戰(5)MySql
- 效能調優學習之硬體調優
- JVM調優JVM
- flink調優
- MySQL調優MySql
- SparkSQL 調優SparkSQL
- php調優PHP
- 模型調優模型
- 數倉調優實戰:GUC引數調優
- 【效能調優】效能測試、分析與調優基礎
- MySQL調優之索引優化MySql索引優化
- Linux核心調優Linux
- 調優引數
- adnroid效能調優
- ElasticSearch效能調優Elasticsearch
- Spark shuffle調優Spark
- JVM調優策略JVM
- MySQL調優之查詢優化MySql優化
- Nginx安全優化與效能調優Nginx優化
- Linux之效能調優Linux
- 掌握JVM調優命令JVM
- spark調優-背壓Spark
- 效能監控調優
- mysql 引數調優MySql
- .Net效能調優-MemoryPool
- .Net效能調優-ArrayPool
- 關於Hadoop調優Hadoop
- Apache 調優進階Apache
- 實戰 nginx 調優Nginx
- linux調優效能命令Linux
- 效能調優實戰
- Hive調優實用Hive