0
| 本文作者: AI研習(xí)社-譯站 | 2020-09-21 10:58 |

字幕組雙語原文:NLP 模型壓縮方法綜述
英語原文:A Survey of Methods for Model Compression in NLP
翻譯:wiige
近年來,基于Transformer的語言模型在神經(jīng)機(jī)器翻譯,自然語言推理,and 其他一攬子自然語言理解任務(wù)中取得了實(shí)質(zhì)性進(jìn)展。 采用不同語言建模損失進(jìn)行自監(jiān)督的預(yù)訓(xùn)練,意味著模型可以通過大規(guī)模語料來提高許多下游任務(wù)的性能。 然而,海量參數(shù)和長計算軌跡意味著BERT及其變體在生產(chǎn)部署中困難重重。 值得慶幸的是,在過去2年里,我們看到了各種各樣的技術(shù)的發(fā)展,它們緩解了這些苦痛并加速了模型的預(yù)測。具體來說,本文將重點(diǎn)介紹下面這套模型預(yù)訓(xùn)練后可以打的組合拳,這能降低模型預(yù)測的計算成本:
數(shù)值精度縮減: 通過減少浮點(diǎn)數(shù)精度和量化來加快速度
操作合并: 在計算圖中合并所選節(jié)點(diǎn)
剪枝: 識別并刪除網(wǎng)絡(luò)中的非必要部分
知識蒸餾: 訓(xùn)練高效的小規(guī)模學(xué)生模型,以模仿表達(dá)力更強(qiáng)、開銷更大的老師模型
模塊替換: 通過替換來降低模型的復(fù)雜性或深度
數(shù)值精度縮減可能是加速模型預(yù)測的最通用方法。在過去的幾年里,GPU硬件對16位浮點(diǎn)數(shù)運(yùn)算的支持不佳,這意味著降低權(quán)重和激活函數(shù)的計算精度往往效果適得其反,但帶有Tensor Core的NVIDIA Volta和Turing 架構(gòu)的引入意味著現(xiàn)代GPU現(xiàn)在已經(jīng)具備了高效的16位浮點(diǎn)數(shù)運(yùn)算能力。
浮點(diǎn)數(shù)的表示
浮點(diǎn)類型存儲三種的數(shù)值信息——符號、指數(shù)和分?jǐn)?shù)。 傳統(tǒng)的32位浮點(diǎn)數(shù)表示法用8位表示指數(shù),用23位來表示尾數(shù)。 而傳統(tǒng)的16位浮點(diǎn)數(shù)表示法(即NVIDIA硬件使用的格式)將32位表示法中的指數(shù)和尾數(shù)位差不多減少了一半。TPU則用了一種名為 bfloat16 的表示方法,它將部分比特位從尾數(shù)移至指數(shù),以部分精度為代價換取了更大的數(shù)值表示能力。

圖源: https://cloud.google.com/tpu/docs/bfloat16
Transformer網(wǎng)絡(luò)大部分的都可以簡單地轉(zhuǎn)換為16位浮點(diǎn)權(quán)重和激活,而不會產(chǎn)生精度問題。 而網(wǎng)絡(luò)剩下的一小部分——特別是softmax操作這部分——必須堅(jiān)持使用32位浮點(diǎn)數(shù)。 這是因?yàn)榇罅啃?shù)值(對數(shù)計算產(chǎn)生的)的和可能會累積出很大誤差。因?yàn)橥瑫r使用了float16和float32,這種方法通常被稱為"混合精度".
較不精確的數(shù)值表示法能夠從兩個方面加速計算:
原生半精度指令
更緊湊的表示使得批尺寸(batch size)更大
NVIDIA已經(jīng)發(fā)布了一套與浮點(diǎn)精度縮減相關(guān)的通用基準(zhǔn)——在實(shí)踐中,這種方法可以實(shí)現(xiàn)高達(dá)3倍的加速。
整型量化
將32位浮點(diǎn)值量化為8位整型值也是可能的,但應(yīng)用起來頗為微妙。 特別是,為了確保8位整型值的計算盡可能地接近32位浮點(diǎn)值的計算,訓(xùn)練后必須要增加一個校準(zhǔn)步驟.
如果你知道一個網(wǎng)絡(luò)的激活值可能在什么樣的區(qū)間內(nèi),你可以把這個區(qū)間劃分成256個離散的塊,并將每個塊分配給一個整數(shù)。 只要你記得了縮放因子和區(qū)間范圍,就可以用整數(shù)近似值進(jìn)行矩陣乘法,并在輸出的時候結(jié)果恢復(fù)為浮點(diǎn)值.

圖源: Szymon Migacz's 演講, "8-bit Inference with TensorRT"
簡單來說,你可以選擇一個縮放比例和偏移量,使得一組校準(zhǔn)輸入上的全部浮點(diǎn)數(shù)激活都不會被映射到8位整型值表示范圍(-128,127)的端點(diǎn)值上。 然而,在這樣做的過程中,為了適應(yīng)極端的值我們犧牲了一些精度。 相反,像TensorRT這樣的框架會選擇規(guī)模和偏移值,來最小化32位浮點(diǎn)版本和8位整型版本的模型激活輸出之間的KL散度,這使得我們原則上可以權(quán)衡好范圍和精度。 由于KL散度就是不同編碼下的信息損失量,所以它完美符合計算需求.
下面的資料介紹了如何使用NVIDIA的TensorRT將8位整型值量化應(yīng)用到自己的模型中:
Tensorflow TensorRT 用戶指南
Tensorflow TensorRT Github
除了浮點(diǎn)縮減和量化,操作合并也為更高效的預(yù)測提供了一個實(shí)用而通用的選擇。合并的基本原理是將一些網(wǎng)絡(luò)層執(zhí)行的操作結(jié)合起來,以更高效少次地訪問設(shè)備內(nèi)存。 通過將多種操作合并到一個核(kernel)中,可以大幅提高訪問內(nèi)存的速度。

上圖中,將跳連的求和操作與層標(biāo)準(zhǔn)化的縮放和偏置合并.
軟件優(yōu)化還可以讓我們重組一些矩陣乘法,以更好地利用并行性。 特別是,這可以將自注意力層的查詢、鍵和值投影合并到一次矩陣乘法中去。

圖片由NVIDIA開發(fā)者博客提供
不幸的是,關(guān)于這種圖優(yōu)化所帶來的速度提升幅度的細(xì)節(jié)很少,但我的樂觀估計是,這種改進(jìn)是漸進(jìn)但不可忽視的——它會在吞吐量上提升10%。
除了純粹地提高軟件效率之外,還有一些方法可以用來剪枝神經(jīng)網(wǎng)絡(luò),去除那些對最終模型貢獻(xiàn)最小的權(quán)重。 許多剪枝方法(如Fan等人的 "Reducing Transformer Depth on Command With Structured Dropout")需要在預(yù)訓(xùn)練期間對網(wǎng)絡(luò)進(jìn)行修改,以產(chǎn)生足夠稀疏的模型,而且可在訓(xùn)練后再進(jìn)行剪枝。 剪枝相關(guān)的其他文獻(xiàn)則側(cè)重于理解習(xí)得的連接模式的稀疏程度,而沒有以高效預(yù)測為目的(例如,Gorden等人的 "Compressing BERT: Studying the Effects of Weight Pruning on Transfer Learning")。
雖然所有這些方法本身都很意思(結(jié)構(gòu)化層丟棄在實(shí)際應(yīng)用中表現(xiàn)出巨大的前景),但我對那些可以在部署應(yīng)用并仍然提升性能的方法更感興趣。這類方法通常基于"模型中只有一部分是解決具體任務(wù)所必需的"這一事實(shí)。
為獲得性能提升而進(jìn)行剪枝對結(jié)構(gòu)化的稀疏性有所要求。 簡單地將奇異權(quán)重歸零并不能有效產(chǎn)生性能提升,因?yàn)槲覀儧]有實(shí)際的方法來利用這種稀疏性。 所以我們必須剪掉網(wǎng)絡(luò)中更大的部分,才能產(chǎn)生實(shí)際的性能提升。
"Are Sixteen Heads Really Better than One?", 一文中,Paul Michel、Peter Levy和Graham Neubig迭代地從BERT中減少頭的數(shù)量. 他們使用基于梯度檢測的方法(梯度是在下游任務(wù)上估計出來的)來估計每個頭的重要性,并以頭剪枝百分比作為性能的函數(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"中,作者探索了一種更通用的模型剪枝方法。 作者沒有只關(guān)注注意力頭,還對每一層的輸入以及每個BERT層的前饋層的激活進(jìn)行了門控。
他們探索了幾種機(jī)制來選出要剪枝的網(wǎng)絡(luò)元素——包括Michel等人提出的方法——最終確定了一種L0正則化項(xiàng),它可以用在精調(diào)期間,提高模型的稀疏性。為了使這個L0正則化項(xiàng)可微,他們采用了類似于變分自編碼器中的重參數(shù)化技巧。

圖片來自 Christos Louizos, Max Welling和Diederik P. Kingma的文章 "Learning Sparse Neural Networks Through L0 regularization"。
他們實(shí)驗(yàn)發(fā)現(xiàn), 用稀疏性懲罰來微調(diào)比"Are 16 Heads Really Better than 1 "中提出的重要性估計方法更勝一籌,并且他們發(fā)現(xiàn)可以多去掉近50%的前饋激活,而對短問題回答任務(wù)(他們視之為基準(zhǔn)任務(wù))的性能影響可以忽略不計。

在Squad 2.0上剪枝模型的注意力頭和前饋激活的魯棒性。
為進(jìn)一步加速模型,作者的還推薦使用下一個技術(shù)——"知識蒸餾"
知識蒸餾是由Geoffrey Hinton, Oriol Vinyals, 和Jeff Dean在2015年的工作"Distilling the Knowledge in a Neural Network"中提出的, 知識蒸餾是指到將一個網(wǎng)絡(luò)("教師")中包含的知識通過特定的修正損失遷移到另一個網(wǎng)絡(luò)中去("學(xué)生")。
首先想象一下,我們有一大堆無標(biāo)記的樣本。如果我們信賴教師模型的預(yù)測,但其模型太過龐大或計算成本太高而無法在實(shí)際環(huán)境中使用,那我們就用教師模型來分類無標(biāo)記的樣本,并將這些分類信號作為監(jiān)督信號饋給學(xué)生模型。 然而如果不將對應(yīng)類別的最大似然作為最終目標(biāo),而是在所有可能的類別上產(chǎn)生一個概率分布,那么學(xué)生模型就可以獲得信息更豐富的監(jiān)督信號。
直覺上,學(xué)生模型所犯的某些錯誤比其他錯誤更合理——把勺子的圖認(rèn)成哈士奇明顯就走遠(yuǎn)了,但把哈士奇誤分為一只阿拉斯加就比較想得通了。所以損失函數(shù)應(yīng)該反映出錯誤的嚴(yán)重程度。通過懲罰教師預(yù)測和學(xué)生預(yù)測之間的差異(鼓勵對數(shù)匹配),學(xué)生可以從教師網(wǎng)絡(luò)也覺得可能的類別中學(xué)習(xí)有用信息。作者認(rèn)為,在原任務(wù)上用僅3%的訓(xùn)練數(shù)據(jù)就可以幾乎實(shí)現(xiàn)教師網(wǎng)絡(luò)的性能。

有樣?xùn)|西和兩個完全不一樣。圖源維基百科,遵循CC BY-SA 3.0協(xié)議發(fā)布。
有證據(jù)表明,大量參數(shù)可能是樣本利用率高的關(guān)鍵,而且在同樣時長內(nèi)把大型語言模型訓(xùn)練到某個困惑度也可能比訓(xùn)練一個等效的緊湊模型更有高效,因此,高效地將這些習(xí)得的知識遷移到緊湊的學(xué)生模型上的方法擁有光明的未來。
相似模型架構(gòu)的蒸餾
在前面討論的"Structured Pruning of a BERT-based Question Answering Model" 中作者利用知識蒸餾方法,將未剪枝的教師模型中的知識遷移到剪枝后的學(xué)生模型上。 在中立問題數(shù)據(jù)集(Natural Questions)上,教師模型在長回答和短回答上的F1值分別為70.3和58.8。剪枝50%左右的注意力頭和前饋激活后,F(xiàn)1分別下降為67.8和55.5 ——平均下降了約2.5。 如果在微調(diào)過程中用蒸餾損失來代替交叉熵?fù)p失,F(xiàn)1則可以恢復(fù)1.5到2個點(diǎn),F(xiàn)1分別達(dá)到了69.3和58.4。

知識蒸餾有助于恢復(fù)剪枝過程中丟失的信息。
Hugging Face的Victor Sanh、Lysandre Debut、Julien Chaumond和Thomas Wolf在其文章"DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter"中, 在對遮罩語言模型的二次預(yù)訓(xùn)練中將知識從基線BERT模型蒸餾到了6層BERT學(xué)生模型上。 令人印象深刻的是, (以任務(wù)無關(guān)的方式訓(xùn)練的)學(xué)生模型保留了97%的GLUE性能,同時還減少了60%的預(yù)測時間.
在 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學(xué)生模型上。 模型在預(yù)訓(xùn)練時和微調(diào)時都進(jìn)行了知識蒸餾,得到的學(xué)生模型GLUE得分實(shí)現(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學(xué)生模型的許多中間表征上加入了知識蒸餾損失,相較于僅對模型logits應(yīng)用知識蒸餾損失的基線模型,這樣能在5/6個GLUE評分項(xiàng)上實(shí)現(xiàn)更高的準(zhǔn)確率。
相異模型架構(gòu)的知識蒸餾
在前文提到的論文中,教師模型和學(xué)生基本架構(gòu)是相似的,教師模型的權(quán)重通常用來初始化學(xué)生模型的權(quán)重。然而,即使在教師模型和學(xué)生模型架構(gòu)差異巨大的情況下,也可以應(yīng)用知識蒸餾損失。
在 "Training Compact Models for Low Resource Entity Tagging using Pre-trained Language Models"一文中, 英特爾AI實(shí)驗(yàn)室的Peter Izsak、Shira Guskin和Moshe Wasserblat將一個在命名實(shí)體識別任務(wù)上訓(xùn)練的BERT教師模型(約330M個參數(shù))蒸餾成了一個明顯更緊湊高效的CNN-LSTM學(xué)生模型(約3M個參數(shù))。 這樣的學(xué)生模型以最少的精度損失在CPU硬件上的提速高達(dá)2個數(shù)量級。
"Distilling Transformers into Simple Neural Networks with Unlabeled Transfer Data"中,Subhabrata Mukherjee和Ahmed Hassan Awadallah將BERT-Base和BERT-Large教師模型蒸餾成了一個BiLSTM學(xué)生模型,在4個分類任務(wù)(Ag News、IMDB、Elec和DBPedia)中用少量參數(shù)(13M)就戰(zhàn)平了教師模型。 他們還發(fā)現(xiàn),知識蒸餾使得樣本利用效率有了很大的提升,每個任務(wù)只需要500個帶標(biāo)注樣本就能達(dá)到(使用大量無標(biāo)注數(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在各種句對任務(wù)(QQP、MNLI等)上的實(shí)驗(yàn)得出了類似結(jié)論。
在 "Attentive Student Meets Multi-Task Teacher: Improved Knowledge Distillation for Pretrained Models" 中, Linqing Liu, Huan Wang, Jimmy Lin, Richard Socher, 和Caiming Xiong 將多任務(wù)學(xué)習(xí)與知識蒸餾方法結(jié)合起來,將Transformer教師模型的知識遷移到一個帶注意力機(jī)制的深度LSTM中。 他們發(fā)現(xiàn),知識蒸餾的好處與多任務(wù)學(xué)習(xí)框架的泛化優(yōu)勢融合得很好,預(yù)測速度提升至耐心知識蒸餾(Patient Knowledge Distillation)模型的30倍,TinyBERT的7倍。
知識蒸餾近來風(fēng)靡各界的原因很好懂——基于Transformer的語言模型參數(shù)量漲個沒完——而可能就是專治參數(shù)爆炸的靈丹妙藥。 如果我們要讓這些吃顯存的無底洞切實(shí)落地,就需要像知識蒸餾這樣的方法來保持模型預(yù)測的高吞吐量。
模塊替換
列表中的最后一篇文章有兩個與眾不同之處:一是采用了比較新穎的模型壓縮方法,二是文章里有這么張圖:

這圖要是做成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)沒有單獨(dú)訓(xùn)練一個學(xué)生模型來最小化知識蒸餾的損失,而是在模型精調(diào)時,每批(batch)以一定的概率用 "后輩模塊"(新模塊的塊)隨機(jī)替換一個 "先輩模塊"(即原模型的塊)。
忒修斯BERT是對 "忒修斯之船 "悖論的延展,這個悖論探討的是一艘船在經(jīng)過不斷的細(xì)小維修和升級后,是否還是那一艘船。 忒修斯BERT將這種漸進(jìn)式替換的思想應(yīng)用在了模型壓縮上。
后輩模塊是低配的先輩模塊——下圖這種情況里,單個Transformer的層替換掉了一個雙層Transformer組成的塊 。 與知識蒸餾不同的是,模塊替換中沒有使用損失來鼓勵后輩模塊模仿先輩模塊。 實(shí)際上,是通過后輩和先輩模塊的互換使用來鼓勵后輩學(xué)習(xí)模仿先輩的行為。

ArXiv論文中的"忒修斯BERT"圖示
這種隱式行為的一個好處是,我們不再需要選擇如何用目標(biāo)模型損失來加權(quán)各種知識蒸餾損失——因?yàn)樗ǔP枰粋€超參數(shù)α,使得模型損失的形式為L=αLKD+(1-α)LCEL=αLKD+(1-α)LCE。 與TinyBERT不同的是,它沒有二次預(yù)訓(xùn)練這一步——模型壓縮與下游精調(diào)是同時進(jìn)行的。 最后,漸進(jìn)式模塊替換方法也適用于模型架構(gòu)不同的情況——它在設(shè)計中就沒有利用Transformer的任何具體特征。
論文作者用線性學(xué)習(xí)率進(jìn)行了實(shí)驗(yàn),他發(fā)現(xiàn)隨著時間的推移,線性增加模塊的替換率比恒定的替換率效果要好。

忒修斯BERT的替換率的比較實(shí)驗(yàn)
為了測試其方法的魯棒性,作者在GLUE跑分的時候在BERT-base上用了"忒修斯壓縮",這輕松超越了幾種基于知識蒸餾方法的性能,在將原始模型壓縮到50%大小的情況下,僅僅落后BERT-base不到1個百分點(diǎn)。

忒修斯BERT的GLUE跑分結(jié)果
我覺得漸進(jìn)式模塊替換方法十分誘人的部分原因是,它打開了用實(shí)驗(yàn)方法提高其他模型吞吐量的大門, 而以前模型通常需要從零開始重新訓(xùn)練。 對于獨(dú)立研究員和小公司來說,從頭開始重新訓(xùn)練Transformer模型的成本通常是難以承受的,所以哪些提出了更高效模型的好點(diǎn)子但沒發(fā)布預(yù)訓(xùn)練模型的論文就很難復(fù)現(xiàn)。
我很想看看忒修斯BERT提出的漸進(jìn)式模塊替換, 是否能夠很好地替換
"Fast Transformer Decoding: One Write-Head is All You Need"中提出的共享鍵和值的預(yù)訓(xùn)練注意力模塊,或者換成一個稀疏的注意力等價模塊。更一般地講,我們需要繼續(xù)開發(fā)一些方法,這些方法既能利用語言模型預(yù)訓(xùn)練過程中的大量計算開銷,又能讓我們事后進(jìn)行修改,以便使這些昂貴的模型能適應(yīng)特定任務(wù)。我對未來研究如何在這一的基石上向前發(fā)展翹首以盼。
如果您有興趣了解更多關(guān)于基于BERT模型的更高效預(yù)測方法,您可能會喜歡下面的:
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愛好者組成的翻譯團(tuán)隊(duì),匯聚五五多位志愿者的力量,分享最新的海外AI資訊,交流關(guān)于人工智能技術(shù)領(lǐng)域的行業(yè)轉(zhuǎn)變與技術(shù)創(chuàng)新的見解。
團(tuán)隊(duì)成員有大數(shù)據(jù)專家,算法工程師,圖像處理工程師,產(chǎn)品經(jīng)理,產(chǎn)品運(yùn)營,IT咨詢?nèi)?,在校師生;志愿者們來自IBM,AVL,Adobe,阿里,百度等知名企業(yè),北大,清華,港大,中科院,南卡羅萊納大學(xué),早稻田大學(xué)等海內(nèi)外高校研究所。
如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學(xué)習(xí)新知,分享成長。

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。