MXFP4 和 NVFP4 的区别

MXFP4:开放标准,但精度较粗

MXFP(Microscaling Floating-Point)是 Open Compute Project 推动的微缩放格式标准。它的 4 位版本 MXFP4 有三个特点:

  • 共享尺度较粗:每 32 个数值共用一块的缩放因子,而这个因子通常只能取 2 的幂次,即 E8M0 格式。
  • 主要优势:作为开放标准,跨平台兼容性好,硬件实现成本也相对低。
  • 主要短板:分组偏大、缩放又只能按 2 的幂次跳,碰到数值分布不均匀的张量,量化误差压不住,模型精度会往下掉。

NVFP4:NVIDIA 专有,精度更优

NVFP4 是 NVIDIA 为 Blackwell 架构 GPU 专门设计的 4 位格式,改进的方向正对着 MXFP4 的精度痛点:

  • 更细的微块:共享缩放因子的分组缩小到 16 个数值,能更细地跟上局部数据的变化。
  • 更高精度的缩放因子:块内缩放因子用 FP8(E4M3)格式,不再局限于 2 的幂次,拟合实际数值分布更准;此外还有一层张量级的全局 FP32 缩放,负责兜住整体的动态范围。
  • 实际效果:同样是 4 位存储,NVFP4 的量化误差显著小于 MXFP4,模型越大,这种差距在精度上越明显。

NVFP4 的计算过程

数据格式:极简的 E2M1

NVFP4 的每个数值只占 4 个比特,位分配是 1 个符号位、2 个指数位、1 个尾数位,也就是 E2M1。它能直接表示的非零数值很有限,绝对值最大到 6,往下是 0.5、1、1.5、2、3、4 这几档。单看这套编码,精度相当粗糙,所以它必须靠一套精细的缩放机制把动态范围“放大”。

精度核心:两级分层缩放

NVFP4 比 MXFP4 准,关键就在这里。它用两级缩放因子还原高精度数值,实际值 = 4 位数值 × 块缩放因子 × 全局缩放因子,两级各管一段(这个思路和 MOSS 那篇论文很像)。

块级缩放管局部。 每 16 个连续的 NVFP4 数值共用一个缩放因子,这个因子用 FP8(E4M3)格式存储。MXFP4 是每 32 个值共用一个 2 的幂次因子,两相对比,NVFP4 的分组更小、因子精度更高,更贴合局部数据的实际分布,量化误差因此小得多。

全局缩放管宏观。 整个张量(比如一整层权重)再配一个 FP32 格式的全局缩放因子。它先把整个张量的数值范围“压”到 FP8 块缩放因子能有效处理的区间里,层与层之间巨大的数量级差异就靠它兜住。

训练稳定性技巧

NVFP4 不只用于推理,也支持训练,为此加了两项针对性技术。

随机舍入。 把数值转成 NVFP4 时,不按“四舍五入”把方向定死,而是按概率决定往哪边舍。统计上看,量化后的期望值等于原始值,训练中量化误差不会系统性累积。这个功能由 Blackwell 架构的 GPU 指令硬件加速,目前主要用在梯度上。

随机 Hadamard 变换。 量化之前,先对输入和梯度做一次正交旋转,把少数特别大的离群值摊到各个维度上,整个张量的分布更均匀,也就更容易被 4 位精度准确表示。这项技术用在计算权重梯度时那个对量化最敏感的矩阵乘法里。

随机舍入:让小梯度不被“四舍五入”吞掉

它解决什么问题。 4 位精度能表示的档位很少,就是前面列过的 0.5、1、1.5、2、3、4、6。梯度值可能小到 0.1 这种量级,普通的“四舍五入”会直接把它舍成 0。训练中这样的微小更新大量存在,每次都被抹掉,累积起来就是系统性偏差,模型可能根本学不动。

它的做法。 不用确定性的就近舍入,改成按概率决定舍入方向。一个值落在 0 和 0.5 之间,离 0 更近,就大概率舍到 0,但也有不小的概率舍到 0.5,概率大小跟它到两个档位的距离成正比。这样从统计期望上看,量化后的值等于原始值,整个量化过程是无偏的。

用在哪里、不用在哪里。 NVIDIA 的配方里,随机舍入只用在对梯度的量化上。权重和激活值仍然用普通的“就近舍入”(round-to-nearest-even),因为对它们用随机舍入反而可能放大误差,而不是抵消误差。这个功能由 Blackwell 的 FP4 转换指令原生支持。

随机舍入只用在对梯度的量化上,为什么?

原因可以用一句话概括:它对梯度是解药,对权重和激活却可能变成毒药。这背后是两类数据在训练中扮演的角色和统计特性不同。

梯度需要“无偏”,随机舍入正好提供

梯度是参数更新的方向。4 位格式的档位极其稀疏,如果对梯度做普通的“四舍五入”,大量微小的梯度值会被系统性地舍入到同一个方向(通常是 0),参数更新因此带上系统性偏差,模型可能学不动,或者收敛变差。

随机舍入的精妙之处在于,它按概率决定舍入方向,量化后的期望值等于原始值,这种偏差就被抹掉了。NVIDIA 明确指出,这对“防止微小更新被压碎为零”至关重要。

权重和激活用随机舍入,反而会放大误差

权重和激活值不需要,也不该承受随机舍入带来的额外方差。

NVIDIA 的官方说明很直接,权重和激活保持“就近舍入”(round-to-nearest-even),因为对它们使用随机舍入反而会放大误差。原因在于,梯度那种“大量微小值被系统性抹掉”的偏差,在权重和激活上并不构成主要矛盾。权重本身可以通过训练去适应 FP4 的表示方式,激活值在每次前向中都是确定的。给它们引入随机性,只会多出一层不必要的噪声,偏差却消不掉。

一个直观的对比

可以这样理解。梯度像一堆指向四面八方的小箭头,如果每次都用“就近”规则把它们掰向少数几个方向,合力的方向就偏了;随机舍入让它们有的偏左一点、有的偏右一点,平均下来方向还是对的。

权重和激活则是模型实际存储和传递的信号本身,它们需要的是稳定、可复现的表示,而不是每次读取都带上随机抖动。给它们加随机性,只会让信号本身变嘈杂。

所以 NVIDIA 的 NVFP4 训练配方把这两种舍入模式做了明确分工:随机舍入专门服务梯度量化,借 Blackwell 硬件的原生支持低成本地消除偏差;权重和激活保持确定性的就近舍入,保证信号本身干净、一致。

随机 Hadamard 变换:把“扎眼”的离群值摊平

它的做法。 量化之前,先对数据做一次正交旋转,也就是 Hadamard 变换。旋转会把原本集中在少数几个维度上的大数值分散到所有维度上,整个张量的数值分布更均匀,也更“像”高斯分布。分布均匀了,4 位精度就更容易准确地表示每一个值。变换本身可逆,在矩阵乘法内部会自然抵消,不改变最终的计算结果。

为什么加“随机”。 标准 Hadamard 变换是固定的。如果数据里恰好存在与变换基“对齐”的结构化离群值,变换可能打不散它。引入随机的符号翻转(乘一个随机对角符号向量),可以降低这种“漏网”的概率,对大模型、长训练周期更稳。

用在哪里。 它只用在权重梯度(WGRAD)的矩阵乘法输入上。前向(FPROP)和激活梯度(DGRAD)不用,是因为一旦对激活做了变换,权重也必须跟着做同样的变换才能保持计算一致,而这会破坏权重二维缩放方案的一致性。权重梯度这一步对量化噪声最敏感,把变换集中用在这里,性价比最高。

Hadamard 变换是什么

Hadamard 变换(阿达马变换)本质上是一种正交变换。放到量化语境里,它像一台“数据平滑器”:通过一个只含 +1 和 -1 的矩阵,把向量里少数特别大的“尖峰”能量均匀地分摊到所有维度上,数据分布变平坦,也就更适合低精度表示。

构造 Hadamard 矩阵的方法

维度是 2 的幂次时。 递归关系是把四块 $H_n$ 拼成一个大矩阵,右下角那块取负号:

这个结构可以一直递归下去,构造出所有 $2^k$ 阶的哈达玛矩阵。

维度不是 2 的幂次时。 还有 Paley 构造法。它利用有限域中的二次剩余(勒让德符号)来填充矩阵:q 取素数幂且 q ≡ 3 (mod 4) 时,能直接得到 $q+1$ 阶的 Hadamard 矩阵;也可以先造一张 $q+1$ 阶的 Conference 矩阵,再把它扩充到 $2(q+1)$ 阶。下面用 $q=3$ 的例子走后一条路。

Conference 矩阵

Conference 矩阵(会议矩阵)很像 Hadamard 矩阵的“带 0 版本”。我们直接把它画出来,你就知道它长什么样了。

1. 它的外貌特征

假设这是一个 $n$ 阶的 Conference 矩阵 $C$,它的样子是这样的:

它的长相有三个硬性规矩:

  1. 对角线全是 0。
  2. 除了对角线,其他所有位置全是 +1 或 -1(没有别的数)。
  3. 任意两行互相垂直(也就是任意两行对应位置相乘再相加,结果必须是 0)。

2. 它和 Hadamard 矩阵是什么关系?

Hadamard 矩阵是“全是 $\pm 1$,且每行长度平方为 $n$”(即 $HH^T = nI$)。
Conference 矩阵是“对角线是 0,其余是 $\pm 1$,且每行长度平方为 $n-1$”(即 $CC^T = (n-1)I$)。
形式上,它像是把 Hadamard 矩阵对角线上的 $\pm 1$ 换成 0 得来的,代价是每行的长度平方从 $n$ 掉到 $n-1$。

3. 亲手造一个 4 阶的 Conference 矩阵

我们拿 $q=3$(质数)来举例,用它造出来的 Conference 矩阵是 $q+1 = 4$ 阶的。真实的矩阵长这样:

来验证一下它的性质:

  • 看对角线:全是 0,满足。
  • 看第一行和第二行(验证垂直):
    对应位置相乘相加:$(0\times1) + (1\times0) + (1\times-1) + (1\times1) = 0 + 0 - 1 + 1 = 0$。垂直!
  • 算自己跟自己的内积(算行长度平方):
    第一行:$0^2 + 1^2 + 1^2 + 1^2 = 3$。正好是 $n-1$($4-1=3$)。

4. 它是怎么被“捏”出来的?

还记得刚才说的勒让德符号 $L(x)$ 吗?这个矩阵就是把 $q=3$ 的 $L$ 值填进去的结果:行和列都按 $\infty, 0, 1, 2$ 的顺序排,第 $i$ 行第 $j$ 列填 $L(i-j)$,第一行和第一列取 $+1$,对角线上取 0。

  • 当 $q=3$ 时,剩余系是 0, 1, 2。
  • $1^2 \pmod 3 = 1$,1 是平方数,所以 $L(1) = 1$。
  • 模 3 的平方只有 0 和 1,2 怎么都凑不出来,所以 $L(2) = -1$。
  • $L(0) = 0$。

按这个规则填完,就得到上面那个 4 阶矩阵了。
(注:不同教材的行列排列(置换)可能不同,但矩阵本质是一样的)。

5. 怎么用它变成正规的 Hadamard 矩阵?

手里有了这个带 0 的“半成品”,还得把它变成全是 $\pm 1$ 的 Hadamard 矩阵。一个很自然的想法是“加边法”:把矩阵里的所有 0 换成 +1,再在最上面加一行全 1、最左边加一列全 1。可 4 阶加一圈边只有 5 阶,而阶数大于 2 的 Hadamard 矩阵,阶数必须是 4 的倍数,5 阶这种东西根本不存在。

真正好用的做法是把 4 阶的 Conference 矩阵当作积木,拼出一个 8 阶的 Hadamard 矩阵。先准备两份副本:把对角线上的 0 换成 $+1$,得到 $A = C + I$;换成 $-1$,得到 $B = C - I$。然后按分块的方式拼起来:

得到的 8 阶矩阵是这样的:

任意两行互乘相加都等于 0,每行长度平方都是 8,就是一个合格的 Hadamard 矩阵。

总结一下: Conference 矩阵就是一个对角线挖空变 0、其余全是 $\pm1$ 的矩阵。数学家正是拿它当原料,通过对角线上 0 的替换和分块拼接,造出那些阶数非常刁钻的 Hadamard 矩阵。

什么是“二次剩余”?

上面说二次剩余就是“能写成另一个数平方”的数,那就直接拿 $q=7$ 试一下。

把 1 到 6 各自平方,然后模 7(除以 7 取余数):

  • 1² = 1,1 mod 7 = 1
  • 2² = 4,4 mod 7 = 4
  • 3² = 9,9 mod 7 = 2
  • 4² = 16,16 mod 7 = 2
  • 5² = 25,25 mod 7 = 4
  • 6² = 36,36 mod 7 = 1

平方算来算去,余数只出现了 1、2、4 这三个数。

  • 能写成平方的(1、2、4),就叫“二次剩余”,所以 $L(1)=1, L(2)=1, L(4)=1$。
  • 怎么算都凑不出平方的(3、5、6),就叫“非二次剩余”,所以 $L(3)=-1, L(5)=-1, L(6)=-1$。
  • 0 单独处理:$L(0)=0$。

这就是勒让德符号 $L(x)$ 的全部含义。它像一台“标签机”: 给你一个数,查一下属于哪一类,是二次剩余就贴 +1,是非二次剩余就贴 -1,是 0 就贴 0。

为什么不用 Conference 矩阵,而用 Hadamard

既然 Conference 矩阵和 Hadamard 矩阵都能做“正交旋转”“能量均摊”,为什么在 AI 芯片(比如 Blackwell 架构)和 NVFP4 的量化里,工程师选的是 Hadamard,Conference 矩阵被晾在一边?

核心原因就两个字:成本。说得具体些,是算力成本和硬件实现成本。可以从四个角度看。

1. 计算速度:Hadamard 是纯加法,Conference 矩阵带着 0

在实际工程里,我们用的不是完整的矩阵乘法,而是快速变换算法(FWHT)。

  • Hadamard 变换:矩阵里只有 $+1$ 和 $-1$,做变换时只需要加法和减法,完全用不上乘法器(硬件里乘法器极其昂贵,也费电)。一维的 Hadamard 变换可以用“蝶形图”极快算出来,时间复杂度是 $O(N \log N)$。
  • Conference 矩阵:它的对角线上有 $0$。用快速算法时,碰到 0 虽然不用乘也不用加,却会破坏硬件流水线的对称性。更要命的是,它没有 Hadamard 那种极度规律、可以直接套分治法的结构,尤其是 Paley 构造出来的矩阵,元素排布是“乱”的。

2. 维度限制:Conference 矩阵太挑剔

AI 模型里张量的维度(比如 4096、8192)通常都是 2 的幂次。

  • Hadamard 变换:只要有 2 的幂次维度,就能从 2 阶矩阵出发无限递归(克罗内克积),生成任何 $2^k$ 阶的矩阵,正好贴合计算机底层的二进制架构。
  • Conference 矩阵:它能给出非 2 的幂次的阶数,但条件卡得很死。Paley 构造法要求 $q$ 是素数幂,阶数就锁在 $q+1$ 或 $2(q+1)$ 这类值上。你没法轻易得到一个 4096 阶的 Conference 矩阵,但闭着眼睛也能写出一个 4096 阶的 Hadamard 矩阵。

3. 硬件实现:Hadamard 可以“零成本”融进 GPU

在 NVFP4 的实际运作中,Hadamard 变换并不是一个单独的步骤,不会“先算完、存下来、再拿去量化”。它是直接融合在矩阵乘法(GEMM)的指令里的。

  • Hadamard 的 $1$ 和 $-1$ 翻转逻辑极度简单,Blackwell 的 Tensor Core 在读取内存的瞬间就能顺手把符号翻转和加减法做完,几乎不增加延迟。
  • 而 Conference 矩阵的对角线 $0$ 和复杂的符号分布,会让硬件电路设计变得很难看,甚至需要额外的寄存器去屏蔽那些 0,这就违背了“用 4 位精度极限榨取算力”的初衷。

4. 目的不同:我们只需要“搅匀”,不需要“开会”

再回到数学本质上。

  • Conference 矩阵的诞生,是为了解决“通信里自己不能干扰自己”的问题(所以对角线是 0),顺带用有限域凑出极少数特定阶数的 Hadamard 矩阵。
  • 在 AI 量化中,我们根本不在乎对角线是不是 0,只需要一台能把任何方向的向量均匀打散到各个维度上的搅拌机。Hadamard 矩阵的每一行都是完美的对称分布(一半 1、一半 -1),是最高效的那一台。

总结

在纯数学家的黑板上,Conference 矩阵是精巧的艺术品,它填补了非 2 次幂阶数的空白。

但在 GPU 的硅片上,Hadamard 矩阵是标准工业零件。它不需要乘除法,完美契合 2 的幂次,结构极度规律,能以接近零成本的方式在硬件里跑完。在动辄几千维、每秒要算上万亿次的 AI 训练里,也只有这种极简结构能活下来。