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