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