在對激活進行偽量化前先將激活截斷在(0,1)之間, 這樣的做法是基于一些經典的網絡結構中,比如AlexNet與RestNet中,大部分的激活都會落在這個范圍里的。
對于weight,則是先通過這樣的一個非線性函數對weight進行映射,tanh(w)將weight的值域縮放到-1到+1之間,再除以2倍的tanh(w)絕對最大值加上1/2最終weight被映射到了0到1之間,再對其進行量化與反量化,再將輸出結果通過乘2減1仿射變換到-1到1之間。
這里的quant與dequant操作在原論文中是被表示為一個quantize_k的操作,k指的是k位的量化,其實本質上就和我們之前提到的量化公式相似,就是把1/s替換成了2^k-1。
但DoReFa-Net的這個方式對于其它一些activation取值分布較廣的網絡就顯得有點過于死板了,所以就有另一個改進版本的算法Parameterized Clipping Activation,PACT針對activation的偽量化這一部分,將截斷門限alpha設為可學習的參數,然后通過梯度下降來尋找更優的門限。
因為alpha被設為可學習參數,所以這一部分的導數就可以由小于alpha的部分為0,大于等于alpha的部分為1。
大家看到PACT的這個函數其實和ReLU很像,對大于零的部分做一個截斷操作,其實PACT原本思想也是想要替代ReLU。但問題是并非所有的模型結構用的都是ReLU這個激活函數,所以為了讓PACT的應用范圍更廣,PaddlePaddle也也對其做了一定的改進,對大于零和小于零的激活值都做了相同的限制,使它能夠在某些情況下得到更好的量化范圍,以降低量化損失。
除此之外,還有一個常被使用到的算法,Learned Step Size Quantization,與PACT相似的是它也是通過訓練來確定量化參數,但不同的是PACT學習的是截斷門限,而LSQ直接將Scale定為一個可學習的參數。
我們先來看它的計算公式,這里的r_hat指的就是經過量化與反量化后的數值,
這其實就是在對稱量化公式的基礎上加了個scale,完成了一個量化與反量化的過程
因為我們需要反向傳播計算梯度,所以就要對這個公式進行求導 (加些對公式的解說)
對于這一塊的導數,LSQ還是采用直通估計,由此我們就得到了一個最終的導數公式;
這里又可以看出,LSQ雖然也采用了直通估計,但它在截取范圍內還是存在梯度計算的
而且,為了使得Scale的學習更為穩定,LSQ還為其梯度加上了一個縮放系數,這個系數主要由tensor中的元素數量決定
另外,既然是可學習參數,那么就需要為其設置一個初始值,PACT中的alpha通常會被手動設置為常數值6,而LSQ原文中scale的初始值則由tensor的L1正則確定,不過在實踐過程中,其實更多的是通過統計激活分布,用EMA-minmax, KLD,MSE等PTQ的方式來計算初始的scale值。
審核編輯:彭菁
-
函數
+關注
關注
3文章
4338瀏覽量
62739 -
網絡結構
+關注
關注
0文章
48瀏覽量
11126 -
STE
+關注
關注
0文章
8瀏覽量
9262
發布評論請先 登錄
相關推薦
評論