預訓練模型BERT是NLP領域現在最大的網紅,BERT的預訓練過程學習了大量的天然語言中詞、句法以及常識等泛領域的知識。所以,在運用BERT到實際的NLP任務中,一般的作法都是基於特定領域內的少許數據(幾千到幾萬)集,再進行Finetune,以適用於當前的任務和領域。算法
一般來講,基於BERT進行Finetune效果都會還不錯。可是若是你的數據集相對小的時候,你有可能會遇到一些麻煩。本篇基於論文《Revisiting Few-sample BERT Fine-tuning》深刻看一下BERT的預訓練過程,試着深刻分析這一過程,用於指導Finetune的工做。機器學習
做者&編輯 | 小Dream哥函數
1 BERT及其預訓練學習
BERT是一個基於transformer encoder的大型雙向模型,基於海量的文本進行預訓練,訓練的任務包括MLM和NSP。
優化
筆者前面有詳細介紹BERT的文章,忘記的同窗能夠先點擊瞭解:
搜索引擎
【NLP】 深刻淺出解析BERT原理及其表徵的內容google
在論文《Revisiting Few-sample BERT Fine-tuning》中,論文做者細緻的發現了BERT在預訓練時,在更新參數時作了一些"小動做",以下圖:人工智能
BERT在預訓練時,省略了標準Adam優化器優化過程當中的第9和第10步。步驟9和步驟10分別是對步驟7和步驟8中一階動量和二階動量的有偏估計的糾正(bias-corrected)。關於爲何步驟7和步驟8中的一階動量和二階動量爲何是有偏的,感興趣的讀者能夠翻看原文去了解,這裏不作繁瑣的推演了。
url
須要說明的是,爲何BERT在預訓練時要省略和能夠省略這兩部呢?筆者猜想,google省略優化步驟主要緣由應該是爲了提速,畢竟預訓練過程的數據量如此之大,BERT又是如此的龐大。那麼爲何能作這樣的省略呢,筆者猜想,是由於BERT在預訓練是用的訓練數據集很是之大,數據集的分佈已經很是接近於實際的樣本分佈,所以能夠省略上述步驟。spa
2 BERT的小樣本Finetune
如咱們上一節討論的,BERT的預訓練過程用的Adam優化器是非標的,能夠稱爲BERT_Adam。而後論文做者發現,現在產業界和學術界大部分的開源BERT庫的Adam優化器都是基於這個版本。
做者認爲,BERT_Adam會形成Finetune時的不穩定(insstability)。
論文做者作實驗發現,在小樣本Finetune時,將BERT_Adam換成Adam確實會有更好的效果。筆者用本身的2000左右的數據集,作分類任務,確實也復現到了一樣的現象。至此,咱們發現了BERT在預訓練時一個不小的坑,在小樣本Finetune時,須要換回標準Adam優化器,由於小樣本須要對一階動量和二階動量作bias-correction。
筆者看了下tensorflow和keras的Adam優化器實現,確實是BERT_Adam的實現:
因此,坑咱們已經找到了,後續你們在bert Finetune時,最好可以本身重寫一下Adam優化器,將其規範爲標準的Adam優化器,或者直接用一些標準的開源庫。
總結
基於BERT的預訓練權重進行Finetune,是NLP領域目前最流行和高效的手段。本文介紹了預訓練過程當中會出現的一個大坑,即大部分開源的Adam優化器都是非標準的,並介紹瞭解決的方案。
下期預告:ACL論文領讀系列
知識星球推薦
掃描上面的二維碼,就能夠加入咱們的星球,助你成長爲一名合格的天然語言處理算法工程師。
知識星球主要有如下內容:
(1) 聊天機器人。
(2) 知識圖譜。
(3) NLP預訓練模型。
轉載文章請後臺聯繫
侵權必究
往期精選