淺談深度學(xué)習(xí)模型量化
【GiantPandaCV導(dǎo)語(yǔ)】本次簡(jiǎn)要的總結(jié)了模型量化研究的一些問(wèn)題,介紹了量化存在的量化誤差與其總體上解決量化誤差的一些方法。主要討論了5種非線性量化的方法。
量化任務(wù)的簡(jiǎn)要總結(jié):1、量化映射方法,也就是將float-32映射到Int數(shù)據(jù)類型,每個(gè)間隔是相等的還是不相等的,這里就是均勻量化(uniform quantization)和非均勻量化(non-uniform quantization),也可以叫作線性量化和非線性量化
2、關(guān)于映射到整數(shù)是數(shù)值范圍是有正負(fù)數(shù),還是都是正數(shù),這里就是對(duì)稱量化(有正負(fù)數(shù))和非對(duì)稱量化(全是正數(shù)),非對(duì)稱量化就有zero-point,zero-point的主要作用是用于做padding。
3、原精度即浮float-32,量化到什么樣的數(shù)據(jù)類型,這里就有float和int;到底要選擇量化后的是多少個(gè)bit,這里就有1-bit(二值網(wǎng)絡(luò))、2-bit(三值網(wǎng)絡(luò))、3-bit、4-bit、5-bit、6-bit、7-bit、8-bit,這幾種量化后的數(shù)值類型是整型。
4、是固定所有網(wǎng)絡(luò)都是相同的bit-width,還是不同的,這里就有混合精度量化(Mixed precision)
5、是從一個(gè)已經(jīng)訓(xùn)練好的模型再進(jìn)行量化,還是有fine tune的過(guò)程或者直接是從頭開(kāi)始訓(xùn)練一個(gè)量化的模型,這里就有Post-training quantization(后量化,即將已經(jīng)訓(xùn)練完的模型參數(shù)進(jìn)行量化)、quantization-aware training(量化感知訓(xùn)練,即在從頭開(kāi)始訓(xùn)練中加入量化)和quantization-aware fine tune(在fine tune訓(xùn)練中加入量化)。
我們與剪枝來(lái)做一個(gè)不恰當(dāng)?shù)膶?duì)比
上面的(3)選擇什么樣的bit-width來(lái)做量化,對(duì)應(yīng)的是剪枝的壓縮率,即要剪枝多少參數(shù);
上面的(4)是所有參數(shù)統(tǒng)一一個(gè)bit表示還是采用混合精度量化,對(duì)應(yīng)的剪枝就是結(jié)構(gòu)化剪枝和非結(jié)構(gòu)化;
上面的(5)有沒(méi)有fine tune操作,對(duì)應(yīng)的剪枝就是《training from starch》和三步剪枝方法(train-prune-fine tune);
「量化誤差到底來(lái)自于哪里?」
1、從float-32到Int數(shù)據(jù)類型,其中有一個(gè)round的操作,這里肯定會(huì)有誤差;2、激活函數(shù)的截?cái)啵?、溢出時(shí)候的處理也有可能帶來(lái)誤差。
那么繼續(xù)來(lái)討論一下「量化遇到的問(wèn)題」是什么:
1、weight和activation的數(shù)據(jù)分布呈現(xiàn)出一個(gè)類拉普拉斯分布或者類高斯分布,數(shù)據(jù)分布是一個(gè)鐘型分布,大部分?jǐn)?shù)據(jù)集中在中間,兩頭的數(shù)據(jù)比較少。如果采用均與量化(uniform quantization),由于是等間隔的,那么中間密集分布的數(shù)據(jù)的分辨率低。舉個(gè)例子,假如總共10個(gè)值,fp32_x={10,-10,0.11,0.21,0.15,0.05,-0.14,-0.22,-0.08,-0.35},采用對(duì)稱均勻分布量化,(10-(-10))/(255)= 20/255,Int8_x={127,-127,1,3,2,1,-2,-3, -1,-5},可以看到,0.05和0.11被量化同一個(gè)int-8的數(shù)值1,而且量化后的數(shù)值大部分集中在了[-5,3],而其余的數(shù)值沒(méi)有用到。如何解決這個(gè)問(wèn)題?很簡(jiǎn)單,給密集的區(qū)域用比較多的Int數(shù)值表示(增大分辨率),稀疏的區(qū)域用比較少的Int數(shù)值表示;這就是一個(gè)不等間距間隔,稱為非均與量化(non-uniform quantization)或非線性量化。
2、另外一個(gè)問(wèn)題就是每一層的數(shù)值范圍不一定都相同,activation在不同層的數(shù)值范圍會(huì)不一樣,這就會(huì)產(chǎn)生另外一個(gè)問(wèn)題,動(dòng)態(tài)值域問(wèn)題,dynamic range。這個(gè)dynamic range如何影響量化效果呢?比如8-bit的均與分布量化,值域[-2, 2]的單位間隔是(2-(-2))/255 = 4/ 255,值域[-6, 6]的單位間隔是(6-(-6))/255 = 12/ 255,明顯前面的分辨率更高。還是由于數(shù)據(jù)分布鐘型分布,即可abs(數(shù)值)大的占據(jù)的比例很小,因此,這里可以采用截?cái)嗟姆绞教岣邅?lái)量化的分辨率。
3、round會(huì)肯定會(huì)帶來(lái)誤差,怎么處理呢?Stochastic rounding,因?yàn)槠淦谕莤,可以減少round的誤差.
Round
證明:
其中是向下取整,即取不大于x的最大整數(shù) 4、如果是量化感知訓(xùn)練,會(huì)遇到另外一個(gè)新的問(wèn)題,就是量化這個(gè)操作的導(dǎo)數(shù)為0,在backwards的時(shí)候,梯度在后向傳播中傳不到后面。怎么辦?(1)STE(Straight-Through Estimator ),直通估算器,即將該操作的梯度設(shè)置為1,那么梯度就可以傳遞下去,;(2)設(shè)計(jì)一個(gè)光滑可導(dǎo)且導(dǎo)數(shù)不為零的量化,比如Lq-Net和DSQ(Differentiable Soft Quantization)

以上就是總結(jié)的量化知識(shí)點(diǎn)和存在的一些問(wèn)題,可能列舉的還不夠完善,希望大家提出寶貴的建議。下面先來(lái)討論非均勻量化/非線性量化,參考文章如下:1、《Convolutional Neural Networks using Logarithmic Data Representation》 2016
2、 Powers-of-two quantization,這個(gè)方法我還沒(méi)找到原論文
3、《Quantization Networks》CVPR 2019
4、《Additive powers-of-two quantization: an efficient non-uniform discretization for neural networks》 ICLR 2020
5、《Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks》 CVPR 2019
6、《Post-Training Piecewise Linear Quantization for Deep Neural Networks》ECCV 2020
「一、均勻量化/線性量化 uniform quantization」
就是scale,是量化,是反量化,
另外一種寫(xiě)法,是全精度數(shù)據(jù)的值域[0,],大括號(hào)里面就有255個(gè)值,讓全精度數(shù)據(jù)映射到這255值。
「二、Logarithmic」文章:《Convolutional Neural Networks using Logarithmic Data Representation》

先貼公式,下面公式是上圖(b)的方案:
為啥要將x變成log呢?就是為了在做矩陣乘法的時(shí)候用2的指數(shù)形式,先,后面再用復(fù)原。這是為了可以用位移的方式實(shí)現(xiàn)乘法。方案(b)只將input做了log操作。
繼續(xù)看上圖(c)的方案,即weight和input兩個(gè)矩陣乘法的乘子都做了log操作,那么:
做矩陣乘法的時(shí)候,weight和input都需要用來(lái)復(fù)原之前的log操作。另外還要擔(dān)心溢出,所以要有做一個(gè)截?cái)郼lamp。一定的bit的數(shù)值范圍,記為,其中,
對(duì)應(yīng)的均勻量化/線性量化:
其中
「這個(gè)方法,還是比較復(fù)雜的,而且是2016的論文,大家就看看理解一下就好了?!?/strong>
「三、Powers-of-two quantization(PoT)」
量化的值跟名字一樣,就是要把浮點(diǎn)數(shù)量化為2的n次冪,下面公式是PoT的計(jì)算公式
下面公式也是PoT的計(jì)算公式,不過(guò)是以集合的形式,列舉可以選的PoT值
其中表示bit位數(shù),這個(gè)也是為了做乘法的時(shí)候,可以使用位移。
那PoT的缺限在哪里呢?舉個(gè)例子最好理解: 為例子,那么兩個(gè)最小的值為 和 ,這兩數(shù)值太接近了;而兩個(gè)最大值為 和 ,這兩個(gè)最大值的間距又過(guò)大。當(dāng)bit位數(shù)增加的時(shí)候,最大值仍然是 和 ,最小值的顆粒度更加細(xì)了。
「四、Additive powers-of-two(APoT)」
先來(lái)看看APoT的名字比powers-of-two多了個(gè)additive,也就說(shuō)明比PoT的非線性量化多了個(gè)加法項(xiàng), where
其中,
表示是縮放系數(shù),以保證中的最大水平為;
是基位寬度(base bit-width),是每個(gè)加法項(xiàng)的位寬;
是加法項(xiàng)的數(shù)量。
當(dāng)設(shè)置了 和 時(shí),可以通過(guò)計(jì)算。總共有個(gè)級(jí)別。APoT量化中加法項(xiàng)的數(shù)量可以隨位寬b的增加而增加,這為非均勻水平提供了更高的分辨率。下面的圖片展示了均勻分布量化、PoT量化和APoT量化的圖,可以看出一下幾點(diǎn):1、均與分布量化是一個(gè)等間隔的階梯,對(duì)于鐘性分布的數(shù)據(jù)不利;
2、PoT解決了一個(gè)問(wèn)題,就是在值比較小的區(qū)域階梯變多了,也就是分辨率變高了,但是也存在Powers-of-two quantization中提到的問(wèn)題;
3、APoT就是為了解決PoT存在的問(wèn)題,也就是當(dāng)bit數(shù)增加的時(shí)候,兩個(gè)最大值的之間的分辨率沒(méi)有提高的問(wèn)題。
因?yàn)闆](méi)有mobilenet、shufflnet的實(shí)驗(yàn),實(shí)驗(yàn)結(jié)果就不貼圖了,另外因?yàn)槎嗔艘恍├奂樱唧wspeedup不好說(shuō),代碼開(kāi)源了。
「五、可微分的非線性量化」
可微分的非線性量化留到下一次討論,給自己挖個(gè)坑,即兩篇《Quantization Networks》和《Differentiable Soft Quantization: Bridging Full-Precision and Low-Bit Neural Networks》(當(dāng)然還有其他的文章,我還沒(méi)找到),主要的思路是:量化映射這個(gè)操作原來(lái)是階躍函數(shù)或者階段函數(shù),是不可導(dǎo)或者導(dǎo)數(shù)為0,那么找一個(gè)可導(dǎo)的函數(shù)比如sigmoid去模擬階躍函數(shù),利用學(xué)習(xí)的方式去找上圖的階梯。這樣就可以不用STE的方法,也就沒(méi)有了梯度不匹配的問(wèn)題。當(dāng)然這種量化方法也有局限性,就是,得用訓(xùn)練的方式,肯定增加了耗時(shí),而且對(duì)于硬件是否友好,這個(gè)還得具體落地實(shí)驗(yàn)。因?yàn)镈SQ有mobilenet的實(shí)驗(yàn),就貼實(shí)驗(yàn)效果表格(Quantization Networks沒(méi)有mobilenet實(shí)驗(yàn)就忘記他吧):DSQ:
「六、Piecewise Linear Quantization」(推薦)
最后來(lái)討論一下PWLQ(作者自己要這么縮寫(xiě)的,不是我強(qiáng)行造詞)「。代碼開(kāi)源了」。就同名字一樣,分段線性量化,這個(gè)思路簡(jiǎn)單而巧妙:在全精度數(shù)據(jù)的分布中,找一個(gè)分位點(diǎn),那么中間的部分給予比較多的bit位數(shù)做一個(gè)線性量化,兩邊分比較少的bit位數(shù)也做一個(gè)線性量化,非常的巧妙的做法。
m是量化的值域[-m; m] (m > 0) , ?, ,uni表示的是均勻分布量化/線性量化??磮D就能一眼看懂這個(gè)公式。

圖中,m=0.8,,。來(lái)看看效果,(有mobilenet的實(shí)驗(yàn)):

后續(xù)有時(shí)間回過(guò)頭來(lái),我想更加詳細(xì)的寫(xiě)一下這些內(nèi)容。
歡迎關(guān)注GiantPandaCV, 在這里你將看到獨(dú)家的深度學(xué)習(xí)分享,堅(jiān)持原創(chuàng),每天分享我們學(xué)習(xí)到的新鮮知識(shí)。( ? ?ω?? )?
有對(duì)文章相關(guān)的問(wèn)題,或者想要加入交流群,歡迎添加BBuf微信:
為了方便讀者獲取資料以及我們公眾號(hào)的作者發(fā)布一些Github工程的更新,我們成立了一個(gè)QQ群,二維碼如下,感興趣可以加入。
