BERT推出這一年來,除了XLNet,其餘的改進都沒帶來太多驚喜,無非是越堆越大的模型和數據,以及動輒1024塊TPU,讓工程師們不知道如何落地。今天要介紹的ELECTRA是我在ICLR盲審中淘到的寶貝(9月25日已截稿),也是BERT推出以來我見過最讚的改進,經過相似GAN的結構和新的預訓練任務,在更少的參數量和數據下,不只吊打BERT,並且僅用1/4的算力就達到了當時SOTA模型RoBERTa的效果。
ELECTRA的全稱是Efficiently Learning an Encoder that Classifies Token Replacements Accurately,先來直觀感覺一下ELECTRA的效果:架構
右邊的圖是左邊的放大版,縱軸是GLUE分數,橫軸是FLOPs (floating point operations),Tensorflow中提供的浮點數計算量統計。從上圖能夠看到,同等量級的ELECTRA是一直碾壓BERT的,並且在訓練更長的步數以後,達到了當時的SOTA模型——RoBERTa的效果。從左圖曲線上也能夠看到,ELECTRA效果還有繼續上升的空間。框架
NLP式的Generator-Discriminatoride
ELECTRA最主要的貢獻是提出了新的預訓練任務和框架,把生成式的Masked language model(MLM)預訓練任務改爲了判別式的Replaced token detection(RTD)任務,判斷當前token是否被語言模型替換過。那麼問題來了,我隨機替換一些輸入中的字詞,再讓BERT去預測是否替換過能夠嗎?能夠的,由於我就這麼作過,但效果並很差,由於隨機替換太簡單了。svg
那怎樣使任務複雜化呢?。。。咦,我們不是有預訓練一個MLM模型嗎?函數
因而做者就乾脆使用一個MLM的G-BERT來對輸入句子進行更改,而後丟給D-BERT去判斷哪一個字被改過,以下:學習
因而,咱們NLPer終於成功地把CV的GAN拿過來了!優化
Replaced Token Detection編碼
但上述結構有個問題,輸入句子通過生成器,輸出改寫過的句子,由於句子的字詞是離散的,因此梯度在這裏就斷了,判別器的梯度沒法傳給生成器,因而生成器的訓練目標仍是MLM(做者在後文也驗證了這種方法更好),判別器的目標是序列標註(判斷每一個token是真是假),二者同時訓練,但判別器的梯度不會傳給生成器,目標函數以下:idea
由於判別器的任務相對來講容易些,RTD loss相對MLM loss會很小,所以加上一個係數,做者訓練時使用了50。.net
另外要注意的一點是,在優化判別器時計算了全部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,做者也嘗試了另外兩種訓練策略:
對比三種訓練策略,獲得下圖:
可見「隔離式」的訓練策略效果仍是最好的,而兩段式的訓練雖然弱一些,做者猜想是生成器太強了致使判別任務難度增大,但最終效果也比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體積越小,相比於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
hi all!最近終於有了本身的公衆號,叫NLPCAB,原本想叫LAB,但以爲和一我的能撐起實驗室我就上天了,因此取了諧音CAB,有些可愛而且意味深長?以後會努力和小夥伴們發乾貨,也但願各位同窗投稿學習筆記~