1. 程式人生 > 其它 >Bert不完全手冊5. 推理提速?訓練提速!記憶體壓縮!Albert

Bert不完全手冊5. 推理提速?訓練提速!記憶體壓縮!Albert

Albert是A Lite Bert的縮寫,確實Albert通過詞向量矩陣分解,以及transformer block的引數共享,大大降低了Bert的引數量級。在我讀Albert論文之前,因為Albert和蒸餾,剪枝一起被歸在模型壓縮方案,導致我一直以為Albert也是為了優化Bert的推理速度,但其實Albert更多用在模型引數(記憶體)壓縮,以及訓練速度優化,在推理速度上並沒有提升。如果說蒸餾任務是把Bert變矮瘦,那Albert就是把Bert變得矮胖。最近寫的文字分類庫里加入了Albert預訓練模型,有在chinanews上已經微調好可以開箱即用的模型,感興趣戳這裡SimpleClassification

Albert主要有以下三點創新

  • 引數共享:降低Transfromer Block的整體引數量級
  • 詞向量分解:有效降低詞向量層引數量級
  • Sentence-Order-Prediction任務:比NSP更加有效的學習句間關係

下面我們分別介紹這三個部分

詞向量分解

其實與其說是分解,個人覺得詞向量重對映的叫法更合適一些。在之前BERT等預訓練模型中,詞向量的維度E和之後隱藏層的維度H是相同的,因為在Self-Attention的過程中Embedding維度是一直保持不變的,所以要增加隱藏層維度,詞向量維度也需要變大。但是從包含的資訊量來看,詞向量本身只包含上下文無關的資訊,並不需要像隱藏層一樣儲存大量的上下文語義,所以相同維度的限制在詞向量部分存在一定的引數冗餘。所以作者對詞向量做了一層對映,詞向量本身的引數變成Vocab * E,對映層是E* H,這樣本身的複雜度O(Vocab * H),就降低成了O(Vocab * E + E*H ),相當於把隱藏層大小和詞向量部分的引數做了解耦。

這個Trick其實之前在之前的NER系列中出現過多次,比如用在詞表增強時,不同詞表Embeeding維度的對齊,以及針對維度太高/太低的詞表輸入,進行適當的降維/升維等等~

以下作者分別對比了在引數共享/不共享的情況下,詞向量維度E對模型效果的影響,從768壓縮到64,非共享引數下有1個點的下降,共享引數時影響較小。這個在下面引數共享處會再提到,和模型整體能處理的資訊量級有一定關係,整體上在共享引數的設定下詞向量壓縮影響有限~

引數共享

引數共享是ALbert提高參數利用率的核心。作者對比了各個block只共享Attention,只共享FFN,和共享所有引數,結果如下~

共享引數多少都會影響模型表現,其中效果損失主要來自共享FFN引數。以及在壓縮詞向量之後,共享引數帶來的影響會降低。這裡感覺和之前在做詞表增強時觀察到的現象有些相似,也就是模型的天花板受到輸入層整體資訊量的影響,因為壓縮了詞向量維度,限制了輸入側的資訊量,模型需要處理的資訊降低,從而引數共享帶來的損失影響也被降低了

最終作者的選擇更多是for最大程度壓縮引數量級,share attenion縮減的引數有限,索性就共享了全部的引數。

SOP

在第三章講到Roberta的時候,提到過Roberta在優化Bert的訓練策略時,提出NSP任務沒啥用在預訓練中只使用了MLM目標。當時就提到NSP沒有用一定程度上是它構造負樣本的方式過於easy,NSP中連續上下文為正樣本,從任意其他文件中取樣的句子為負樣本,所以模型可以簡單通過topic資訊來判斷,而這部分資訊基本已經被MLM任務學到。Albert改良了NSP中的負樣本生成方式,AB為正樣本,BA為負樣本,模型需要判別論述的邏輯順序和前後句子的合理語序。

作者也進行了對比,在預訓練任務上,加入NSP訓練的模型在SOP目標上和只使用MLM沒啥區別,這裡進一步證明了NSP並沒有學到預期中的句子關聯和邏輯順序,而加入SOP訓練的模型在NSP上表現要超過只使用MLM。在下游依賴上下文推理的幾個任務上,加入SOP的模型整體表現略好。不過差異沒有想象中的明顯,感覺在如何構建負樣本上應該還有優化的空間。個人感覺只是AB,BA的構造方式可能有些過於區域性了

整體效果

Albert在以上三點改良之外,在訓練中也進行了一些優化,例如使用了SpanBert的MASK策略,用了LAMB optimizer來加速訓練等等,Albert總共放出了以下幾種引數的模型,和BERT之間的效果對比如下~

需要注意最後一列是訓練速度的對比哈,哈哈之前看paper沒帶腦子,想都沒想就給當成了推理速度,琢磨半天也沒明白這為啥就快了???

  1. 直接base和base比,large和large比:引數可以壓縮到1/10,適合大家自己跑來玩玩,整體模型大小甚至比一些詞表大的詞向量模型還要小,訓練速度上也有提升但是模型效果都有2個點以上的損失,以及因為層數沒變,所以推理速度不會更快,以及因為詞向量分解的原因多了一層,所以還會略慢些
  2. 相似表現對比:ALbert xlarge和Bertlarge對比,都是24層,xlarge的隱藏層是bert的兩倍,這裡也是為啥說albert是矮胖,因為引數共享所以加層數效果有限,只能增加隱藏層維度。雖然albert xlarge引數壓縮到1/5,但是訓練更慢,推理也更慢
  3. 超越Bert:Albert xxlarge雖然只有12層,但是4倍的隱藏層還是讓它的表現全面超越了Bert large,引數壓縮到2/3,但是訓練速度更更慢,以及超大隱藏層會導致計算中中間變數的儲存過大,一般機子跑不動。。。

所以整體感覺albert的實際應用價值比較有限的,但是提出的兩個點還有進一步深挖的價值,其一NSP任務負樣本是否有進一步改造的空間,其二如何更有效地利用Bert的引數?


Reference

  1. ALBERT: A Lite BERT for Self-supervised Learning of Language Representations
  2. https://zhuanlan.zhihu.com/p/84273154
  3. https://zhuanlan.zhihu.com/p/343729067