极智AI | 谈谈几种量化策略:MinMax、KLD、ADMM、EQ
? 歡迎關(guān)注我的公眾號 [極智視界],獲取我的更多筆記分享
? O_o ? >_< ? o_O ? O_o ? ~_~ ? o_O
? 本文主要聊一下深度學(xué)習(xí)模型量化相關(guān)策略。
? 模型小型化是算法部署的關(guān)鍵技術(shù),模型小型化的過程通常用模型量化來描述。量化通常是高比特位到低比特位的映射過程,量化的對象既可以是權(quán)重?cái)?shù)據(jù),也可以是激活值。量化方式具有多種形態(tài),不管是混合量化、還是全整型量化;不管是單層量化、成組量化、還是整網(wǎng)量化,都存在浮點(diǎn)數(shù)映射到整型數(shù)的過程,這個過程一定存在精度損失,而對于我們來說,要做的是把精度損失控制在可接受的范圍。
? 量化又可以分為后量化、訓(xùn)練時量化又或是量化感知訓(xùn)練。后量化相比訓(xùn)練時量化,是一種更加高效和無侵入式的算法加速技術(shù),這里主要聊一下后量化,包括一些主要的量化類型和量化策略:
- 量化類型:非對稱量化和對稱量化、非線性量化和線性量化;
- 量化策略:MinMax、KLD、ADMM、EQ;
文章目錄
- 1、量化類型
- 1.1 非對稱量化和對稱量化
- 1.2 非線性量化和線性量化
- 2、量化策略
- 2.1 MinMax 量化
- 2.2 KLD 量化
- 2.3 ADMM 量化
- 2.4 EQ 量化
- 3、量化實(shí)驗(yàn)
1、量化類型
1.1 非對稱量化和對稱量化
? 非對稱量化是比對稱量化更加廣義的概念,對稱量化是非對稱量化的一種特殊情況。
? 非對稱量化也就是帶有偏置的線性映射,其數(shù)學(xué)表達(dá)可以是這樣:
? 其中 Z 不一定等于 0,代表浮點(diǎn)數(shù)的零點(diǎn)不一定對應(yīng)整型的零點(diǎn)。E() 代表截?cái)嗪瘮?shù),作用是使其截?cái)嗟綄?yīng)整型的數(shù)值表述范圍內(nèi)。對于非對稱量化,滿足如下的約束:
? 上述約束中,T1 和 T2 是對于浮點(diǎn)數(shù)的截?cái)喾秶?#xff0c;也就是非對稱量化的閾值。通過換算可以得到閾值和線性映射參數(shù) S 和 Z 的數(shù)學(xué)關(guān)系,在確定了閾值后,也就確定了線性映射的參數(shù)。
? 對稱量化可以看作非對稱量化當(dāng) Z = 0 時的一種特殊情況,滿足 T1 = -T2,此時的閾值和線性映射參數(shù)的數(shù)學(xué)關(guān)系如下:
1.2 非線性量化和線性量化
? 線性量化往往又被稱為均勻量化,這在目前的算法落地中是最常用的,上面提到的非對稱量化和對稱量化也是基于線性量化的。非線性量化實(shí)際用的比較少,以 LOG 量化為代表。
? 不同的量化方式對數(shù)據(jù)分布具有選擇性。對于均勻量化,假設(shè)數(shù)據(jù)在整個表達(dá)空間內(nèi)均勻分布,在均勻分布下線性量化是一種較好的量化方式。 LOG 量化則可以保證數(shù)值空間內(nèi)相對誤差的最優(yōu)化,這是目前大部分非線形量化的目標(biāo),通過對數(shù)據(jù)分布的分析,可以提升高密度數(shù)據(jù)區(qū)域的表達(dá)能力。
? 舉個例子,假設(shè)我要對一組數(shù)據(jù) x 進(jìn)行 int8 對稱量化,量化范圍為 (-a, a),對于線性量化,可以用以下數(shù)學(xué)式進(jìn)行表達(dá):
? 同樣的,對于 LOG 非線性量化可以用如下式子進(jìn)行表達(dá):
2、量化策略
? 從上述的映射關(guān)系中,如果知道了閾值,那么其對應(yīng)的線性映射參數(shù)也就知道了,整個量化過程也就明確了。那么該如何確定閾值呢?一般來說,對于權(quán)重的量化,由于權(quán)重的數(shù)據(jù)分布是靜態(tài)的,一般直接找出 MIN 和 MAX 線性映射即可;而對于推理激活值來說,其數(shù)據(jù)分布是動態(tài)的,為了得到激活值的數(shù)據(jù)分布,往往需要一個所謂校準(zhǔn)集的東西來進(jìn)行抽樣分布,有了抽樣分布后再通過一些量化算法進(jìn)行量化閾值的選取。
2.1 MinMax 量化
? MinMax 是最簡單的量化方法,量化示意如下:
? MinMax 其實(shí)就是簡單的把浮點(diǎn)數(shù)直接映射到 int8 的數(shù)據(jù)范圍,MinMax 方法由浮點(diǎn)映射到定點(diǎn)的數(shù)學(xué)表達(dá)如下:
? 其中,R:真實(shí)浮點(diǎn)值(fp32);Q:量化后的定點(diǎn)值(int8,Q屬于[-127, 127]);Z:表示0浮點(diǎn)值對應(yīng)的量化定點(diǎn)值;S:定點(diǎn)量化后可表示的最小刻度。
? 這種量化方式,主要關(guān)注浮點(diǎn)范圍的最大值和最小值,然后通過尺度 S 線性映射。這種量化方法往往會使精度下降較多,一般后面還會跟一個 requantize 的微調(diào)優(yōu)化。實(shí)際上,把 MinMax 量化應(yīng)用于網(wǎng)絡(luò)權(quán)重這樣靜態(tài)分布的數(shù)據(jù)的時候,對于網(wǎng)絡(luò)推理最后的精度損失影響不大,且量化操作開銷更小,量化過程效率更高,這是 Nvidia 經(jīng)過大量實(shí)驗(yàn)得出的結(jié)論。
2.2 KLD 量化
? KLD 量化是用 KL 散度來衡量兩個分布之間的相似性,是 Nvidia TensorRT 中對于激活值采用的量化方法,KLD 量化的示意如下:
- 這種方法不是直接將 [min, max] 映射到 [-127,127],而是去尋找一個閾值|T| < max(|max|, |min|),將其 [-T, T] 映射到 [-127, 127]。認(rèn)為只要閾值選取得當(dāng),就能將閾值外的值舍棄掉,也不會對精度損失造成大的影響;
- 超出閾值 ±|T| 外的直接映射為閾值。比如上圖中的三個紅色點(diǎn),直接映射為-127,這種映射關(guān)系為飽和的(Saturate );
? KLD 量化方法試圖將 fp32 數(shù)值分布和 int8 數(shù)值分布抽象成兩個分布,用閾值 |T| 來更新兩個數(shù)值分布,并用 KL 散度來衡量兩個分布的相似性,若 KL 散度值越小,說明這兩個分布越相似,也說明這個閾值 |T| 選擇的最好。
? 下面的圖是 TensorRT 中的關(guān)于 KL 散度校準(zhǔn)的偽代碼,這個圖也完美詮釋了 KLD 整個量化過程。
2.3 ADMM 量化
? ADMM 交替方向乘子法,是優(yōu)化函數(shù)的一種方式,一般用于帶有約束的最優(yōu)解問題。類似的,梯度下降法、牛頓下降法、拉格朗日乘子法也是類似的優(yōu)化方法。
? 其通用優(yōu)化式子如下:
? 在 ADMM 中,其等價(jià)的優(yōu)化式,也就是拉格朗日式如下:
? 同拉格朗日乘子法不同的是,ADMM 采用的是類似于分布迭代的方式獲得最終解。其采用如下的步驟:
? 下面我們將量化閾值的選取策略變換成 ADMM 算法,利用前面所說的對稱量化方法,把量化當(dāng)成一個編碼問題,編碼再加上解碼,就還原出了可以跟原始數(shù)據(jù)進(jìn)行對比的數(shù)據(jù)。這樣的邏輯下,將優(yōu)化目標(biāo)設(shè)計(jì)成如下表達(dá):
? 2-范式易于求導(dǎo),那么上述的優(yōu)化目標(biāo)可以轉(zhuǎn)換成如下形式:
? 個人認(rèn)為在對于對稱量化不需要使用 ADMM,因?yàn)橹挥幸粋€變量,使用梯度下降法也是可以得到最終的s。
2.4 EQ 量化
? EQ 量化即 EasyQuant,是格靈深瞳開源的量化算法,在文章《EasyQuant: Post-training Quantization via Scale Optimization》中進(jìn)行了介紹。EQ 量化方法的主要思想是:誤差累計(jì)、整網(wǎng)決策變成單網(wǎng)決策、以余弦相似度為優(yōu)化目標(biāo)、交替優(yōu)化權(quán)重縮放系數(shù)和激活值縮放系數(shù)。
? 假設(shè)量化公式如下(為了方便起見,采用對稱量化進(jìn)行說明):
? 假設(shè)量化目標(biāo)精度為 IntN,其中的 clip 函數(shù)表示把量化后的數(shù)值規(guī)范到整型范圍,如下:
? EQ 量化算法把縮放系數(shù) S 的獲得看成數(shù)學(xué)優(yōu)化問題,將優(yōu)化目標(biāo)進(jìn)行了如下表達(dá):假設(shè)傳入的校準(zhǔn)集中樣本個數(shù)為 N、被量化模型的網(wǎng)絡(luò)層個數(shù)為 L,Qil 表示未量化推理時第 l 層網(wǎng)絡(luò)層的第 i 個樣本的輸出值,Q^il 表示量化推理時第 l 層網(wǎng)絡(luò)層的第 i 個樣本的輸出值,因?yàn)檎`差累計(jì)和問題分解的手段,使用余弦相似度作為評判標(biāo)準(zhǔn),最終的優(yōu)化目標(biāo)如下所示:
? 其中 Qil 和 Q^il 在該層為卷積的時候?yàn)?#xff1a;
? EQ 算法最大的亮點(diǎn)在于對權(quán)重的縮放系數(shù)也進(jìn)行了優(yōu)化,其他的量化閾值選取策略基本是不考慮對權(quán)重的縮放系數(shù)進(jìn)行優(yōu)化,直接使用 Min-Max 得到縮放系數(shù)。加入了權(quán)重的縮放系數(shù)的優(yōu)化變量,導(dǎo)致了多變量優(yōu)化問題。如若按照常規(guī)的方式進(jìn)行多變量優(yōu)化,該優(yōu)化目標(biāo)往往難以解析,EQ 給出的解法是使用交替優(yōu)化權(quán)重激活系數(shù)和激活縮放系數(shù)。
? EQ 算法流程如下:
3、量化實(shí)驗(yàn)
? 這里選取了 KLD 和 ADMM 兩種量化算法進(jìn)行了一些實(shí)驗(yàn)?zāi)M。
? 使用 python numpy 創(chuàng)造隨機(jī)數(shù)據(jù)分布,下面均是以正太分布進(jìn)行試驗(yàn)。對同個分布分別使用 KL 和 ADMM 算法進(jìn)行閾值計(jì)算。
? 以下是三次試驗(yàn)的結(jié)果:
? 使用 KLD 和 ADMM 算法得到的閾值如下:
? 實(shí)驗(yàn)小結(jié):單從試驗(yàn)結(jié)果可知,ADMM 得到的量化閾值總是比 KLD 的量化閾值要高,基本穩(wěn)定在max(|均值-3 * 標(biāo)準(zhǔn)差|,|均值+ 3 * 標(biāo)準(zhǔn)差|)。按照正太分布的定義,ADMM 的閾值會覆蓋 99.99% 分布的數(shù)據(jù),因?yàn)槠鋬?yōu)化目標(biāo)難以忍受太小的閾值,那樣會讓閾值外的數(shù)值量化 + 反量化后誤差極大。
? 以上聊了一下一些量化算法相關(guān)的東西,包括量化類型、量化策略以及貼了個試驗(yàn)分析,關(guān)于量化是一個實(shí)用且值得深挖的領(lǐng)域,有問題歡迎討論,我也在學(xué)習(xí)中~
? 好了,收工~
?【公眾號傳送】
《【模型推理】談?wù)剮追N量化策略:MinMax、KLD、ADMM、EQ》
掃描下方二維碼即可關(guān)注我的微信公眾號【極智視界】,獲取更多AI經(jīng)驗(yàn)分享,讓我們用極致+極客的心態(tài)來迎接AI !
總結(jié)
以上是生活随笔為你收集整理的极智AI | 谈谈几种量化策略:MinMax、KLD、ADMM、EQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉字转拼音 Npinyin
- 下一篇: numpy下 随机抽样