深度神经网络模型量化

深度神经网络模型量化

模型量化的基本概念

模型量化技术作为一种重要的模型压缩方法,在降低计算复杂度和提高执行效率方面显示出巨大价值。模型量化的核心思想是将模型参数和激活值从高精度表示(通常是32位浮点数FP32)转换为低精度表示(如8位整数INT8或更低位宽),从而减少模型存储空间并加速推理过程。

从数学角度看,量化可以被视为一种映射函数 Q Q Q,它将连续的浮点数值域 R \mathcal{R} R映射到离散的整数值域 Q \mathcal{Q} Q

Q : R ⊂ R → Q = { q 0 , q 1 , . . . , q n − 1 } ⊂ Z Q: \mathcal{R} \subset \mathbb{R} \rightarrow \mathcal{Q} = \{q_0, q_1, ..., q_{n-1}\} \subset \mathbb{Z} Q:RRQ={q0,q1,...,qn1}Z

其中, { q 0 , q 1 , . . . , q n − 1 } \{q_0, q_1, ..., q_{n-1}\} {q0,q1,...,qn1}是量化后的离散值集合。从信息论的角度看,量化本质上是一种有损压缩,将连续信号的信息压缩到有限比特位宽中,不可避免地会引入信息损失,即量化误差。

量化过程可以通过复合函数表示,包含编码(量化)和解码(解量化)两个步骤:

Q ( x ) = Int ( E ( x ) ) Q(x) = \text{Int}(\mathcal{E}(x)) Q(x)=Int(E(x))
x ^ = D ( Q ( x ) ) \hat{x} = \mathcal{D}(Q(x)) x^=D(Q(x))

其中, E : R → R \mathcal{E}: \mathbb{R} \rightarrow \mathbb{R} E:RR是编码函数, Int \text{Int} Int是取整操作, D : Z → R \mathcal{D}: \mathbb{Z} \rightarrow \mathbb{R} D:ZR是解码函数, x x x是原始浮点数, Q ( x ) Q(x) Q(x)是量化后的整数, x ^ \hat{x} x^是解量化后的浮点数近似值。

从率失真理论(Rate-Distortion Theory)角度,量化问题可以形式化为在给定位宽 b b b(率)的约束下,最小化量化误差(失真):

min ⁡ E , D E x ∼ p ( x ) [ d ( x , x ^ ) ] s.t. H ( Q ( x ) ) ≤ b \min_{\mathcal{E}, \mathcal{D}} \mathbb{E}_{x \sim p(x)}[d(x, \hat{x})] \quad \text{s.t.} \quad H(Q(x)) \leq b E,DminExp(x)[d(x,x^)]s.t.H(Q(x))b

其中, d ( x , x ^ ) d(x, \hat{x}) d(x,x^)是失真度量(通常使用均方误差), H ( Q ( x ) ) H(Q(x)) H(Q(x))是量化输出的熵, p ( x ) p(x) p(x)是输入数据的分布。

均匀量化(线性量化)

均匀量化是最常见的量化方法,其特点是量化值在目标范围内均匀分布。其基本原理是将浮点数范围 [ x m i n , x m a x ] [x_{min}, x_{max}] [xmin,xmax]线性映射到整数范围 [ 0 , 2 b − 1 ] [0, 2^b-1] [0,2b1](无符号量化)或 [ − 2 b − 1 , 2 b − 1 − 1 ] [-2^{b-1}, 2^{b-1}-1] [2b1,2b11](有符号量化),其中 b b b是量化后的位宽。

无符号均匀量化

对于无符号均匀量化,量化过程可以表示为:

q = clip ( round ( r − r m i n r m a x − r m i n × ( 2 b − 1 ) ) , 0 , 2 b − 1 ) q = \text{clip}\left(\text{round}\left(\frac{r - r_{min}}{r_{max} - r_{min}} \times (2^b - 1)\right), 0, 2^b - 1\right) q=clip(round(rmaxrminrrmin×(2b1)),0,2b1)

其中, r r r是原始浮点数, r m i n r_{min} rmin r m a x r_{max} rmax分别是浮点数范围的下界和上界, q q q是量化后的整数, clip \text{clip} clip函数确保量化结果在有效范围内。解量化过程则为:

r ^ = r m i n + q 2 b − 1 × ( r m a x − r m i n ) \hat{r} = r_{min} + \frac{q}{2^b - 1} \times (r_{max} - r_{min}) r^=rmin+2b1q×(rmaxrmin)

通常,我们引入量化比例因子 S S S和零点偏移 Z Z Z来简化上述公式:

S = r m a x − r m i n 2 b − 1 S = \frac{r_{max} - r_{min}}{2^b - 1} S=2b1rmaxrmin
Z = round ( − r m i n S ) Z = \text{round}\left(\frac{-r_{min}}{S}\right) Z=round(Srmin)

则量化过程可以重写为:

q = clip ( round ( r S + Z ) , 0 , 2 b − 1 ) q = \text{clip}\left(\text{round}\left(\frac{r}{S} + Z\right), 0, 2^b - 1\right) q=clip(round(Sr+Z),0,2b1)

解量化过程为:

r ^ = S × ( q − Z ) \hat{r} = S \times (q - Z) r^=S×(qZ)

从信号处理的角度,均匀量化可以看作是一种非线性采样过程,将连续信号离散化为有限级别。量化误差 e = r ^ − r e = \hat{r} - r e=r^r可以建模为加性量化噪声,在高分辨率量化下,该噪声近似服从均匀分布:

e ∼ U ( − S 2 , S 2 ) e \sim \mathcal{U}\left(-\frac{S}{2}, \frac{S}{2}\right) eU(2S,2S)

量化噪声的功率为:

σ e 2 = E [ e 2 ] = S 2 12 = ( r m a x − r m i n ) 2 12 ⋅ ( 2 b − 1 ) 2 \sigma_e^2 = \mathbb{E}[e^2] = \frac{S^2}{12} = \frac{(r_{max} - r_{min})^2}{12 \cdot (2^b - 1)^2} σe2=E[e2]=12S2=12(2b1)2(rmaxrmin)2

这表明量化噪声功率与量化步长的平方成正比,与位宽的平方成反比。

有符号均匀量化

对于有符号均匀量化,量化过程可以表示为更复杂的数学形式:

q = clip ( round ( r − r m i n r m a x − r m i n × ( 2 b − 1 ) − 2 b − 1 ) , − 2 b − 1 , 2 b − 1 − 1 ) q = \text{clip}\left(\text{round}\left(\frac{r - r_{min}}{r_{max} - r_{min}} \times (2^b - 1) - 2^{b-1}\right), -2^{b-1}, 2^{b-1}-1\right) q=clip(round(rmaxrminrrmin×(2b1)2b1),2b1,2b11)

解量化过程为:

r ^ = r m i n + q + 2 b − 1 2 b − 1 × ( r m a x − r m i n ) \hat{r} = r_{min} + \frac{q + 2^{b-1}}{2^b - 1} \times (r_{max} - r_{min}) r^=rmin+2b1q+2b1×(rmaxrmin)

引入量化比例因子 S S S和零点偏移 Z Z Z后:

S = r m a x − r m i n 2 b − 1 S = \frac{r_{max} - r_{min}}{2^b - 1} S=2b1rmaxrmin
Z = round ( − r m i n S − 2 b − 1 ) Z = \text{round}\left(\frac{-r_{min}}{S} - 2^{b-1}\right) Z=round(Srmin2b1)

量化和解量化过程可以简化为:

q = clip ( round ( r S + Z ) , − 2 b − 1 , 2 b − 1 − 1 ) q = \text{clip}\left(\text{round}\left(\frac{r}{S} + Z\right), -2^{b-1}, 2^{b-1}-1\right) q=clip(round(Sr+Z),2b1,2b11)
r ^ = S × ( q − Z ) \hat{r} = S \times (q - Z) r^=S×(qZ)

从量化编码理论角度,均匀量化的Lloyd-Max迭代算法可以表述为:给定数据分布 p ( r ) p(r) p(r)和初始量化边界 { b 0 , b 1 , . . . , b 2 b } \{b_0, b_1, ..., b_{2^b}\} {b0,b1,...,b2b},迭代更新量化重建值和边界:

r i = ∫ b i b i + 1 r ⋅ p ( r ) d r ∫ b i b i + 1 p ( r ) d r , i = 0 , 1 , . . . , 2 b − 1 r_i = \frac{\int_{b_i}^{b_{i+1}} r \cdot p(r) dr}{\int_{b_i}^{b_{i+1}} p(r) dr}, \quad i = 0, 1, ..., 2^b-1 ri=bibi+1p(r)drbibi+1rp(r)dr,i=0,1,...,2b1
b i = r i − 1 + r i 2 , i = 1 , 2 , . . . , 2 b − 1 b_i = \frac{r_{i-1} + r_i}{2}, \quad i = 1, 2, ..., 2^b-1 bi=2ri1+ri,i=1,2,...,2b1

对于均匀分布的数据,Lloyd-Max算法收敛到均匀量化;但对于非均匀分布,如神经网络中常见的近似高斯分布或拉普拉斯分布,均匀量化不是最优的。

对称均匀量化

对称均匀量化是均匀量化的一个特例,其假设数据范围关于零对称,即 r m i n = − r m a x r_{min} = -r_{max} rmin=rmax。在这种情况下,零点偏移 Z Z Z简化为特定值,量化比例因子 S S S的计算也变得更加简洁:

S = 2 ⋅ r m a x 2 b − 1 S = \frac{2 \cdot r_{max}}{2^b - 1} S=2b12rmax
Z = { 0 , for signed quantization 2 b − 1 , for unsigned quantization Z = \begin{cases} 0, & \text{for signed quantization} \\ 2^{b-1}, & \text{for unsigned quantization} \end{cases} Z={0,2b1,for signed quantizationfor unsigned quantization

对称量化的量化和解量化过程可以简化为:

q = clip ( round ( r S ) , − 2 b − 1 , 2 b − 1 − 1 ) q = \text{clip}\left(\text{round}\left(\frac{r}{S}\right), -2^{b-1}, 2^{b-1}-1\right) q=clip(round(Sr),2b1,2b11)
r ^ = S × q \hat{r} = S \times q r^=S×q

对于满足特定条件的神经网络(如使用ReLU激活函数的网络),可以证明在最小化量化误差的意义下,最优的非对称量化方案会趋近于对称量化。具体地,当权重分布近似为零均值高斯分布时,量化范围 [ r m i n , r m a x ] [r_{min}, r_{max}] [rmin,rmax]的最优设置为:

r m a x = − r m i n = α ⋅ σ w r_{max} = -r_{min} = \alpha \cdot \sigma_w rmax=rmin=ασw

其中 σ w \sigma_w σw是权重的标准差, α \alpha α是与置信度相关的系数,通常取2-4。通过微分量化噪声功率关于 α \alpha α的导数并令其为零,可以得到最优 α \alpha α值:

d d α ( ( 2 α σ w ) 2 12 ⋅ ( 2 b − 1 ) 2 + 2 ∫ α σ w ∞ ( r − α σ w ) 2 1 2 π σ w e − r 2 2 σ w 2 d r ) = 0 \frac{d}{d\alpha}\left(\frac{(2\alpha\sigma_w)^2}{12 \cdot (2^b - 1)^2} + 2 \int_{\alpha\sigma_w}^{\infty} (r - \alpha\sigma_w)^2 \frac{1}{\sqrt{2\pi}\sigma_w}e^{-\frac{r^2}{2\sigma_w^2}}dr\right) = 0 dαd(12(2b1)2(2ασw)2+2ασw(rασw)22π σw1e2σw2r2dr)=0

这个最优解取决于数据分布和量化位宽,需要通过数值方法求解。

非均匀量化

非均匀量化考虑了数据的分布特性,在数据密集区域分配更多的量化级别,在数据稀疏区域分配较少的量化级别,从而在相同位宽下获得更高的量化精度。

对数量化

对数量化利用对数函数的非线性特性,在接近零的区域提供更高的精度。其基本思想是将浮点数先转换到对数空间,然后进行均匀量化。

对于正数部分,量化过程可以表示为非线性映射:

q + = clip ( round ( k × log ⁡ b ( 1 + ∣ r ∣ ϵ ) ) , 0 , 2 b − 1 − 1 ) , r > 0 q_+ = \text{clip}\left(\text{round}\left(k \times \log_b\left(1 + \frac{|r|}{\epsilon}\right)\right), 0, 2^{b-1}-1\right), \quad r > 0 q+=clip(round(k×logb(1+ϵr)),0,2b11),r>0

其中, k k k是缩放因子, b b b是对数的底数(通常选择2), ϵ \epsilon ϵ是防止对数参数为零的小正数。

完整的对数量化考虑正负数的处理,可以表示为:

q = { sign ( r ) ⋅ clip ( round ( k × log ⁡ b ( 1 + ∣ r ∣ ϵ ) ) , 0 , 2 b − 1 − 1 ) , r ≠ 0 0 , r = 0 q = \begin{cases} \text{sign}(r) \cdot \text{clip}\left(\text{round}\left(k \times \log_b\left(1 + \frac{|r|}{\epsilon}\right)\right), 0, 2^{b-1}-1\right), & r \neq 0 \\ 0, & r = 0 \end{cases} q={sign(r)clip(round(k×logb(1+ϵr)),0,2b11),0,r=0r=0

其中符号位占用1位,数值部分占用 b − 1 b-1 b1位。解量化过程为:

r ^ = sign ( q ) ⋅ ϵ ⋅ ( b ∣ q ∣ k − 1 ) \hat{r} = \text{sign}(q) \cdot \epsilon \cdot \left(b^{\frac{|q|}{k}} - 1\right) r^=sign(q)ϵ(bkq1)

从信息论角度,对数量化实际上是根据Weber-Fechner定律设计的,该定律指出人类对刺激的感知与刺激强度的对数成正比。类似地,对数量化对相对变化较大的区域(通常是大数值区域)进行粗量化,对相对变化小的区域(通常是小数值区域)进行精细量化。

对于服从拉普拉斯分布的数据:

p ( r ) = 1 2 b e − ∣ r ∣ b p(r) = \frac{1}{2b}e^{-\frac{|r|}{b}} p(r)=2b1ebr

可以证明,最优的非均匀量化方案应该按照数据的概率密度函数的立方根分布量化级别,即:

p q ( q ) ∝ p ( r ) 1 / 3 p_q(q) \propto p(r)^{1/3} pq(q)p(r)1/3

这导致量化边界满足:

∫ b i b i + 1 p ( r ) 1 / 3 d r = 1 2 b ∫ − ∞ ∞ p ( r ) 1 / 3 d r \int_{b_i}^{b_{i+1}} p(r)^{1/3} dr = \frac{1}{2^b} \int_{-\infty}^{\infty} p(r)^{1/3} dr bibi+1p(r)1/3dr=2b1p(r)1/3dr

对于拉普拉斯分布,这一最优量化方案近似于对数量化。

基于聚类的非均匀量化

基于聚类的非均匀量化方法通过聚类算法自动发现数据的分布特征,为不同的数据区域分配合适的量化级别。

K-means量化

K-means量化是一种典型的基于聚类的量化方法,其目标是最小化量化均方误差:

min ⁡ C , S ∑ i = 1 n min ⁡ j ∈ { 1 , 2 , . . . , k } ∥ r i − c j ∥ 2 \min_{C, S} \sum_{i=1}^{n} \min_{j \in \{1,2,...,k\}} \|r_i - c_j\|^2 C,Smini=1nj{1,2,...,k}minricj2

其中, C = { c 1 , c 2 , . . . , c k } C = \{c_1, c_2, ..., c_k\} C={c1,c2,...,ck} k = 2 b k = 2^b k=2b个聚类中心, S = { S 1 , S 2 , . . . , S k } S = \{S_1, S_2, ..., S_k\} S={S1,S2,...,Sk}是聚类划分,满足 S j = { i : arg ⁡ min ⁡ j ′ ∥ r i − c j ′ ∥ 2 = j } S_j = \{i : \arg\min_{j'} \|r_i - c_{j'}\|^2 = j\} Sj={i:argminjricj2=j}

K-means算法的迭代过程可以表示为:

  1. 初始化聚类中心 C ( 0 ) = { c 1 ( 0 ) , c 2 ( 0 ) , . . . , c k ( 0 ) } C^{(0)} = \{c_1^{(0)}, c_2^{(0)}, ..., c_k^{(0)}\} C(0)={c1(0),c2(0),...,ck(0)}
  2. 对于每次迭代 t t t,计算聚类划分:
    S j ( t ) = { i : arg ⁡ min ⁡ j ′ ∥ r i − c j ′ ( t − 1 ) ∥ 2 = j } S_j^{(t)} = \{i : \arg\min_{j'} \|r_i - c_{j'}^{(t-1)}\|^2 = j\} Sj(t)={i:argjminricj(t1)2=j}
  3. 更新聚类中心:
    c j ( t ) = 1 ∣ S j ( t ) ∣ ∑ i ∈ S j ( t ) r i c_j^{(t)} = \frac{1}{|S_j^{(t)}|} \sum_{i \in S_j^{(t)}} r_i cj(t)=Sj(t)1iSj(t)ri
  4. 重复步骤2-3直至收敛

K-means量化的量化过程可以表示为查找最近的聚类中心:

q ( r ) = arg ⁡ min ⁡ j ∈ { 1 , 2 , . . . , k } ∥ r − c j ∥ q(r) = \arg\min_{j \in \{1,2,...,k\}} \|r - c_j\| q(r)=argj{1,2,...,k}minrcj

解量化过程则是直接映射到对应的聚类中心:

r ^ = c q ( r ) \hat{r} = c_{q(r)} r^=cq(r)

从矢量量化理论角度,K-means量化实际上是在最小化下面的期望失真度量:

D = E r ∼ p ( r ) [ ∥ r − r ^ ∥ 2 ] = ∑ j = 1 k ∫ V j ∥ r − c j ∥ 2 p ( r ) d r D = \mathbb{E}_{r \sim p(r)}[\|r - \hat{r}\|^2] = \sum_{j=1}^{k} \int_{V_j} \|r - c_j\|^2 p(r) dr D=Erp(r)[rr^2]=j=1kVjrcj2p(r)dr

其中, V j V_j Vj是第 j j j个Voronoi区域,定义为与中心 c j c_j cj距离最近的点集:

V j = { r : ∥ r − c j ∥ ≤ ∥ r − c j ′ ∥ , ∀ j ′ ≠ j } V_j = \{r : \|r - c_j\| \leq \|r - c_{j'}\|, \forall j' \neq j\} Vj={r:rcjrcj,j=j}

最优量化方案应满足以下两个必要条件:

  1. 最近邻条件: q ( r ) = arg ⁡ min ⁡ j ∥ r − c j ∥ q(r) = \arg\min_{j} \|r - c_j\| q(r)=argminjrcj
  2. 质心条件: c j = ∫ V j r p ( r ) d r ∫ V j p ( r ) d r c_j = \frac{\int_{V_j} r p(r) dr}{\int_{V_j} p(r) dr} cj=Vjp(r)drVjrp(r)dr
乘积量化(Product Quantization)

乘积量化是一种更复杂的非均匀量化方法,其核心思想是将高维向量分解为多个低维子向量,然后对每个子向量独立量化。这种方法的数学表示更为复杂。

假设原始向量 r ∈ R d \mathbf{r} \in \mathbb{R}^d rRd可以分解为 m m m个子向量: r = [ r 1 , r 2 , . . . , r m ] \mathbf{r} = [\mathbf{r}^1, \mathbf{r}^2, ..., \mathbf{r}^m] r=[r1,r2,...,rm],其中每个子向量 r j ∈ R d / m \mathbf{r}^j \in \mathbb{R}^{d/m} rjRd/m(假设 d d d能被 m m m整除)。

对于每个子向量空间 j ∈ { 1 , 2 , . . . , m } j \in \{1, 2, ..., m\} j{1,2,...,m},应用K-means算法得到 k j k_j kj个聚类中心 { c 1 j , c 2 j , . . . , c k j j } \{c_1^j, c_2^j, ..., c_{k_j}^j\} {c1j,c2j,...,ckjj}。量化过程为:

q j ( r j ) = arg ⁡ min ⁡ i ∈ { 1 , 2 , . . . , k j } ∥ r j − c i j ∥ q^j(\mathbf{r}^j) = \arg\min_{i \in \{1,2,...,k_j\}} \|\mathbf{r}^j - c_i^j\| qj(rj)=argi{1,2,...,kj}minrjcij

完整的量化向量是所有子向量量化结果的组合:

Q ( r ) = [ q 1 ( r 1 ) , q 2 ( r 2 ) , . . . , q m ( r m ) ] Q(\mathbf{r}) = [q^1(\mathbf{r}^1), q^2(\mathbf{r}^2), ..., q^m(\mathbf{r}^m)] Q(r)=[q1(r1),q2(r2),...,qm(rm)]

整个向量的量化编码可以表示为一个 m m m元组: ( i 1 , i 2 , . . . , i m ) (i_1, i_2, ..., i_m) (i1,i2,...,im),其中 i j = q j ( r j ) i_j = q^j(\mathbf{r}^j) ij=qj(rj)。这种编码方式的总位宽为 ∑ j = 1 m log ⁡ 2 k j \sum_{j=1}^{m} \log_2 k_j j=1mlog2kj位。

从信息论角度,乘积量化本质上是在进行一种结构化的矢量量化,其理论上可以达到的率失真性能受限于以下不等式:

R ( D ) ≥ 1 2 log ⁡ 2 ∣ Σ ∣ ( 2 π e ) d D d R(D) \geq \frac{1}{2} \log_2 \frac{|\Sigma|}{(2\pi e)^d D^d} R(D)21log2(2πe)dDd∣Σ∣

其中, R R R是编码率(每维度的平均比特数), D D D是平均失真, Σ \Sigma Σ是数据的协方差矩阵。

乘积量化通过子空间独立量化的方式近似这一界限,其失真度量可以分解为:

D P Q = ∑ j = 1 m D j D_{PQ} = \sum_{j=1}^{m} D_j DPQ=j=1mDj

其中, D j D_j Dj是第 j j j个子空间的量化失真。这种分解假设子空间之间相互独立,在实际应用中通常通过适当的空间变换(如PCA)来近似满足这一假设。

基于分布的非均匀量化

基于分布的非均匀量化方法根据数据的概率分布特性设计量化策略,使量化后的数据分布接近原始分布。

最小化量化误差

基于分布的量化可以形式化为最小化预期量化误差的优化问题,这可以通过变分优化方法求解:

min ⁡ c 1 , c 2 , . . . , c k , τ 1 , τ 2 , . . . , τ k − 1 E r ∼ p ( r ) [ ( r − r ^ ) 2 ] = min ⁡ c 1 , c 2 , . . . , c k , τ 1 , τ 2 , . . . , τ k − 1 ∫ − ∞ ∞ ( r − r ^ ) 2 p ( r ) d r \min_{c_1, c_2, ..., c_k, \tau_1, \tau_2, ..., \tau_{k-1}} \mathbb{E}_{r \sim p(r)}[(r - \hat{r})^2] = \min_{c_1, c_2, ..., c_k, \tau_1, \tau_2, ..., \tau_{k-1}} \int_{-\infty}^{\infty} (r - \hat{r})^2 p(r) dr c1,c2,...,ck,τ1,τ2,...,τk1minErp(r)[(rr^)2]=c1,c2,...,ck,τ1,τ2,...,τk1min(rr^)2p(r)dr

其中, { c 1 , c 2 , . . . , c k } \{c_1, c_2, ..., c_k\} {c1,c2,...,ck}是量化表示值, { τ 1 , τ 2 , . . . , τ k − 1 } \{\tau_1, \tau_2, ..., \tau_{k-1}\} {τ1,τ2,...,τk1}是量化阈值,满足:

r ^ = c i  if  τ i − 1 < r ≤ τ i \hat{r} = c_i \text{ if } \tau_{i-1} < r \leq \tau_i r^=ci if τi1<rτi

通过对优化目标关于 c i c_i ci τ i \tau_i τi分别求导并令其为零,可以得到最优量化方案应满足的条件:

∂ ∂ c i ∫ τ i − 1 τ i ( r − c i ) 2 p ( r ) d r = 0 ⇒ c i = ∫ τ i − 1 τ i r ⋅ p ( r ) d r ∫ τ i − 1 τ i p ( r ) d r \frac{\partial}{\partial c_i} \int_{\tau_{i-1}}^{\tau_i} (r - c_i)^2 p(r) dr = 0 \Rightarrow c_i = \frac{\int_{\tau_{i-1}}^{\tau_i} r \cdot p(r) dr}{\int_{\tau_{i-1}}^{\tau_i} p(r) dr} ciτi1τi(rci)2p(r)dr=0ci=τi1τip(r)drτi1τirp(r)dr

∂ ∂ τ i [ ∫ τ i − 1 τ i ( r − c i ) 2 p ( r ) d r + ∫ τ i τ i + 1 ( r − c i + 1 ) 2 p ( r ) d r ] = 0 \frac{\partial}{\partial \tau_i} \left[ \int_{\tau_{i-1}}^{\tau_i} (r - c_i)^2 p(r) dr + \int_{\tau_i}^{\tau_{i+1}} (r - c_{i+1})^2 p(r) dr \right] = 0 τi[τi1τi(rci)2p(r)dr+τiτi+1(rci+1)2p(r)dr]=0

求解后得到:

τ i = c i + c i + 1 2 \tau_i = \frac{c_i + c_{i+1}}{2} τi=2ci+ci+1

这组方程表明,最优量化表示值应为每个量化区间内数据的条件期望,而最优量化阈值应是相邻量化表示值的中点。通过迭代求解这两组方程,可以得到最优的非均匀量化方案,这就是Lloyd-Max算法的本质。

从信息论角度,当量化位宽足够高时,最优非均匀量化的量化点密度应与数据概率密度的立方根成正比:

ρ ( r ) ∝ p ( r ) 1 / 3 \rho(r) \propto p(r)^{1/3} ρ(r)p(r)1/3

基于这一原理,可以设计出适合各种分布的非均匀量化方案。例如,对于拉普拉斯分布 p ( r ) = 1 2 b e − ∣ r ∣ b p(r) = \frac{1}{2b}e^{-\frac{|r|}{b}} p(r)=2b1ebr,最优的量化点密度为 ρ ( r ) ∝ e − ∣ r ∣ 3 b \rho(r) \propto e^{-\frac{|r|}{3b}} ρ(r)e3br,这表明在靠近零的区域应安排更密集的量化级别。

基于熵的量化

基于熵的量化方法试图最大化量化后数据的信息熵,从而保留原始数据的信息量。其目标函数可以表示为复杂的优化问题:

max ⁡ c 1 , c 2 , . . . , c k , τ 1 , τ 2 , . . . , τ k − 1 H ( Q ( r ) ) = − ∑ i = 1 k P ( Q ( r ) = c i ) log ⁡ 2 P ( Q ( r ) = c i ) \max_{c_1, c_2, ..., c_k, \tau_1, \tau_2, ..., \tau_{k-1}} H(Q(r)) = -\sum_{i=1}^{k} P(Q(r) = c_i) \log_2 P(Q(r) = c_i) c1,c2,...,ck,τ1,τ2,...,τk1maxH(Q(r))=i=1kP(Q(r)=ci)log2P(Q(r)=ci)

其中, P ( Q ( r ) = c i ) = ∫ τ i − 1 τ i p ( r ) d r P(Q(r) = c_i) = \int_{\tau_{i-1}}^{\tau_i} p(r) dr P(Q(r)=ci)=τi1τip(r)dr是量化后数据落入第 i i i个量化级别的概率。

最大熵量化的一个特例是均匀概率量化,即使得每个量化级别被选中的概率相等:

P ( Q ( r ) = c i ) = 1 k , ∀ i ∈ { 1 , 2 , . . . , k } P(Q(r) = c_i) = \frac{1}{k}, \forall i \in \{1, 2, ..., k\} P(Q(r)=ci)=k1,i{1,2,...,k}

这等价于求解以下方程组:

∫ τ i − 1 τ i p ( r ) d r = 1 k , ∀ i ∈ { 1 , 2 , . . . , k } \int_{\tau_{i-1}}^{\tau_i} p(r) dr = \frac{1}{k}, \forall i \in \{1, 2, ..., k\} τi1τip(r)dr=k1,i{1,2,...,k}

对于连续型分布,这可以进一步简化为:

τ i = F − 1 ( i k ) \tau_i = F^{-1}\left(\frac{i}{k}\right) τi=F1(ki)

其中, F − 1 F^{-1} F1是数据累积分布函数的逆函数。

这种量化方法在信息论意义上最大限度地保留了原始数据的信息,但不一定最小化均方误差。实际应用中,可以结合熵最大化和误差最小化的目标,设计混合优化方案:

min ⁡ c 1 , c 2 , . . . , c k , τ 1 , τ 2 , . . . , τ k − 1 E [ ( r − r ^ ) 2 ] − λ H ( Q ( r ) ) \min_{c_1, c_2, ..., c_k, \tau_1, \tau_2, ..., \tau_{k-1}} \mathbb{E}[(r - \hat{r})^2] - \lambda H(Q(r)) c1,c2,...,ck,τ1,τ2,...,τk1minE[(rr^)2]λH(Q(r))

其中, λ \lambda λ是平衡两个目标的权重参数。这种混合优化方案在理论上可以获得更好的率失真性能,但求解复杂度较高。

其他量化方法

除了上述方法外,神经网络量化还有许多其他技术,以下介绍几种理论上更为复杂的方法。

混合精度量化

混合精度量化针对神经网络中不同层或不同类型的参数采用不同的量化精度。其基本思想是根据每层对最终精度的敏感度,分配不同的位宽。这一问题可以形式化为一个复杂的离散优化问题:

min ⁡ { b 1 , b 2 , . . . , b L } ∈ B L ( Q { b 1 , b 2 , . . . , b L } ( W ) ) s.t. ∑ l = 1 L C ( b l ) ≤ C b u d g e t \min_{\{b_1, b_2, ..., b_L\} \in \mathcal{B}} \mathcal{L}(Q_{\{b_1, b_2, ..., b_L\}}(\mathbf{W})) \quad \text{s.t.} \quad \sum_{l=1}^{L} C(b_l) \leq C_{budget} {b1,b2,...,bL}BminL(Q{b1,b2,...,bL}(W))s.t.l=1LC(bl)Cbudget

其中, b l b_l bl是分配给第 l l l层的位宽, B \mathcal{B} B是可选位宽集合, L \mathcal{L} L是模型损失函数, Q { b 1 , b 2 , . . . , b L } Q_{\{b_1, b_2, ..., b_L\}} Q{b1,b2,...,bL}表示使用指定位宽进行量化的操作, C ( b l ) C(b_l) C(bl)是使用位宽 b l b_l bl的计算成本, C b u d g e t C_{budget} Cbudget是总计算预算。

由于这是一个NP难问题,通常采用启发式方法或强化学习方法求解近似最优解。例如,可以基于每层的敏感度指标分配位宽:

s l = ∂ L ∂ b l ≈ L ( Q { b 1 , . . . , b l + Δ b , . . . , b L } ( W ) ) − L ( Q { b 1 , . . . , b l , . . . , b L } ( W ) ) Δ b s_l = \frac{\partial \mathcal{L}}{\partial b_l} \approx \frac{\mathcal{L}(Q_{\{b_1, ..., b_l + \Delta b, ..., b_L\}}(\mathbf{W})) - \mathcal{L}(Q_{\{b_1, ..., b_l, ..., b_L\}}(\mathbf{W}))}{\Delta b} sl=blLΔbL(Q{b1,...,bl+Δb,...,bL}(W))L(Q{b1,...,bl,...,bL}(W))

位宽分配策略可以基于敏感度和计算成本的比率:

b l = arg ⁡ max ⁡ b ∈ B s l ( b ) C ( b ) b_l = \arg\max_{b \in \mathcal{B}} \frac{s_l(b)}{C(b)} bl=argbBmaxC(b)sl(b)

从理论上讲,混合精度量化可以视为针对每层设计最优码本的问题,其理论最优解应满足:

∂ L / ∂ b 1 ∂ C / ∂ b 1 = ∂ L / ∂ b 2 ∂ C / ∂ b 2 = . . . = ∂ L / ∂ b L ∂ C / ∂ b L \frac{\partial \mathcal{L} / \partial b_1}{\partial C / \partial b_1} = \frac{\partial \mathcal{L} / \partial b_2}{\partial C / \partial b_2} = ... = \frac{\partial \mathcal{L} / \partial b_L}{\partial C / \partial b_L} C/b1L/b1=C/b2L/b2=...=C/bLL/bL

这表明在最优配置下,增加任何一层的位宽所带来的性能提升与计算成本增加的比率应相等。

动态量化

动态量化在推理时动态确定量化参数,而不是预先确定。这种方法特别适合于激活值的量化,因为激活值在不同输入下有较大变化。

从数学上看,动态量化可以表示为一个依赖于输入的量化函数:

Q θ ( r , x ) = round ( r S ( x , θ ) + Z ( x , θ ) ) Q_{\theta}(r, \mathbf{x}) = \text{round}\left(\frac{r}{S(\mathbf{x}, \theta)} + Z(\mathbf{x}, \theta)\right) Qθ(r,x)=round(S(x,θ)r+Z(x,θ))

其中, S ( x , θ ) S(\mathbf{x}, \theta) S(x,θ) Z ( x , θ ) Z(\mathbf{x}, \theta) Z(x,θ)是基于输入 x \mathbf{x} x和参数 θ \theta θ计算的量化参数。这些参数可以由神经网络直接预测:

[ S ( x , θ ) , Z ( x , θ ) ] = f θ ( x ) [S(\mathbf{x}, \theta), Z(\mathbf{x}, \theta)] = f_{\theta}(\mathbf{x}) [S(x,θ),Z(x,θ)]=fθ(x)

其中, f θ f_{\theta} fθ是一个参数为 θ \theta θ的辅助神经网络。

动态量化可以看作是一种自适应的非均匀量化,其理论最优性可以通过条件率失真理论分析。对于输入 x \mathbf{x} x条件下的数据分布 p ( r ∣ x ) p(r|\mathbf{x}) p(rx),最优的条件量化方案应满足:

S ( x ) = r m a x ( x ) − r m i n ( x ) 2 b − 1 S(\mathbf{x}) = \frac{r_{max}(\mathbf{x}) - r_{min}(\mathbf{x})}{2^b - 1} S(x)=2b1rmax(x)rmin(x)
Z ( x ) = round ( − r m i n ( x ) S ( x ) ) Z(\mathbf{x}) = \text{round}\left(\frac{-r_{min}(\mathbf{x})}{S(\mathbf{x})}\right) Z(x)=round(S(x)rmin(x))

其中, r m i n ( x ) r_{min}(\mathbf{x}) rmin(x) r m a x ( x ) r_{max}(\mathbf{x}) rmax(x)是条件分布 p ( r ∣ x ) p(r|\mathbf{x}) p(rx)的最小值和最大值。在实践中,通常使用统计估计值,如:

r m i n ( x ) ≈ min ⁡ i r i ( x ) r_{min}(\mathbf{x}) \approx \min_{i} r_i(\mathbf{x}) rmin(x)iminri(x)
r m a x ( x ) ≈ max ⁡ i r i ( x ) r_{max}(\mathbf{x}) \approx \max_{i} r_i(\mathbf{x}) rmax(x)imaxri(x)

或者使用更稳健的估计:

r m i n ( x ) ≈ μ ( x ) − α ⋅ σ ( x ) r_{min}(\mathbf{x}) \approx \mu(\mathbf{x}) - \alpha \cdot \sigma(\mathbf{x}) rmin(x)μ(x)ασ(x)
r m a x ( x ) ≈ μ ( x ) + α ⋅ σ ( x ) r_{max}(\mathbf{x}) \approx \mu(\mathbf{x}) + \alpha \cdot \sigma(\mathbf{x}) rmax(x)μ(x)+ασ(x)

其中, μ ( x ) \mu(\mathbf{x}) μ(x) σ ( x ) \sigma(\mathbf{x}) σ(x)分别是条件分布的均值和标准差, α \alpha α是超参数。

量化感知训练

量化感知训练(Quantization-Aware Training, QAT)在训练过程中考虑量化效应,以减小量化误差。其基本思想是在前向传播中模拟量化操作,但在反向传播中使用直通估计器(Straight-Through Estimator, STE)保持梯度流动。

数学上,QAT的前向传播为一个复合函数:

r ^ = g ( Q ( r ) ) = g ( round ( f ( r ) ) ) \hat{r} = g(Q(r)) = g(\text{round}(f(r))) r^=g(Q(r))=g(round(f(r)))

其中, f f f是预处理函数, g g g是后处理函数。

反向传播时,由于取整操作的梯度几乎处处为零,使用STE近似梯度:

∂ r ^ ∂ r = ∂ g ∂ Q ⋅ ∂ Q ∂ r ≈ ∂ g ∂ Q ⋅ ∂ f ∂ r \frac{\partial \hat{r}}{\partial r} = \frac{\partial g}{\partial Q} \cdot \frac{\partial Q}{\partial r} \approx \frac{\partial g}{\partial Q} \cdot \frac{\partial f}{\partial r} rr^=QgrQQgrf

这相当于在梯度传播中"跳过"取整操作。更精确地说,STE可以表示为:

∂ L ∂ r = ∂ L ∂ r ^ ⋅ { ∂ g ∂ Q ⋅ ∂ f ∂ r , if  f m i n ≤ f ( r ) ≤ f m a x 0 , otherwise \frac{\partial \mathcal{L}}{\partial r} = \frac{\partial \mathcal{L}}{\partial \hat{r}} \cdot \begin{cases} \frac{\partial g}{\partial Q} \cdot \frac{\partial f}{\partial r}, & \text{if } f_{min} \leq f(r) \leq f_{max} \\ 0, & \text{otherwise} \end{cases} rL=r^L{Qgrf,0,if fminf(r)fmaxotherwise

其中, [ f m i n , f m a x ] [f_{min}, f_{max}] [fmin,fmax]是量化操作的有效输入范围。

从优化理论角度,QAT可以看作是求解以下双层优化问题:

min ⁡ W L ( Q ( W ) ) \min_{\mathbf{W}} \mathcal{L}(Q(\mathbf{W})) WminL(Q(W))

其中, W \mathbf{W} W是模型参数, Q Q Q是量化操作。这可以通过交替优化的方式求解,即先固定量化操作 Q Q Q,优化参数 W \mathbf{W} W,然后固定参数,更新量化操作的参数(如量化范围)。

从理论上讲,QAT的全局最优解应该导致量化模型在原始任务上的性能最大化,但由于问题的非凸性和离散性,通常只能找到局部最优解。

量化误差分析

量化不可避免地会引入误差,理解这些误差的性质和大小对于设计有效的量化策略至关重要。

量化噪声模型

对于均匀量化,量化误差 e = r ^ − r e = \hat{r} - r e=r^r可以建模为均匀分布的随机噪声,这一模型在信号处理领域广为使用。在深度神经网络中,我们可以扩展这一模型,考虑量化误差在网络中的传播。

假设量化后的参数为 W ^ = W + E W \hat{\mathbf{W}} = \mathbf{W} + \mathbf{E}_W W^=W+EW,量化后的激活值为 a ^ = a + E a \hat{\mathbf{a}} = \mathbf{a} + \mathbf{E}_a a^=a+Ea,其中 E W \mathbf{E}_W EW E a \mathbf{E}_a Ea是量化噪声。对于线性层 y = W x \mathbf{y} = \mathbf{W}\mathbf{x} y=Wx,量化后的输出为:

y ^ = W ^ x ^ = ( W + E W ) ( x + E x ) = W x + W E x + E W x + E W E x \hat{\mathbf{y}} = \hat{\mathbf{W}}\hat{\mathbf{x}} = (\mathbf{W} + \mathbf{E}_W)(\mathbf{x} + \mathbf{E}_x) = \mathbf{W}\mathbf{x} + \mathbf{W}\mathbf{E}_x + \mathbf{E}_W\mathbf{x} + \mathbf{E}_W\mathbf{E}_x y^=W^x^=(W+EW)(x+Ex)=Wx+WEx+EWx+EWEx

假设噪声项相互独立且与信号无关,输出噪声的协方差矩阵可以近似为:

Cov ( y ^ − y ) ≈ W Cov ( E x ) W T + Cov ( E W x ) \text{Cov}(\hat{\mathbf{y}} - \mathbf{y}) \approx \mathbf{W}\text{Cov}(\mathbf{E}_x)\mathbf{W}^T + \text{Cov}(\mathbf{E}_W\mathbf{x}) Cov(y^y)WCov(Ex)WT+Cov(EWx)

其中,

Cov ( E x ) = Δ x 2 12 I \text{Cov}(\mathbf{E}_x) = \frac{\Delta_x^2}{12}\mathbf{I} Cov(Ex)=12Δx2I
Cov ( E W x ) ≈ Δ W 2 12 ⋅ E [ x x T ] \text{Cov}(\mathbf{E}_W\mathbf{x}) \approx \frac{\Delta_W^2}{12} \cdot \mathbb{E}[\mathbf{x}\mathbf{x}^T] Cov(EWx)12ΔW2E[xxT]

这里, Δ x \Delta_x Δx Δ W \Delta_W ΔW分别是激活值和权重的量化步长。

对于非线性层,如ReLU激活函数 σ ( x ) = max ⁡ ( 0 , x ) \sigma(x) = \max(0, x) σ(x)=max(0,x),量化误差的传播更为复杂,可以通过一阶泰勒展开近似:

σ ( x ^ ) ≈ σ ( x ) + σ ′ ( x ) ⋅ ( x q − x ) ≈ σ ( x ) + I x > 0 ⋅ e x \sigma(\hat{x}) \approx \sigma(x) + \sigma'(x) \cdot (x_q - x) \approx \sigma(x) + \mathbb{I}_{x > 0} \cdot e_x σ(x^)σ(x)+σ(x)(xqx)σ(x)+Ix>0ex

其中, I x > 0 \mathbb{I}_{x > 0} Ix>0是指示函数,当 x > 0 x > 0 x>0时为1,否则为0。这表明ReLU激活函数会过滤掉负输入区域的量化噪声,但保留正输入区域的噪声。

对于整个网络,量化误差会从输入到输出累积。假设网络有 L L L层,每层的量化误差传播可以递归表示为:

e l = J l e l − 1 + e quant l \mathbf{e}^l = \mathbf{J}^l \mathbf{e}^{l-1} + \mathbf{e}_{\text{quant}}^l el=Jlel1+equantl

其中, e l \mathbf{e}^l el是第 l l l层的总误差, J l = ∂ a l ∂ a l − 1 \mathbf{J}^l = \frac{\partial \mathbf{a}^l}{\partial \mathbf{a}^{l-1}} Jl=al1al是雅可比矩阵, e quant l \mathbf{e}_{\text{quant}}^l equantl是第 l l l层引入的量化误差。

假设各层误差相互独立,则输出的误差协方差矩阵可以近似为:

Cov ( e L ) ≈ ∑ l = 1 L ( J L J L − 1 ⋯ J l + 1 ) Cov ( e quant l ) ( J L J L − 1 ⋯ J l + 1 ) T \text{Cov}(\mathbf{e}^L) \approx \sum_{l=1}^{L} (\mathbf{J}^L \mathbf{J}^{L-1} \cdots \mathbf{J}^{l+1}) \text{Cov}(\mathbf{e}_{\text{quant}}^l) (\mathbf{J}^L \mathbf{J}^{L-1} \cdots \mathbf{J}^{l+1})^T Cov(eL)l=1L(JLJL1Jl+1)Cov(equantl)(JLJL1Jl+1)T

这一表达式表明,早期层的量化误差会通过后续层的雅可比矩阵放大或缩小,因此不同层对量化的敏感度不同。

量化敏感度分析

不同层对量化的敏感度不同,敏感度可以通过扰动分析或Hessian分析来评估。

扰动分析通过直接测量量化对模型输出的影响来评估敏感度:

S l = ∥ a L − a ^ L ∥ 2 2 ∥ E l ∥ F 2 S_l = \frac{\|\mathbf{a}^L - \hat{\mathbf{a}}^L\|_2^2}{\|\mathbf{E}_l\|_F^2} Sl=ElF2aLa^L22

其中, a L \mathbf{a}^L aL是原始模型的输出, a ^ L \hat{\mathbf{a}}^L a^L是在第 l l l层引入量化扰动后的输出, E l \mathbf{E}_l El是第 l l l层的量化误差, ∥ ⋅ ∥ F \|\cdot\|_F F是Frobenius范数。

从优化角度,可以通过Hessian矩阵分析量化敏感度。损失函数关于第 l l l层参数的二阶导数可以表示为:

H l = ∂ 2 L ∂ W l 2 \mathbf{H}_l = \frac{\partial^2 \mathcal{L}}{\partial \mathbf{W}_l^2} Hl=Wl22L

量化后的参数 W ^ l = W l + E l \hat{\mathbf{W}}_l = \mathbf{W}_l + \mathbf{E}_l W^l=Wl+El引起的损失增加可以通过二阶泰勒展开近似:

Δ L ≈ ∂ L ∂ W l ⋅ E l + 1 2 E l T H l E l \Delta \mathcal{L} \approx \frac{\partial \mathcal{L}}{\partial \mathbf{W}_l} \cdot \mathbf{E}_l + \frac{1}{2} \mathbf{E}_l^T \mathbf{H}_l \mathbf{E}_l ΔLWlLEl+21ElTHlEl

对于已经收敛的模型,一阶导数 ∂ L ∂ W l \frac{\partial \mathcal{L}}{\partial \mathbf{W}_l} WlL接近于零,主要的损失增加来自二阶项。假设量化误差 E l \mathbf{E}_l El的每个元素独立同分布,服从均匀分布 U ( − Δ l 2 , Δ l 2 ) \mathcal{U}(-\frac{\Delta_l}{2}, \frac{\Delta_l}{2}) U(2Δl,2Δl),则预期的损失增加为:

E [ Δ L ] ≈ 1 2 E [ E l T H l E l ] = 1 2 Tr ( H l ⋅ E [ E l E l T ] ) = Δ l 2 24 Tr ( H l ) \mathbb{E}[\Delta \mathcal{L}] \approx \frac{1}{2} \mathbb{E}[\mathbf{E}_l^T \mathbf{H}_l \mathbf{E}_l] = \frac{1}{2} \text{Tr}(\mathbf{H}_l \cdot \mathbb{E}[\mathbf{E}_l \mathbf{E}_l^T]) = \frac{\Delta_l^2}{24} \text{Tr}(\mathbf{H}_l) E[ΔL]21E[ElTHlEl]=21Tr(HlE[ElElT])=24Δl2Tr(Hl)

因此,第 l l l层的量化敏感度可以定义为 S l = Tr ( H l ) S_l = \text{Tr}(\mathbf{H}_l) Sl=Tr(Hl)

由于Hessian矩阵的计算复杂度高,实际应用中通常使用近似方法,如对角Hessian近似:

S l ≈ ∑ i , j ( ∂ 2 L ∂ W l , i j 2 ) S_l \approx \sum_{i,j} \left(\frac{\partial^2 \mathcal{L}}{\partial W_{l,ij}^2}\right) Sli,j(Wl,ij22L)

或者使用Fisher信息矩阵作为Hessian的近似:

S l ≈ E [ ( ∂ L ∂ W l ) T ( ∂ L ∂ W l ) ] S_l \approx \mathbb{E}\left[\left(\frac{\partial \mathcal{L}}{\partial \mathbf{W}_l}\right)^T \left(\frac{\partial \mathcal{L}}{\partial \mathbf{W}_l}\right)\right] SlE[(WlL)T(WlL)]

基于敏感度分析,可以为不同层分配不同的量化位宽,以平衡性能和效率。对于敏感度高的层,应分配更高的位宽;对于敏感度低的层,可以使用更低的位宽。

理想的位宽分配策略应满足:

S 1 ⋅ Δ 1 2 C 1 = S 2 ⋅ Δ 2 2 C 2 = … = S L ⋅ Δ L 2 C L \frac{S_1 \cdot \Delta_1^2}{C_1} = \frac{S_2 \cdot \Delta_2^2}{C_2} = \ldots = \frac{S_L \cdot \Delta_L^2}{C_L} C1S1Δ12=C2S2Δ22==CLSLΔL2

其中, C l C_l Cl是第 l l l层的计算复杂度, Δ l \Delta_l Δl是第 l l l层的量化步长。这一原则表明,每单位计算复杂度的损失增加应在各层之间均衡。

你可能感兴趣的:(dnn,人工智能,算法)