閒話模型壓縮之量化(Quantization)篇

1. 前言

這些年來,深度學習在衆多領域亮眼的表現使其成爲了如今機器學習的主流方向,但其巨大的計算量仍爲人詬病。尤其是近幾年,隨着端設備算力增強,業界湧現出越來越多基於深度神經網絡的智能應用。爲了彌補算力需求與供給的鴻溝,近幾年來模型壓縮成爲了業界的熱點之一。模型壓縮又可細分爲多個子方向。之前在《淺談端上智能之計算優化》中有過一些簡單的論述,同時在《閒話模型壓縮之網絡剪枝(Network Pruning)篇》中更加具體地整理了些關於網絡剪枝(network pruning)的東西,本文就再將目光放到另一類方法上-量化(Quantization)。模型量化可以帶來多方面的好處:

  • 計算效率提升:很多處理器整數計算指令都要比相應的浮點計算高效。以CPU爲例,浮點運算指令的latency平均會長於對應的整數運算指令,早期的CPU尤其如此。對於FPGA來說,浮點運算就更麻煩了。而且乘法的複雜度通常與操作數bit-width的平方成正比,因此將表示精度降低可以有效降低複雜度。
  • 內存和存儲佔用減少:量化對模型的『瘦身』效果可謂立杆見影,它所帶來的好處是兩方面的:其一,減少memory footprint。我們知道很多時候推理性能的瓶頸不在於計算而在於訪存,在這種情況下提高計算密度會對耗時有顯著的優化效果;其二,節省存儲空間,減少應用的size,同時便於軟件的升級更新。
  • 減少能耗:我們知道功耗主要來自計算和訪存兩部分。一方面 ,以乘加運算爲例,8位整型與32浮點相比能耗可有數量級的差異。另一方面,訪存是耗電大戶。假設原本只能放在DRAM中的模型經過量化能放入SRAM,那不僅提升性能,而且減少了能耗,簡直完美。

正如其它模型壓縮方法一樣,對模型的量化基於一個共識。那就是複雜的、高精度表示的模型在訓練時是必要的,因爲我們需要在優化時捕捉微小的梯度變化,然而在推理時並沒有必要。也就是說,網絡中存在很多不重要的參數,或者並不需要太細的精度來表示它們。另外,實驗證明神經網絡對噪聲魯棒,而量化其實也可看作是噪聲。這就意味着我們在部署模型前可以將之化簡,而表示精度降低就是化簡的重要手段之一。我們知道,大多深度學習訓練框架默認下模型的參數是32位浮點的,計算也是32位浮點的。模型量化的基本思想就是用更低精度(如8位整型)來代替原浮點精度。聽起來似乎非常的簡單,但是細看之下會發現這個坑比想象中大得多。從相關的文獻可以看到各大巨頭公司都或多或少地參於其中,似乎成爲了兵家必爭之地。量化最核心的挑戰是如何在減少表示精度的同時不讓模型的準確度掉下來,即在壓縮率與準確率損失間作trade-off。這就衍生出很多有趣的子問題,比如量化對象是什麼(weight,activation,gradient),量化到幾位(8位,4位,2位,1位),量化參數(如step size,clipping value)如何選擇,量化參數是否可以自動優化,不同層是否需要不同的量化參數,如何在量化後恢復準確率或者在訓練時考慮量化,等等。。。

2. 原理與分類

這裏先非常簡單列一下基本原理。 由於相關的介紹與文獻非常多,這裏不細展開,主要爲了統一下術語。對於典型的浮點到整型的量化,其本質上是將實數域中的某一段映射到整數。如果使用的是線性量化,其一般形式可表示爲:
q=round(sx+z) q = round(s * x + z)
其中的xxqq分別爲量化前和後的數,ss稱爲scaling factor,zz稱爲zero point。這個zero point即是原值域中的0在量化後的值。在weight或activation中會有不少0(比如padding,或者經過ReLU),因此我們在量化時需要讓實數0在量化後可以被精確地表示。

爲使量化後在指定位數整數表示範圍內(如nn位),這裏scaling factor可以取:
2n1maxxminx \frac {2^n - 1}{\max_x - \min_x}
其中minx\min_xmaxx\max_x分別爲量化對象(如weight或activation)的dynamic range下界與上界。那麼問題來了,如果這個dynamic range很廣,或者有些很離奇的outlier,那這樣做就會便得比特位被浪費在那些並不密集的區域,導致信息的丟失。因此,還有種做法就是對dynamic range先做clip,把那些含信息少的區域切掉。即:
q=round(sclip(x,α,β)+z) q = round(s * clip(x, \alpha, \beta) + z)
其中α\alphaβ\beta分別爲clip的上下界,作爲量化參數clipping value。這個取值也是門藝術,大了浪費比特位,小了把就把太多有用信息“切”掉了,如何選取後面會再討論。

以上方法中由於對原值域和量化後值域都不要求關於0對稱,故稱爲非對稱(Asymmetric)量化。如果將上面的zero point設爲0,則稱爲對稱(Asymmetric)量化。可以說對稱量化是非對稱量化的特例。另外因計算機內部用補碼錶示,其表示範圍不是關於0對稱的。因此對於對稱量化,會將整型值域最小值去掉,如8位有符號整型表示範圍[-128, 127],截取後變成[-127, 127]。這樣整型值域纔是直正的對稱,否則會產生偏差。相比而言,非對稱量化優點是能夠更充分利用比特位,因爲對於對稱量化而言,碰到dynamic range關於0兩邊嚴重不對稱的話(比如經過ReLU後的activation),會比較低效。但這也是有代價的,即計算更加複雜。以乘法爲例,對於對稱量化來說,量化後乘法只是原值乘法再乘以一個縮放因子:sxxsyy=sxsyxys_x x * s_y y = s_x s_y xy;而對於非對稱量化來說,就要複雜一些了:(sxx+zx)(syy+zy)=sxsyxy+sxxzy+syyzx+zxzy(s_x x + z_x) * (s_y y + z_y) = s_x s_y xy + s_x x z_y + s_y y z_x + z_x z_y。總得來說,對稱與非對稱量化各有利弊,得看用在什麼地方。如實際中weight的分佈通常是關於0對稱的高斯分佈,那比較適用用對稱量化。而ReLU後的activation是沒有負數的,因此適用於非對稱量化。另外,如果非對稱量化中整個值域都落在正區間,那就可以用無符號整型表示,否則用有符號整型。

量化方法還分爲均勻(Uniform)量化與非均勻(Non-uniform)量化。最簡單就是讓量化的等級間距離相等,這類量化稱爲均勻量化。但直覺上這樣會有更多的信息丟失,因爲一般來說dynamic range中肯定有些區域點密集,有些稀疏。相應地,有均勻量化就有非均勻量化,它是指量化等級間不等長,如log quantization。再高級一點,那就是通過學習來得到更大自由度的映射(可通過查找表表示)。直覺上,非均勻量化似乎能達到更高的準確率,但它的缺點是不利於硬件加速。

對於量化對象,主要有以下三個。當然,實際中可能是量化其中的多個甚至全部。

  • weight(權重):weight的量化是最常規也是最常見的。量化weight可達到減少模型大小和memory footprint等目的。
  • activation(激活函數輸出):實際中activation往往是佔內存使用的大頭,因此量化activation不僅可以大大減少memory footprint。更重要的是,結合weight的量化可以充分利用整數計算獲得性能提升。
  • gradient(梯度):相對上面兩者略微小衆一些,因爲主要用於訓練。它主要作用是在分佈式計算中減少通信開銷,單機訓練時也可減少backward時的開銷。

對於量化位數,可以有很多種選擇。大體可分爲幾類:

  • float16量化是比較保險的做法,大多數情況下可以不丟失太多精度的情況下有明顯的性能提升。因爲都是浮點,相對來說容易,就不細展開了。
  • 8位是比較常見的,也是相對成熟的。相關的研究很多,各種主流框架也基本都支持。
  • 8位以下目前而言學界相對玩得多些,工業界有少量支持,但還沒有太成熟。8位以下主要是4,2和1位(因爲位數爲2的冪次性能會更好,也更容易實現)。如果精度低至1位,也就是二值化,那可以用位運算進行計算。這對處理器而言是很友好的。

按量化過程中是否需要進行訓練可分爲兩類:

  • PTQ(Post-training quantization):顧名思義,就是在模型訓練後做的量化。又可細分爲兩種:
    • 需要calibration數據,這些數據主要用來統計得到量化參數,因此是不需要打標的,一般百來張即可。
    • 完全不需要數據集。這適用於那些完全拿不到訓練環境和數據的場景。
  • QAT(Quantization aware training):又可分是要從頭訓練還是fine-tuning。基本上到4位及以下量化由於信息丟失較多,因此很多方法中(也不絕對)需要訓練介入。

一般來說,QAT可以得到更高的準確率,但同時也會有更強的假設,就是有訓練數據,訓練環境和所需的成本。在一些場景下這個假設很難滿足。比如雲服務上,對於給定的模型,不可能還要求提供數據和訓練環境。

以量化參數的共用範圍或者說粒度來分,可分爲:

  • Per-axis/per-channel:對tensor的單個軸有單獨的量化參數,如per-channel就是weight的每個channel使用單獨的量化參數。
  • Per-tensor/per-layer:每個tensor有單獨的量化參數。對於卷積或全連接層這些的話這也就意味着每層獨立的量化參數。
  • Global:即整個網絡使用相同的量化參數。一般來說,對於8位量化,全局量化參數影響不明顯,但到更低精度,就會對準確率有較大影響。

3. 業界方法

其實很早就有對神經網絡量化的研究,如1990年Fiesler等人的《Weight Discretization Paradigm for Optical Neural Networks》。而今天,深度學習的興起和對準確率的追求使得神經網絡越來越重,因此這方面的需求也重新成爲了熱點。

3.1 基於壓縮的方法

量化最簡單粗暴的做法的是rounding。2015年IBM的論文《Deep Learning with Limited Numerical Precision》中描述了兩種將浮點轉爲定點的rounding方法:一種是Round-to-nearest,即就近取整;另一種是Stochastic rounding,即以一定概率(與向下取整點的距離成正比)確定向上還是向下取整。與前者相比,它是一種無偏的估計。

另外一個直觀的思路就是將之看作一個數據壓縮問題。2016年Stanford、清華和NVIDIA的經典論文《Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding》中的量化部分就是採用了先將weight進行聚類,生成codebook,再通過weight sharing達到對weight壓縮的目的。數據壓縮中VQ(Vector quantization)是一類常見的方法,它在最近鄰搜索問題中應用得比較多,其基本思想是將D維空間的數映射到codebook(包含codeword的集合)中的codeword。這種映射就稱爲quantizer。像K-means,product quantization都屬於此類方法。K-means任何一本機器學習教材都會詳細說,不多說。PQ(Product quantization)主要針對空間非常大以至codeword指數增加的情況,它將原向量空間分爲M個低維子空間(將D維空間向量看作M個D/M維子向量的聯接),並且將每個子空間進行量化,最後將這些codeword進行聯接。感覺VQ/PQ的路子Facebook是比較喜歡的,似乎在這個方向上一直有研究。從2014年的論文《Compressing Deep Convolutional Networks using Vector Quantization》將之引入神經網絡的weight量化到2019年的《And the Bit Goes Down: Revisiting the Quantization of Neural Networks》通過最小化activation的reconstruction error提升PQ效果,再到2020發表的論文《Training with Quantization Noise for Extreme Model Compression》提出在每次迭代中只隨機選取一部分weight做量化,從而減少STE帶來的梯度估計偏差影響。另外,2015年華盛頓大學與NVIDIA的論文《Compressing Neural Networks with the Hashing Trick》中提出HashedNets用於神經網絡中weight間的隨機共享。爲了降低內存使用,它使用hash來建立共享的映射關係。

3.2 如何確定量化參數

前面的討論還遺留下來一個靈魂拷問,即量化會帶來精度損失,那怎麼選取量化時所用參數(如scaling factor,zero point,clipping value)可以儘可能地減少對準確率的影響呢。量化誤差來自兩方面,一個是clip操作帶來的,一個是round操作帶來的。而這兩者間是有trade-off關係的。總得來說,選取合適的量化參數是非常考究的問題,事實上大多數業界的研究正是爲了解決這個問題。業界主要有如下幾類方法,其實和之前network pruning中介紹的幾類方法的精神是類似的。

3.2.1 基於統計近似的方法

對於均勻量化中的量化參數clipping value,除了手工設定之外,一個簡單的做法就是統計下要量化的對象,取最大值和最小值。但這樣的問題在於如果有outlier,就會使得clipping value的絕對值很大,從而影響要量化區間的精度。2016年Stanford的論文《Convolutional Neural Networks using Logarithmic Data Representation》提出了一種非均勻量化方法,即將weight和activation在log域中進行表示,並給出了在該表示下將向量乘加用位運算實現的方法。它的clipping value是一個超參,通過少量數據tune出來的。文中指出相比線性均勻量化,這種方法對量化更加魯棒。2018年Intel的論文《Highly Efficient 8-bit Low Precision Inference of Convolutional Neural Networks with IntelCaffe》主要討論了Intel優化版Caffe中對於8位精度推理的支持。它基於經典的線性量化建模,其中的scaling factor參數通過基於calibration數據集來統計量化對象的最大值來得到。2019年上海科技大學與商湯的論文《Fully Quantized Network for Object Detection》提出基於percentile的activation clamping方法。它從訓練集中採樣一部分作爲calibration set,然後在這個集合上進行模型推理並記錄它的activation。假設activation爲高斯分佈,通過統計得到均值和方差,然後基於γ\gamma-th和(1γ)(1-\gamma)-th percentiles來進行weight clipping。2020年得克薩斯大學和Google Brain的論文《Post-training Quantization with Multiple Points: Mixed Precision without Mixed Precision》提出multi-point quantization,使用低位數據的多個向量的線性組合來近似,而傳統方法中使用單個低精度數的方式。該方法通過貪心選擇來構建multi-point quantization,然後基於與輸出的誤差自適應地決定低精度點的數量。

3.2.2 基於優化的方法

定義誤差的測度爲優化目標,然後利用優化方法來求解。這樣問題就歸結爲如何定義誤差。一種常見的是量化誤差(Quantization error),設量化函數爲Q(w)Q(w),那目標就是對於輸入數據分佈,使量化誤差最小化,可形式化爲:
Q(x)=argminQp(x)(Q(x)x)2dx Q^*(x) = \mathop{\arg\min}_{Q} \int p(x) (Q(x) - x)^2 dx
不少的方法都是基於該目標或類似目標。

2017年大疆的論文《Towards Accurate Binary Convolutional Neural Network》提出ABC-Net(Accurate-Binary-Convolutional)以量化誤差爲優化目標。它比較特色的是將weight和activation表示成一系列二進制基的線性組合。如weight可表示爲Wi=1MαiBiW \approx \sum_{i=1}^{M} \alpha_i B_i,其中BiB_iWW同維度但元素爲-1或+1。這樣,優化問題就是一個線性迴歸問題。這種方式與類似的多bit-width量化方案相比,在計算上有優勢。如在計算時能將輸出限制在{-1, +1},從而節省硬件資源。2017年阿里巴巴的論文《Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM》解耦了連續空間中的參數學習和量化所要求的離散化約束,將量化模型的訓練建模爲MIP(Mixed integer programming)問題。通過引入輔助變量,使問題變成可用ADMM(Alternating Direction Method of Multipliers)來解的形式。ADMM的每步迭代分爲三步:連續空間下的proximal step,離散空間下的projection step和dual update。這樣就將原NP-hard問題分解爲多個更易解的子問題。2018年微軟在論文《LQ-Nets: Learned Quantization for Highly Accurate and Compact Deep Neural Networks》中提出非均勻量化方法LQ-Nets,在訓練中同時學習weight和quantizer。它可對weight和activation進行任意位精度的量化。爲了使量化對位運算兼容,它將quantizer建模成一系列浮點數組成的basis vector(替換傳統的[1,2,...,2K1][1, 2, ..., 2^{K-1}])的線性組合。訓練過程中weight還是與傳統方法一樣訓練,而量化參數是在forward中通過QEM(Quantization Error Minimization)算法優化求解的。QEM目標是最小化量化誤差,它通過交替最小化編碼係數與basis vector來進行迭代優化 。2018年Intel與以色列理工學院的論文《Post Training 4-bit Quantization of Convolutional Networks for Rapid-deployment》提出ACIQ方法,它適用於weight和activation,且不需要訓練。以最小化tensor級別的量化誤差爲優化目標,並給出最優clipping value和bit-width的解析解。類似地,2019年華爲的論文《Low-bit Quantization of Neural Networks for Efficient Inference》也基於MSE來找最優的clipping value。2019年華爲的另一論文《Low-bit Quantization of Neural Networks for Efficient Inference》將線性量化任務形式化爲Minimum Mean Squared Error(MMSE)問題,然後用迭代方式求解。它針對weight與activation,可以量化到4位,且不需要網絡的fine-tuning。只是在一些步驟中(如activation量化,scaling factor refinement)需要calibration data。2020年Samsung的論文《Post-Training Piecewise Linear Quantization for Deep Neural Networks》提出了一種post-training量化方法Piecewise linear quantization(PWLQ)。它主要針對具有長尾的bell-shaped分佈。該方法將量化範圍切分成不相交的區域,每個區域賦於相同的量化水平。最優的切分點是通過最小化量化誤差來得到的。

之前很多基於優化方法的工作將最小化量化誤差作爲目標。但最小化量化誤差是否就意味着loss最小呢?只能說前者是後者的一個思路,但並不等同。顯然,後者纔是我們更關注的東西。因此,也有些基於優化的工作開始將loss納入考慮 。2016年香港科技大學的論文《Loss-aware Binarization of Deep Networks》直接關於二值化的weight最小化loss,然後用proximal Newton算法,其中的Hessian矩陣通過Adam optimizer中的second moments進行近似。2018年香港科技大學的論文《Loss-aware Weight Quantization of Deep Networks》用類似的思路拓展到三值化網絡。2019年Intel和以色列理工學院的論文《Loss Aware Post-training Quantization》從量化參數對於loss的表面形態影響出發,指出對於小bit-width量化,loss函數表面會變得非常凹凸陡峭(以Gaussian curvature爲測度),層間的step size相互依賴也更明顯,從而讓最優量化參數的選擇變得十分困難。另外,有時傳統基於L2L_2範數的MSE未必達到最好的準確率。基於這些考慮,文中提出一個三階段方法-LAPQ(Loss aware post-training quantization),它優化的目標爲相對於step size的網絡損失函數。首先,考慮單層找到多種LpL_p範數下最小化量化誤差的step size。然後,基於前一步的結果採樣,再通過插值得到二次函數近似並找到最優解。最後,以前一步得到的最優解爲初始值,通過gradient-free優化方法(Powell’s method)進一步得到最終最優解。

3.2.3 基於可微分的方法

主要思想是使優化目標相對於量化參數可微,這樣就可以通過SGD在訓練網絡時順便也把量化參數給學習了。而且這個訓練以準確率爲目標,不會像上面優化方法中一樣,優化目標與最終目標還存在偏差。2018年三星和KAIST的論文《Joint Training of Low-precision Neural Network with Quantization interval Parameters》提出QIL(Quantization interval learning)方法。它將weight與activation的量化區間作爲可學習參數,對於每一層通過兩參數指定區間的中心與到中心的距離。在訓練模型同時也學習量化參數。2018年IBM的論文《PACT: Parameterized Clipping Activation for Quantized Neural Networks》提出PACT(PArameterized Clipping acTivation)方法。它將ReLU替換成帶clipping參數的激活函數,並且在訓練中優化它來找到scaling factor。PACT允許activation量化到任意bit-width。論文表明在大量的模型和數據集上,將weight和activation同時量化到4位可以維持和原始精度模型類似的準確率。2018年IBM又在論文《Bridging the Accuracy Gap for 2-bit Quantized Neural Networks》中將適用於activation的PACT方法與用於weight的SAWB(Statistical-aware weight binning)方法結合,用於2位的量化。SAWB基於訓練時採集的統計信息以最小化MSE爲目標找到最優的scaling factor。2019年Sony在論文《Differentiable Quantization of Deep Neural Networks》中提出DQ(Differentiable Quantization)方法,通過構造可微的量化器,可以通過梯度下降來學習每個weight和activation的量化參數,如step size, dynamic range,然後可以推導出bit-width。2019年IBM的論文《Learned Step Size Quantization》將基於學習的方法拓展到step size,並提出LSQ(Learned Step Size Quantization)方法,它延續了將step size作爲可訓練參數(每層有單獨的step size),然後在訓練過程中進行學習的做法。文中主要提出一種量化函數關於step size參數的梯度計算方法。與之前的QIL與PACT方法相比,這種梯度對於transition point敏感,符合在transition point處step size的變化會引起量化後值大的變化的intuition。另外提出對step size梯度進行縮放以保證其數值大小上與weight的梯度差不多。該方法在將weight和activation都量化到2,3,4位時仍能在ImageNet這樣的大型數據集上達到高準確率,尤其是3位的量化網絡能達到全精度網絡的準確率。2019年中科大、阿里與南加州大學發表的論文《Quantization Networks》提出一種可應用於weight與activation且適用於任意位量化的方法。它將量化函數形式化爲可微分的非線性函數。量化函數被表示爲一些sigmoid函數的線性組合,這些sigmoid函數具有可學習的參數。這樣,便可以以一種end-to-end的方式來學習這些量化參數。2019年北航,商湯和北京理工的論文《Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks》提出DSQ(Differentiable Soft Quantization)方法。它通過分段的tanh函數構建可微的soft quantization function,二值量化是其特殊形式。因爲該函數相對於量化參數可微,因此可以在網絡的訓練中一起學習。

3.2.4 基於貝葉斯的方法

貝葉斯方法以其優雅的理論基礎一直是機器學習中非常流行的方法。在模型壓縮領域也不例外。2017年阿姆斯特丹大學的論文《Bayesian Compression for Deep Learning》將weight以group爲單位,並引入使weight稀疏的先驗,再基於變分推理方法估計後驗分佈,最後基於後驗分佈的variance確定每層最優的bit-width。同年阿姆斯特丹大學另一篇論文《Soft Weight-Sharing for Neural Network Compression》基於soft weight-sharing的思想,在re-training過程中同時做了quantization和pruning。Soft weight-sharing體現在針對weight使用高斯混合模型(GMM)作爲先驗,然後將variational lower bound(negative variational free energy)作爲目標,通過gradient descent進行優化,同時學習weight與GMM中的參數。在後處理中,將weight設爲它所在component的均值,同時通過component間KL divergence爲測度,合併小於指定閥值的兩個component。2017年俄羅斯斯科爾科沃創新中心等機構的論文《Variational Dropout Sparsifies Deep Neural Networks》將之貝葉斯理論中的變分推理方法用於網絡模型的裁剪。它擴展Variational Dropout並提出Sparse VD(Variational Dropout)方法。它將weight表示成參數θ\theta與高斯噪聲N(1,α)\mathcal{N}(1, \alpha)的乘積,使weight變成以θ\thetaα\alpha爲參數的高斯分佈並對其施加log-uniform先驗(它可以使weight變得稀疏),然後以SGVB(在variational lower bound上使用reparameterization trick得來,具體見《Auto-encoding Variational Bayes》)爲優化目標學習參數,最後通過學習到的參數與給定閥值比較決定對特定weight是否要做裁剪。2018年Bosch和亞琛工業大學的論文《Variational Network Quantization》擴展了Sparse VD方法提出VNQ(Variational Network Quantization)將變分推理方法引入量化任務。我們知道貝葉斯方法中先驗的設計是很tricky的。本文針對量化引入了multi-modal的先驗(稱爲quantizing prior),該先驗分佈在codebook中值(如[-r, 0, r])會有"spike"。然後通過最大化ELBO得到最優的變分參數。由於先驗的影響,參數的後驗會聚集在幾個codebook中的值上,接着就可以對每個weight通過argmax得到它該量化爲codebook中的那個。2019年北航和百度等機構發表的論文《Bayesian Optimized 1-Bit CNNs》利用貝葉斯學習來提升bit-width爲1的CNN的表現,提出了BONNs(Bayesian optimized 1-bit CNNs)方法。它在loss中引入雙峯高斯混合模型作爲先驗分佈,使後驗分佈趨向於雙峯。該模型可以通過SGD方法進行end-to-end的訓練。

3.3 讓模型更容易量化

之前的主要思路是給定一個訓練好的網絡,如何找到最優的量化參數。對於量化目標對象,其分佈影響着量化的效果。即有些分佈利於量化,而有些分佈不利於量化。因此,一個改進的思路就是如何讓量化目標對象的分佈變得更適合量化(所謂適合就是量化後不容易掉準確率)。2019年康奈爾大學的論文《Improving Neural Network Quantization without Retraining using Outlier Channel Splitting》針對weight/activation的分佈中的outlier,提出outlier channel splitting(OCS)。它基於功能不變的網絡變換,使outlier往中間靠。網絡經過修改後,按常理是要重新訓練的,但文中使用了Net2Net方法來給出新結構中的weight從而節省了訓練開銷。2019年高通的《Data-Free Quantization Through Weight Equalization and Bias Correction》提出DFQ(Data-free quantization)。作爲一種8位量化方法,它不需要fine-tuning和超參選取。該方法利用了激活函數的scale-equivalence性質(即對於一個層,單獨的output channel可以被縮放,只要它的下一層被相應地反向縮放),對網絡中的weight range進行跨層的均衡。對於引入的bias通過bias correction對其進行吸收。這樣處理後更適合量化。DFQ算法主要分四個階段:cross-layer equalization,bias absorption,Quantization,bias correction。2019年Hailo發表的論文《Same, Same But Different:Recovering Neural Network Quantization Error Through Weight Factorization》也給出了類似的觀點,即對於給定層,單獨的output channel可以乘以一個縮放因子,只要下一層的相應weight乘以這個縮放因子的相反數。這種改變網絡的weight但不改變其功能(即輸出)的equivalent weight arrangement,可以用來減少量化帶來的degradation。在量化中,每一個層的dynamic range都是被具有最大絕對值的channel(稱爲dominant channel)確定的,而其它的channel如果能增大到與這個dominant channel差不多的話便可以減少量化帶來的噪聲,前提是下一層需要做相應的補償。2020年Intel與以色列理工學院的論文《Robust Quantization:One Model to Rule Them All》引入KURE(KUrtosis REgularization)項加入到模型的損失函數中。通過特定kurtosis值,可以讓模型分佈適應量化噪聲有高的容忍度。文中從理論上證明了相對於正態分佈,均勻分佈對量化參數的變化更加魯棒,而通常情況下weight和activation趨向於正正態分佈。這樣的好處是在佈署模型時,如果由於低精度加速硬件的限制需要使用不同的量化參數(如step size),不會引起大的準確率損失。而傳統的如QAT方案,需要在訓練時確定量化策略,一旦訓練好後模型其實就和所選量化策略綁定了。這時一旦加速硬件不支持就很麻煩。

不僅量化目標對象的分佈對量化效果有影響,網絡結構的調整也可用於提升量化效果。2017年Intel在論文《WRPN: Wide Reduced-Precision Networks》中提出WRPN(Wide reduced-precision networks)。文中指出當batch size增大,activation所佔memory會隨之增大。當batch size到128時,訓練時activation達到98%的memory footprint。文中提出的主要方法是通過增加filter map(即加寬layer)的方式補償精度損失。文中指出對於許多網絡(如AlexNet, ResNet-34和Inception),2位的weight和4位的activation足夠保持模型準確率。2019年高通在論文《A Quantization-Friendly Separable Convolution for MobileNets》提出在MobileNet V1中主要引起量化誤差的是BN和ReLU6,然後它提出了一種對量化友好的深度可分離卷積。文中指出定點量化過程中會引入5種精度損失:input quant loss, weight quant loss, runtime saturation loss, activation re-quantization loss和可能的clipping loss。它使用SQNR(Signal-to-quantization-noise ratio),即量化的信噪比來衡量誤差。注意用於量化weight的最大/最小值是基於所有channel的,但有些channel中會出現都是0(MobileNet V1中常見),從而使quant range變得很大,這稱爲zero-variance issue。

3.4 量化中的訓練

PTQ因爲是拿已有的32位精度模型進行量化,對數據集和訓練環境沒有依賴。實際中對於大型模型通常效果很好,但對於小模型會引起較大的準確率損失。因此,爲了降低量化後準確率的損失,不少方法會在訓練時引入量化操作。但問題來了,神經網絡的訓練是基於鏈式求導法則,但量化操作是個階躍函數,它的導數要麼不存在要不爲0。這就給基於鏈式求導的神經網絡訓練帶來了麻煩。針對該問題,業界有一些方案,比較經典的有:

  • 使用最廣泛的可能就是STE(Straight through estimator)了。由2012年Hinton的《Coursera Lectures: Neural Networks for Machine Learning》和Bengio等人2013的論文《Estimating or propagating gradients through stochastic neurons for conditional computation》提出。思路和做法都很簡單,它就用把量化操作的導數用1近似,也就是說做backward時有和沒有量化操作是一樣的。在量化到8位以下時它會帶來較大誤差影響準確率。STE本質上是量化函數梯度的近似,它會導致forward和backward時激活函數不一致(如sign vs. hard tanh),所以會有gradient mismatch problem。
  • 另一思路是既然量化函數不可微,那就用一個可微的函數近似或逼近它。2016年Google,劍橋大學與斯坦福的論文《Categorical Reparameterization with Gumbel-Softmax》與DeepMind與牛津大學的《The Concrete Distribution: A Continuous Relaxation of Discrete Random Variables》針對網絡中需要對categorical distribution採樣的情況,提出了一種連續可微的estimator(在兩篇文章中分別稱爲Gumbel-Softmax distribution和Concrete distribution)。2018年阿姆斯特丹大學,QUVA Lab和高通的論文《Relaxed Quantization for Discretized Neural Networks》提出Relaxed Quantization方法。它將前面的思想引入量化,將weight與activation看作是quantization grid上的categorical distribution,結合前述方法,就可以定義一個完全可微的量化過程,從而利用stochastic gradient優化方法。2017年清華大學與伊利諾伊大學芝加哥分校的論文《HashNet: Deep Learning to Hash by Continuation》中提出基於continuation method,從一個光滑的目標函數開始,隨着訓練的進行讓之逐漸變得不光滑,從而逼近原問題。具體來說,對於不光滑的sign函數,用帶參數的tanh函數來逼近。
  • 再就是EBP方法。2014年哥倫比亞大學和以色列理工學院的論文《Expectation Backpropagation: Parameter-Free Training of Multilayer Neural Networks with Continuous or Discrete Weights》基於變分貝葉斯方法,將EP(Expectation Propagation)引入帶神經網絡的訓練,提出了EBP(Expectation BackPropagation)算法,可適用於連續或離散的weight。

如何更有效地訓練低精度量化網絡仍是一個持續討論的問題。業界還有不少相關的工作,如2017年華盛頓大學的論文《Deep Learning as Mixed Convex-Combinatorial Optimization Problem》中將量化模型的學習建模成mixed convex-combinatorial優化問題。基本思路是先通過組合優化方法找到層的輸入輸出(稱爲target)的可行解,然後在給定的這些可行解下再優化weight。2017年阿德萊德大學等機構的論文《Towards Effective Low-bitwidth Convolutional Nerual Networks》考慮了量化網絡訓練難的問題,提出了三種方法優化訓練過程。一是將weight與activation分開量化的兩階段優化策略。二是progressive優化方法,即逐步降低bit-width。三是高精度與低精度模型聯合訓練。2019年Hailo Technologies的論文《Fighting Quantization Bias With Bias》指出對於一些適合端上的輕量網絡(如MobileNet)由於參數冗餘度較小,量化會給activation帶來比較明顯的均值偏移,稱爲MAS(Mean activation shift)。文中給出的解決方案是通過bias項來作補償,並基於這個基本思想提出了IBC(Iterative bias correction)與BFT(Bias fine tuning)兩種方法。

3.5 超低精度量化

超低精度(Ultra-low precision)量化是這幾年一直很火的topic。這裏的超低精度量化指的1位或者2位的量化。這類量化會引起非常大的精度損失,所以也需要一些非常手段來維持準確率,值得專門聊一下。在超低精度量化中,最極端的就是將bit-width限制爲1位,即二值化網絡。除了模型大小的數十倍減少外,更加吸引人的是這樣就可以用硬件友好的位運算來代替耗時的乘法。 對於元素爲-1和1的兩個NN維向量xxyy,它們的內積可以表示爲xy=N2popcount(xnor(x,y))x \cdot y = N - 2 \cdot \text{popcount}(\text{xnor}(x, y))

比較早期的工作有2014年的首爾大學的論文《Fixed-point Feedforward Deep Neural Network Design using Weights +1, 0, and -1》,它將weight量化爲三值(-1, 0, +1)。爲了解決量化模型的訓練問題,它採取的方法是同時維護高精度與低精度的權重,權重的累計是在高精度下完成的,然後通過量化得到低精度的weight。2015年蒙特利爾工程學院和蒙特利爾大學的論文《BinaryConnect: Training Deep Neural Networks with Binary weights during Propagations》中提出的BinaryConnect(BC)方法引入了binary weight的概念(即-1和1)。這樣MAC中的乘法可以用加和減來替代。在訓練過程中,forward中對於weight ww使用deterministic (sign(w)\text{sign}(w))或者stochastic(以hard sigmoid σ(w)\sigma(w)爲概率隨機賦於+1或-1)的方式來進行二值化。weight更新時仍以浮點精度進行累積。爲了避免二值化帶來的零值梯度問題採用了等效STE的方法。實驗主要限於一些小型數據集(如MNIST, CIFAR-10, SVHN)。2016年蒙特利爾大學、以色列理工學院等機構的論文《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or -1》提出了BNN的一種訓練方法,除了weight外,它將activation也做了二值化。爲了解決sign函數導數幾乎處處爲零的問題,文中在backward時使用hard tanh來近似量化操作。另外,爲了進一步減少訓練時BN的開銷,文中給出了基於shift操作的SBN(Shift-based batch normalization)。這裏實驗仍限於小型數據集。2017年UC San Diego、微軟和曠視的論文《Deep Learning with Low Precision by Half-wave Gaussian Quantization》重點研究了activation的量化,提出用於forward和backward時ReLU的近似。該方法考慮了activation輸出通常符合對稱高斯分佈以及ReLU只保留正數域的性質。HWGQ(Half-wave Gaussian quantizer)定義爲正數域上的step-wise constant函數,其參數可根據統計數據通過Lloyd’s algorithm求得MSE意義下的最優解。而對於backward中的ReLU近似,考慮到outlier的影響,文中提出了Clipped ReLU和Log-tailed ReLU兩種近似。2016年Allen Institute for AI與華盛頓大學論文《XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks》中提出了兩種方法:BWN(Binary Weight Networks)與XNOR-Networks。兩者的一個大的差別在於前者只二值化weight而後者對weight和activation都二值化。它們引入了一些改動來減少準確率的損失,如將輸出乘以一個scaling factor來恢復其dynamic range,保持第一和最後一層FP32的精度,和使用歸一化來減少activation的dynamic range。這篇文章的實驗開始涉及ImageNet這樣的大型數據集。2016年曠視的論文《DoReFa-Net: Training Low Bitwidth Convolutional Neural Networks with Low Bitwidth Gradients》中提出了DoReFa-Net。它基於STE,並將量化對象擴展到weight、activation和gradient。這樣訓練和推理中的卷積都可用位運算來加速。特別地,對於gradient的量化,加入了隨機噪聲。另外它還將量化的bit-width拓展到任意位。2016年中科院與陌上花發表的論文《Ternary Weight Networks》對BWN進行了擴展,提出了TWN方法將weight進行三值化(即-1, 0, 1)。它爲每層使用threshold和scaling factor量化weight。與BWN一樣,backward中梯度是相對於量化後的weight。2017年清華大學、Stanford和NVIDIA《Trained Ternary Quantization》的論文提出了TTQ。它也是基於三值網絡,並在此基礎上進行了改進,它允許正負兩邊有不同的scaling factor,並將之作爲可學習參數。2017年阿里巴巴的論文《Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM》也主要用於超低精度量化,前面有提不再贅述。2017年Intel的《Incremental Network Quantization: Towards Lossless CNNs with Low-Precision Weights》提出INQ(Incremental network quantization)方法將weight限制在2的冪,並引入一些方法來降低準確率的損失。它包含三個獨立的操作:weight partition,group-wise quantization和re-training。首先將預訓練模型佔的weight通過某種測度分成兩組。第一組通過變長編碼方法量化。第二組用於re-training,負責補償量化帶來的準確率損失。這三個操作以一種迭代的方式重複執行,直到所有的weight被量化成低精度。2018年香港科技大學、騰訊和華中科技大學《Bi-Real Net: Enhancing the Performance of 1-bit CNNs with Improved Representational Capability and Advanced Training Algorithm》提出了Bi-Real Net,它將實數的activation與後續block的activation通過identity shortcut連接來強化網絡的表達能力。除此之外,它還對於訓練提出多項改進,包括sign函數導數的更好近似-piecewise polynomial函數,magnitude-aware gradient(使梯度不僅與符號相關還與當前weight的絕對值相關),以及在預訓練時將ReLU替換成clip函數。另外還有前面提到過的2019年北航、百度等機構發表的論文《Bayesian Optimized 1-Bit CNNs》,和2019年中科大、阿里與南加州大學發表的論文《Quantization Networks》。

3.6 混合精度

一個神經網絡中不同的層的重要程度或者說冗餘度是不一樣的。Network pruning中也曾經提到會對不同的層採用不同的裁剪參數。類似地,不同的層對量化的敏感度也是不一樣的。因此在量化方法中,最好也可以對不同的層使用不同的bit-width。但是,爲每層找尋最優的bit-width是一個組合優化問題,其搜索空間是隨着層數的增加指數增加的。暴力搜索的話其複雜度爲O(MN)O(M^N),因此得想其它法子。

一類比較直覺的路子是heuristic-based的方法。主要思想是定義對量化敏感度的測度,越敏感的層使用最多的位。而這個敏感度測度的定義就非常關鍵了。2018年中科大的論文《Adaptive layerwise quantization for deep neural network compression》基於weight與activation的entropy來確定每層的bit-width。因爲熵可以表示信息量,而熵越大表示信息量越大,直覺上也需要更多位數也表示。2019年Berkeley的論文《HAWQ: Hessian AWare Quantization of Neural Networks with Mixed-Precision》提出了HAWQ方法。它的主要思想是利用了二階信息(由Hessian矩陣表示)。該方法採用multi-stage quantization,即每一個stage中只量化部分網絡,然後進行quantization-aware fine-tuning。具體地,sensitivity由Hessian的特徵值來衡量。根據MDL(Minimum Description Length)理論,要描述平坦的區域需要較少的位,要描述曲率很大的表面則需要較多的位。而block(一層或多層)的Hessian eigenvalue越大則表示曲率越大,也就是意味着需要更大的bit-width。在multi-stage fine-tuning過程中,需要確定block順序。這裏也同樣用到了Hessian eigenvalue,即先fine-tune那些曲率大的,因它們量化後帶來的擾動更大。同年論文《HAWQ-V2: Hessian Aware trace-Weighted Quantization of Neural Networks》針對HAWQ缺點做了改進:一是由原先敏感度的測度從Hessian的最大特徵值改爲Hessian的特徵值均值;二是通過基於Pareto frontier的方法進行bit-width的選取,取代手工選取;三是將該方法拓展到activation的混合精度量化。2020年,北京大學與Berkeley聯合發表論文《ZeroQ:A Novel Zero Shot Quantization Framework》提出zero-shot的post-training quantization方法,無需訓練集和驗證集。首先,通過建模distillation optimization選取distilled data,它的目標是選取部分輸入數據,並使得它們的統計量和BN中的一致。然後基於distilled data進行sensitivity analysis。它定義sensitivity metric爲原模型與量化後模型輸出的KL距離。最後,基於Pareto frontier方法找到每層最適合的精度。具體地,在目標量化model size的約束下,找到能使所有層的敏感度累加最小的bit-width配置。這裏假設層與層之間的bit-width選取是相互獨立的,即不考慮層間影響。

第二類是基於自動學習的方法。以上方法本質上是基於heuristic。這樣的好處是快,但得到的解未必是實際效果最優的。最優的量化策略往往還是和硬件平臺相關的,需要根據特定平臺『量體裁衣』。那一個自然的思路就是software-hardware co-design的方法,即對bit-width配置策略的調整添加反饋,通過基於如強化學習的方法自動搜索得到最優的每層bit-width配置。2018年ACL Lab等機構的論文《ReLeQ: A Reinforcement Learning Approach for Deep Quantization of Neural Networks》將強化學習(PPO算法)用於量化中自動找到最優的bit-width。爲了考慮層間的影響,它的policy network和value network基於LSTM。在學習過程中,agent從預訓練全精度模型開始,以層及網絡的靜態和動態信息embedding後作爲狀態,逐層從預定bit-width集合{2,3,4,5,6,7,8}中選取bit-width,然後收到與量化後準確率與計算/內存開銷收益相同的回報。由於考慮了多目標,所以文中提到對回報函數做了設計,使其在維持準確率與減少bit-width間做了trade-off,讓其更注重準確率的維持。爲了得到該準確率的降低信息,需要在量化後進行幾輪fine-tuning。2019年MIT的的論文《HAQ: Hardware-Aware Automated Quantization with Mixed Precision》提出HAQ(Hardware-Aware Automated Quantization)方法。它通過強化學習(DDPG算法)自動學習每一層的最優bit-width。爲了得到強化學習中訓練所需的反饋信號,量化模型被放在硬件上運行以獲取延遲和能耗等信息,這樣比通過FLOPs或內存訪問等直覺上的間接目標要更準確。另外,像延遲、能耗與模型大小的限制可以通過強化學習中動作空間的構造來加以限制。因此,回報中只考慮準確率的降低就行。這點上與上面的ReLeQ方法有所差別。文中實現表明在不同的硬件上bit-width的最優配置會有很大差異,而通過該方法可以自動找到每個硬件平臺上的最優配置。

以上方法主要是在離散空間中進行搜索。我們知道,如果能將目標整成搜索空間上的可微函數,那我們就可以使用效率更高的基於梯度的優化方法。2018年Berkeley和Facebook的論文《Mixed Precision Quantization of ConvNets via Differentiable Neural Architecture Search》將NAS(Neural architecture search)引入混合精度量化,提出一種Differentiable NAS(DNAS)框架。它根據給定的模型構建具有相同macro architecture的super net。在super net中,兩個代表中間數據的節點中會有多個邊。每個邊代表不同的算子,比如分別對應不同bit-width的卷積。這些邊由隨機變量edge mask來控制。利用Gumbel Softmax,可以使目標函數對於該mask參數可微。這樣,便可以利用常用的SGD進行優化。2019年Sony的論文《Differentiable Quantization of Deep Neural Network》前面有介紹,其中step-size和dynamic range是自動學習的,而bit-width是通過固定的規則從前面自動學習的參數得到的。

3.7 梯度量化

與weight和activation量化不同,梯度的量化主要用於訓練,尤其是分佈式訓練。在傳統的分佈式訓練中,通信的數據一大塊是梯度的更新信息。因此,如果減少梯度,那就可以有效減少通信開銷,從而提高訓練速度。由於適用範圍有限(僅適用於訓練場景),這裏就簡略而過。

相關的研究早些年就開始了,如2014年微軟和清華大學的論文《1-Bit Stochastic Gradient Descent and Application to Data-Parallel Distributed Training of Speech DNNs》結合quantization-error feedback方法將梯度壓縮到1 bit。前面提到的《DoReFa-Net:Training Low Bitwidth Convolutonal Neural Networks with Low Bitwidth Gradients》也涉及了梯度的量化,它設計了梯度量化公式(只在backward時使用)。考慮到梯度是無界的,且可能比activation大得多。該量化公式先對梯度做仿射變換映射到[0, 1]區間,接着量化後再反變換回來。爲了補償潛在的量化引入的偏差,公式還引入了噪聲函數,它的大小與可能的量化誤差一致。2016年Google的論文《Distributed Mean Estimation with Limited Communication》提出stochastic rotated quantization,將gradient精度降到4位。2016年蘇黎世聯邦理工學院等機構的論文《QSGD:Communication-efficient SGD via Gradient Quantization and Encoding》提出了QSGD(Quantized SGD)方法,它允許在通信帶寬與訓練收斂時間之間做trade-off。也就是說計算節點可以在提高variance的代價下調節梯度的bit-width(實驗中使用了2bit、4bit、8bit)減少傳輸開銷。2017年杜克大學等機構的論文《Terngrad: Ternary Gradients to Reduce Communication in Distributed Deep Learning》將梯度的精度降低爲三值(2位)。它使用了兩個方法減少通信開銷:一個是parameter localization。傳統的parameter server架構中每個PS會將共享的weight發給每個worker,而parameter localization中每個worker維護本地的weight並通過相同的隨機種子使它們初始相同,這樣只需要傳輸量化後的梯度即可;另一個是scaler sharing,即取所有worker的scaler參數的最大值作爲共享的scaler。2018年Intel的論文《Scalable Methods for 8-bit Training of Neural Networks》從理論上提出大多訓練過程對降低精度魯棒。論文除了將weight和activation量化爲8位,也將gradient量化爲8位。2018年清華大學的論文《Training And Inference with Integers in Deep Neural Networks》提出了WAGE方法,它用於訓練和推理中weight,activation和gradient的error(故得名WAGE)的量化。它提出一種新的初始化方法和一種逐層的scaling factor常量代替BN。這樣,整個框架可以在基於整數計算的芯片上訓練與推理。

4. 結語

如文章開頭所提到的,神經網絡模型的量化能帶來許多好處。因此,近年來量化成爲學術界與工業界熱門的研究方向。相關paper也以很快速度增長。但與此同時,模型量化也帶來了巨大的挑戰。其中比較大的有兩個:其一是由於表示精度下降引起信息損失帶來準確率的下降;其二是量化帶來的不連續性使神經網絡的訓練不穩定。上面列舉的大多數工作也正是圍繞它們展開的。

然而,僅僅是在保證準確率的同時降低網絡的bit-width只能保證模型size的減少,同時減少理論上的計算量,但是要真正拿到性能的好處還需要計算相關軟件與硬件的配合。先看軟件部分,現在主流的深度學習/推理框架都支持常見的8位量化。支持的花樣也都差不多。以目前最流行的幾個爲例:

  • TensorFlow:具體可參見官方介紹Model Optimization。它支持quantization-aware training和post-training quantization兩種模式。對於後者,又細分爲三種:Dynamic range quantization,Full integer quantization和Float16 quantization。原理部分在2018年Google的文章《Quantizing Deep Convolutional Networks for Efficient Inference: A Whitepaper》中有一些介紹。另外2017年Google的論文《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》介紹了TensorFlow中使得推理能全部以整型計算的方法。

    • Post-training float16 quantization:比較直觀,從FP32壓到FP16。模型小一半。一些GPU支持FP16計算,因此性能通常會有可觀地提高,而且大部分情況下準確率損失不大,可以說是一種性價比比較高的做法。
    • Post-training dynamic range quantization:Weight部分會以靜態方式量化爲8位整型。activation以浮點形式保存,如果算子支持量化,那會在推理時對activation量化成8位,然後執行8位weight與activation間的計算。否則,weight會從8位轉到浮點類型(只會轉一次並保存),然後用浮點運算。性能比post-training integer quantization略差,但好處是不需要額外的calibration dataset。
    • Post-training integer quantization:需要calibration dataset來估計activation和輸入的dynamic range,這樣除了weight外,activation的量化也可以靜態確定。這樣可生成完全量化的模型,減少運行時開銷,同時便於在只支持整型計算的硬件上執行。
    • Quantization-aware training:在訓練過程中模擬量化帶來的影響,壞處是需要訓練,好處是一般準確率損失比前面的要小。
  • Pytorch:具體可參見官方介紹Introduction to Quantization on PyTorch。對量化的支持有下面三種模式。它們分別對應TensorFlow中的post-training dynamic range quantization,integer quantization和quantization-aware training。

    • Dynamic quantization:Weight轉爲INT8,對activation的轉換是動態的(這也是爲啥叫dynamic的原因)。activation從內存讀寫時是以浮點形式的,但會在計算前進行量化,因此計算是以INT8精度來進行。
    • Post-training static quantization:與dynamic quantization類似,weight轉爲INT8,計算也是用INT8精度進行。區別在於對activation的量化參數是事先通過一些數據來確定而不是動態來確定。這樣便可以省下內存訪問和動態量化(避免先轉成浮點,再量化成整型)的開銷,因此性能較第一種也會高一些。
    • Quantization-aware training:在forward和backward時將weight和activation轉爲INT8,但計算仍以浮點來進行。通過這種方式,讓訓練過程考慮量化影響,因此準確率的損失也會較前兩種方法少。
  • TensorRT:是NVIDIA的主打推理(非訓練)框架,材料《8-bit Inference with TensorRT》 中有介紹對量化的支持。它基於的原則是最小化信息的損失。因爲KL距離可以用來衡量當使用給定編碼近似時的信息損失,所以使用KL距離作爲測度。基於這種思想,TensorRT的方法是在一個calibration dataset(幾百張,不用標註)上進行FP32的推理,然後得到合適的量化參數,從而使KL距離最小。這種方法用於weight與activation的線性對稱量化。

量化模型的高效推理依賴於計算引擎,它需要對低精度有深入的優化。因爲大多數的計算都是矩陣乘加,對於量化模型中的矩陣計算也需要專門的計算優化。如Facebook整了兩個對量化模型優化的計算庫:QNNPACK和FBGEMM。前者主要用於端上,後者主要用於雲上。它們是PyTorch用於支持量化模型計算的兩個後端。Google系的有gemmlowp,支持ARM和x86,在TensorFlow Lite中有用來支持量化模型計算。近年來,隨着超低精度量化技術的興起,還湧現出一些專用於二值網絡的推理引擎,如2019年京東在論文《daBNN: A Super Fast Inference Framework for Binary Neural Networks on ARM devices》中介紹的daBNN。我們知道,機器學習推理框架還有條路就是基於編譯器的方法。2020年華盛頓大學和OctoML等機構的論文《RipTide: Fast End-to-End Binarized Neural Networks》中研究了二值化網絡的計算優化。它擴展了TVM支持二值網絡中的計算,提出了RipTide系統。以SqueezeNet爲例,末優化量化模型與原始浮點模型運行還慢了7x,整上Tiling, Vectorization, Parallelization, Fast Popcount, Bitpack Fusion後完美逆襲,比原始浮點模型快了一個數量級。

再進一步地,正如其它領域一樣,往往軟件和硬件的深度配合才能達到極致的性能。量化模型要達到最高的性能,打造專用的硬件也是一個方向。一方面 ,在工業界量化的支持已經比較成熟。主流的AI芯片基本都支持8 bit運算,如Apple的Bionic芯片和Tesla的FSD。而一些芯片已開始支持8位以下的bit-width,如Imagination的NNA(Neural network accelerator)支持最低4位。NVIDIA在Turning架構中除了支持常規的FP32、FP16和INT8等精度,還提供了INT4,INT1等次字節級精度。另一方面,學界的相關研究也非常豐富。如2016年Stanford和NVIDIA的《EIE: Efficient Inference Engine on Compressed Deep Neural Network》就是一個早期的經典例子。2016年的YodaNN(《YodaNN: An Ultra-Low Power Convolutional Neural Network Accelerator Based on Binary Weights》),2017年的FINN(《FINN: A Framework for Fast, Scalable Binarized Neural Network Inference》)等專注於使用FPGA和ASIC來計算二值網絡。2017年的BISMO(《BISMO: A Scalable Bit-Serial Matrix Multiplication Overlay for Reconfigurable Computing》)和2018年的Bit Fusion(《Bit Fusion: Bit-Level Dynamically Composable Architecture for Accelerating Deep Neural Networks》)考慮了混合精度的硬件加速器。另外,量化(尤其是二值化)網絡也更適用於神經擬態芯片。如2016年IBM的TrueNorth相關論文(《Convolutional Networks for Fast, Energy-Efficient Neuromorphic Computing》)中就使用了低精度網絡,在其中weight和activation分別是三值和二值。雖然人工智能從不是爲了複製人腦,但人腦因其超高的計算效率一直吸引着科學家嘗試借鑑其機理。儘管目前人類還不知道人腦的工作機制,但直覺上脈衝神經網絡貌似更符合猜想,而二值網絡感覺又和它有着千絲萬縷的聯繫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章