0
本文作者: AI研習社-譯站 | 2020-09-21 10:58 |
字幕組雙語原文:NLP 模型壓縮方法綜述
英語原文:A Survey of Methods for Model Compression in NLP
翻譯:wiige
近年來,基于Transformer的語言模型在神經(jīng)機器翻譯,自然語言推理,and 其他一攬子自然語言理解任務中取得了實質性進展。 采用不同語言建模損失進行自監(jiān)督的預訓練,意味著模型可以通過大規(guī)模語料來提高許多下游任務的性能。 然而,海量參數(shù)和長計算軌跡意味著BERT及其變體在生產(chǎn)部署中困難重重。 值得慶幸的是,在過去2年里,我們看到了各種各樣的技術的發(fā)展,它們緩解了這些苦痛并加速了模型的預測。具體來說,本文將重點介紹下面這套模型預訓練后可以打的組合拳,這能降低模型預測的計算成本:
數(shù)值精度縮減: 通過減少浮點數(shù)精度和量化來加快速度
操作合并: 在計算圖中合并所選節(jié)點
剪枝: 識別并刪除網(wǎng)絡中的非必要部分
知識蒸餾: 訓練高效的小規(guī)模學生模型,以模仿表達力更強、開銷更大的老師模型
模塊替換: 通過替換來降低模型的復雜性或深度
數(shù)值精度縮減可能是加速模型預測的最通用方法。在過去的幾年里,GPU硬件對16位浮點數(shù)運算的支持不佳,這意味著降低權重和激活函數(shù)的計算精度往往效果適得其反,但帶有Tensor Core的NVIDIA Volta和Turing 架構的引入意味著現(xiàn)代GPU現(xiàn)在已經(jīng)具備了高效的16位浮點數(shù)運算能力。
浮點數(shù)的表示
浮點類型存儲三種的數(shù)值信息——符號、指數(shù)和分數(shù)。 傳統(tǒng)的32位浮點數(shù)表示法用8位表示指數(shù),用23位來表示尾數(shù)。 而傳統(tǒng)的16位浮點數(shù)表示法(即NVIDIA硬件使用的格式)將32位表示法中的指數(shù)和尾數(shù)位差不多減少了一半。TPU則用了一種名為 bfloat16 的表示方法,它將部分比特位從尾數(shù)移至指數(shù),以部分精度為代價換取了更大的數(shù)值表示能力。
圖源: https://cloud.google.com/tpu/docs/bfloat16
Transformer網(wǎng)絡大部分的都可以簡單地轉換為16位浮點權重和激活,而不會產(chǎn)生精度問題。 而網(wǎng)絡剩下的一小部分——特別是softmax操作這部分——必須堅持使用32位浮點數(shù)。 這是因為大量小數(shù)值(對數(shù)計算產(chǎn)生的)的和可能會累積出很大誤差。因為同時使用了float16和float32,這種方法通常被稱為"混合精度".
較不精確的數(shù)值表示法能夠從兩個方面加速計算:
原生半精度指令
更緊湊的表示使得批尺寸(batch size)更大
NVIDIA已經(jīng)發(fā)布了一套與浮點精度縮減相關的通用基準——在實踐中,這種方法可以實現(xiàn)高達3倍的加速。
整型量化
將32位浮點值量化為8位整型值也是可能的,但應用起來頗為微妙。 特別是,為了確保8位整型值的計算盡可能地接近32位浮點值的計算,訓練后必須要增加一個校準步驟.
如果你知道一個網(wǎng)絡的激活值可能在什么樣的區(qū)間內(nèi),你可以把這個區(qū)間劃分成256個離散的塊,并將每個塊分配給一個整數(shù)。 只要你記得了縮放因子和區(qū)間范圍,就可以用整數(shù)近似值進行矩陣乘法,并在輸出的時候結果恢復為浮點值.
圖源: Szymon Migacz's 演講, "8-bit Inference with TensorRT"
簡單來說,你可以選擇一個縮放比例和偏移量,使得一組校準輸入上的全部浮點數(shù)激活都不會被映射到8位整型值表示范圍(-128,127)的端點值上。 然而,在這樣做的過程中,為了適應極端的值我們犧牲了一些精度。 相反,像TensorRT這樣的框架會選擇規(guī)模和偏移值,來最小化32位浮點版本和8位整型版本的模型激活輸出之間的KL散度,這使得我們原則上可以權衡好范圍和精度。 由于KL散度就是不同編碼下的信息損失量,所以它完美符合計算需求.
下面的資料介紹了如何使用NVIDIA的TensorRT將8位整型值量化應用到自己的模型中:
Tensorflow TensorRT 用戶指南
Tensorflow TensorRT Github
除了浮點縮減和量化,操作合并也為更高效的預測提供了一個實用而通用的選擇。合并的基本原理是將一些網(wǎng)絡層執(zhí)行的操作結合起來,以更高效少次地訪問設備內(nèi)存。 通過將多種操作合并到一個核(kernel)中,可以大幅提高訪問內(nèi)存的速度。
上圖中,將跳連的求和操作與層標準化的縮放和偏置合并.
軟件優(yōu)化還可以讓我們重組一些矩陣乘法,以更好地利用并行性。 特別是,這可以將自注意力層的查詢、鍵和值投影合并到一次矩陣乘法中去。
圖片由NVIDIA開發(fā)者博客提供
不幸的是,關于這種圖優(yōu)化所帶來的速度提升幅度的細節(jié)很少,但我的樂觀估計是,這種改進是漸進但不可忽視的——它會在吞吐量上提升10%。
除了純粹地提高軟件效率之外,還有一些方法可以用來剪枝神經(jīng)網(wǎng)絡,去除那些對最終模型貢獻最小的權重。 許多剪枝方法(如Fan等人的 "Reducing Transformer Depth on Command With Structured Dropout")需要在預訓練期間對網(wǎng)絡進行修改,以產(chǎn)生足夠稀疏的模型,而且可在訓練后再進行剪枝。 剪枝相關的其他文獻則側重于理解習得的連接模式的稀疏程度,而沒有以高效預測為目的(例如,Gorden等人的 "Compressing BERT: Studying the Effects of Weight Pruning on Transfer Learning")。
雖然所有這些方法本身都很意思(結構化層丟棄在實際應用中表現(xiàn)出巨大的前景),但我對那些可以在部署應用并仍然提升性能的方法更感興趣。這類方法通?;?quot;模型中只有一部分是解決具體任務所必需的"這一事實。
為獲得性能提升而進行剪枝對結構化的稀疏性有所要求。 簡單地將奇異權重歸零并不能有效產(chǎn)生性能提升,因為我們沒有實際的方法來利用這種稀疏性。 所以我們必須剪掉網(wǎng)絡中更大的部分,才能產(chǎn)生實際的性能提升。
"Are Sixteen Heads Really Better than One?", 一文中,Paul Michel、Peter Levy和Graham Neubig迭代地從BERT中減少頭的數(shù)量. 他們使用基于梯度檢測的方法(梯度是在下游任務上估計出來的)來估計每個頭的重要性,并以頭剪枝百分比作為性能的函數(shù)來評估模型對頭剪枝的魯棒性。
在實踐中,作者發(fā)現(xiàn)20 - 40%的頭可以剪枝,它們對精度的影響可以忽略不計。
資料來源 https://arxiv.org/abs/1905.10650
在J.S. McCarley和Rishav Chakravarti以及Avirup Sil的"Structured Pruning of a BERT-based Question Answering Model"中,作者探索了一種更通用的模型剪枝方法。 作者沒有只關注注意力頭,還對每一層的輸入以及每個BERT層的前饋層的激活進行了門控。
他們探索了幾種機制來選出要剪枝的網(wǎng)絡元素——包括Michel等人提出的方法——最終確定了一種L0正則化項,它可以用在精調期間,提高模型的稀疏性。為了使這個L0正則化項可微,他們采用了類似于變分自編碼器中的重參數(shù)化技巧。
圖片來自 Christos Louizos, Max Welling和Diederik P. Kingma的文章 "Learning Sparse Neural Networks Through L0 regularization"。
他們實驗發(fā)現(xiàn), 用稀疏性懲罰來微調比"Are 16 Heads Really Better than 1 "中提出的重要性估計方法更勝一籌,并且他們發(fā)現(xiàn)可以多去掉近50%的前饋激活,而對短問題回答任務(他們視之為基準任務)的性能影響可以忽略不計。
在Squad 2.0上剪枝模型的注意力頭和前饋激活的魯棒性。
為進一步加速模型,作者的還推薦使用下一個技術——"知識蒸餾"
知識蒸餾是由Geoffrey Hinton, Oriol Vinyals, 和Jeff Dean在2015年的工作"Distilling the Knowledge in a Neural Network"中提出的, 知識蒸餾是指到將一個網(wǎng)絡("教師")中包含的知識通過特定的修正損失遷移到另一個網(wǎng)絡中去("學生")。
首先想象一下,我們有一大堆無標記的樣本。如果我們信賴教師模型的預測,但其模型太過龐大或計算成本太高而無法在實際環(huán)境中使用,那我們就用教師模型來分類無標記的樣本,并將這些分類信號作為監(jiān)督信號饋給學生模型。 然而如果不將對應類別的最大似然作為最終目標,而是在所有可能的類別上產(chǎn)生一個概率分布,那么學生模型就可以獲得信息更豐富的監(jiān)督信號。
直覺上,學生模型所犯的某些錯誤比其他錯誤更合理——把勺子的圖認成哈士奇明顯就走遠了,但把哈士奇誤分為一只阿拉斯加就比較想得通了。所以損失函數(shù)應該反映出錯誤的嚴重程度。通過懲罰教師預測和學生預測之間的差異(鼓勵對數(shù)匹配),學生可以從教師網(wǎng)絡也覺得可能的類別中學習有用信息。作者認為,在原任務上用僅3%的訓練數(shù)據(jù)就可以幾乎實現(xiàn)教師網(wǎng)絡的性能。
有樣東西和兩個完全不一樣。圖源維基百科,遵循CC BY-SA 3.0協(xié)議發(fā)布。
有證據(jù)表明,大量參數(shù)可能是樣本利用率高的關鍵,而且在同樣時長內(nèi)把大型語言模型訓練到某個困惑度也可能比訓練一個等效的緊湊模型更有高效,因此,高效地將這些習得的知識遷移到緊湊的學生模型上的方法擁有光明的未來。
相似模型架構的蒸餾
在前面討論的"Structured Pruning of a BERT-based Question Answering Model" 中作者利用知識蒸餾方法,將未剪枝的教師模型中的知識遷移到剪枝后的學生模型上。 在中立問題數(shù)據(jù)集(Natural Questions)上,教師模型在長回答和短回答上的F1值分別為70.3和58.8。剪枝50%左右的注意力頭和前饋激活后,F(xiàn)1分別下降為67.8和55.5 ——平均下降了約2.5。 如果在微調過程中用蒸餾損失來代替交叉熵損失,F(xiàn)1則可以恢復1.5到2個點,F(xiàn)1分別達到了69.3和58.4。
知識蒸餾有助于恢復剪枝過程中丟失的信息。
Hugging Face的Victor Sanh、Lysandre Debut、Julien Chaumond和Thomas Wolf在其文章"DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter"中, 在對遮罩語言模型的二次預訓練中將知識從基線BERT模型蒸餾到了6層BERT學生模型上。 令人印象深刻的是, (以任務無關的方式訓練的)學生模型保留了97%的GLUE性能,同時還減少了60%的預測時間.
在 TinyBERT: Distilling BERT for Natural Language Understanding一文中, Xiaoqi Jiao, Yichun Yin, Lifeng Shang, Xin Jiang, Xiao Chen, Linlin Li, Fang Wang 和 Qun Liu 將一個BERT教師模型蒸餾到了一個隱層大小為312的4層Transformer學生模型上。 模型在預訓練時和微調時都進行了知識蒸餾,得到的學生模型GLUE得分實現(xiàn)了BERT基線模型的96%,而軟件尺寸減小了7.5倍,推理速度快了近10倍。
在 "Patient Knowledge Distillation for BERT Model Compression"這篇文章里, Siqi Sun, Yu Cheng, Zhe Gan, Jingjing Liu 在12層BERT老師模型和6層BERT學生模型的許多中間表征上加入了知識蒸餾損失,相較于僅對模型logits應用知識蒸餾損失的基線模型,這樣能在5/6個GLUE評分項上實現(xiàn)更高的準確率。
相異模型架構的知識蒸餾
在前文提到的論文中,教師模型和學生基本架構是相似的,教師模型的權重通常用來初始化學生模型的權重。然而,即使在教師模型和學生模型架構差異巨大的情況下,也可以應用知識蒸餾損失。
在 "Training Compact Models for Low Resource Entity Tagging using Pre-trained Language Models"一文中, 英特爾AI實驗室的Peter Izsak、Shira Guskin和Moshe Wasserblat將一個在命名實體識別任務上訓練的BERT教師模型(約330M個參數(shù))蒸餾成了一個明顯更緊湊高效的CNN-LSTM學生模型(約3M個參數(shù))。 這樣的學生模型以最少的精度損失在CPU硬件上的提速高達2個數(shù)量級。
"Distilling Transformers into Simple Neural Networks with Unlabeled Transfer Data"中,Subhabrata Mukherjee和Ahmed Hassan Awadallah將BERT-Base和BERT-Large教師模型蒸餾成了一個BiLSTM學生模型,在4個分類任務(Ag News、IMDB、Elec和DBPedia)中用少量參數(shù)(13M)就戰(zhàn)平了教師模型。 他們還發(fā)現(xiàn),知識蒸餾使得樣本利用效率有了很大的提升,每個任務只需要500個帶標注樣本就能達到(使用大量無標注數(shù)據(jù)的)教師模型性能。
在 "Distilling Task-Specific Knowledge from BERT into Simple Neural Networks" 中,Raphael Tang、Yao Lu、Linqing Liu、Lili Mou、Olga Vechtomova和Jimmy Lin通過少于1M參數(shù)的單層BiLSTM在各種句對任務(QQP、MNLI等)上的實驗得出了類似結論。
在 "Attentive Student Meets Multi-Task Teacher: Improved Knowledge Distillation for Pretrained Models" 中, Linqing Liu, Huan Wang, Jimmy Lin, Richard Socher, 和Caiming Xiong 將多任務學習與知識蒸餾方法結合起來,將Transformer教師模型的知識遷移到一個帶注意力機制的深度LSTM中。 他們發(fā)現(xiàn),知識蒸餾的好處與多任務學習框架的泛化優(yōu)勢融合得很好,預測速度提升至耐心知識蒸餾(Patient Knowledge Distillation)模型的30倍,TinyBERT的7倍。
知識蒸餾近來風靡各界的原因很好懂——基于Transformer的語言模型參數(shù)量漲個沒完——而可能就是專治參數(shù)爆炸的靈丹妙藥。 如果我們要讓這些吃顯存的無底洞切實落地,就需要像知識蒸餾這樣的方法來保持模型預測的高吞吐量。
模塊替換
列表中的最后一篇文章有兩個與眾不同之處:一是采用了比較新穎的模型壓縮方法,二是文章里有這么張圖:
這圖要是做成T-shirt的話我必穿來游街。
BERT-of-Theseus: Compressing BERT by Progressive Module Replacing 是Canwen Xu, Wangchunshu Zhou, Tao Ge, Furu Wei, and Ming Zhou發(fā)表的文章。 忒修斯BERT(BERT-of-Theseus)沒有單獨訓練一個學生模型來最小化知識蒸餾的損失,而是在模型精調時,每批(batch)以一定的概率用 "后輩模塊"(新模塊的塊)隨機替換一個 "先輩模塊"(即原模型的塊)。
忒修斯BERT是對 "忒修斯之船 "悖論的延展,這個悖論探討的是一艘船在經(jīng)過不斷的細小維修和升級后,是否還是那一艘船。 忒修斯BERT將這種漸進式替換的思想應用在了模型壓縮上。
后輩模塊是低配的先輩模塊——下圖這種情況里,單個Transformer的層替換掉了一個雙層Transformer組成的塊 。 與知識蒸餾不同的是,模塊替換中沒有使用損失來鼓勵后輩模塊模仿先輩模塊。 實際上,是通過后輩和先輩模塊的互換使用來鼓勵后輩學習模仿先輩的行為。
ArXiv論文中的"忒修斯BERT"圖示
這種隱式行為的一個好處是,我們不再需要選擇如何用目標模型損失來加權各種知識蒸餾損失——因為它通常需要一個超參數(shù)α,使得模型損失的形式為L=αLKD+(1-α)LCEL=αLKD+(1-α)LCE。 與TinyBERT不同的是,它沒有二次預訓練這一步——模型壓縮與下游精調是同時進行的。 最后,漸進式模塊替換方法也適用于模型架構不同的情況——它在設計中就沒有利用Transformer的任何具體特征。
論文作者用線性學習率進行了實驗,他發(fā)現(xiàn)隨著時間的推移,線性增加模塊的替換率比恒定的替換率效果要好。
忒修斯BERT的替換率的比較實驗
為了測試其方法的魯棒性,作者在GLUE跑分的時候在BERT-base上用了"忒修斯壓縮",這輕松超越了幾種基于知識蒸餾方法的性能,在將原始模型壓縮到50%大小的情況下,僅僅落后BERT-base不到1個百分點。
忒修斯BERT的GLUE跑分結果
我覺得漸進式模塊替換方法十分誘人的部分原因是,它打開了用實驗方法提高其他模型吞吐量的大門, 而以前模型通常需要從零開始重新訓練。 對于獨立研究員和小公司來說,從頭開始重新訓練Transformer模型的成本通常是難以承受的,所以哪些提出了更高效模型的好點子但沒發(fā)布預訓練模型的論文就很難復現(xiàn)。
我很想看看忒修斯BERT提出的漸進式模塊替換, 是否能夠很好地替換
"Fast Transformer Decoding: One Write-Head is All You Need"中提出的共享鍵和值的預訓練注意力模塊,或者換成一個稀疏的注意力等價模塊。更一般地講,我們需要繼續(xù)開發(fā)一些方法,這些方法既能利用語言模型預訓練過程中的大量計算開銷,又能讓我們事后進行修改,以便使這些昂貴的模型能適應特定任務。我對未來研究如何在這一的基石上向前發(fā)展翹首以盼。
如果您有興趣了解更多關于基于BERT模型的更高效預測方法,您可能會喜歡下面的:
Prakhar Ganesh , Yao Chen , Xin Lou , Mohammad Ali Khan, Yin Yang , Deming Chen , Marianne Winslett , Hassan Sajjad and Preslav Nakov的Compressing Large-Scale Transformer-Based Models: A Case Study on BERT
Michael Gordon的一篇博文:All the Ways You Can Compress BERT,我寫這篇文章的時候經(jīng)常引用之。
雷鋒字幕組是一個由AI愛好者組成的翻譯團隊,匯聚五五多位志愿者的力量,分享最新的海外AI資訊,交流關于人工智能技術領域的行業(yè)轉變與技術創(chuàng)新的見解。
團隊成員有大數(shù)據(jù)專家,算法工程師,圖像處理工程師,產(chǎn)品經(jīng)理,產(chǎn)品運營,IT咨詢?nèi)?,在校師生;志愿者們來自IBM,AVL,Adobe,阿里,百度等知名企業(yè),北大,清華,港大,中科院,南卡羅萊納大學,早稻田大學等海內(nèi)外高校研究所。
如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學習新知,分享成長。
雷峰網(wǎng)版權文章,未經(jīng)授權禁止轉載。詳情見轉載須知。