系列文章目录
章节1:什么是MLIR
章节2:MLIR的引入
章节3:MLIR完成一个端到端的流程
章节4:编写一个pass
章节5:MLIR相关语法
章节6:量化相关
章节7:训练相关
章节8:图优化
文章目录
目录
系列文章目录
文章目录
一、梯度
1. 从一维导数说起
2. 多维时,每个方向都有偏导
3. 梯度把偏导组成向量
4. 梯度的几何意义
5. 在深度学习里,梯度是什么
6. 一个具体例子
一句话总结
二、LSQ的QAT算法
核心思想:让量化器自己“找”最佳分辨率
量化公式:步长 s 决定了量化的一切
核心机制:如何计算可学习步长 s 的梯度?
关键技巧:梯度缩放(Gradient Scale)
完整的 LSQ 训练流程
总结
总结
一、梯度
梯度是一个向量,它把“函数在每个方向上的变化率”打包在一起,指向函数值增长最快的方向,其长度表示这个最快方向的增长率。
1. 从一维导数说起
一维函数 f(x)f(x) 的导数 f′(x)f′(x) 表示“xx 增加一点,ff 增加多少”。
比如。在 x=3 处,导数是 6,意思是往正方向走一点,函数值大约增加 6 倍那么多。
一维只有“正方向”和“负方向”,所以导数一个数就够了。
2. 多维时,每个方向都有偏导
函数有多个变量时,比如:
它对 xx 的偏导是:
对 yy 的偏导是:
偏导只回答“只动 x 时怎么变”或“只动 y 时怎么变”,但没有回答“如果同时动 x 和 y,往哪个方向变最快”。
3. 梯度把偏导组成向量
梯度就是把所有偏导按变量顺序排成一个向量:
在点 (1,2)处:
这个向量 (2,4)就是梯度。
4. 梯度的几何意义
梯度 ∇f∇f 有两个关键性质:
方向:指向函数值增长最快的方向
大小:这个最快方向的增长率
所以:
沿梯度方向走,函数值上升最快
沿负梯度方向走,函数值下降最快
梯度垂直于等高线(等值线)
以为例,等高线是圆。在点 (1,2),梯度 (2,4)从原点指向外,正好垂直于过该点的圆,指向函数值增大的方向。
5. 在深度学习里,梯度是什么
训练时,损失函数 LL 是所有模型参数的函数:
梯度就是:
它告诉每个参数:
如果只把这个参数往正方向调一点,损失会怎么变
所有参数一起看,往哪个方向调,损失上升最快
所以梯度下降做的是,其中η就代表学习率,(在足够小学习率下)损失会局部减小:
即往负梯度方向走,让损失下降。
6. 一个具体例子
设损失:
在 w=1,b=1处:
预测值 =1×2+1=3
误差 =3−5=−2
损失 =4
对 w 的偏导:
对 bb 的偏导:
梯度:
负梯度方向是 (8,4),意思是增大 w 和 b能让损失下降。梯度下降会按这个方向更新参数。
一句话总结
梯度是由所有偏导数组成的向量,指向函数值增长最快的方向;它的反方向就是函数值下降最快的方向。在深度学习中,梯度告诉我们“每个参数该怎么调、往哪个方向调,损失会上升或下降”。
二、LSQ的QAT算法
理解 LSQ(Learned Step Size Quantization)的关键,在于把量化“步长”从一个需要预设的固定超参数,变成了一个像权重一样、可以由模型自己“学习”的可训练参数。
核心思想:让量化器自己“找”最佳分辨率
在常规的 QAT 中,量化步长 s 通常是固定的(例如根据权重或激活的统计值预先计算好)。LSQ 的核心突破在于,它让步长 s 变成了一个可学习的参数,直接与模型的权重一起,通过梯度下降来优化。
这意味着模型在训练中,会自动地为每一层、每一个张量寻找最适合其当前数据分布的量化“分辨率”,而不是依赖一个可能并非最优的静态预设值。
量化公式:步长 s 决定了量化的一切
在 LSQ 中,对于一个待量化的数值 v(可以是权重或激活),其量化过程为:
vˉ:量化后的整数。
v^:反量化回浮点数的结果。
s:可学习的量化步长。它同时决定了量化精度(ss 越小,分辨率越高)和截断边界(
)。
核心机制:如何计算可学习步长 s 的梯度?
这是 LSQ 最精妙的部分。由于量化中的取整操作(⌊⋅⌋)本身不可导,LSQ 使用了STE(直通估计器)的思想,并推导出了一个专门针对步长 s 的梯度公式:
这个公式的含义很直观:
在量化范围内:梯度反映了当前数值 v 与它最近量化格点的距离。如果 v 正好在格点上,梯度贡献为 0;如果 v 在两个格点中间,梯度最大,推动步长 s 去“覆盖”这个位置。
在截断区域:当 v 超出可表示范围时,梯度会饱和为一个常数(−QN 或 QP),推动 s 增大,以将原本被截断的极端值重新纳入可量化范围。
关键技巧:梯度缩放(Gradient Scale)
LSQ 发现,如果直接使用上述梯度,步长 s 的更新幅度会与权重 w 的更新幅度严重不匹配,导致训练不稳定。
为此,LSQ 引入了一个梯度缩放因子,人为地调整 s 的梯度大小,使其更新步调与权重更新相协调。论文中使用的缩放因子约为(其中 N 是该层参数的数量),这个启发式方法被证明能有效提升收敛性。
完整的 LSQ 训练流程
初始化:从一个预训练好的全精度(FP32)模型开始,这能显著提升最终性能。
前向传播:使用量化后的权重和激活(v^)进行计算。
反向传播:
对权重:使用标准的 STE 近似其梯度。
对步长 s:使用上面推导的LSQ 专属梯度公式,并乘以缩放因子。
参数更新:同时更新全精度权重和可学习的步长 s。
部署:训练完成后,从模型中提取出学习好的、固定的步长 s,用于最终的整数推理。
总结
LSQ 的核心贡献在于将量化参数(步长)本身也变成了模型优化的一部分。它通过设计一个能感知量化状态(格点距离、是否截断)的专属梯度,并辅以梯度缩放来平衡优化,使得模型能够自适应地找到低比特(如 2、3、4 bit)下的最优量化配置。这让 LSQ 在极低比特量化下表现尤为突出,例如首次实现了 3-bit 量化网络达到全精度模型的精度。