量化感知训练技术解析
引言:训练中的量化智慧
从数学角度看,量化感知训练解决了一个基本的优化问题:如何在离散约束下进行连续优化。传统的梯度下降方法假设参数空间是连续的,而量化引入了离散性约束。QAT通过巧妙的重参数化和梯度估计技术,在保持优化算法有效性的同时,让模型感知到最终部署时的量化约束。
模拟量化的数学原理
模拟量化是量化感知训练的核心技术,它在保持数值为浮点数的同时,模拟了量化过程的数值效果。这种技术的精妙之处在于它能够在训练时提供量化的"预览",让模型提前适应量化带来的数值变化。
基础模拟量化函数
模拟量化函数的数学定义为:
FakeQuant ( x ) = s ⋅ clamp ( round ( x − z s ) , q m i n , q m a x ) + z \text{FakeQuant}(x) = s \cdot \text{clamp}\left(\text{round}\left(\frac{x - z}{s}\right), q_{min}, q_{max}\right) + z FakeQuant(x)=s⋅clamp(round(sx−z),qmin,qmax)+z
其中 s s s 是缩放因子, z z z 是零点偏移, q m i n q_{min} qmin 和 q m a x q_{max} qmax 分别是量化后的最小值和最大值。对于8位无符号量化,通常有 q m i n = 0 q_{min} = 0 qmin=0, q m a x = 255 q_{max} = 255 qmax=255。
这个函数可以分解为三个步骤:首先将浮点数映射到量化级别,然后进行取整和截断操作,最后映射回浮点数域。整个过程的数学表达为:
q = clamp ( round ( x − z s ) , q m i n , q m a x ) q = \text{clamp}\left(\text{round}\left(\frac{x - z}{s}\right), q_{min}, q_{max}\right) q=clamp(round(sx−z),qmin,qmax)
x ^ = s ⋅ q + z \hat{x} = s \cdot q + z x^=s⋅q+z
这种设计确保了前向传播时数值经历了完整的量化过程,但所有计算仍然在浮点数域中进行,保持了数值精度和计算效率。
对称量化的简化形式
对于对称量化( z = 0 z = 0 z=0),模拟量化函数简化为:
FakeQuant s y m ( x ) = s ⋅ clamp ( round ( x s ) , − 2 b − 1 , 2 b − 1 − 1 ) \text{FakeQuant}_{sym}(x) = s \cdot \text{clamp}\left(\text{round}\left(\frac{x}{s}\right), -2^{b-1}, 2^{b-1} - 1\right) FakeQuantsym(x)=s⋅clamp(round(sx),−2b−1,2b−1−1)
其中 b b b 是量化位数。对称量化的优势在于零点偏移为零,这简化了量化乘法运算:
( a q − z a ) × ( b q − z b ) = a q × b q (a_q - z_a) \times (b_q - z_b) = a_q \times b_q (aq−za)×(bq−zb)=aq×bq
当 z a = z b = 0 z_a = z_b = 0 za=zb=0 时。
量化参数的动态调整
在训练过程中,量化参数 s s s 和 z z z 需要根据数据分布的变化进行动态调整。一种常用的策略是使用指数移动平均来跟踪统计信息:
μ t = α μ t − 1 + ( 1 − α ) μ b a t c h \mu_t = \alpha \mu_{t-1} + (1-\alpha) \mu_{batch} μt=αμt−1+(1−α)μbatch
σ t 2 = α σ t − 1 2 + ( 1 − α ) σ b a t c h 2 \sigma_t^2 = \alpha \sigma_{t-1}^2 + (1-\alpha) \sigma_{batch}^2 σt2=ασt−12+(1−α)σbatch2
其中 α \alpha α 是动量系数,通常取0.9到0.99之间的值。
基于更新的统计信息,缩放因子和零点的计算为:
s t = 6 σ t 2 b − 1 s_t = \frac{6\sigma_t}{2^b - 1} st=2b−16σt
z t = round ( − μ t + 3 σ t s t ) z_t = \text{round}\left(\frac{-\mu_t + 3\sigma_t}{s_t}\right) zt=round(st−μt+3σt)
这里使用6倍标准差覆盖99.7%的数据分布,这是基于正态分布假设的经验选择。
学习式量化参数
除了基于统计信息的参数更新,还可以将量化参数作为可学习参数直接优化:
s = exp ( log s 0 + Δ s ) s = \exp(\log s_0 + \Delta s) s=exp(logs0+Δs)
z = z 0 + Δ z z = z_0 + \Delta z z=z0+Δz
其中 s 0 s_0 s0 和 z 0 z_0 z0 是初始参数, Δ s \Delta s Δs 和 Δ z \Delta z Δz 是可学习的调整量。使用指数变换确保缩放因子始终为正。
这种方法的损失函数包含两个部分:
L t o t a l = L t a s k + λ L q u a n t i z a t i o n \mathcal{L}_{total} = \mathcal{L}_{task} + \lambda \mathcal{L}_{quantization} Ltotal=Ltask+λLquantization
其中任务损失 L t a s k \mathcal{L}_{task} Ltask 是原始的监督学习损失,量化损失 L q u a n t i z a t i o n \mathcal{L}_{quantization} Lquantization 是专门针对量化效果的正则化项。
直通估计器与梯度传播
量化函数包含不可微的 round \text{round} round 和 clamp \text{clamp} clamp 操作,这给梯度反向传播带来了根本性挑战。直通估计器(Straight-Through Estimator, STE)是解决这一问题的经典方法。
标准直通估计器
对于包含不可微操作的函数 y = g ( f ( x ) ) y = g(f(x)) y=g(f(x)),其中 f ( x ) f(x) f(x) 可微但 g ( ⋅ ) g(\cdot) g(⋅) 不可微,直通估计器的梯度计算为:
∂ y ∂ x = ∂ f ( x ) ∂ x \frac{\partial y}{\partial x} = \frac{\partial f(x)}{\partial x} ∂x∂y=∂x∂f(x)
即梯度"直通"不可微的操作,只考虑可微部分的贡献。
对于模拟量化函数,标准STE的梯度为:
∂ FakeQuant ( x ) ∂ x = { 1 if q m i n ≤ x − z s ≤ q m a x 0 otherwise \frac{\partial \text{FakeQuant}(x)}{\partial x} = \begin{cases} 1 & \text{if } q_{min} \leq \frac{x-z}{s} \leq q_{max} \\ 0 & \text{otherwise} \end{cases} ∂x∂FakeQuant(x)={10if qmin≤sx−z≤qmaxotherwise
这意味着在量化范围内梯度为1,超出范围时梯度为0。
改进的直通估计器
标准STE可能导致梯度消失问题,特别是当大量参数超出量化范围时。几种改进方法被提出来缓解这个问题。
软截断STE使用连续函数近似截断操作:
soft_clamp ( x , a , b ) = a + ( b − a ) ⋅ σ ( x − a τ ) ⋅ σ ( b − x τ ) \text{soft\_clamp}(x, a, b) = a + (b-a) \cdot \sigma\left(\frac{x-a}{\tau}\right) \cdot \sigma\left(\frac{b-x}{\tau}\right) soft_clamp(x,a,b)=a+(b−a)⋅σ(τx−a)⋅σ(τb−x)
其中 σ ( ⋅ ) \sigma(\cdot) σ(⋅) 是sigmoid函数, τ \tau τ 是温度参数。相应的梯度为:
∂ soft_clamp ( x , a , b ) ∂ x = ( b − a ) ⋅ σ ′ ( x − a τ ) σ ( b − x τ ) − σ ( x − a τ ) σ ′ ( b − x τ ) τ \frac{\partial \text{soft\_clamp}(x, a, b)}{\partial x} = (b-a) \cdot \frac{\sigma'(\frac{x-a}{\tau}) \sigma(\frac{b-x}{\tau}) - \sigma(\frac{x-a}{\tau}) \sigma'(\frac{b-x}{\tau})}{\tau} ∂x∂soft_clamp(x,a,b)=(b−a)⋅τσ′(τx−a)σ(τb−x)−σ(τx−a)σ′(τb−x)
分段线性STE
另一种改进是使用分段线性函数:
∂ FakeQuant ( x ) ∂ x = { β if x < s ⋅ q m i n + z 1 if s ⋅ q m i n + z ≤ x ≤ s ⋅ q m a x + z β if x > s ⋅ q m a x + z \frac{\partial \text{FakeQuant}(x)}{\partial x} = \begin{cases} \beta & \text{if } x < s \cdot q_{min} + z \\ 1 & \text{if } s \cdot q_{min} + z \leq x \leq s \cdot q_{max} + z \\ \beta & \text{if } x > s \cdot q_{max} + z \end{cases} ∂x∂FakeQuant(x)=⎩ ⎨ ⎧β1βif x<s⋅qmin+zif s⋅qmin+z≤x≤s⋅qmax+zif x>s⋅qmax+z
其中 0 < β < 1 0 < \beta < 1 0<β<1 是一个小的正数,通常取0.1到0.3之间的值。这种方法允许部分梯度传播到超出量化范围的参数,有助于参数逐渐调整到合适的范围内。
基于统计的STE
基于参数统计信息的STE考虑了参数分布特性:
∂ FakeQuant ( x ) ∂ x = exp ( − ( x − μ ) 2 2 σ 2 ) \frac{\partial \text{FakeQuant}(x)}{\partial x} = \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) ∂x∂FakeQuant(x)=exp(−2σ2(x−μ)2)
其中 μ \mu μ 和 σ \sigma σ 分别是参数的均值和标准差。这种梯度权重确保接近分布中心的参数获得更大的梯度,而远离中心的参数获得较小但非零的梯度。
自适应梯度缩放
自适应梯度缩放根据量化误差动态调整梯度大小:
∂ FakeQuant ( x ) ∂ x = γ ( x ) ⋅ 1 i n _ r a n g e ( x ) \frac{\partial \text{FakeQuant}(x)}{\partial x} = \gamma(x) \cdot \mathbf{1}_{in\_range}(x) ∂x∂FakeQuant(x)=γ(x)⋅1in_range(x)
其中缩放因子 γ ( x ) \gamma(x) γ(x) 定义为:
γ ( x ) = 1 + α ⋅ ∣ x − FakeQuant ( x ) ∣ ∣ x ∣ + ϵ \gamma(x) = 1 + \alpha \cdot \frac{|x - \text{FakeQuant}(x)|}{|x| + \epsilon} γ(x)=1+α⋅∣x∣+ϵ∣x−FakeQuant(x)∣
这里 α \alpha α 是调节参数, ϵ \epsilon ϵ 是小的正数防止除零。这种方法根据量化误差的相对大小调整梯度,量化误差越大的参数获得越大的梯度更新。
权重量化感知训练
权重量化感知训练直接在网络的权重参数上应用模拟量化,让权重在训练过程中适应量化约束。
逐层权重量化
最基本的权重QAT对每一层独立进行量化:
W q ( l ) = FakeQuant ( W ( l ) ) W_q^{(l)} = \text{FakeQuant}(W^{(l)}) Wq(l)=FakeQuant(W(l))
其中 W ( l ) W^{(l)} W(l) 是第 l l l 层的原始权重, W q ( l ) W_q^{(l)} Wq(l) 是量化后的权重。
量化参数的更新基于该层权重的统计信息:
s ( l ) = max ( W ( l ) ) − min ( W ( l ) ) 2 b − 1 s^{(l)} = \frac{\max(W^{(l)}) - \min(W^{(l)})}{2^b - 1} s(l)=2b−1max(W(l))−min(W(l))
对于对称量化,零点设为0;对于非对称量化:
z ( l ) = round ( − min ( W ( l ) ) s ( l ) ) z^{(l)} = \text{round}\left(\frac{-\min(W^{(l)})}{s^{(l)}}\right) z(l)=round(s(l)−min(W(l)))
逐通道权重量化
卷积层的不同输出通道可能具有不同的权重分布,逐通道量化为每个通道分别设置量化参数:
W q , c ( l ) = FakeQuant ( W c ( l ) , s c ( l ) , z c ( l ) ) W_{q,c}^{(l)} = \text{FakeQuant}(W_c^{(l)}, s_c^{(l)}, z_c^{(l)}) Wq,c(l)=FakeQuant(Wc(l),sc(l),zc(l))
其中 c c c 是通道索引。每个通道的量化参数独立计算:
s c ( l ) = max ( W c ( l ) ) − min ( W c ( l ) ) 2 b − 1 s_c^{(l)} = \frac{\max(W_c^{(l)}) - \min(W_c^{(l)})}{2^b - 1} sc(l)=2b−1max(Wc(l))−min(Wc(l))
逐通道量化的优势在于它能更好地适应不同通道的权重分布差异,通常能获得更好的量化精度。
权重正则化
为了促进权重分布更适合量化,可以在损失函数中加入正则化项:
L r e g = λ s p a r s i t y ∥ W ∥ 1 + λ s m o o t h n e s s ∑ i , j ∣ W i , j − W i + 1 , j ∣ \mathcal{L}_{reg} = \lambda_{sparsity} \|W\|_1 + \lambda_{smoothness} \sum_{i,j} |W_{i,j} - W_{i+1,j}| Lreg=λsparsity∥W∥1+λsmoothnessi,j∑∣Wi,j−Wi+1,j∣
其中稀疏性正则化项 ∥ W ∥ 1 \|W\|_1 ∥W∥1 鼓励权重趋向于零,平滑性正则化项鼓励相邻权重值相近。
另一种有效的正则化是量化友好的正则化:
L q u a n t _ f r i e n d l y = ∑ w ∈ W ( w − s ⋅ round ( w s ) ) 2 \mathcal{L}_{quant\_friendly} = \sum_{w \in W} \left(w - s \cdot \text{round}\left(\frac{w}{s}\right)\right)^2 Lquant_friendly=w∈W∑(w−s⋅round(sw))2
这个正则化项直接最小化权重与其量化值之间的差异,鼓励权重值接近量化格点。
权重初始化策略
量化感知训练的权重初始化需要考虑量化的影响。一种有效的策略是使用量化感知的Xavier初始化:
W i , j ∼ U ( − 6 n i n + n o u t ⋅ 2 b − 1 2 b , 6 n i n + n o u t ⋅ 2 b − 1 2 b ) W_{i,j} \sim \mathcal{U}\left(-\sqrt{\frac{6}{n_{in} + n_{out}}} \cdot \frac{2^b-1}{2^b}, \sqrt{\frac{6}{n_{in} + n_{out}}} \cdot \frac{2^b-1}{2^b}\right) Wi,j∼U(−nin+nout6⋅2b2b−1,nin+nout6⋅2b2b−1)
其中 n i n n_{in} nin 和 n o u t n_{out} nout 分别是输入和输出神经元数量。调整因子 2 b − 1 2 b \frac{2^b-1}{2^b} 2b2b−1 考虑了量化造成的有效动态范围减少。
激活值量化感知训练
激活值的量化感知训练比权重量化更具挑战性,因为激活值是动态产生的,其分布依赖于输入数据和网络状态。
激活值统计追踪
激活值量化需要跟踪每层激活值的统计信息。使用指数移动平均来维护运行时统计:
μ r u n n i n g ( l ) = γ μ r u n n i n g ( l ) + ( 1 − γ ) μ b a t c h ( l ) \mu_{running}^{(l)} = \gamma \mu_{running}^{(l)} + (1-\gamma) \mu_{batch}^{(l)} μrunning(l)=γμrunning(l)+(1−γ)μbatch(l)
( σ 2 ) r u n n i n g ( l ) = γ ( σ 2 ) r u n n i n g ( l ) + ( 1 − γ ) ( σ 2 ) b a t c h ( l ) (\sigma^2)_{running}^{(l)} = \gamma (\sigma^2)_{running}^{(l)} + (1-\gamma) (\sigma^2)_{batch}^{(l)} (σ2)running(l)=γ(σ2)running(l)+(1−γ)(σ2)batch(l)
其中 γ \gamma γ 是动量参数,通常取0.9到0.999之间的值。
基于运行时统计,激活值的量化参数计算为:
s ( l ) = k ⋅ σ r u n n i n g ( l ) 2 b − 1 − 1 s^{(l)} = \frac{k \cdot \sigma_{running}^{(l)}}{2^{b-1} - 1} s(l)=2b−1−1k⋅σrunning(l)
z ( l ) = round ( − μ r u n n i n g ( l ) s ( l ) ) z^{(l)} = \text{round}\left(\frac{-\mu_{running}^{(l)}}{s^{(l)}}\right) z(l)=round(s(l)−μrunning(l))
其中 k k k 是覆盖系数,通常取2到4之间的值。
分位数基础的激活量化
为了更好地处理激活值分布的异常值,可以使用基于分位数的量化:
r m i n ( l ) = Q α ( l ) , r m a x ( l ) = Q 1 − α ( l ) r_{min}^{(l)} = Q_{\alpha}^{(l)}, \quad r_{max}^{(l)} = Q_{1-\alpha}^{(l)} rmin(l)=Qα(l),rmax(l)=Q1−α(l)
其中 Q α ( l ) Q_{\alpha}^{(l)} Qα(l) 是第 l l l 层激活值的第 α \alpha α 分位数, α \alpha α 通常取0.001到0.01之间的值。
相应的量化参数为:
s ( l ) = r m a x ( l ) − r m i n ( l ) 2 b − 1 s^{(l)} = \frac{r_{max}^{(l)} - r_{min}^{(l)}}{2^b - 1} s(l)=2b−1rmax(l)−rmin(l)
z ( l ) = round ( − r m i n ( l ) s ( l ) ) z^{(l)} = \text{round}\left(\frac{-r_{min}^{(l)}}{s^{(l)}}\right) z(l)=round(s(l)−rmin(l))
激活函数的影响
不同的激活函数对量化的敏感性不同。ReLU激活函数产生的激活值具有单侧分布(值域为 [ 0 , + ∞ ) [0, +\infty) [0,+∞)),这种分布特性天然适合非对称量化。
对于ReLU激活,最优的量化参数可以通过最小化重构误差获得:
s ∗ = arg min s E a ∼ p ( a ) [ ( a − FakeQuant ( a , s , 0 ) ) 2 ] s^* = \arg\min_s \mathbb{E}_{a \sim p(a)}\left[(a - \text{FakeQuant}(a, s, 0))^2\right] s∗=argsminEa∼p(a)[(a−FakeQuant(a,s,0))2]
其中零点设为0(因为ReLU的输出最小值为0)。
对于其他激活函数,如Swish或GELU,其输出分布更加复杂,通常需要使用对称量化和更精细的参数调整。
跨层激活值协调
相邻层的激活值量化参数可能相互影响。为了优化整体性能,可以使用联合优化:
s ( l ) ∗ , s ( l + 1 ) ∗ = arg min s ( l ) , s ( l + 1 ) E [ ∥ y ( l + 1 ) − Layer ( l + 1 ) ( FakeQuant ( a ( l ) , s ( l ) ) ) ∥ 2 2 ] s^{(l)*}, s^{(l+1)*} = \arg\min_{s^{(l)}, s^{(l+1)}} \mathbb{E}\left[\left\|y^{(l+1)} - \text{Layer}^{(l+1)}(\text{FakeQuant}(a^{(l)}, s^{(l)}))\right\|_2^2\right] s(l)∗,s(l+1)∗=args(l),s(l+1)minE[ y(l+1)−Layer(l+1)(FakeQuant(a(l),s(l))) 22]
其中 y ( l + 1 ) y^{(l+1)} y(l+1) 是第 l + 1 l+1 l+1 层的期望输出, Layer ( l + 1 ) \text{Layer}^{(l+1)} Layer(l+1) 是第 l + 1 l+1 l+1 层的计算函数。
这种协调优化考虑了量化误差在网络中的传播效应,通常能获得更好的整体性能。
混合精度量化感知训练
混合精度量化允许网络的不同部分使用不同的量化精度,这在保持模型性能的同时最大化压缩效果。
基于敏感性的位宽分配
不同层对量化精度的敏感性不同,可以基于敏感性分析进行位宽分配。敏感性可以通过Hessian矩阵的对角元素估计:
S ( l ) = diag ( ∂ 2 L ∂ ( W ( l ) ) 2 ) S^{(l)} = \text{diag}\left(\frac{\partial^2 \mathcal{L}}{\partial (W^{(l)})^2}\right) S(l)=diag(∂(W(l))2∂2L)
基于敏感性的位宽分配优化问题为:
min { b l } ∑ l = 1 L S ( l ) ⋅ Q e r r o r ( l ) ( b l ) \min_{\{b_l\}} \sum_{l=1}^{L} S^{(l)} \cdot Q_{error}^{(l)}(b_l) {bl}minl=1∑LS(l)⋅Qerror(l)(bl)
s.t. ∑ l = 1 L b l ≤ B b u d g e t \text{s.t.} \sum_{l=1}^{L} b_l \leq B_{budget} s.t.l=1∑Lbl≤Bbudget
其中 Q e r r o r ( l ) ( b l ) Q_{error}^{(l)}(b_l) Qerror(l)(bl) 是第 l l l 层在位宽 b l b_l bl 下的量化误差, B b u d g e t B_{budget} Bbudget 是总的位宽预算。
可微分架构搜索方法
位宽选择可以看作是一种架构搜索问题,使用可微分架构搜索(DARTS)方法求解:
α l ( b ) = exp ( θ l ( b ) ) ∑ b ′ exp ( θ l ( b ′ ) ) \alpha_l^{(b)} = \frac{\exp(\theta_l^{(b)})}{\sum_{b'} \exp(\theta_l^{(b')})} αl(b)=∑b′exp(θl(b′))exp(θl(b))
其中 θ l ( b ) \theta_l^{(b)} θl(b) 是第 l l l 层使用位宽 b b b 的可学习权重, α l ( b ) \alpha_l^{(b)} αl(b) 是相应的概率。
混合精度的输出为:
y ( l ) = ∑ b α l ( b ) ⋅ FakeQuant ( x ( l ) , b ) y^{(l)} = \sum_{b} \alpha_l^{(b)} \cdot \text{FakeQuant}(x^{(l)}, b) y(l)=b∑αl(b)⋅FakeQuant(x(l),b)
训练过程中, θ \theta θ 和网络权重交替优化,最终选择概率最大的位宽作为每层的量化精度。
强化学习方法
位宽分配也可以使用强化学习方法求解。将位宽选择建模为马尔可夫决策过程:
- 状态:当前层的统计信息(均值、方差、敏感性等)
- 动作:为当前层选择的位宽
- 奖励:量化后模型性能与计算资源消耗的权衡
策略网络的更新使用REINFORCE算法:
∇ θ J ( θ ) = E π θ [ ∑ t = 1 T ∇ θ log π θ ( a t ∣ s t ) ⋅ R t ] \nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\left[\sum_{t=1}^{T} \nabla_\theta \log \pi_\theta(a_t|s_t) \cdot R_t\right] ∇θJ(θ)=Eπθ[t=1∑T∇θlogπθ(at∣st)⋅Rt]
其中 π θ \pi_\theta πθ 是参数为 θ \theta θ 的策略网络, R t R_t Rt 是从时刻 t t t 开始的累积奖励。
知识蒸馏辅助训练
在混合精度训练中,可以使用知识蒸馏来进一步提升性能。教师网络是全精度模型,学生网络是混合精度量化模型:
L d i s t i l l = α L C E ( y , t ) + ( 1 − α ) L K L ( σ ( z s / T ) , σ ( z t / T ) ) \mathcal{L}_{distill} = \alpha \mathcal{L}_{CE}(y, t) + (1-\alpha) \mathcal{L}_{KL}(\sigma(z_s/T), \sigma(z_t/T)) Ldistill=αLCE(y,t)+(1−α)LKL(σ(zs/T),σ(zt/T))
其中 y y y 是真实标签, t t t 是教师网络的软标签, z s z_s zs 和 z t z_t zt 分别是学生和教师网络的logits, T T T 是温度参数, σ \sigma σ 是softmax函数。
这种方法利用教师网络的丰富信息指导学生网络的训练,特别是在低精度量化时效果显著。
损失函数设计与优化目标
量化感知训练需要特殊设计的损失函数来平衡任务性能和量化效果。
多项式损失函数
标准的分类损失函数可能不适合量化训练,因为它们没有考虑量化带来的数值扰动。多项式损失函数提供了更好的鲁棒性:
L p o l y ( p , y ) = ∑ k = 1 K ( 1 − p k y k ) γ \mathcal{L}_{poly}(p, y) = \sum_{k=1}^{K} \left(1 - p_k^{y_k}\right)^{\gamma} Lpoly(p,y)=k=1∑K(1−pkyk)γ
其中 p k p_k pk 是第 k k k 类的预测概率, y k y_k yk 是one-hot编码的真实标签, γ \gamma γ 是调节参数。
这种损失函数对预测概率的小幅变化不那么敏感,更适合量化训练中的数值扰动。
量化友好的正则化
除了任务损失,量化感知训练通常需要添加量化相关的正则化项:
L t o t a l = L t a s k + λ 1 L q u a n t + λ 2 L r e g \mathcal{L}_{total} = \mathcal{L}_{task} + \lambda_1 \mathcal{L}_{quant} + \lambda_2 \mathcal{L}_{reg} Ltotal=Ltask+λ1Lquant+λ2Lreg
量化损失 L q u a n t \mathcal{L}_{quant} Lquant 直接度量量化前后的差异:
L q u a n t = ∑ l = 1 L ∥ W ( l ) − FakeQuant ( W ( l ) ) ∥ 2 2 + ∥ A ( l ) − FakeQuant ( A ( l ) ) ∥ 2 2 \mathcal{L}_{quant} = \sum_{l=1}^{L} \left\|W^{(l)} - \text{FakeQuant}(W^{(l)})\right\|_2^2 + \left\|A^{(l)} - \text{FakeQuant}(A^{(l)})\right\|_2^2 Lquant=l=1∑L W(l)−FakeQuant(W(l)) 22+ A(l)−FakeQuant(A(l)) 22
其中 A ( l ) A^{(l)} A(l) 是第 l l l 层的激活值。
基于信息论的损失函数
从信息论角度,量化过程不应该丢失过多的信息。基于互信息的损失函数为:
L M I = − I ( X ; FakeQuant ( X ) ) \mathcal{L}_{MI} = -I(X; \text{FakeQuant}(X)) LMI=−I(X;FakeQuant(X))
其中 I ( X ; Y ) I(X; Y) I(X;Y) 是互信息量:
I ( X ; Y ) = ∑ x , y p ( x , y ) log p ( x , y ) p ( x ) p ( y ) I(X; Y) = \sum_{x,y} p(x,y) \log \frac{p(x,y)}{p(x)p(y)} I(X;Y)=x,y∑p(x,y)logp(x)p(y)p(x,y)
在实际实现中,互信息通常使用神经网络估计器近似计算。
对抗训练损失
对抗训练可以提高量化模型的鲁棒性。对抗样本通过以下方式生成:
x a d v = x + ϵ ⋅ sign ( ∇ x L ( f q u a n t ( x ) , y ) ) x_{adv} = x + \epsilon \cdot \text{sign}(\nabla_x \mathcal{L}(f_{quant}(x), y)) xadv=x+ϵ⋅sign(∇xL(fquant(x),y))
其中 f q u a n t f_{quant} fquant 是量化后的模型, ϵ \epsilon ϵ 是扰动幅度。
对抗损失函数为:
L a d v = α L ( f q u a n t ( x ) , y ) + ( 1 − α ) L ( f q u a n t ( x a d v ) , y ) \mathcal{L}_{adv} = \alpha \mathcal{L}(f_{quant}(x), y) + (1-\alpha) \mathcal{L}(f_{quant}(x_{adv}), y) Ladv=αL(fquant(x),y)+(1−α)L(fquant(xadv),y)
这种训练方式使量化模型对输入扰动更加鲁棒,间接提高了对量化噪声的适应能力。
高级量化感知训练技术
最新的研究提出了许多高级的QAT技术,进一步提升了量化模型的性能和训练效率。
可学习量化参数
传统的QAT使用固定的量化参数计算方法,而可学习量化参数直接将 s s s 和 z z z 作为网络参数优化:
s l = σ ( ϕ l ) , z l = tanh ( ψ l ) ⋅ z m a x s_l = \sigma(\phi_l), \quad z_l = \tanh(\psi_l) \cdot z_{max} sl=σ(ϕl),zl=tanh(ψl)⋅zmax
其中 ϕ l \phi_l ϕl 和 ψ l \psi_l ψl 是可学习参数, σ \sigma σ 和 tanh \tanh tanh 确保参数在合理范围内。
参数的梯度计算需要考虑量化函数对这些参数的依赖:
∂ L ∂ ϕ l = ∂ L ∂ s l ⋅ ∂ s l ∂ ϕ l \frac{\partial \mathcal{L}}{\partial \phi_l} = \frac{\partial \mathcal{L}}{\partial s_l} \cdot \frac{\partial s_l}{\partial \phi_l} ∂ϕl∂L=∂sl∂L⋅∂ϕl∂sl
其中 ∂ L ∂ s l \frac{\partial \mathcal{L}}{\partial s_l} ∂sl∂L 通过链式法则和直通估计器计算。
渐进式量化训练
渐进式量化训练逐步降低量化精度,让模型有更多时间适应每个精度级别:
b t = b s t a r t − ⌊ t / T s t e p ⌋ b_t = b_{start} - \lfloor t / T_{step} \rfloor bt=bstart−⌊t/Tstep⌋
其中 b s t a r t b_{start} bstart 是初始位宽, T s t e p T_{step} Tstep 是每个精度级别的训练步数。
在每个精度级别,模型需要重新校准量化参数和适应新的量化约束。这种方法通常能获得更好的最终性能,但训练时间较长。
量化噪声注入
在量化感知训练中注入额外的噪声可以提高模型的鲁棒性:
NoisyQuant ( x ) = FakeQuant ( x ) + ϵ \text{NoisyQuant}(x) = \text{FakeQuant}(x) + \epsilon NoisyQuant(x)=FakeQuant(x)+ϵ
其中 ϵ ∼ N ( 0 , σ 2 ) \epsilon \sim \mathcal{N}(0, \sigma^2) ϵ∼N(0,σ2) 是高斯噪声,方差 σ 2 \sigma^2 σ2 与量化步长相关:
σ 2 = β ⋅ s 2 \sigma^2 = \beta \cdot s^2 σ2=β⋅s2
其中 β \beta β 是调节参数,通常取0.1到0.5之间的值。
这种噪声注入模拟了实际部署中可能遇到的额外扰动,提高了模型的泛化能力。
元学习量化
元学习方法可以快速适应新的量化配置。使用MAML(Model-Agnostic Meta-Learning)框架:
θ ′ = θ − α ∇ θ L s u p p o r t ( θ , q ) \theta' = \theta - \alpha \nabla_\theta \mathcal{L}_{support}(\theta, q) θ′=θ−α∇θLsupport(θ,q)
L m e t a = E q L q u e r y ( θ ′ , q ) \mathcal{L}_{meta} = \mathbb{E}_{q} \mathcal{L}_{query}(\theta', q) Lmeta=EqLquery(θ′,q)
其中 q q q 是量化配置(位宽、量化方法等), L s u p p o r t \mathcal{L}_{support} Lsupport 是支持集损失, L q u e r y \mathcal{L}_{query} Lquery 是查询集损失。
训练后的元模型能够快速适应新的量化需求,只需要少量的微调步骤。
理论分析与收敛保证
量化感知训练的理论分析是一个活跃的研究领域,涉及优化理论、概率论和函数分析等多个数学分支。
收敛性分析
QAT的收敛性分析需要考虑量化函数的非凸性和不连续性。设损失函数为 L ( θ ) \mathcal{L}(\theta) L(θ),量化后的损失函数为 L ~ ( θ ) = L ( Quant ( θ ) ) \tilde{\mathcal{L}}(\theta) = \mathcal{L}(\text{Quant}(\theta)) L~(θ)=L(Quant(θ))。
在一定的假设条件下,可以证明QAT的收敛性。关键假设包括:
-
损失函数 L \mathcal{L} L 是 L L L-smooth的:
∥ ∇ L ( θ 1 ) − ∇ L ( θ 2 ) ∥ ≤ L ∥ θ 1 − θ 2 ∥ \|\nabla \mathcal{L}(\theta_1) - \nabla \mathcal{L}(\theta_2)\| \leq L \|\theta_1 - \theta_2\| ∥∇L(θ1)−∇L(θ2)∥≤L∥θ1−θ2∥ -
量化误差有界:
∥ θ − Quant ( θ ) ∥ ≤ ϵ q u a n t \|\theta - \text{Quant}(\theta)\| \leq \epsilon_{quant} ∥θ−Quant(θ)∥≤ϵquant -
直通估计器的偏差有界:
∥ E [ ∇ ~ L ( θ ) ] − ∇ L ( θ ) ∥ ≤ δ \|\mathbb{E}[\tilde{\nabla} \mathcal{L}(\theta)] - \nabla \mathcal{L}(\theta)\| \leq \delta ∥E[∇~L(θ)]−∇L(θ)∥≤δ
在这些条件下,可以证明QAT的期望收敛率为:
E [ ∥ ∇ L ~ ( θ T ) ∥ 2 ] ≤ 2 ( L ~ ( θ 0 ) − L ~ ∗ ) + L T ϵ q u a n t 2 + T δ 2 T \mathbb{E}[\|\nabla \tilde{\mathcal{L}}(\theta_T)\|^2] \leq \frac{2(\tilde{\mathcal{L}}(\theta_0) - \tilde{\mathcal{L}}^*) + LT\epsilon_{quant}^2 + T\delta^2}{T} E[∥∇L~(θT)∥2]≤T2(L~(θ0)−L~∗)+LTϵquant2+Tδ2
其中 T T T 是迭代次数, L ~ ∗ \tilde{\mathcal{L}}^* L~∗ 是最优值。
泛化能力分析
QAT的泛化能力可以通过PAC-贝叶斯理论分析。设 H \mathcal{H} H 是量化后的假设空间,其VC维为 d d d,则泛化误差的上界为:
R ( h ^ ) − R ^ ( h ^ ) ≤ d log ( 2 m / d ) + log ( 4 / δ ) 2 m R(\hat{h}) - \hat{R}(\hat{h}) \leq \sqrt{\frac{d \log(2m/d) + \log(4/\delta)}{2m}} R(h^)−R^(h^)≤2mdlog(2m/d)+log(4/δ)
其中 m m m 是训练样本数, δ \delta δ 是置信水平, R ( h ^ ) R(\hat{h}) R(h^) 和 R ^ ( h ^ ) \hat{R}(\hat{h}) R^(h^) 分别是真实风险和经验风险。
量化操作实际上减少了假设空间的复杂度,因此理论上QAT具有更好的泛化能力。
优化景观分析
量化感知训练的优化景观比全精度训练更加复杂。量化函数引入了大量的平坦区域(plateau)和不连续点。局部最优解的数量可以通过计算临界点的数量估计。对于 n n n 维参数空间和 b b b 位量化,临界点的数量上界为:
N c r i t i c a l ≤ ( 2 b ) n N_{critical} \leq (2^b)^n Ncritical≤(2b)n
这表明量化精度越低,优化景观越复杂,但同时也意味着存在更多可能的好解。
从统计物理学角度,QAT的自由能景观可以用以下表达式描述:
F ( β ) = − 1 β log ∫ e − β L ~ ( θ ) d θ F(\beta) = -\frac{1}{\beta} \log \int e^{-\beta \tilde{\mathcal{L}}(\theta)} d\theta F(β)=−β1log∫e−βL~(θ)dθ
其中 β \beta β 是逆温度参数。高温时( β → 0 \beta \to 0 β→0),系统能够探索整个参数空间;低温时( β → ∞ \beta \to \infty β→∞),系统趋向于全局最优解。