pytorch微调bert_香侬读 | RoBERT: 没错,我就是能更强——更大数据规模和仔细调参下的最优BERT
文章標(biāo)題:RoBERTa: A Robustly Optimized BERT Pretraining Approach
文章作者:Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov
文章鏈接:https://arxiv.org/pdf/1907.11692.pdf
代碼鏈接:https://github.com/pytorch/fairseq
導(dǎo)言
自從BERT橫空出世以來(lái),各類預(yù)訓(xùn)練模型一直在試圖“撼動(dòng)”BERT的地位,如XLM、XLNet等等,然而,這些模型都異常龐大,這給調(diào)參帶來(lái)了巨大的困難, 我們往往沒(méi)有足夠的時(shí)間為一個(gè)模型找到最佳參數(shù)。這篇論文將煉丹爐火力全開,在得到以下煉丹配方后將BERT的效果再次提到SOTA:
- 訓(xùn)練更久,batch更大,數(shù)據(jù)更多
- 丟棄NSP
- 在更長(zhǎng)的序列上訓(xùn)練
- 動(dòng)態(tài)改變mask策略
在新的煉丹配方上訓(xùn)練,RoBERT在GLUE上達(dá)到了88.5,在4/9上的任務(wù)上刷新SOTA,且在SQuAD和RACE上更新記錄。
總的來(lái)說(shuō),本論文的貢獻(xiàn)在于:
- 修改了BERT原有的訓(xùn)練策略
- 引入了一個(gè)更大的新數(shù)據(jù)集CCNEWS
- 驗(yàn)證了預(yù)訓(xùn)練模型合理設(shè)計(jì)的重要性
下面我們略過(guò)BERT等一些背景知識(shí),開門見(jiàn)山地直奔主題。
新的調(diào)整
在這里直接列出RoBERT在原BERT上新的調(diào)整,詳情請(qǐng)看原論文:
- 對(duì)學(xué)習(xí)率的峰值和warm-up更新步數(shù)作出調(diào)整(在不同任務(wù)下不同,在實(shí)驗(yàn)階段說(shuō)明)
- 將Adam中改為
- 不對(duì)序列進(jìn)行截短,使用全長(zhǎng)度序列
- 使用更高級(jí)的煉丹爐DGX-1 each with 8*32GB NVIDIA V100 GPUs interconnected by Infiniband
- 使用更多的煉丹原料,共160G左右,包括:
- 原BERT的16GB原料
- CC-NEWS的76GB原料
- OPENWEBTEXT的38GB原料
- STORIES的31GB原料
訓(xùn)練過(guò)程分析
動(dòng)態(tài)Mask
原來(lái)的BERT是靜態(tài)mask,即在數(shù)據(jù)預(yù)處理階段把所有的數(shù)據(jù)都mask了,在訓(xùn)練階段保持不變,即使在不同的epoch里。但這樣顯然是有問(wèn)題的, 為此,在實(shí)踐中我們把數(shù)據(jù)復(fù)制10份,然后統(tǒng)一進(jìn)行mask,然后再保持不變,送入訓(xùn)練過(guò)程,相當(dāng)于每種mask一共需要被看4次,而不是原來(lái)的40 次了。那么動(dòng)態(tài)mask就是訓(xùn)一個(gè)mask一個(gè),這樣基本可以保證每次看到的都不一樣。下面是BERT_base使用靜態(tài)和動(dòng)態(tài)mask的結(jié)果:
看起來(lái)dynamic比static好一點(diǎn)(雖然好得不是那么多),所以后文我們都統(tǒng)一使用dynamic的方法。
輸入格式和NSP
原BERT使用了NSP,但是近期的一些文章質(zhì)疑了NSP的作用,并且是把兩個(gè)句子貼在一起喂給模型,本文討論了下面的組合:
- SEGMENT-PAIR+NSP。這就是原BERT的NSP方法,輸入的是兩個(gè)段,每個(gè)段都可能有多個(gè)句子,總長(zhǎng)度要小于512。
- SENTENCE-PAIR+NSP。這里從各自的文檔或段中sample一個(gè)句子即可,因?yàn)榭傞L(zhǎng)度小于512,所以增大了batch size使得總字符數(shù)和SEGMENT-PAIR差不多。
- FULL-SENTENCES。直接從文檔中連續(xù)sample句子直到塞滿512的長(zhǎng)度,且丟掉NSP。當(dāng)?shù)竭_(dá)一個(gè)文檔結(jié)尾時(shí),先增加一個(gè)文檔分隔符,再?gòu)暮竺娴奈臋n接著sample。
- DOC-SENTENCES。和上面一樣,只是不得(may not)跨文檔。同樣增大batch size 使得總字符數(shù)和上面差不多。
模型使用的是BERT_base,實(shí)驗(yàn)結(jié)果如下:
首先看最上面兩行,使用多個(gè)句子效果更好,因?yàn)榭梢圆蹲骄渥又g的相關(guān)性。再看中間兩行,差不多,但是注意到都好于有NSP的模型,這說(shuō)明NSP的確沒(méi)用。而且似乎DOC-SENTENCES比FULL-SENTENCES略好,但這難以控制batch size,所以后面我們固定使用FULL-SENTENCES。
更大的batch size
原BERT使用了bs=256和1M步的訓(xùn)練方法,這等價(jià)于bs=2K和125K步或者bs=8K和31K步,下面是在BOOKCORPUS和WIKIPEDIA上的實(shí)驗(yàn)結(jié)果:
好像趨勢(shì)不太明顯,只能說(shuō)總的來(lái)看bs更大效果更好。
原子單位
時(shí)下流行的方法是BPE,傳統(tǒng)上我們使用unicode(兩個(gè)byte)作為切分基礎(chǔ),Radford et al. (2019) 使用了 byte-level 方法將字典大小限制在了50K左右,所以本文使用這種方法,且不對(duì)數(shù)據(jù)進(jìn)行任何預(yù)處理。
實(shí)驗(yàn)
總結(jié)一下上面,RoBERT作了如下調(diào)整:
- 使用動(dòng)態(tài)mask
- FULL-SENTENCES without NSP
- 更大的bs
- 更大的byte-level BPE
此外,還有兩個(gè)重要的因素有待探究:
- 數(shù)據(jù)量大小
- 訓(xùn)練次數(shù)
所以,我們首先復(fù)現(xiàn)BERT_large作為基線模型,包括原來(lái)的數(shù)據(jù)集,然后在相同的結(jié)構(gòu)和數(shù)據(jù)集上實(shí)現(xiàn)RoBERT,然后再在160G的新數(shù)據(jù)集上訓(xùn)練,且增加訓(xùn)練步數(shù)。下表是結(jié)果:
結(jié)果是顯然的,更多的數(shù)據(jù)和更長(zhǎng)的訓(xùn)練會(huì)提高效果,這告訴我們一個(gè)道理:大力出奇跡。
GLUE
對(duì)于GLUE,我們考慮兩種設(shè)置
- 對(duì)不同的任務(wù)各自微調(diào),在bs和lr之間選擇,并且對(duì)前6%的訓(xùn)練步數(shù)進(jìn)行線性warm-up,然后使用線性衰減。此外,用10個(gè)epoch微調(diào)與提前終止,其他保持前文所述不變。
- 和GLUE榜上的其他模型一較高下,但是只基于單任務(wù)微調(diào)。對(duì)RTE,STS和MRPC使用MNLI單任務(wù)微調(diào)。對(duì)于QNLI和WNLI這兩個(gè)任務(wù)有獨(dú)特的微調(diào)方法,詳情參考論文及附錄。下表是結(jié)果:
對(duì)第一種比較設(shè)置,RoBERT在結(jié)構(gòu)與BERT_large相同的情況下碾壓了對(duì)手,在GLUE榜上也刷新了4個(gè)任務(wù)的記錄。
SQuAD
下表是SQuAD1/2的結(jié)果:
其中,帶有? 表示引入了額外的外部數(shù)據(jù)。可以看到,即使在有外部數(shù)據(jù)的情況下,RoBERT也比BERT_large好。
RACE
下表是結(jié)果:
依舊碾壓了BERT_large和XLNet呢。
小結(jié)
RoBERT在BERT的基礎(chǔ)上進(jìn)行了更細(xì)致的探究,包括損失函數(shù)、超參數(shù)、數(shù)據(jù)量、訓(xùn)練方法等,但是,本文說(shuō)是RoBERT比XLNet好,但是在GLUE上人家也只用了112G數(shù)據(jù),這相差的50G數(shù)據(jù)量能否彌補(bǔ)呢?這是一個(gè)問(wèn)題。
總之,神仙打架(苦笑)。
總結(jié)
以上是生活随笔為你收集整理的pytorch微调bert_香侬读 | RoBERT: 没错,我就是能更强——更大数据规模和仔细调参下的最优BERT的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: centos8 配置 dns_广电行业D
- 下一篇: delphi libeay32 各版本_