PyTorch中手动反量化层输出并重新量化给下一层的方法
正确的层量化-反量化流程(自定义位宽)
核心原则
- 激活、权重、层输出各用独立的量化参数(min/max、scale、zero_point),绝对不能混用
- 量化分为非对称量化(适合有固定偏移的数值,比如ReLU激活)和对称量化(适合正负对称的数值,比如权重),根据数据分布选择对应方式
步骤详解
1. 为激活和权重分别计算量化参数
以N位有符号整数为例(数值范围:q_min=-2^(N-1),q_max=2^(N-1)-1):
非对称量化(以激活为例)
- 统计激活的实际数值范围:
min_act、max_act - 计算scale:
scale_act = (max_act - min_act) / (q_max - q_min) - 计算zero_point:
zp_act = q_min - round(min_act / scale_act) - 量化公式:
q_act = clamp( round( (act - min_act)/scale_act + zp_act ), q_min, q_max )
对称量化(以权重为例)
- 统计权重的最大绝对值:
max_abs_w = max(abs(min_w), abs(max_w)) - 计算scale:
scale_w = max_abs_w / q_max - zero_point固定为0(对称分布无需偏移)
- 量化公式:
q_w = clamp( round( w / scale_w ), q_min, q_max )
2. 执行量化后的层计算
- 层输出的量化值为整数运算结果:
q_out = sum(q_act * q_w)(注意用足够位宽的整数存储,避免溢出,比如用int32存储int16乘积的和)
3. 反量化层输出
方法1:从激活/权重的量化参数推导(对称量化适用)
如果激活和权重都采用对称量化(zero_point=0),则反量化公式为:actual_out = q_out * scale_act * scale_w
原理:量化后的激活是q_act = act / scale_act,权重是q_w = w / scale_w,乘积和sum(q_act*q_w)=sum(act*w)/(scale_act*scale_w),反推即可得到实际输出。
方法2:单独计算输出的量化参数(通用)
- 统计非量化情况下输出的范围:
min_out、max_out(可通过输入范围和权重范围推导,或批量统计实际输出的极值) - 计算输出的scale和zero_point:
scale_out=(max_out-min_out)/(q_max-q_min),zp_out=q_min - round(min_out/scale_out) - 反量化公式:
actual_out = (q_out - zp_out)*scale_out + min_out
针对你的示例的修正操作
原错误分析
你错误地共用了激活和权重的[1,8]范围来量化两者,导致激活被错误映射到负数区间;同时用该范围反量化输出(输出实际范围是[20,128]),结果完全偏离预期。
修正后的计算(对称量化,16位)
量化激活:
- 激活范围
[1,4],max_abs_act=4,q_max=32767 scale_act=4/32767≈1.2207e-4- 量化激活:
[round(1/1.2207e-4), round(2/1.2207e-4), round(3/1.2207e-4), round(4/1.2207e-4)] = [8192,16384,24576,32767]
- 激活范围
量化权重:
- 权重范围
[5,8],max_abs_w=8,q_max=32767 scale_w=8/32767≈2.4414e-4- 量化权重:
[round(5/2.4414e-4), round(6/2.4414e-4), round(7/2.4414e-4), round(8/2.4414e-4)] = [20480,24576,28672,32767]
- 权重范围
量化输出:
q_out=8192*20480 +16384*24576 +24576*28672 +32767*32767=2349749249反量化输出:
actual_out=2349749249 *1.2207e-4 *2.4414e-4≈70,与预期一致。
PyTorch量化的参考逻辑
PyTorch的int8量化同样遵循上述原则:
- 激活、权重、输出各有独立的
Observer模块统计数值范围 - 反量化时严格使用对应张量自身的scale和zero_point,不会复用其他张量的参数
内容的提问来源于stack exchange,提问作者longbow
相关产品推荐
相关产品推荐

