摘要:介紹目前業界主要的模型優化的方法,然后對模型量化進行重點闡述,介紹量化的基本原理,方法分類,未來發展,以及對前沿論文進行解讀。
本文分享自華為雲社區《模型量化綜述及應用》,作者:Alan_wen。
前言
隨着深度學習的不斷發展,神經網絡廣泛應用於不同的領域,取得遠超以往的性能,但是深度網絡模型的參數也越來越大,嚴重制約着深度網絡在業界的應用,因此本文即將介紹目前業界主要的模型優化的方法,然后對模型量化進行重點闡述,介紹量化的基本原理,方法分類,未來發展,以及對前沿論文進行解讀。
1.模型優化的方法
1.1設計高效的網絡結構
設計緊湊的網絡結構可以實現模型的優化,比如提出的MobileNet系列網絡,其中簡潔的Depth-Wise Convolution和Point-Wise Convolution。但是目前手工設計的神經網絡已逐漸被AutoML和網絡結構搜索取代,通過網絡結構搜索可以得到高精度而結構又緊湊的網絡。
1.2模型剪枝
使用手工設計的網絡結構一般可以獲得較高的精度,但是巨大的網絡參數很難直接應用到工業界的產品中,一般會對模型進行剪枝,模型剪枝分為結構化剪枝和非結構化剪枝,非結構化剪枝一般很難實現底層加速,而模型剪枝也逐漸被網絡結構搜索取代。
1.3知識蒸餾
除了剪枝可以將一個大模型縮小為小模型外,知識蒸餾同樣可以實現該功能。知識蒸餾將原先大模型作為Teacher模型,而設計的小模型Student模型,通過soft-target引導Student模型訓練,實現Teacher模型的知識遷移。
1.4稀疏
稀疏主要是通過對網絡權重或者特征進行稀疏,可以通過正則化訓練的方式實現稀疏化,而網絡權重稀疏后一般通過與模型剪枝的方式結合,對不活躍的權重進行裁剪,以壓縮網絡結構。
1.5模型量化
模型量化是目前工業界最有效的模型優化方法之一,如FP32-->INT8可以實現4倍的參數壓縮,在壓縮內存的同時可以實現更快速的計算,進行極端的二值量化理論上甚至可以實現32倍的壓縮,但是過度的壓縮會導致模型的精度快速下降。下文將對模型量化進行詳細介紹。
2.模型量化綜述
2.1什么是量化?
在信息系統中量化是將信號的連續取值近似為有限多個離散值的過程 (可以認為是一種信息壓縮的方法) 。
在計算機系統中,量化是指定點與浮點等數據之間建立一種數據映射關系,使得以較小的精度損失代價獲得了較好的收益,可簡單理解為用“低比特”數字表示FP32等數值。
在開始介紹量化的原理之前先問三個問題:
為什么量化有用?
- 因為卷積神經網絡對噪聲不敏感,量化相當於對原輸入加入了大量的噪聲。
為什么用量化?
- 模型太大,比如VGG19大於500MB的參數量,存儲壓力大;
- 每個層的weights范圍基本都是確定的,且波動不大,適合量化壓縮;
- 此外,量化既減少訪存又可減少計算量
為什么不直接訓練低精度的模型?
- 因為訓練需要反向傳播和梯度下降,int8為離散數值,舉個例子就是我們的學習率一般都是零點幾零點幾的,int8不匹配無法反向傳播更新。
2.2量化原理
量化是指將信號的連續取值近似為有限多個離散值的過程。可理解成一種信息壓縮的方法。在計算機系統上考慮這個概念,一般用“低比特”來表示。
模型量化為定點與浮點等數據之間建立一種數據映射關系,使得以較小的精度損失代價獲得了較好的收益。詳細如下:
R 表示真實的浮點值,Q 表示量化后的定點值,Z 表示 0 浮點值對應的量化定點值,S 則為定點量化后可表示的最小刻度。 由浮點到定點的量化公式如下:
浮點到定點的量化:
2.3量化基礎概率
均勻與非均勻量化:
如上圖所示,量化可分為均勻量化和非均勻量化,上圖左圖的均勻量化即為公式(1)方式的線性量化。而網絡權重或者特征分布不一定是均勻的,簡單的線性量化可能導致原網絡明顯的信息丟失,因此還可以進行非均勻量化,如使用Kmeans對網絡權重進行聚類,得到不同的聚類中心,然后將聚類中心作為同一簇權重的量化代表。
對稱與非對稱量化:
在理想的情況下,如上圖左圖所示,特征分布比較均勻,因此可以對模型進行對稱量化,即以0點值左右兩邊絕對值相等進行量化。但是很多情況下模型權重或特征是分布不均勻的,不一定在0點值兩邊對稱,如上圖右圖所示,直接進行對稱量化會某一側的特征被嚴重壓縮,大量丟失網絡信息,因此可為了盡可能以的保持原網絡表示的信息,可進行非對稱量化。
動態與靜態量化:
有不同的校准方法來確定上圖[α, β]的剪切范圍。量化方法的另一個重要區分因素是裁剪范圍的確定。可以靜態地計算權重的范圍,因為在大多數情況下,參數在推斷期間是固定的。然而,每個輸入樣本的激活映射是不同的。因此,有兩種量化激活的方法:動態量化和靜態量化。
在動態量化中,在運行時期間為每個激活映射動態計算此范圍。這種方法需要實時計算信號統計信息(最小值、最大值、百分位數等),這些統計信息可能具有非常高的開銷。然而,動態量化通常能獲得更高的精度,因為信號范圍是精確計算每個輸入的。
另一種量化方法是靜態量化,其中剪裁范圍是預先計算的,在推理期間是靜態的。這種方法在推理過程不會增加任何計算開銷,但與動態量化相比,它通常會導致更低的精度。預計算的一種流行方法是運行一系列校准輸入以計算典型激活范圍。
總的來說,動態量化動態計算每個激活的裁切范圍,通常可實現最高精度。然而,動態計算裁切的范圍非常消耗計算,因此,業界最常使用靜態量化,其中所有輸入的裁切范圍都是固定的。
不同量化粒度:
在計算機視覺任務中,每層的激活輸入有許多不同的卷積濾波器卷積,如圖上所示。這些卷積濾波器的每個都可以具有不同的值范圍。因此,量化方法的一個區別是如何為權重計算裁切范圍[α,β]的粒度。可將它們分類為層量化,分組量化和通道量化:
a)層量化:在這種方法中,裁切范圍是通過考慮層卷積濾波器中的所有權重來確定的,如上圖的第三列所示。通過該層中整個參數的統計信息(如最小、最大和百分位數等),然后對整層卷積濾波器使用相同的裁切范圍。雖然這種方法實現非常簡單,但它通常會導致次優解,因為每個卷積濾波器的范圍可能會有很大的變化,會使某些參數范圍相對較窄的卷積核失去量化分辨率。
b)分組量化:可以將層內的多個不同通道分組,以計算裁切范圍(激活或卷積核)。這對於單個卷積/激活中參數分布變化很大的情況可能會有所幫助,分組量化可以在量化分辨率和計算開銷之間建立一個很好的妥協。
c)通道量化:裁切范圍的一個通常選擇是為每個卷積濾波器使用固定值,獨立於其他通道,如上圖最后一列所示。也就是說,每個通道都被分配了一個專用的縮放因子。這確保了更好的量化分辨率,並通常導致更高的精度,通道量化是目前用於量化卷積核的標准方法。
隨機量化
在推理過程中,量化方案通常是確定性的。然而,這並不是唯一的可能性,一些工作已經探索了隨機量化用於量化感知訓練以及降低精度訓練。高層次的直覺是,與確定性量化相比,隨機量化可能允許NN進行更多探索。人們通常認為小的權重更新可能不會導致任何權重變化,因為四舍五入操作可能總是返回相同的權重。然而,啟用隨機舍入可能會為NN提供轉變的機會,從而更新其參數。下面公式為在Int量化和二值量化的隨機舍入方式。
微調的方法
量化后,通常需要調整神經網絡(NN)中的參數。這可以通過retraining模型來執行,該過程稱為量化感知訓練(QAT),也可以在不retraining的情況下完成,該過程通常稱為訓練后量化(PTQ)。上圖顯示了這兩種方法之間的示意性比較(左圖為量化感知訓練,右圖為訓練后量化),並在下文進一步討論。
- 量化感知訓練(偽量化)
給定一個訓練好的模型,量化可能會對訓練好的模型參數引入擾動,這可能會將模型偏離以浮點精度訓練時收斂到的點。可以通過使用量化參數重新訓練NN模型來解決這個問題,以便模型能夠收斂到具有更好損失的點。一種流行的方法是使用量化感知訓練(QAT),其中通常的正向和反向傳遞是在浮點中對量化模型執行的,但模型參數在每次梯度更新后都會量化。特別是,在以浮點精度執行權重更新后,執行此投影非常重要。使用浮點執行向后傳遞非常重要,因為在量化精度中累積梯度可能會導致零梯度或具有高誤差的梯度,特別是在低精度中。
反向傳播中的一個重要微妙之處是如何處理不可微量化算子(公式1)。在沒有任何近似的情況下,這個運算符的梯度幾乎在任何地方都是零,因為在公式中的舍入操作是分段平面運算符。解決這個問題的一種流行方法是通過所謂的直通估計器(STE)近似該運算符的梯度。STE基本上忽略了舍入操作,並使用標識函數近似它,如下圖所示。
盡管STE是粗略近似的,但QAT已被證明有效。然而,QAT的主要缺點是重新訓練NN模型的計算成本。這種重新訓練可能需要執行幾百個epoch來恢復精度,特別是對於低位精度量化。如果量化模型要在很長一段時間內部署,如果效率和准確性特別重要,那么在重新訓練方面的投資可能是值得的。然而,情況並不總是這樣,因為有些模型的壽命相對較短。
- 訓練后量化
替代昂貴的QAT方法是訓練后量化(PTQ)執行量化和權重調整,不進行任何微調。因此,PTQ的開銷非常低,而且往往可以忽略不計。與QAT不同,QAT需要足夠數量的訓練數據進行再培訓,PTQ還有一個額外的優勢,即它可以應用於數據有限或未標記的情況。然而,與QAT相比,這通常是以更低的精度為代價的,尤其是對於低精度量化。
- Zero Shot(即data-free)
- 如目前所討論的,為了在量化后實現最小的精度下降,我們需要訪問整個或者部分訓練數據。首先,我們需要知道激活的范圍,以便我們可以剪裁值並確定適當的縮放因子(文獻中通常稱為校准)。其次,量化模型通常需要微調來調整模型參數並恢復精度下降。然而,在許多情況下,在量化過程中,不可能訪問原始訓練數據。這是因為訓練數據集要么太大,無法分發,要么是獨有的(例如Google的JFT-300M),要么是由於安全或隱私問題(例如醫療數據)而敏感的。目前提出了幾種不同的方法來解決這一挑戰,我們稱之為Zero Shot量化(ZSQ)。根據高通的一個工作的啟示[2],可以描述兩個不同級別的Zero Shot量化:
第1級:無數據,無微調(ZSQ+PTQ)。
第2級:無數據,但需要微調(ZSQ +QAT).
級別1允許更快、更容易的量化,而無需任何微調。微調通常很耗時,而且通常需要額外的超參數搜索。級別1可通過權重均衡或者BatchNorm的統計參數實現校正,無需微調。
然而,級別2通常會導致更高的精度,因為微調有助於量化模型恢復精度下降,特別是在超低位精度設置中。級別2微調的輸入數據主要通過GAN生成,可根據量化前的模型,使用GAN生成近似的分布數據,而無需再訪問外部數據。
Zero Shot(又名date-free)量化執行整個量化,而不訪問訓練/驗證數據。這對於希望加快客戶工作負載部署而無需訪問其數據集的提供商來說尤其重要。此外,這對於安全或隱私問題可能限制對訓練數據的訪問的情況非常重要。
2.4量化進階概念
- FP32,偽量化和定點量化
部署量化NN模型有兩種常見的方法,模擬量化(又名偽量化)和僅整數量化(又名定點量化)。在模擬量化中,量化的模型參數存儲在低精度中,但操作(如矩陣乘法和卷積)是用浮點算法執行的。因此,量化參數需要在浮點運算之前反量化,如圖上圖(中間)所示。因此,人們不能完全受益於快速高效的低精度邏輯與模擬量化。然而,在純整數量化中,所有操作都使用低精度整數算術執行,如上圖(右)所示。這允許整個推理可以用有效的整數算法執行,而不需要對任何參數或激活進行任何浮點反量化。
一般來說,使用浮點算法在全精度下執行推理可能有助於最終量化精度,但這是以無法從低精度邏輯中受益為代價的。低精度邏輯在延遲、功耗和區域效率方面與全精度邏輯相比具有多重優勢。與模擬/假量化相比,僅整數量化和二進量化更可取。這是因為僅整數使用較低精度的邏輯進行算術,而模擬量化使用浮點邏輯來執行運算。然而,這並不意味着偽量化永遠沒有用處。事實上,偽量化方法對帶寬限制而不是計算限制的問題是有益的,例如在推薦系統中,對於這些任務,瓶頸是內存占用空間和從內存加載參數的成本。因此,在這些情況下,執行偽量化是可以接受的。
- 混合精度量化
很容易看到,隨着我們使用較低精度量化,硬件性能得到了提高。然而,將模型均勻量化到超低精度可能會導致精度顯著下降。可以通過混合精度量化來解決這個問題。在這種方法中,每個層都以不同的位精度量化,如上所示。這種方法的一個挑戰是,選擇此位設置的搜索空間在層數上是指數級的。
目前提出了不同的方法來解決這一巨大的搜索空間。
a)為每個層選擇這種混合精度本質上是一個搜索問題,並且已經提出了許多不同的搜索方法。
b)另一類混合精度方法使用周期函數正則化來訓練混合精度模型,通過自動區分不同層及其在精度方面的變化重要性,同時學習它們各自的位寬。
c)HAWQ 引入了一種基於模型二階靈敏度的自動方法來查找混合精度設置。
混合精度量化已被證明是一種有效的硬件高效方法,用於不同神經網絡模型的低精度量化。在這種方法中,NN的層被分組為對量化敏感/不敏感,每個層使用高/低位。因此,人們可以最大限度地減少精度下降,並仍然受益於減少內存占用和低精度量化更快的加速。
- 硬件感知量化
量化的目標之一是提高推理時延。然而,並非所有硬件在量化某個層/操作后都提供相同的速度。事實上,量化的好處取決於硬件,片上內存、帶寬和緩存層次結構等許多因素都會影響量化速度。
考慮這一事實對於通過硬件感知量化實現最佳效益非常重要。因此需要模擬硬件延遲,在硬件中部署量化操作時,需測量不同量化位精度的每層的實際部署延遲。
- 蒸餾輔助量化
量化中一個有趣的工作路線是結合模型蒸餾以提高量化精度。模型蒸餾是一種使用精度較高的大模型作為教師,幫助訓練緊湊型學生模型的方法。在學生模型的訓練過程中,模型蒸餾提出利用教師產生的軟概率,而不是僅僅使用ground-true類標簽,該軟概率可能包含更多輸入信息。也就是說,總體損失函數包括學生損失和蒸餾損失。
- 極致量化
二值化是最極端的量化方法,其中量化值被限制為1位表示,從而將內存需求大幅降低32×。除了內存優勢外,二進制(1位)和三元(2位)操作通常可以使用位算術有效計算,並可以在更高精度(如FP32和INT8)上實現顯著的加速。然而,簡單的二值化方法將導致精度顯著下降。因此,有大量工作提出了不同的解決方案來解決這一問題,主要分為以下三類:
- 量化誤差最小化(使用多個二值矩陣組合模擬近似,或者使用更寬網絡)
- 改進損失函數(例如加入蒸餾損失)
- 改進訓練方法(如反向傳播時用更光滑的函數取代sign)
極低位精度量化是一條非常有前途的研究方向。然而,與基線相比,現有方法通常會導致高精度下降,除非執行非常廣泛的調諧和超參數搜索。但這種精度下降對於不那么關鍵的應用可能是可以接受的。
2.5未來量化方向
在這里,我們簡要討論了未來量化研究的幾個挑戰和機遇。這分為量化工具、硬件和NN架構的共同設計、聯合多種壓縮方法和量化訓練。
- 量化工具:
使用當前的方法,將不同的NN模型量化並部署到INT8是很簡單的,而不會明顯失去准確性。有幾個軟件包可用於部署INT8量化模型(例如,Nvidia的TensorRT、TVM等),每個軟件包都有良好的文檔。然而,用於低位精度量化的軟件並不廣泛可用,有時也不存在。例如,Nvidia的TensorRT目前不支持INT8以外的量化。此外,對INT4量化的支持直到最近才被添加到TVM中。使用INT4/INT8進行低精度和混合精度量化在實踐中有效和必要的,因此,開發用於低精度量化的高效軟件API將產生重要影響。 - 硬件和NN架構聯合設計:
如上所述,低精度量化的經典工作與機器學習的最新工作之間的一個重要區別是,神經網絡參數可能具有非常不同的量化值,但仍然可以很好地泛化近似。例如,通過量化感知訓練,我們可能會收斂到一個不同的解,遠離單一精度參數的原始解,但仍然獲得良好的准確率。人們可以利用這種自由度,也可以在NN架構被量化時調整它。例如,改變NN架構的寬度可以減少/消除量化后的泛化間隙。未來的工作之一是在模型被量化時聯合調整其他體系結構參數,如深度或單個內核。未來的另一項工作是將這種共同設計擴展到硬件體系結構。 - 聯合多種壓縮方法:
如上所述,量化只是有效部署NN的方法之一。其他方法包括高效的NN架構設計、硬件和NN架構的協同設計、剪枝和知識蒸餾、網絡框架搜索等。量化可以與這些其他方法結合使用。然而,目前很少有工作探索這些方法的最佳組合。例如,NAS聯合量化、剪枝和量化可以一起應用於模型,以減少其開銷,理解結構化/非結構化剪枝和量化的最佳組合非常重要。同樣,未來的另一個方向是研究這些方法與上述其他方法之間的聯合。 - 量化訓練:
也許量化最重要的用途是以半精度加速NN訓練。這使得使用更快、更節能的低精度邏輯進行訓練。然而,要把這一點進一步推到INT8精確訓練是非常困難的。雖然在這一領域存在一些有趣的工作,但所提出的方法通常需要大量的超參數調整,或者它們只適用於一些相對容易的學習任務的NN模型。基本的問題是,在INT8精度的情況下,訓練可能會變得不穩定和發散。解決這一挑戰可能會對多個應用程序產生很大影響,特別是對於前沿的訓練。
3.量化論文解讀
3.1Data-Free 量化
Data-Free Quantization Through Weight Equalization and Bias Correction[2]. (ICCV2019)
這是高通提出的一篇文章,提出Data-Free實現訓練后量化,文章中的主要創新點是提出了權重均衡和偏移糾正的方法。
如下圖(左)所示,同一層的卷積核值范圍分布極不均衡,而每通道量化又實現相對復雜和消耗額外的時間,因此提出對權重進行均衡化,如下圖(右)所示,經過均衡化后,整體值范圍分布相對均衡。
而權重均衡主要是利用了等價伸縮的原理,如公式
的等價,在卷積核全連接層中,對前一層權重的縮放可以通過縮放因子傳遞到下一層。
偏移糾正是因為在模型量化過程中數據會發生整體的偏移,因此通過計算偏移的誤差,然后對誤差進行抵消可實現更准確的量化效果。如下表所示,文章中提出的兩種方法在層量化的方式中可以實現與每通道量化接近的結果。
Post training 4-bit quantization of convolutional networks for rapid-deployment[3]. (NIPS2019)
該文章使用4bit精度實現了訓練后量化,提出了分析計算最佳剪輯范圍(ACIQ)和通道位寬設置。ACIQ提出以最小量化誤差為優化目標,通過優化的方式得到不同精度量化的最優裁斷值,同時還提出了在總bit精度固定的情況下,不同通道設置不同的精度進行量化,可以實現更加合適和准確的量化,但是不同通道設置不同的bit進行量化難以實現工業加速。下表展示了得到的實驗結果,在4bit量化下,模型下降2%左右的准確率。
Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks[4].(ICCV2019)
對於低比特量化,如二量化可以有效地加速推理,同時降低深度神經網絡的內存消耗,這對於在資源有限的設備(如嵌入式設備)上部署模型至關重要。然而,由於低比特量化的離散性,現有的量化方法往往面臨訓練過程不穩定和性能嚴重下降的問題。為了解決這一問題,該文章提出了一種可微軟量化(DSQ)方法來彌補全精度網絡和低比特網絡之間的差距。DSQ可以在訓練過程中自動進化,逐步逼近標准量化,如下圖所示。由於DSQ的可微性,在適當的限幅范圍內,DSQ可以在后向傳播中跟蹤精確的梯度,減少前向過程中的量化損失。
DSQ采用一系列雙曲正切函數逐步逼近階梯函數進行低比特量化(如1比特情況下的符號函數),同時保持平滑性,便於梯度計算。該文章針對一個近似特征變量重新構造了DSQ函數,並相應地發展了一種進化訓練策略來逐步學習微分量化函數。在訓練過程中,DSQ和標准量化之間的近似值可以由特征變量控制,特征變量和限幅值可以在網絡中自動確定。DSQ減少了由極低比特量化引起的偏差,從而使訓練中的前向和后向過程更加一致和穩定。
下表可以看到該方法在較低比特量化的情況下,與FP32相比,基本沒有准確率退化。
Mixed Precision Quantization of ConvNets via Differentiable Neural Architecture Search[5].(ICLR2019)
如上圖所示,該論文提出了可微分NAS(DNAS),該NAS方法將候選操作以概率θ隨機激活,而非直接的softmax進行加權,並且概率θ作為搜索過程中可以優化的參數。由於DNAS前期初始化以相等的概率進行隨機激活操作,而在訓練后期概率θ會出現明顯的差異化,因此DNAS在前期訓練時似DARTS,而后期似ENAS。
為了實現混合精度的量化,該論文在DNAS的基礎上,將不同bit量化作為不同的結構(如下圖所示),搜索優化得到不同層不同的量化精度。
通過可微分搜索得到混合精度量化,如下表所示,在Cifar10數據集上,可以做在10倍以上加速的條件下,量化后准確率還略高於FP32。
APQ: Joint Search for Network Architecture, Pruning and Quantization Policy[6]. (CVPR2020)
該論文提出了APQ,用於在資源受限硬件上高效的深度學習推理。與以前分別搜索神經架構、剪枝策略和量化策略的方法不同,該論文以聯合的方式優化它們。為了應對它帶來的更大的設計空間,提出訓練一個量化感知的精度預測器,以快速獲得量化模型的精度,並將其反饋給搜索引擎,以選擇最佳擬合。
然而,訓練這種量化感知精度預測器需要收集大量量化的模型、精度配對,這涉及量化感知微調,因此非常耗時。為了應對這一挑戰,該論文提出將知識從全精度(即fp32)精度預測器轉移到量化感知(即int8)精度預測器,這大大提高了樣本效率。此外,收集fp32精度預測器的數據集只需要通過從預先訓練的once-for-all[7]網絡中采樣來評估神經網絡,而不需要任何訓練成本,這是高效的。下圖為從全精度預測器遷移訓練量化感知的准確率預測器的過程。
下表為在ImageNet數據集上的結果:
參考文獻:
- A Survey of Quantization Methods for Efficient Neural Network Inference.
- Data-Free Quantization Through Weight Equalization and Bias Correction, ICCV2019.
- Post training 4-bit quantization of convolutional networks for rapid-deployment, NIPS2019.
- Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks, ICCV2019.
- Mixed Precision Quantization of ConvNets via Differentiable Neural Architecture Search, ICLR2019.
- APQ: Joint Search for Network Architecture, Pruning and Quantization Policy, CVPR2020.
- Once for all: Train one network and specialize it for efficient deployment,ICLR2020.
- Binary Neural Networks: A Survey, Pattern Recognition, 2020.
- Forward and Backward Information Retention for Accurate Binary Neural Networks, CVPR2020.