【AI不惑境】模型量化技术原理及其发展现状和展望
大家好,這是專欄《AI不惑境》的第十篇文章,講述模型量化相關的內容。
進入到不惑境界,就是向高手邁進的開始了,在這個境界需要自己獨立思考。如果說學習是一個從模仿,到追隨,到創造的過程,那么到這個階段,應該躍過了模仿和追隨的階段,進入了創造的階段。從這個境界開始,講述的問題可能不再有答案,更多的是激發大家一起來思考。
作者&編輯 | 言有三
模型量化是非常實用的模型壓縮技術,當前已經在工業界發展比較成熟,本文給大家梳理模型量化的核心技術,發展現狀,未來展望以及學習資源推薦。
1 模型量化基礎
1.1 什么是模型量化
我們知道為了保證較高的精度,大部分的科學運算都是采用浮點型進行計算,常見的是32位浮點型和64位浮點型,即float32和double64。
對于深度學習模型來說,乘加計算量是非常大的,往往需要GPU等專用的計算平臺才能實現實時運算,這對于端上產品來說是不可接受的,而模型量化是一個有效降低計算量的方法。
量化,即將網絡的權值,激活值等從高精度轉化成低精度的操作過程,例如將32位浮點數轉化成8位整型數int8,同時我們期望轉換后的模型準確率與轉化前相近。
1.2 模型量化的優勢
模型量化可以帶來幾方面的優勢,如下。
(1) 更小的模型尺寸。以8bit量化為例,與32bit浮點數相比,我們可以將模型的體積降低為原來的四分之一,這對于模型的存儲和更新來說都更有優勢。
(2) 更低的功耗。移動8bit數據與移動32bit浮點型數據相比,前者比后者高4倍的效率,而在一定程度上內存的使用量與功耗是成正比的。
(3)?更快的計算速度。相對于浮點數,大多數處理器都支持8bit數據的更快處理,如果是二值量化,則更有優勢。
上圖展示的是一個二值權重和激活值矩陣的運算,卷積過程中的乘加都可以轉換為異或操作,并行程度更高,運算速度因此也更快。
因此,在工業界對模型量化有著非常強烈的需求,接下來我們講解其中的主要算法。
2 模型量化算法
量化的技術根據不同的量化原理和位寬可以分為許多種。根據量化原理來說,可以分為直接經驗量化算法,基于重建的方法,基于梯度和損失優化的算法等。根據位寬常見的有1bit量化,8bit量化,以及任意bit數量化。
由于我們在實際應用的時候更關注量化本身帶來的對模型體積的減小和加速效果,因此我們根據位寬的不同來分別介紹常見的代表性模型量化技術。
2.1 二值量化(1bit量化)
二值量化是最高效率的量化方式,也可以稱之為1bit量化,即將32位浮點數量化為1bit整型,非常適合FPGA等平臺進行并行運算。二值量化模型以Binary Connect和Binarized Neural Networks為代表。
BinaryConnect[1]是首先做二值化研究的論文,它們對權重進行了二值化。將權重和每層的激活值全部二值化的方法有兩種方法。第一種就是符號函數,即x>0,則f(x)=1,x<0,則f(x)=-1。另一種是以一定的概率賦值,類似于Dropout技術。
BinaryConnect在前向傳播權重量化的時候,使用了隨機的二值化方法,如下:
需要注意的是,為了保持精度,權重在前向傳播和反向傳播計算的時候進行二值化,但是在進行參數更新的時候使用浮點類型。隨機的二值化策略能夠起到提高模型泛化能力的作用,這與Dropout,Dropconnect等技術是類似的。
在BinaryConnect的基礎上,Binarized Neural Networks[2]隨后被提出,它對權重和激活值都進行了二值化,并且同時采用了符號函數和隨機量化兩種策略。對于激活函數,采用了隨機量化方法,而其余的都采用符號函數。
針對符號函數的導數并不連續,無法進行梯度傳播的問題,該網絡方法將符號函數進行松弛,在-1到1之間采用了線性函數:f(x)=max(-1,min(1,x))。
下圖展示的就是一個二值化的權重。
當然了,二值量化還有非常多的技術,包括XNorNet[3]等基于重建的模型,優化目標敏感的二值化模型,基于閾值的二值化改進,激活值正則化等,篇幅有限不再詳述,讀者可以閱讀綜述文章[4]進行學習。
2.2 8bit量化
8bit量化是當前工業界最常見的量化方法,也是當前精度保持最高的量化類型。Tensorflow,TensorRT等框架都提供了支持,并且各自代表著非對稱量化和對稱量化的方案,以Nvidia的8bit對稱量化方案為例:
TensorRT[5]通過最小化原始數據分布和量化后數據分布之間的KL散度來對激活值進行量化,將FP32降為INT8的操作如下:
FP32(T) = scale_factor(s) * 8-bit(t) +FP32_bias(b)
實驗證明偏置實際上是不需要的,去掉偏置后就是T=s?t。其中s就是比例因子(scaling factor),因此現在的問題就是如何確定比例因子,一個簡單的示意圖如下:
上圖直接將一個tensor中的-|max|和|max|的FP32值線性映射為-127和127,這樣的映射是對稱的,并且是不飽和的,實驗結果顯示這樣做會導致比較大的精度損失。主要的原因是max值可能會存在一些離散點噪聲,如果直接進行線性縮放,可能就放大了這些噪聲,TensorRT的改進做法是從127和|max|之間選擇好一個閾值T,把大于這個閾值T的部分截斷,示意圖如下:
只要閾值選取得當,就能將不穩定的大激活值舍棄掉,并且使精度損失不至于降低太多。原始的數據是一個FP32的分布,現在我們要用INT8的分布來表達這個tensor,根據閾值|T|的取值不同有多種選擇,只需要選擇其中最接近FP32的即可,所以現在的問題是確定|T|。
我們需要一個衡量指標來衡量不同的INT8分布與原來的FP32分布之間的差異程度,這就是相對熵,或者稱為KL散度,它是衡量兩個分布相似度的經典算法,定義如下:
KL_divergence(P,Q):= SUM(P[i]*log(P[i]/Q[i]),i)
P,Q分別稱為參考分布(reference_distribution)、量化分布(quantize_distribution)。在應用的時候,每一層的|T|值都不同,確定每一層的|T|值的過程被稱為校準(Calibration)。
所以完整的流程如下:
(1) 首先將FP32的模型在一個數據集(Calibration Dataset)上跑一遍記錄下每一層的FP32激活值,這里沒必要去跑整個訓練集,比較現實的做法是從驗證集中選取一個子集,當然它最好有代表性,多樣性好。之后對網絡的每一層收集激活值,得到直方圖,bins的大小官方建議為2048,所以閾值就在128和2047之間。
(2) 對于128和2047之間的不同閾值|T|進行遍歷,選取使得KL散度取得最小值的|T|。對每一層計算出|T|,得到一個所謂的CalibrationTable。把0-T組的數值線性映射到0-128之間,超出T的直接映射到128。
具體的代碼實現可以看源代碼,下表展示的是一些實驗結果,證明分類任務上精度損失并不大。
當前8bit的量化還有以Google提出的非對稱量化方法[6],篇幅有限不再贅述。
2.3 任意bit量化
除了2bit和8bit兩類最常見的量化方法,3bit,4bit,6bit等也經常被研究,以韓松等人提出的Deep Compression[7]為例,Deep Compression綜合應用了剪枝、量化、編碼三個步驟來進行模型壓縮,是2016 ICLR最佳論文。
整個框架如上所示,包括三個步驟:
(1) 網絡剪枝
即移除不重要的連接,包括3個步驟,分別是普通網絡訓練,刪除權重小于一定閾值的連接得到稀疏網絡,對稀疏網絡再訓練,這是一個反復迭代的過程。
(2) 權重量化
如下圖,這是一個4×4的權值矩陣,量化權重為4階,即2bit,分別對應浮點數-1.0,0,1.5,2.0。
對weights矩陣采用cluster index進行存儲后,原來需要16個32bit float,現在只需要4個32bit float,與16個2bit uint,參數量為原來的(16×2+4×32)/(16×32)=0.31。
這就完成了存儲,那如何對量化值進行更新呢?事實上,文中僅對碼字進行更新,也就是量化后的2bit的權重。
將索引相同的地方梯度求和乘以學習率,疊加到碼字,這就是不斷求取weights矩陣的聚類中心。原來有成千上萬個不同浮點數的weights矩陣,經過一個有效的聚類后,每一個值都用其聚類中心進行替代,作者的研究表明這樣并不會降低網絡的效果。而聚類的迭代過程,通過BP的反向傳播完成。
(3) 霍夫曼編碼
霍夫曼編碼是一種成熟的編碼技巧,與CNN無關,它有效地利用了權重的有偏分布,可以進一步減少需要存儲的參數體積。
3 模型量化算法的展望
在第二部分,我們簡單對2bit,8bit,任意bit量化方法介紹了代表性的框架,但是其實量化本身還有非常多的研究方向,下面列舉其中比較具有代表性的。
3.1 混合精度量化
所謂混合精度量化,它可以指不同的網絡層有不同的量化位階,或者權重,激活以及輸出采用不同的量化方案,當下可以利用AutoML技術來實現,以HAQ[78]框架為例。
3.2 量化訓練框架
目前前向傳播中權重和激活的量化比較成熟,但是訓練中大部分的計算在反向傳播步驟,如果能夠將量化技術應用在反向傳播中,則可以加速卷積的反向梯度傳播過程,不過這需要對梯度也進行量化操作,而梯度的分布比較復雜,容易帶來誤差造成訓練過程的不穩定。如何讓量化模型的訓練更加穩定,這是非常值得研究的方向[9]。
3.3?非均勻量化方案
通常來說量化函數是一個分段的常數函數,不同的量化等級之間的距離是相等的,即均勻量化,然而數據的分布往往不是均勻的,所以均勻量化不是最合理的方案,因此有一些研究針對量化函數本身進行學習[10]。
除此之外,還有基于重建與損失敏感的量化方法,量化正則化方法,量化網絡結構的設計,量化的具體硬件實現等內容。
我們不再一一介紹,對模型量化感興趣的同學,歡迎到有三AI知識星球的網絡結構1000變-模型壓縮-模型量化板塊進行學習,數十期內容定能滿足你的求知欲。
掃碼即可加入,了解有三AI知識星球詳情請閱讀以下文章。
【雜談】有三AI知識星球一周年了!為什么公眾號+星球才是完整的?
參考文獻
[1] Courbariaux M, Bengio Y, David J, et al. BinaryConnect: training deep neural networks with binary weights during propagations[C]. neural information processing systems, 2015: 3123-3131.
[2] Courbariaux M, Hubara I, Soudry D, et al. Binarized neural networks: Training deep neural networks with weights and activations constrained to+ 1 or-1[J]. arXiv preprint arXiv:1602.02830, 2016.
[3] Rastegari M , Ordonez V , Redmon J , et al. XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks[J]. 2016.
[4]?Qin H, Gong R, Liu X, et al. Binary neural networks: A survey[J]. Pattern Recognition, 2020.
[5]?8-bit-inference-with-tensorrt
[6] Jacob B, Kligys S, Chen B, et al. Quantization and training of neural networks for efficient integer-arithmetic-only inference[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 2704-2713.
[7] Han S, Mao H, Dally W J. Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding[J]. arXiv preprint arXiv:1510.00149, 2015.
[8]?Wang K, Liu Z, Lin Y, et al. HAQ: Hardware-Aware Automated Quantization with Mixed Precision[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 8612-8620.
[9]?Zhu F, Gong R, Yu F, et al. Towards Unified INT8 Training for Convolutional Neural Network.[J]. arXiv: Learning, 2019.
[10]?Zhang D, Yang J, Ye D, et al. LQ-Nets: Learned Quantization for Highly Accurate and Compact Deep Neural Networks[C]. european conference on computer vision, 2018: 373-390.
總結
本次我們總結了模型量化的核心技術,并對其重要方向進行了展望,推薦了相關的學習資源,下一期我們將介紹知識蒸餾與遷移學習相關內容。
有三AI秋季劃-模型優化組
如果你想系統性地學習模型優化相關的理論和實踐,并獲得持續的指導,歡迎加入有三AI秋季劃-模型優化組,系統性地學習數據使用,模型使用和調參,模型性能分析,緊湊模型設計,模型剪枝,模型量化,模型部署,NAS等內容。
模型優化組介紹和往期的一些學習內容總結請參考閱讀以下文章:
有三AI秋季劃出爐,模型優化,人臉算法,圖像質量等24個項目等你來拿
【總結】有三AI秋季劃模型優化組3月直播講了哪些內容,為什么每一個從事深度學習的同學都應該掌握模型優化的內容
轉載文章請后臺聯系
侵權必究
往期精選
-
【完結】深度學習CV算法工程師從入門到初級面試有多遠,大概是25篇文章的距離
-
【完結】優秀的深度學習從業者都有哪些優秀的習慣
-
【完結】給新手的12大深度學習開源框架快速入門項目
-
【完結】總結12大CNN主流模型架構設計思想
-
【知乎直播】千奇百怪的CNN網絡架構等你來
-
【AI不惑境】數據壓榨有多狠,人工智能就有多成功
-
【AI不惑境】網絡深度對深度學習模型性能有什么影響?
-
【AI不惑境】網絡的寬度如何影響深度學習模型的性能?
-
【AI不惑境】學習率和batchsize如何影響模型的性能?
-
【AI不惑境】殘差網絡的前世今生與原理
-
【AI不惑境】移動端高效網絡,卷積拆分和分組的精髓
-
【AI不惑境】深度學習中的多尺度模型設計
-
【AI不惑境】計算機視覺中注意力機制原理及其模型發展和應用
-
【AI不惑境】模型剪枝技術原理及其發展現狀和展望
總結
以上是生活随笔為你收集整理的【AI不惑境】模型量化技术原理及其发展现状和展望的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【通知】有三AI固态硬盘最后一次补货,再
- 下一篇: 【星球知识卡片】模型量化的核心技术点有哪