模型很小,结果也小吗?
设想把神经网络移到机器或传感器内的嵌入式计算设备。权重和激活用8位整数表示,单个数占空间少。但神经元会把许多对数相乘再求和。总和存在哪里?累加器,一个必须容纳远大于单个输入结果的变量。本文的问题是:运行前如何判断该变量的表示范围是否足够?
摘要。从量化点积出发,即表示实数的整数编码乘积之和。推导有符号32位累加器的保守边界,并仅用合法8位输入构造超界情况。区分舍入、饱和与溢出,再解释偏置、实际权重和操作顺序如何改变分析。结果来自Python执行的精确整数计算和显式算术模型,不是微控制器测量或TensorFlow Lite后端测试。
整数编码还不是实际数值
仿射量化用x≈s(q−z)表示实数:q是整数编码,z是实数零的编码,s为正尺度。若z=−128,则q=127距零有255步。两个各自合法的8位数相减,结果可能超出有符号8位范围,因此应在相减前扩展类型。存储紧凑不意味着所有运算保持同样位宽。
采用激活qₐ范围−128至127、权重q𝑤范围−127至127且权重零点为零的情形,与所查TensorFlow Lite INT8规范一致。激活是网络中间值,权重是学习到的系数。对尺度sₐ、s𝑤对应的一个输出通道,整数A收集转换为输出格式前的总和。
K是该输出包含的乘积数量。b_int为神经元常数偏置,使用乘积尺度sₐs𝑤。A、编码和整数偏置是无物理单位的计数;y的单位由模型与尺度决定。通道权重尺度不同,偏置尺度也相应改变。本文研究A;之后转回INT8可能再有舍入与裁剪,却无法修复已经错误的总和。
总和可以增长到多大?
有符号32位整数范围为−2,147,483,648至2,147,483,647。首先忽略正负抵消,对每项绝对值作界定。|qₐ−zₐ|最高255,|q𝑤|最高127,故单乘积绝对值最高32,385。三角不等式说明总和绝对值不超过各项绝对值之和。
第二行是充分非必要条件,并假定扣除偏置后的余量非负。两种符号都用正上界,保守舍弃额外的一个负数。零偏置时K≤66,311保证该直接求和及部分和对全部合法输入都不超界。K=66,312并不总出错,只是此普适保证失效。
一个越界例子
令全部激活编码为127、零点−128、权重127。均合法,每项32,385。65,536项总和2,122,383,360,适合INT32;66,311项为2,147,481,735,再加一项变为2,147,514,120,超过上限。这不是逐渐丢失小数精度,而是所选类型无法表示完整整数结果。
| K | 精确和 | 模型回绕 | 模型饱和 |
|---|---|---|---|
| 65536 | 2122383360 | 2122383360 | 2122383360 |
| 66311 | 2147481735 | 2147481735 | 2147481735 |
| 66312 | 2147514120 | −2147453176 | 2147483647 |
| 70000 | 2266950000 | −2028017296 | 2147483647 |
表中比较三种显式计算的算术。Python保留精确整数;回绕模型保留低32位并按有符号解释,可把大正数变负;饱和模型则截在可表示最大值。两者都没有恢复精确和。本文不声称某嵌入式内核采用哪一种,必须核查其约定、指令和实现。

在C++中不能假定普通有符号整数超界加法必然回绕;所查工作草案将此类超类型范围算术表达式定义为未定义行为。加速器专用指令可有不同规则。因此程序使用Python整数和明确的模公式,而不触发原生溢出后把一次观察当作可移植规律。
偏置与权重改变余量
偏置2,000,000,000能用INT32表示,却占掉大部分正余量;同一边界只保证4,554个极端乘积。分别检查偏置与乘积类型不够,需要界定它们的和。反之,激活零点为零时单乘积最大绝对值为128·127=16,256,零偏置保守上限增至132,104项。层结构和量化参数要一起分析。
已知权重时全局界往往过于保守。对固定wᵢ和范围[lᵢ,uᵢ]内激活,计算两个端点乘积并取最小最大;负权重会翻转端点大小。分别求最小值之和与最大值之和,可包住全部可能总和,即使部分输入不可能同时出现。这依赖区间有效性,并非错误频率预测。
权重(127,−127,64,−64)、zₐ=−128、完整INT8输入范围下,各乘积区间为[0,32385]、[−32385,0]、[0,16320]、[−16320,0]。零偏置时A在[−48705,48705];全局界为|A|≤129540,正确但松得多。这用了实际系数与全部合法输入,而非平均观测或期待抵消。还需对具体程序的部分和做同样计算。
最终和合法不保证中间步骤安全
内核可能把A改写为Σqₐq𝑤−zₐΣq𝑤+b_int。代数等价仍需为中间和留足范围。K=150,000、qₐ=zₐ=−128、q𝑤=127时,每个中心化乘积为零,A=0。但展开后的两项是−2,438,400,000和+2,438,400,000,均超INT32。这不证明某库缺陷,只说明验证必须跟随实际算术路径,包括预计算修正。
每次加法都饱和也改变问题。小型8位例子100+100−100精确为100,但逐步饱和得到100、127、27;改成100−100+100则得100。这证明饱和算术依赖顺序,并非建议网络用8位累加。纯模加减则保留模意义下结果,不能把饱和行为归给回绕,两者不同。
哪种替代方法解决哪类问题?
把累加器扩到64位会增加余量,前提是乘法、修正与中间转换也用合适类型。周期或能耗代价依赖平台,需要实测,本文不推断。分块点积限制局部和,却仍须安全合并;先缩放舍入各块则引入另一种误差。改变精度、尺度或架构可能有帮助,但改变数值权衡,需同时评价模型质量。
未来设备验证有具体流程:确定层与通道;提取实际权重、偏置、尺度和零点;重建K与内核算术路径;用足够精确参考比较普通及极端输入;记录库版本、编译器、选项和硬件。本文只执行数学参考,不报告设备延迟、峰值RAM、功率或单次推理能量,因为未在板卡上测量。
结论:只数数据位数还不够
INT8模型可能需要比输入宽得多的求和范围。应检查乘积数量、减零点后的区间、偏置和每个中间步骤。保守界给简单保证,按权重分析收紧边界,内核检查确认保证是否描述真实程序。目标是把模糊精度问题变成发布前可验证条件,而不是怀疑所有量化网络。
来源与可复现程序
TensorFlow — TensorFlow Lite 8-bit quantization specification, definitions and CONV_2D requirements.
C++ working draft — Expressions, arithmetic range and evaluation rules.
来源定义表示与语义;边界、反例和图由本文教学分析推导并执行。下方代码找出最后被保证的K并比较三种算术规则。过程确定,无需种子。归档还含偏置、逐权重区间、展开抵消与饱和例子。这不是EL-AI嵌入式产品结果,也非经同行评审的原创研究。
LIMIT = 2**31 - 1
product = (127 - (-128)) * 127
safe_k = LIMIT // product
for k in (safe_k, safe_k + 1, 70000):
exact = k * product # Python arbitrary-precision integer
wrapped = (exact + 2**31) % 2**32 - 2**31
saturated = min(LIMIT, max(-2**31, exact))
print(k, exact, wrapped, saturated)
# Explicit mathematical models, NOT execution of an embedded kernel.
代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 9 月 29 日。

