PACT parameterized clipping activation for quantization neural networks

PACT: parameterized clipping activation for quantization neural networks


文章鏈接

Introduction

提出了PArameterized clipping activation function,能夠在模型訓練階段自動優化量化的尺度。主要貢獻在於:

1:PACT。引入了一個aa用於表示訓練中的clipping level並通過反向傳播學習這個參數。aa使得量化尺度比ReLU更小來減小量化誤差,但是比傳統的clipping activation函數尺度更大,使得梯度能夠更有效的傳播。另外,在loss function中也加入了對aa的正則化,使網絡能夠更快收斂

2:量化的結果說明了PACT在模型和測試數據上的有效性,1)對於low bit-precision(對於weight和activation2-bits\leq2\operatorname{-bits}),PACT精度最高,2)對於4-bit量化的CNN,PACT得到了和單精度浮點型(single-precision floating point)相似的結果

3:作者進行了系統性能分析,展示了the trade-offs in hardware complexity for different bit representations vs. model accuracy。說明了對計算進行大量精簡是可能的。

Related work

這塊,作者說在ImageNet上掉1個點就是significantly reduced。

Chanllenge in Activation Quantization

量化就相當於將權重和損失函數空間離散化,因此,在模型訓練中是可能彌補權重量化帶來的誤差的,傳統的激活函數的沒有任何可以訓練的參數,因此,量化激活函數帶來的誤差無法在反向傳播時被補償掉。

當使用ReLU時,量化就變得更難了,因爲ReLU的值域是無窮的,因此在量化的時候非常困難,而在反向傳播的時候,前面層的梯度是依賴後面層的梯度計算的,所以誤差就會越來越累積。

但是,使用clipping activation function的話,可以緩解上面提到的難題,因此clipping activation是有界的。然而由於模型與模型、層與層之間的區別,選擇這個最好的clipping value是很困難的。同時,使用這種方法的validation error還是很大。

最近,這個問題通過使用half-wave Gaussian quantization進行量化激活緩解了。因爲觀察到在BN層之後,激活值大致類似於一個zero mean and unit variance的高斯分佈,因此使用Lloyd‘s算法來找到對於每個層應用高斯分佈的最佳尺度,然而,它還是沒有完全解決這個問題,因爲所有的量化參數都是離線決定的,在訓練階段並不更新。

PACT: parameterized clipping activation function

根據前面提到的問題,就在截斷的時候加了一個參數aa,這個參數是可學習的,因此,激活函數就變爲:
y=PACT(x)=0.5(xxa+a)={0x(,0]xx[0,a)a,x[a,+)(1) y =PACT(x)=0.5(|x|-|x-a|+a)= \left\{ \begin{array}{ll} 0 & x \in (-\infty, 0] \\ x & x \in [0, a) \\ a, & x \in [a, +\infty) \end{array} \right. \tag{1}
式中,aa是用來限定激活值的範圍[0,a][0,a],對於點乘的計算,截斷的激活輸出就線性量化爲kbitsk-bits
yq=round(y2k1a)a2k1(2) y_q=round(y\cdot {{2^k-1}\over{a}})\cdot {a \over{2^k-1}} \tag{2}
aa是loss中的一個變量,能在訓練時被優化,在反向時,能夠使用STE來計算梯度yqa\frac{\partial y_q}{\partial a}來估計yqy\frac{\partial y_q}{\partial y}
yqa=yqyya={0,x(,a)1,x[a,+)(3) \frac{\partial y_q}{\partial a}= \frac{\partial y_q}{\partial y}\frac{\partial y}{\partial a}= \left\{ \begin{array}{ll} 0, & x \in (-\infty, a) \\ 1, & x \in [a, +\infty) \\ \end{array} \right. \tag{3}
aa越大,這個激活函數就越像ReLU激活函數。同時,在損失函數中對aa使用了L2正則化。

underdtanding how parameterized clipping works

作者通過調整aa的大小,觀察了每一層的cross-entropy和training loss(cross entroy + regularization)的變化。網絡中的激活函數是上述提到的激活函數,同時,在改變某一層的aa的值時,保持網絡中其他的值不變,如weight、bias、BatchNorm parameters、其它層的aa值。

cross-entropy在圖a中是全精度的形式計算的,隨着aa的增大,cross-entropy收斂到一個比較小的值。這說明了ReLU是一個很好的激活函數。但是,即使是使用full precision計算的cross-entropy,它也不能使每一層都收斂到一個很好的值,如act0和act6。

如果在前向的時候量化cross-entropy,隨着aa的增大,cross-entropy大多數情況下也會增大,這個時候ReLU就沒有多大作用了。並且,不同層中最優的aa一般不同,所以這個參數得學習。並且,隨着aa的增大,act6的cross-entropy變得很穩定,就就給梯度下降帶來困難。

最後觀察training loss,正則化使得training loss不會變得很穩定,因此可以收斂,而且,加入正則化之後,training loss的最小值點並沒有改變。(藍色線中的最小值點)
在這裏插入圖片描述

Exploration of Hyper-parameters

從作者的實驗而言,最好是讓每一層共享一個aa值,這麼做也降低了硬件實現的複雜性,另外,在初始化aa的時候,儘量將值設大一點,然後在訓練中通過正則化減小它。最後,對aa使用與正則化權重時相同的係數λ\lambda時,L2正則化效果還不錯。對於最優值λa\lambda_a會隨着bit精度的升高略微減小。最後,在量化的時候,還是白癡第一層和最後一層的量化結果不變。

Experiment

量化bit數越高,結果越接近full precision的結果。當bit-precision高於3-bits時,同全精度相比almost identically,當激活函數的精度最少爲4-bits時,validation error和全精度相差不到1%。和之前的方法比效果也很好,作者還在具體的硬件系統上進行了實驗。
在這裏插入圖片描述
在這裏插入圖片描述

Conclusion

在本文彙總,作者提出了帶aa參數的PACT函數代替ReLU進行激活,這個參數可以在訓練中學習,並提供了有效性分析。它可以在各個網絡上實現更大程度的量化(down to 4-bits),並且掉點不到1%,並且在硬件上的效果也很好。

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