[深度學習] 自然語言處理 --- ALBERT 介紹

一、簡介

隨着Transfomer結構的普及,一時間大語料、大參數量的預訓練模型成爲主流。當在實際部署BERT等模型時,往往需要使用蒸餾、壓縮或其他優化技術對模型進行處理。

ALBERT模型來自論文 Google 最近公佈的論文 《ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》從名字就可以看出 ALBERT 是 BERT 的“改進版”,其進步的地方,一言以蔽之,就是 用更少的參數,取得了更好的效果

github: https://github.com/google-research/ALBERT

ALBERT模型也是基於這一點考慮,通過各種手段減少參數量,得到一個佔用較小的模型,對實際落地有較大的意義,不過由於其主要還是減少參數量,所以在推斷時間上並沒有優化,所有對量大的需求還是很有問題的。
 

總體來說,ALBERT有意義的創新主要有:

  1. 修正了句子預測這一一直被詬病的預訓練任務,改爲了預測句子之間的連貫性;

  2. 對Embedding進行因式分解;

  3. 跨層的參數共享。

模型大小與模型性能之間的關係

  這是作者開篇討論的問題。近一兩年,預訓練語言模型給自然語言處理領域帶來了巨大的突破。從 ELMO,GPT,到 Bert,XLNet 和 RoBerta,我們不難看出,性能越強的模型,參數量也越大。既然模型的參數量如此重要,我們就會有一個很直接的假設:參數量越大,模型的性能就會越高。

  先不考慮硬件資源和訓練時間(還是要考慮,如此大的開銷已經將很多參與者擠出門外了),如果上述假設成立,那麼我們只需要想方設法地擴展模型規模就可以了。作者爲驗證假設,將 Bert-large 模型的隱藏層 size 擴展了一倍,構建了 Bert-xlarge模型。該模型的參數量較 Bert-large 提升了一倍,然而遺憾的是,如圖1所示,Bert-xlarge 出現了模型退化(model degradation)現象,性能不升反降。因此,簡單地推高參數量,不僅會面臨更加嚴峻的硬件資源不足以及訓練時間過長問題,且無法獲得更好的效果的。

 

                                                          Bert-large 與 Bert-xlarge 對比圖

  其實這也比較好理解,參數量越大性能越好,我認爲這本身是沒有正確的,但前提是對模型中參數的運用沒有退化,或者說模型內單位參數所發揮的作用沒有退化。舉個例子,鯨魚大腦的絕對體積和重量都要超過人類,但其大腦很大一部分精力用在控制其“臃腫”的體積上,而不是用來思考和記憶,因此遠不如人類聰明。
  因此爲了提升模型性能,我們既可以“做加法”,在模型結構合理有效的前提下,增大模型的規模(e.g. Bert --> Bert-large, Bert --> XLNet);也可以“做減法”,降低參數量,但提升參數的利用效率、更大地發揮參數的效果。本篇論文中所設計的 ALBERT,就是在“做減法”的基礎上,在性能上全面超越 Bert。

三  ALBERT的改進

1. SOP任務

BERT在提出的時候提供了兩種預訓練任務,一個是遮蔽語言模型,即以一定比例隨機遮蔽一定比例的輸入標記,然後預測那些被遮蔽的標記的預訓練任務(PS:ALBERT也不是直接做這個任務,而是換成N-gram的預測任務),另一個則是預測第二個句子是不是第一個句子的下一句。但在隨後的實踐中,第二個任務被證明並沒有給模型帶來受益,主要由於這個任務過於簡單。於是,在ALBERT中這個任務被換成了預測句子間的順序,增加模型學會這種任務的能力:

從實驗上看,有所提升,但個人感覺這個預訓練任務還是有待改進。

2. Embedding因式分解

這一步操作其實就是沒啥特別好說的,無外乎就是覺得詞嵌入時的向量維度應該小一點,然後通過個網絡擴充一下提升維度,這樣一通操作就可以把參數量從 O(V x H)   降到了   O(V x E  + E x H)

(有點像深度可分離卷積的做法):

 

論文實驗結果

從實驗上看,使用這種方法降低了詞向量維度,但沒有損失太多的精度(相對來說吧),使用權值共享的策略時增加詞向量不升反降(感覺有點神奇)。

3. 跨層的參數共享

共享權值不是什麼新鮮的事情,之前一般採用只共享全連接層或只共享attention層,ALBERT則更直接全部共享,不過從實驗結果看,全部共享的代價是可以接受的,同時共享權值帶來了一定的訓練難度,使得模型更魯棒:

ALBERT 在參數量上要遠遠小於 Bert。譬如,ALBERT-large 的參數量僅有 18M,僅爲 Bert-large 的 1/18;將 Bert 的隱藏層擴展到 2048 維,參數量會飆升到 1.27G 且性能下降,而 H = 2048 的 ALBERT-xlarge 模型只有 59M 的參數,更大的模型 ALBERT-xxlarge(H=4096)參數量也僅有 233M。另外作者在 ALBERT-xxlarge 中設定了 12 層的網絡,之所以不設置爲 24 層,是因爲通過實驗作者驗證了二者在性能上相近,而後者的計算成本更高。

4. dropout的移除

在ALBERT的實驗中作者提到對掩碼任務和下游任務取消dropout都帶來了提升,這一點無疑非常值得去思考:

掩碼任務

下游任務

同時,作者也提到100w步之後,ALBERT依舊沒有過擬合的跡象。

 

四、ALBERT的實驗結果

最後作者又總結了一遍論文中提出的模型——ALBERT-xxlarge 的強大性能(使用了 Bert、XLNet 和 RoBERTa 的訓練數據):在 13 項 NLP 任務上都取得了最佳,包括 GLUE 上的 9 個任務 和 SQuAD、RACE等 4 個數據集。

 

簡單一句話來說,就是小但強。僅從ALBERT本身來說其實是蠻讓人失望的,因爲並沒有帶來很多有營養的創新,同時由於其的小更多是共享權值帶來的,這也就導致它並沒有減少推斷時的時間。但另一方面來說,ALBERT減少了佔用,本身就給大規模部署帶來優勢,如果再結合上蒸餾等技術,佔用小、速度快、精度高的Bert彷彿就在眼前。

最近,谷歌開源了中文版本和Version 2

ALBERT 2性能再次提升

在這個版本中,“no dropout”“additional training data”“long training time”策略將應用到所有的模型。

與初代ALBERT性能相比結果如下:

從性能的比較來說,對於ALBERT-base、ALBERT-large和ALBERT-xlarge,v2版要比v1版好得多。

說明採用上述三個策略的重要性。

平均來看,ALBERT-xxlarge比v1略差一些,原因有以下2點:

額外訓練了1.5M步(兩個模型的唯一區別就是訓練1.5M和3M步)

對於v1,在BERT、Roberta和XLnet給出的參數集中做了一點超參數搜索;對於v2,只是採用除RACE之外的V1參數,其中使用的學習率爲1e-5和0 ALBERT DR。

 

參考

  1. 「NLP」ALBERT:更輕更快的NLP預訓練模型
  2. 一文揭開ALBERT的神祕面紗
  3. albert_pytorch
  4. ALBERT 論文:ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章