別再蒸餾3層BERT了!變矮又能變瘦的DynaBERT了解一下

2021-01-16 AI 科技評論

作者 | rumor醬

編輯 | 叢 末

神經網絡模型除了部署在遠程伺服器之外,也會部署在手機、音響等智能硬體上。比如在自動駕駛的場景下,大部分模型都得放在車上的終端裡,不然荒山野嶺沒有網的時候就尷尬了。對於BERT這類大模型來說,也有部署在終端的需求,但考慮到設備的運算速度和內存大小,是沒法部署完整版的,必須對模型進行瘦身壓縮。

說到模型壓縮,常用的方法有以下幾種:

量化:用FP16或者INT8代替模型參數,一是佔用了更少內存,二是接近成倍地提升了計算速度。目前FP16已經很常用了,INT8由於涉及到更多的精度損失還沒普及。低軼近似/權重共享:低軼近似是用兩個更小的矩陣相乘代替一個大矩陣,權重共享是12層transformer共享相同參數。這兩種方法都在ALBERT中應用了,對速度基本沒有提升,主要是減少了內存佔用。但通過ALBRET方式預訓練出來的Transformer理論上比BERT中的層更通用,可以直接拿來初始化淺層transformer模型,相當於提升了速度。剪枝:通過去掉模型的一部分減少運算。最細粒度為權重剪枝,即將某個連接權重置為0,得到稀疏矩陣;其次為神經元剪枝,去掉矩陣中的一個vector;模型層面則為結構性剪枝,可以是去掉attention、FFN或整個層,典型的工作是LayerDrop[1]。這兩種方法都是同時對速度和內存進行優化。蒸餾:訓練時讓小模型學習大模型的泛化能力,預測時只是用小模型。比較有名的工作是DistillBERT[2]和TinyBERT[3]。實際工作中,減少BERT層數+蒸餾是一種常見且有效的提速做法。但由於不同任務對速度的要求不一樣,可能任務A可以用6層的BERT,任務B就只能用3層的,因此每次都要花費不少時間對小模型進行調參蒸餾。

有沒有辦法一次獲得多個尺寸的小模型呢?

今天就給大家介紹一篇論文《DynaBERT: Dynamic BERT with Adaptive Width and Depth》[4]。論文中作者提出了新的訓練算法,同時對不同尺寸的子網絡進行訓練,通過該方法訓練後可以在推理階段直接對模型裁剪。依靠新的訓練算法,本文在效果上超越了眾多壓縮模型,比如DistillBERT、TinyBERT以及LayerDrop後的模型。

論文地址:https://arxiv.org/abs/2004.04037

1

原理

論文對於BERT的壓縮流程是這樣的:

訓練時,對寬度和深度進行裁剪,訓練不同的子網絡推理時,根據速度需要直接裁剪,用裁剪後的子網絡進行預測想法其實很簡單,但如何能保證更好的效果呢?這就要看煉丹功力了 (.._..),請聽我下面道來~

整體的訓練分為兩個階段,先進行寬度自適應訓練,再進行寬度+深度自適應訓練。

1、寬度自適應 Adaptive Width

寬度自適應的訓練流程是:

1)得到適合裁剪的teacher模型,並用它初始化student模型

2)裁剪得到不同尺寸的子網絡作為student模型,對teacher進行蒸餾

最重要的就是如何得到適合裁剪的teacher。先說一下寬度的定義和剪枝方法。Transformer中主要有Multi-head Self-attention(MHA)和Feed Forward Network(FFN)兩個模塊,為了簡化,作者用注意力頭的個數和intermediate層神經元的個數來定義MHA和FFN的寬度,並使用同一個縮放係數來剪枝,剪枝後注意力頭減小到個,intermediate層神經元減少到個。

在MHA中,我們認為不同的head抽取到了不同的特徵,因此每個head的作用和權重肯定也是不同的,intermediate中的神經元連接也是。如果直接按照粗暴裁剪的話,大概率會丟失重要的信息,因此作者想到了一種方法,對head和神經元進行排序,每次剪枝掉不重要的部分,並稱這種方法為Netword Rewiring。

對於重要程度的計算參考了論文[5],核心思想是計算去掉head之前和之後的loss變化,變化越大則越重要。

利用Rewiring機制,便可以對注意力頭和神經元進行排序,得到第一步的teacher模型,如圖:

要注意的是,雖然隨著參數更新,注意力頭和神經元的權重會變化,但teacher模型只初始化一次(在後文有驗證增加頻率並沒帶來太大提升)。之後,每個batch會訓練四種student模型,如圖:

蒸餾的最終loss來源於三方面:logits、embedding和每層的hidden state。

2、深度自適應 Adaptive Depth

訓好了width-adaptive的模型之後,就可以訓自適應深度的了。淺層BERT模型的優化其實比較成熟了,主要的技巧就是蒸餾。作者直接使用訓好的作為teacher,蒸餾裁剪深度後的小版本BERT。

對於深度,係數,設層的深度為[1,12],作者根據去掉深度為d的層。之所以取是因為研究表明最後一層比較重要[6]。

最後,為了避免災難性遺忘,作者繼續對寬度進行剪枝訓練,第二階段的訓練方式如圖:

2

實驗

根據訓練時寬度和深度的裁剪係數,作者最終可得到12個大小不同的BERT模型,在GLUE上的效果如下:

可以看到,剪枝的BERT效果並沒有太多下降,並且在9個任務中都超越了BERT-base。同時,這種靈活的訓練方式也給BERT本身的效果帶來了提升,在與BERT和RoBERTa的對比中都更勝一籌:

另外,作者還和DistillBERT、TinyBERT、LayerDrop進行了實驗對比,DynaBERT均獲得了更好的效果。

在消融實驗中,作者發現在加了rewiring機制後準確率平均提升了2個點之多:

3

結論

本篇論文的創新點主要在於Adaptive width的訓練方式,考慮到後續的裁剪,作者對head和neuron進行了排序,並利用蒸餾讓子網絡學習大網絡的知識。

總體來說還是有些點可以挖的,比如作者為什麼選擇先對寬度進行自適應,再寬度+深度自適應?這樣的好處可能是在第二階段的蒸餾中學習到寬度自適應過的子網絡知識。但直接進行同時訓練不可以嗎?還是希望作者再驗證一下不同順序的差距。

為了簡化,作者在寬度上所做的壓縮比較簡單,之後可以繼續嘗試壓縮hidden dim。另外,ALBERT相比原始BERT其實更適合淺層Transformer,也可以作為之後的嘗試方向。

參考文獻:

[1]LayerDrop: https://arxiv.org/abs/1909.11556

[2]DistillBERT: https://arxiv.org/abs/1910.01108

[3]TinyBERT: https://arxiv.org/abs/1909.10351

[4]DynaBERT: https://www.researchgate.net/publication/340523407_DynaBERT_Dynamic_BERT_with_Adaptive_Width_and_Depth

[5]Analyzing multi-head self-attention: https://arxiv.org/abs/1905.09418

[6]Minilm: https://arxiv.org/abs/2002.10957

相關焦點

  • BERT 模型蒸餾 TinyBERT
    有不少利用模型蒸餾壓縮 BERT 的研究,例如將 BERT 蒸餾到 BiLSTM,還有 huggingface 的 DistilBERT 等,在之前的文章BERT 模型蒸餾 Distillation BERT有比較詳細的介紹,對模型蒸餾不熟悉的童鞋可以參考一下。
  • 一種多層對多層的BERT蒸餾方法
    但是這些模型體積愈發龐大,從 BERT-large 的 3.4 億參數到 Turing-NLP 參數規模的 170 億參數。單個樣本計算一次的開銷動輒上百毫秒,很難應用到實際生產中。BERT蒸餾技術應運而生,解決了模型大小和推理速度的問題,而且使用該技術的模型大小並沒有明顯的下降。
  • 谷歌最強NLP模型BERT,為何炫酷又強大?騰訊程式設計師給你從頭講起
    雖然知道了 bert能解決這個問題,我們更好奇的是"Ϊʲô":為什麼 bert 的表現能這麼好?這裡面有沒有可解釋的部分呢?因為 Multi-head-attention 是 bert 的主要組成部分,所以我們從"頭"入手,希望弄清楚各個 head 對 bert 模型有什麼作用。為了研究某個 head 對模型的影響,我們需要比較有這個 head 和沒有這個 head 模型的前後表現。
  • 小版BERT也能出奇蹟:最火的預訓練語言庫探索小巧之路
    想了解更多,可以查看這篇關於 BERT 量化的精彩博客:https://blog.rasa.com/compressing-bert-for-faster-prediction-2/。Hugging Face 的研究者決定把重點放在知識蒸餾(distillation)上。蒸餾即,將較大模型(教師模型)壓縮成較小模型(學生模型)的方法。
  • 剛剛,Google發布24個小型BERT模型,直接通過MLM損失進行預訓練
    「新智元急聘主筆、編輯、運營經理、客戶經理,添加HR微信(Dr-wly)了解詳情。」Google最新推出24個精簡的BERT模型供下載,趕在白色情人節之前為廣大NLP研究者送上一份厚禮。BERT勝在模型大,也敗在模型大!
  • 矮是一輩子的痛,再努力也沒用?這樣做30歲之前還能再長
    如果上天給你一次機會,會想變高還是變瘦?很多人都會選變高,因為胖只是暫時的,減肥可以減下來。但是矮是一輩子的痛,再努力也沒用。但實際上個頭矮還是有補救的方法的,那麼,小編今天要帶大家了解的就是健康又科學的長高方法了~~長高最重要的就是鍛鍊。
  • 用釀酒設備蒸餾有3大注意點?酒香不香全看蒸餾工序,出酒率還高
    2、操作方法①放黃水先放出發酵容器內的黃水,次日起糟蒸餾。②裝好甑桶,在甑算上撒一層熟稻殼。移去封窖泥,刮去面糟,待底鍋水燒開後即可上艦。要輕倒勻鋪,逐層探汽裝甑,防止踏汽吊尾。上滿後,刮至四周略高於中間,蓋上甑蓋,連接好冷卻器,準備接酒。③蒸餾時,要掌握好冷凝水溫度和火力,流酒溫度控制在30℃,截頭去尾,控制好酒度。吊淨酒尾。④蒸餾完畢,糟子出甑,留作下甑配糟用。
  • 內存用量1/20,速度加快80倍,QQ提全新BERT蒸餾框架,未來將開源
    據機器之心了解,從 2019 年 8 月份在騰訊內部開源至今,LTD-BERT 的效果已經在 QQ、騰訊新聞、騰訊遊戲、騰訊看點、騰訊健康等服務海量用戶的產品的實際任務中得到驗證,確保算法擁有足夠的泛化能力和實用性。此外,該團隊還表示 LTD-BERT 相關代碼和更多結果將在近期開源。
  • MobileBERT:一個在資源有限設備上使用的BERT模型
    作者:Viktor Karlsson編譯:ronghuaiyang導讀在蒸餾之後對學生模型再進行微調,進一步提升能力。這是通過最小化每一層和頭部的注意力分布(KL散度)之間的差異而實現的。預訓練蒸餾 —— 也可以在預訓練中使用蒸餾,通過組合Masked語言建模和下一個句子預測任務的線性組合。有了這些目標,我們就有了不止一種方法來進行知識的提煉。
  • 紹興變矮了
    紹興老城區正在變「矮」,去年1月1日,《紹興古城保護利用條例》實施,規定:對古城範圍內現存不符合城市天際線、傳統格局、歷史風貌要求的建(構)築物,應當根據古城保護相關規劃逐步依法實施降層、改造或者拆除措施。
  • BERT, RoBERTa, DistilBERT, XLNet的用法對比
    此外使用Transformer XL做基礎架構,即使在不統一排序訓練的情況下也能表現出良好的性能。XLNet使用了超過130 GB的文本數據和512 TPU晶片進行訓練,運行時間為2.5天,XLNet用於訓練的資料庫要比BERT大得多。
  • BERT代碼實現及解讀
    LayerNorm實際就是對隱含層做層歸一化,即對某一層的所有神經元的輸入進行歸一化(沿著通道channel方向),使得其加快訓練速度:PositionalEmbedding : adding positional information using sin, cos 3.
  • 速度×6,模型縮小20倍:華為&華科TinyBERT做搜索,性能達BERT90%
    現在,就有人用這個Transformer蒸餾方法,讓BERT搜索變快6倍,模型大小則只有原來的1/20。TinyBERT搜索首先,用微軟的MS Marco訓練三元組,在PyTorch中訓練一個基於BERT的教師網絡。
  • 新冠疫情醫療問答-基於對抗訓練的BERT多模型融合相似問匹配算法
    六、模型設計思路單模型選擇語句對相似性判斷, 屬於語句對分類(Sentence Pair Classification Task)範疇, 18年以來, BERT在很多自然語言處理的下遊任務中表現非常突出, 所以我們選擇BERT作為基礎模型結構,在pooler層後加了dropout全連接層和Sigmoid激活層。沒用Softmax層是為了能夠容易修改類別的閾值。
  • 怎麼讓自己臉變瘦
    女孩子如果有一張圓盤大臉看起來就會給人一種不夠清秀的感覺,可是現在臉型比較大看起來比較胖的女性朋友卻很多,這些臉胖的女孩子很想尋找一些有效的瘦臉方法讓自己的臉瘦下來,但是不知道那些方法效果最好,那麼今天就來帶大家了解一下怎麼讓自己臉變瘦?
  • 【NLP】從BERT到ALBERT
    下圖來源於BERT的論文裡,BERT同樣做了把網絡變寬和變深的實驗,發現網絡變寬和變深,精度會提升。我們能不能在大量減少參數的情況下,不減少或者稍微減少模型的精度呢?這就是ALBERT的主題。3.One-hot向量到第一次映射的參數非常多,可以把這塊參數變的非常小。
  • 小白,用bert進行字符類數據斷言,效果怎樣
    方法將類似說法進行統一化處理(維護成本高、如何評估類似說法存在一定風險)基於上述情況,本文使用文本相似度來評估基準數據與實際響應,相對直接使用equals、contains、正則表達等進行嚴格意義上的斷言,會使工具更具靈活性與魯棒性,同時也能夠降低檢測點的基準數據的維護成本環境構建首先,下載開源的預訓練模型:chinese_L-12_H-768_A-12.zip,具體連接百度一下即可
  • 知識蒸餾:如何用一個神經網絡訓練另一個神經網絡
    作者:Tivadar Danka編譯:ronghuaiyang導讀知識蒸餾的簡單介紹,讓大家了解知識蒸餾背後的直覺。什麼是知識蒸餾?讓我們想像一個非常複雜的任務,比如對數千個類進行圖像分類。通常,你不能指望ResNet50能達到99%的準確度。所以,你建立一個模型集合,平衡每個模型的缺陷。現在你有了一個巨大的模型,儘管它的性能非常出色,但無法將其部署到生產環境中,並在合理的時間內獲得預測。
  • 所有你要知道的 BERT 模型壓縮方法,都在這裡!
    權重因子分解既可以應用於輸入嵌入層(這節省了大量磁碟內存),也可以應用於前饋/自注意力層的參數(為了提高速度)。3、知識蒸餾——又名「Student Teacher」。一些方法還將BERT 蒸餾成如LSTMS 等其他各種推理速度更快的架構。另外還有一些其他方法不僅在輸出上,還在權重矩陣和隱藏的激活層上對 Teacher 知識進行更深入的挖掘。4、權重共享——模型中的一些權重與模型中的其他參數共享相同的值。
  • 為什麼人老了會變矮?骨科醫生:3個原因,望你儘早了解
    我們在小時候覺得家中較為年長的大人們,都十分的高大,但是隨著年齡的增長,卻發現這些長輩越來越矮,很多人覺得是自己長高了,所以這些老一輩的人就會看起來比較矮了。但是其實人體在隨著年齡的增長,不僅身體的各項機能會逐漸的老化,而且人體的身材面貌也會產生變化,人體不斷的老化過程中,在加上長時間的為後輩進行操勞,這些生活中所承擔的重壓就會導致人體越來越矮,有句俗話叫做「人老矮三分」,骨科醫生提出老年人變矮的因素還與其餘的三種有一定的關聯。那麼人老是,哪三種原因導致變矮?