一句话定义
四位浮点(4-bit floating point,常写作 FP4) 指用 4 个比特编码一个实数,其中一部分比特当指数(决定能表示多大和多少量级)、剩下的当尾数(决定同一量级里的分辨率),另有一位符号位。
关键在格点形状:4 个比特能表示的数只有十几个,这些数在数轴上的间距随数值大小变化——越靠近零越密,越往大值越稀。整数 4 位(INT4)则是十六个等距的格点,间距处处相同。
同样是 4 位,一张格点均匀、一张格点不均匀,模型压下去之后坏的地方就不一样。
它解决什么问题
权重和激活的取值跨好几个数量级:多数值挤在零附近,少数离群值撑到很远。整数 4 位要靠一个缩放因子(scale)把浮点范围映射进那十六个等距格点,于是出现两难:
- scale 按离群值定,绝大多数数值被挤进很窄的一段,分辨率不够;
- scale 按主体分布定,离群值直接饱和截断。
四位浮点把比特分给指数,等于用分辨率换动态范围:不需要一个 scale 覆盖整个跨度,格点自己就按数量级排开。对分布尾巴长的张量(激活值尤其典型),这条路比整数 4 位省事。
代价是分辨率真的低。4 位总共只有十几个可取值,落在同一个数量级里,相邻两个可表示的数之间可能差着百分之十几——这不是「精度略降」,是一层很粗的栅栏。
关键做法
位宽布局是硬件契约。 指数几位、尾数几位,决定了格点长什么样,这不是软件可以临时改的参数。所以「支持 FP4」的芯片之间,格点未必相同。把一份按 A 格式量化好的权重塞给 B 格式,误差会重新分布。
缩放因子的粒度决定离群值的影响范围。 整张量一个 scale、每通道一个、还是每 32 个元素一组一个,决定了某个离群值会拉坏多少邻居。粒度越细,补偿能力越强,但 scale 本身也要存、要算,硬件支持到什么粒度是选型时要问清楚的。
校准要做的是「决定饱和点」。 因为格点稀,量化误差不会被平均掉,校准过程实际上是在挑一个截断位置:让多少大值被截掉,换回中间段的多少分辨率。arXiv 上有一篇工作(2610.41112)专门讨论以 HiFloat4 为目标格式时的量化校准,出发点正是低比特下这件事不再是「调个参数」,而是决定模型在哪一段失真。
格式必须被算子原生支持。 反量化如果落在 kernel 外面,先转成 FP16 再算,4 位省下的只能是存储,算力和带宽的账一分没省。
常见误区
- 「都是 4 位,所以效果差不多。」 文件大小确实一样,误差分布不一样。有的格式在接近零的小值上更准,有的在大值上更稳,落到具体任务上就是「哪一类样本先坏」的差别。
- 「平均精度只掉零点几个点,问题不大。」 平均值把局部塌陷摊平了。同一个模型可能整体几乎不变,而某一类低对比度、某一类小目标整段失效。
- 「格式随便选,反正框架会处理。」 框架能处理的是转换,不是收益。转完再算,等于多付一次搬运。
- 「校准集越大越好。」 校准集要的是覆盖,不是数量。拿一万张晴天货架图,也校准不出暗角和反光包装下的分布。
用不上的时候
- 模型本来就小,8 位整数已经够用,4 位带来的收益抵不上校准和验证的成本。
- 目标芯片只是「支持读入 4 位权重」,计算仍在更高位宽上做——这时该按存储收益算账,别按算力收益算。
- 拿不到有代表性的校准数据:新品类还没上架、门店还没开业,这时候压到 4 位等于用别人的分布赌自己的场景。
- 交付周期短,没有余量做逐品类的对比验证。
参考
arXiv:2610.41112,Calibration of Large Model Quantization based on HiFloat4 Format(2026-10-30)。论文以 HiFloat4 这一 4 位浮点格式为目标,讨论大模型量化中的校准问题;出发点是量化对降低大模型计算开销与资源需求越来越重要,而低比特下校准的选择直接决定失真落在哪一段。原文:http://arxiv.org/abs/2610.41112v1
延伸阅读
- 都是 4 位量化,换一颗芯片为什么就变差 —— 这篇讲的是这件事对门店意味着什么。
相关词条
火眼识别提供端侧视觉引擎与设备管理平台,相关方案见 火眼识别官网。