ELECTRA模型精讲
還記得去年寫下《ELECTRA: 超越BERT, 19年最佳NLP預訓練模型》時興奮的心情,在我等到都快復工的時候,終于看到了它的身影和源碼[1]:
才第五嗎?沒事,期望越大,失望越大
谷歌在github放出的預訓練模型效果是這樣的:
燃!鵝!在論文中聲稱的效果卻是這樣的
Github repo中官方的解釋是精調的震蕩比較大,他們測試了很多隨機種子后取了中位數。
那么問題來了,為什么論文中沒有取中位數呢(* ̄m ̄)?
雖然ELECTRA的思想仍是很驚艷的,但這樣的結果不免讓我們對原論文的數據產生質疑。
?
不過,有了word2vec和transformer的大家都懂的前車之鑒,我們這一次也理解為瑕不掩瑜了(* ̄m ̄)
回顧目前單模型的進展(只參考原論文數據):
如果按照github中給出的85.2,ELECTRA跟RoBERTa還是有很大差距的。那今天我們就來分析一下ELECTRA的優點和缺陷,如果對文中的觀點有質疑,請在評論區一起討論~
PS:不了解這個模型的同學可以先看第二章ELECTRA簡介~
后臺回復【electra】獲取論文PDF噢~~
ELECTRA優缺點
通過自己的思考和知乎大佬們的提點[2],ELECTRA主要有如下優點:
-
任務難度的提升(知乎@香儂科技)
原始的MLM任務是隨機進行mask,樣本預測難度是不一樣的,比如“夕小瑤的賣[MASK]屋”和“夕[MASK]瑤的賣萌屋”中,賣萌是比較常見的詞語,而夕小瑤則是命名實體,沒見過的話更難預測出來。生成器相當于對輸入進行了篩選,使判別器的任務更難,從而學習到更好的表示
-
效率的提升(知乎@徐嘯)
運算上,判別器進行2分類而不是V分類,復雜度降低。參數利用上,判別器不需要對完整的數據分布進行建模,作者在實驗中也發現越小的模型提升越明顯,可見參數被更完整地訓練了
-
Token自身信息的利用(知乎@Towser)
做MLM的任務時,都是mask掉token自身,利用上下文對自己進行預測。而ELECTRA是同時利用自身和上下文預測,和NLU任務的Finetune階段也比較一致
-
收斂速度
從論文中的分析實驗來看:
(1)ELECTRA 15%:讓判別器只計算15% token上的損失
(2)Replace MLM:兩個生成器。一個生成器替換被mask的token,另一個生成器用替換后的輸入繼續進行15%的MLM訓練。這樣可以消除這種pretrain-finetune之間的diff
(3)All-Tokens MLM:同Replace MLM,只不過BERT的目標函數變為預測所有的token,為了防止信息泄露加入了copy機制,以D的概率直接拷貝輸入,以1-D的概率預測新token,相當于ELECTRA和BERT的結合
可以發現,對效果提升最重要的其實是all-tokens的loss計算,這種方式相比只計算15%的token,大大增加了模型收斂速度。
雖然ELECTRA有很多優點,但個人認為它還有以下缺陷:
-
顯存占用增多
之前都是訓一個BERT,現在相當于兩個,即使共享參數去訓練,由于Adam等優化器的關系,需要保存的中間結果數量也是翻倍的。
-
多任務學習超參數調整
ELECTRA的loss由生成器和判別器分別構成,原文中給判別器loss的權重是50,因為二分類的loss會比V分類低很多。但這個數值太過絕對,最好是變成可學習的參數動態調整。
ELECTRA簡介
模型結構
ELECTRA的全稱是Efficiently Learning an Encoder that Classifies Token Replacements Accurately,以1/4的算力就達到了RoBERTa的效果。模型結構如下:
Generator和Discriminator可以看作兩個BERT,生成器的任務是MLM,判別器的任務是Replaced Token Detection,判斷哪個字被替換過。
但上述結構有個問題,輸入句子經過生成器,輸出改寫過的句子,因為句子的字詞是離散的,所以梯度在這里就斷了,判別器的梯度無法傳給生成器,于是生成器的訓練目標還是MLM(作者在后文也驗證了這種方法更好),判別器的目標是序列標注(判斷每個token是真是假),兩者同時訓練,但判別器的梯度不會傳給生成器,目標函數如下:
因為判別器的任務相對來說容易些,RTD loss相對MLM loss會很小,因此加上一個系數,作者訓練時使用了50。
另外要注意的一點是,在優化判別器時計算了所有token上的loss,而以往計算BERT的MLM loss時會忽略沒被mask的token。作者在后來的實驗中也驗證了在所有token上進行loss計算會提升效率和效果。
事實上,ELECTRA使用的Generator-Discriminator架構與GAN還是有不少差別,作者列出了如下幾點:
實驗及結論
創新總是不易的,有了上述思想之后,可以看到作者進行了大量的實驗,來驗證模型結構、參數、訓練方式的效果。
-
Weight Sharing
生成器和判別器的權重共享是否可以提升效果呢?作者設置了相同大小的生成器和判別器,在不共享權重下的效果是83.6,只共享token embedding層的效果是84.3,共享所有權重的效果是84.4。作者認為生成器對embedding有更好的學習能力,因為在計算MLM時,softmax是建立在所有vocab上的,之后反向傳播時會更新所有embedding,而判別器只會更新輸入的token embedding。最后作者只使用了embedding sharing。
-
Smaller Generators
從權重共享的實驗中看到,生成器和判別器只需要共享embedding的權重就足矣了,那這樣的話是否可以縮小生成器的尺寸進行訓練效率提升呢?作者在保持原有hidden size的設置下減少了層數,得到了下圖所示的關系圖:
可以看到,生成器的大小在判別器的1/4到1/2之間效果是最好的。作者認為原因是過強的生成器會增大判別器的難度(判別器:小一點吧,我太難了)。
-
Training Algorithms
實際上除了MLM loss,作者也嘗試了另外兩種訓練策略:
(1) Adversarial Contrastive Estimation:ELECTRA因為上述一些問題無法使用GAN,但也可以以一種對抗學習的思想來訓練。作者將生成器的目標函數由最小化MLM loss換成了最大化判別器在被替換token上的RTD loss。但還有一個問題,就是新的生成器loss無法用梯度下降更新生成器,于是作者用強化學習Policy Gradient的思想,將被替換token的交叉熵作為生成器的reward,然后進行梯度下降。強化方法優化下來生成器在MLM任務上可以達到54%的準確率,而之前MLE優化下可以達到65%。
(2) Two-stage training:即先訓練生成器,然后freeze掉,用生成器的權重初始化判別器,再接著訓練相同步數的判別器。
對比三種訓練策略,得到下圖:
可見“隔離式”的訓練策略效果還是最好的,而兩段式的訓練雖然弱一些,作者猜測是生成器太強了導致判別任務難度增大,但最終效果也比BERT本身要強,進一步證明了判別式預訓練的效果。
-
Small model? Big model?
模型的效果可以參考文首的圖片,ELECTRA-Small僅用14M參數量,以前13%的體積,就接近了BERT-Base的效果。ELECTRA-Base更是超越了BERT-Large。由于時間和精力問題,作者們沒有把ELECTRA訓練更久(應該會有提升),也沒有使用各種榜單Trick,所以真正的GLUE test上表現一般。
后臺回復【electra】獲取論文PDF噢~~
?
總結
以上是生活随笔為你收集整理的ELECTRA模型精讲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: All in Linux:一个算法工程师
- 下一篇: 面试必备!卖萌屋算法工程师思维导图—统计