論文地址:
https://openreview.net/forum?id=r1xMH1BtvB
感謝徐嘯以及SmileTM同學的補充,這是斯坦福SAIL實驗室Manning組的工作,10.31的智源大會上有簡單介紹。右邊的圖是左邊的放大版,縱軸是GLUE分數,橫軸是FLOPs (floating point operations),Tensorflow中提供的浮點數計算量統計。從上圖可以看到,同等量級的ELECTRA是一直碾壓BERT的,而且在訓練更長的步數之後,達到了當時的SOTA模型——RoBERTa的效果。從左圖曲線上也可以看到,ELECTRA效果還有繼續上升的空間。
NLP式的Generator-DiscriminatorELECTRA最主要的貢獻是提出了新的預訓練任務和框架,把生成式的Masked language model(MLM)預訓練任務改成了判別式的Replaced token detection(RTD)任務,判斷當前token是否被語言模型替換過。那麼問題來了,我隨機替換一些輸入中的字詞,再讓BERT去預測是否替換過可以嗎?可以的,因為我就這麼做過,但效果並不好,因為隨機替換太簡單了。那怎樣使任務複雜化呢?。。。咦,咱們不是有預訓練一個MLM模型嗎?
於是作者就乾脆使用一個MLM的G-BERT來對輸入句子進行更改,然後丟給D-BERT去判斷哪個字被改過,如下:
於是,我們NLPer終於成功地把CV的GAN拿過來了!
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,作者也嘗試了另外兩種訓練策略:
Adversarial Contrastive Estimation:ELECTRA因為上述一些問題無法使用GAN,但也可以以一種對抗學習的思想來訓練。作者將生成器的目標函數由最小化MLM loss換成了最大化判別器在被替換token上的RTD loss。但還有一個問題,就是新的生成器loss無法用梯度下降更新生成器,於是作者用強化學習Policy Gradient的思想,將被替換token的交叉熵作為生成器的reward,然後進行梯度下降。強化方法優化下來生成器在MLM任務上可以達到54%的準確率,而之前MLE優化下可以達到65%。
Two-stage training:即先訓練生成器,然後freeze掉,用生成器的權重初始化判別器,再接著訓練相同步數的判別器。
對比三種訓練策略,得到下圖:
可見「隔離式」的訓練策略效果還是最好的,而兩段式的訓練雖然弱一些,作者猜測是生成器太強了導致判別任務難度增大,但最終效果也比BERT本身要強,進一步證明了判別式預訓練的效果。
Small model? Big model?
這兩節真是吊打之前的模型,作者重申了他的主要目的是提升預訓練效率,於是做了GPU單卡就可以愉快訓練的ELECTRA-Small和BERT-Small,接著和尺寸不變的ELMo、GPT等進行對比,結果如下:
數據簡直優秀,僅用14M參數量,以前13%的體積,在提升了訓練速度的同時還提升了效果,這裡我瘋狂點讚。
小ELECTRA的本事我們見過了,那大ELECTRA行嗎?直接上圖:
上面是各個模型在GLUE dev/text上的表現,可以看到ELECTRA僅用了1/4的計算量就達到了RoBERTa的效果。而且作者使用的是XLNet的語料,大約是126G,但RoBERTa用了160G。由於時間和精力問題,作者們沒有把ELECTRA訓練更久(應該會有提升),也沒有使用各種榜單Trick,所以真正的GLUE test上表現一般(現在的T5是89.7,RoBERTa是88.5,沒看到ELECTRA)。
Efficiency Analysis
前文中提到了,BERT的loss只計算被替換的15%個token,而ELECTRA是全部都計算的,所以作者又做了幾個實驗,探究哪種方式更好一些:
ELECTRA 15%:讓判別器只計算15% token上的損失
Replace MLM:訓練BERT MLM,輸入不用[MASK]進行替換,而是其他生成器。這樣可以消除這種pretrain-finetune直接的diff。
All-Tokens MLM:接著用Replace MLM,只不過BERT的目標函數變為預測所有的token,比較接近ELECTRA。
三種實驗結果如下:
可以看到:
對比ELECTRA和ELECTRA 15%:在所有token上計算loss確實能提升效果
對比Replace MLM和BERT:[MASK]標誌確實會對BERT產生影響,而且BERT目前還有一個trick,就是被替換的10%情況下使用原token或其他token,如果沒有這個trick估計效果會差一些。
對比All-Tokens MLM和BERT:如果BERT預測所有token 的話,效果會接近ELECTRA
另外,作者還發現,ELECTRA體積越小,相比於BERT就提升的越明顯,說明fully trained的ELECTRA效果會更好。另外作者推斷,由於ELECTRA是判別式任務,不用對整個數據分布建模,所以更parameter-efficient。
無意中發現了這篇還在ICLR盲審的ELECTRA,讀完摘要就覺得發現了新大陸,主要是自己也試過Replaced Token Detection這個任務,因為平時任務效果的分析和不久前看的一篇文章,讓我深刻感受到了BERT雖然對上下文有很強的編碼能力,卻缺乏細粒度語義的表示,我用一張圖表示大家就明白了:
這是把token編碼降維後的效果,可以看到sky和sea明明是天與海的區別,卻因為上下文一樣而得到了極為相似的編碼。細粒度表示能力的缺失會對真實任務造成很大影響,如果被針對性攻擊的話更是無力,所以當時就想辦法加上更細粒度的任務讓BERT去區分每個token,不過同句內隨機替換的效果並不好,弱雞的我也沒有再往前想一步,不然就也ICLR了。相信這個任務很多人都想到過,不過都沒有探索這麼深入,這也告誡我們,idea遍地都是,往下挖才能有SOTA。
ELECTRA是BERT推出這一年來我見過最贊的idea,它不僅提出了能打敗MLM的預訓練任務,更推出了一種十分適用於NLP的類GAN框架。畢竟GAN太牛逼了,看到deepfake的時候我就想,什麼時候我們也能deepcheat,但聽說GAN在NLP上的效果一直不太好(只懂皮毛,要學起來了,輕拍),這次ELECTRA雖然只用了判別器,但個人認為也在一定程度上打開了潘多拉魔盒。
另外,整篇文章都乾貨滿滿,不再像之前的BERT+模型一樣可以用「more data+params+steps+GPU+MONEY」簡單概括。推薦大家去通讀正文+附錄,裡面還有一些失敗嘗試我沒有講。
如果ELECTRA去直播,我一定給它刷一輛遊艇。
參考資料ELECTRA: PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS