性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

機器之心報道

對於動輒上百 M 大小的神經網絡來說,模型壓縮能夠減少它們的內存佔用、通信帶寬和計算複雜度等,以便更好地進行應用部署。最近,來自 Facebook AI 的研究者提出了一種新的模型量化壓縮技術 Quant-Noise,讓神經網絡在不降低性能的前提下,內存佔用減少 90% 以上。

性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise


我們都知道,對於神經網絡來說,參數量越大、層數越多,就代表著輸出的結果越精細。當然,這也意味著許多性能優越的神經網絡體積會非常龐大。比如當前的標準機器翻譯架構 Transformer,一層就可能包含數百萬個參數。即使是一些優化過性能和參數效率的模型(比如 EfficientNet),也仍然需要幾十到幾百 MB。這就使得它們的應用範圍限制在機器人或者虛擬助手等領域。


所以我們在應用部署之前,必須面對一個問題:如何對模型進行壓縮?


剪枝和蒸餾是模型壓縮中常用的兩種方法,通過減少網絡權重的數量來刪減參數。還有一種方法就是「量化」,不同的是,它是通過減少每個權重的比特數來壓縮原始網絡。


標量量化(scalar quantization)等流行的後處理量化方法是讓訓練網絡的浮點權重以一個低精度表徵去表示,比如說定寬整數。這些後處理量化方法的好處在於壓縮效率很高,並且能夠加速支持硬件上的推理。但缺點在於,這些近似值造成的誤差會在前向傳播的計算過程中不斷累積,最終導致性能顯著下降。


現在,來自 Facebook 的研究者提出了一種新的模型量化壓縮技術 Quant-Noise,可對模型進行極致壓縮,同時在實際應用部署時保持高性能


  • 論文地址:https://arxiv.org/abs/2004.07320
  • 項目地址:https://github.com/pytorch/fairseq/tree/master/examples/quant_noise

在這項研究中,研究者提出了一種僅量化權重子集而非整個網絡的壓縮方案。在每次前向傳播時僅量化網絡的隨機部分,對大多數權重使用無偏梯度進行更新。


該方法可以在訓練過程中採用更簡單的量化方案,這對於具有可訓練參數的量化模塊來說是非常有用的,比如乘積量化(Product Quantizer,PQ)算法。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise


總體來說,該方法的亮點在於:


  1. 將名為「Quant-Noise」的量化噪聲應用到權重的隨機子集上,來學習更適用於 int4、 int8 和 PQ 算法等各種量化方法的網絡;
  2. 在 PQ 算法上添加 Quant-Noise,實現準確率和模型大小綜合結果上的 SOTA 水平。使用該方法進行壓縮後,在自然語言處理方面,RoBERTa 在壓縮到 14MB 的前提下,在 MNLI 上實現了 82.5% 的準確率;在計算機視覺方面,EfficientNet-B3 在壓縮到 3.3 MB 的前提下,在 ImageNet 上實現了 80.0% 的 top-1 準確率。
  3. 使用 Quant-Noise 訓練的網絡,通過結合 PQ 算法和 int8 來量化網絡的權重和 activation,獲得在固定精度計算條件下的極致壓縮效果,實現了 ImageNet 數據集上的 79.8% top-1 準確率和 WikiText-103 數據集上的 21.1 困惑度。


此外,使用 Quant-Noise 壓縮後的模型性能幾乎與原始模型一致,同時將內存佔用量減少至原來的十分之一甚至二十分之一。這大大超過了 PyTorch 和 Tensorflow 中所用的 int8 的 4 倍壓縮

。目前,相關代碼也已經開源。


原理:量化神經網絡


在本章中,研究者介紹了量化原理以及幾種標準量化方法,並詳細解釋瞭如何將標量和乘積量化相結合。需要注意的是,為了定義清楚,研究者主要專注於固定實矩陣(fixed real matrix)W∈R ^ n×p 的示例,並假設此矩陣被拆分為 m×q 個塊(b_kl):


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise


這些塊的屬性由量化方法來確定,而碼本(codebook)是包含 K 個向量的集合,即 C = {c [1], ..., c [K]}。此量化方法使用如下方法壓縮矩陣 W:向每個塊 b_kl 分配一個指向碼本 C 中「碼字 c」的索引,同時存儲碼本 C 以及結果索引(作為索引矩陣 I 的條目 I_kl), 而不是使用實際權重。在推理過程中,該方法重建原始矩陣 W 的近似值

性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

,使得 b_kl = c [I_kl]。研究者將標量量化(如 int8,即每個塊 b_kl 由一個權重組成)與向量量化(將多個權重共同量化)區分開來。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise


上圖顯示了研究者在訓練過程中如何將量化噪聲應用於權重子集,從而改善量化模型的性能(完整視頻請參照鏈接)。


定點標量量化


定點(Fixed-point)標量量化方法用低精度定點表示代替了浮點表示。通過在能夠兼容的硬件上使用定點運算,實現減少模型內存佔用並加快推理速度的效果。


Quant-Noise 的具體實現方法


深度網絡訓練過程中不會接觸到 quantization drift 引起的噪聲,從而導致性能欠佳。如何使網絡對量化具有一定的魯棒性?解決方案就是在訓練期間引入量化噪聲


量化感知訓練(Quantization Aware Training,QAT)通過對前向傳播過程中的權重進行量化來實現這一點。這種轉換是不可微的,且使用直通估計器(straight through estimator,STE)來逼近梯度。STE 在梯度中引入了一個偏置,該偏置取決於權重的量化級別,因此也取決於壓縮率。


因此,研究者提出了一種簡單的修改方法 Quant-Noise,通過隨機改善 QAT 來控制該偏置。其思路是:量化權重中的隨機部分,而不是像 QAT 那樣量化整個網絡,使未經量化的權重使用無偏梯度。該方法的一般形式可以模擬訓練期間的量化和剪枝效果。


使用 Quant-Noise 訓練網絡


仍以實矩陣 W 為例。在訓練時,Quant-Noise 方法的運行方式如下:


首先,計算與目標量化方法相關的塊 b_kl;然後在每個前向傳播過程中,隨機選擇這些塊的子集,並添加一些失真;在反向傳播過程中,使用 STE 逼近失真的權重,進而計算所有權重的梯度值。換句話說,給定索引元組 J ⊂ {(k, l)},其中 1≤k≤m,1≤l≤q,同時將失真或噪聲函數 ϕ 作用在塊上,於是研究者定義算子 ψ (· | J),對於每個塊 b_kl 均應用以下轉換:


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise


Quant-Noise 的效果怎麼樣?


Quant-Noise 對不同量化方法的影響


如下表 1 所示,研究者首先展示了在語言建模和圖像分類任務上,Quant-Noise 對 int4、int8 和 iPQ 三種不同量化方案的影響。結果表明,Quant-Noise 對 iPQ 等高性能量化方案表現出非常好的效果,而 QAT 一般導致性能下降,即使與量化作為後處理步驟的情況相比也會這樣。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

表 1:在 QAT 和 Quant-Noise 兩種設置下,int4、int8 和 iPQ 三種量化方案在語言建模和圖像分類任務上的量化結果對比。對於語言建模任務,研究者在 Wikitext-103 基準上訓練 Transformer,得出了測試困惑度(PPL);對於圖像分類任務,研究者在 ImageNet-1k 基準上訓練了 EfficientNet-B3,得出了驗證 Top-1 準確率。


研究者分析得出,Quant-Noise 能夠與剪枝(pruning)和權重共享(weight sharing)方法兼容並相互補充。如下表 2 所示,研究者分別展示了 WikiText-103 上語言建模、MNLI 上預訓練句子表徵和 ImageNet-1k 上目標分類的結果,這些結果在不同的任務和基準上保持了高度一致:Quant-Noise 在強大的 iPQ 基線方法上實現了性能的大幅提升。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

表 2:幾種不同的壓縮方法(權重共享、剪枝和 Quant-Noise)在語言建模、句子表徵和圖像分類任務上對未量化模型和量化模型性能的影響。


與 SOTA 方法的對比


研究者在相同任務上將 Quant-Noise 與當前 SOTA 方法進行對比。他們在有競爭力的模型上應用了最佳量化設置,在結合權重共享和剪枝方法時將這些模型的內存佔用縮小到原來的 1/94-1/20,從而為高性能模型提供了極致壓縮。


如下圖 2 所示,研究者得出了在語言建模、MNLI 和 ImageNet 上性能與模型大小的權衡情況。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

圖 2:模型性能隨模型大小的變化情況。


控制變量測試


如下表 3 所示,研究者分別展示了在未利用 Quant-Noise 訓練、利用 Quant-Noise 微調以及利用 Quant-Noise 訓練三種不同的設置下,Adaptive Input 架構的困惑度和 RoBERTa 的準確率變化情況。可以看出,直接利用 Quant-Noise 訓練可以實現最低的困惑度和最高的準確率。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

表 3:未利用 Quant-Noise 訓練、利用 Quant-Noise 微調和利用 Quant-Noise 訓練三種不同設置下的困惑度和準確率對比。


如下圖 3 所示,不同 Quant-Noise 值對語言建模模型 Transformer 性能的影響。對於 iPQ,高噪聲值對模型性能帶來較大影響;而對於 int8 量化及其噪聲函數而言,較高的噪聲值對模型性能造成輕微的負面影響,但不如前者那麼嚴重。


性能不打折,內存佔用減少90%,Facebook提模型壓縮方法Quant-Noise

圖 3:量化參數的影響。



分享到:


相關文章: