4 mHC:流形约束的超连接 / 让 1.6T 模型啃下 32T+ token 不崩

mHC 是 V4 三大创新里最"低调"的一个——它不省 FLOPs、不压 KV、用户感知不到。 但没有它,V4 训不动。这一节把"流形约束"从听起来玄学的名字,拆成一句话能懂的事: 让每层的残差变换都不放大信号

4.1 背景:残差连接的老毛病

标准 Transformer 的残差是教科书写法:

y = x + f(x)

简单、好训。但叠到几十层、训到几万亿 token 时,三件麻烦事一起来:

字节跳动 2025 年提出 Hyper-Connections (HC):把残差流的"宽度"从 1 份扩到 n 份, 每一份独立传递,子层通过加权聚合再展开。V4 取 hc_mult = 4,相当于 4 路残差并联

4.2 HC 的数学骨架:三个映射矩阵

一层 HC 用三个动态生成的矩阵把 n_hc 路残差流送进子层、再展开回 n_hc 路:

Xl+1 = Bl · Xl + Cl · Fl(Al · Xl) (论文式 1)

Al:输入映射

形状 [1, n_hc]。把 4 路残差流加权合并成 1 份,送进子层 F(Attention / MoE)。 决定子层听谁的

Bl:残差映射

形状 [n_hc, n_hc]。决定旧的 4 路残差怎么搬到下一层的 4 路残差。 整个 HC 的稳定性核心

Cl:输出映射

形状 [n_hc, 1]。把子层的 1 份输出展开回 4 路残差流。 决定子层结果分给谁

这三个矩阵都是 input-dependent + input-independent 两部分相加生成的—— 既能"看人下菜",也保留一份通用基底。但 HC 论文最初的版本是没有任何约束的, Bl 的奇异值可能 > 1——叠几十层之后,残差流的 norm 就指数级爆炸。

4.3 mHC 的核心改动:把 Bl 钉在双随机矩阵流形上

一句话总结 mHC 强制残差映射矩阵 Bl双随机矩阵(doubly stochastic matrix):每行和为 1、每列和为 1、所有元素 ≥ 0。 这个集合(Birkhoff polytope)有一个关键性质——谱范数 ‖B‖₂ ≤ 1,即残差变换是 non-expansive 的,永远不放大信号。

一个 3×3 双随机矩阵长什么样?

示例:3×3 双随机矩阵

[ ] 0.50.30.2 0.20.60.2 0.30.10.6 → 1.0 → 1.0 → 1.0 ↓1.0 ↓1.0 ↓1.0

每行和 = 1(绿色) · 每列和 = 1(蓝色) · 全部 ≥ 0

为什么"行和=列和=1"就保证稳定?

  • 双随机矩阵 ⊂ 凸包,由所有置换矩阵线性组合而成(Birkhoff–von Neumann 定理)
  • 置换矩阵的奇异值都是 1 → ‖B‖₂ ≤ 1
  • 残差变换不放大向量长度:‖B·x‖ ≤ ‖x‖
  • 双随机矩阵的乘积仍是双随机矩阵——多层叠加仍稳定

相比之下,普通 HC 的 Bl 没有这个约束,多层乘积的奇异值会按几何级数累积。

4.4 怎么把任意矩阵投到这个流形上?Sinkhorn–Knopp

训练时 Bl 是网络动态生成的。mHC 用 Sinkhorn–Knopp 算法把它"洗"成双随机:

# Sinkhorn-Knopp 投影(V4 在每层 forward 时跑一次)
M = torch.exp(B_l)              # ① 取 exp 保证正性
for t in range(hc_sinkhorn_iters):  # V4 取 t_max = 20
    M = M / M.sum(dim=-1, keepdim=True)  # ② 行归一化(每行和=1)
    M = M / M.sum(dim=-2, keepdim=True)  # ③ 列归一化(每列和=1)
# 收敛后 M ≈ 双随机矩阵
B_l_proj = M

这个算法很有意思——你以为列归一化会破坏行归一化(反之亦然), 但它是数学上保证收敛的(Sinkhorn 1964 定理):交替归一化的极限点恰好是双随机矩阵。 20 次迭代足够误差 < 1e-4。

4.5 交互可视化①:稳定性对比 —— 普通 HC vs mHC 叠 N 层后

横轴是层数,纵轴是残差流 norm(对数刻度)。调节"残差矩阵的最大奇异值"模拟普通 HC 训练中的常见情况:

1.15
60 层
普通 HC(B 无约束) mHC(B 双随机,‖B‖₂ ≤ 1)
第 L 层时普通 HC 的信号增益
第 L 层时 mHC 的信号增益
差距

把滑块拨到 1.15、层数拨到 60,普通 HC 的信号会放大 ~3000 倍—— 这正是论文里普通 HC 实测到的数值。mHC 把这个数压到 1.6, 也就是用户提供的精读资料里那句"信号增益从 3000 压到 1.6"的真实出处。

4.6 Al 和 Cl 用 Sigmoid 约束

Bl 锁在双随机流形上,但 Al(输入聚合权重)和 Cl(输出展开权重) 没法用双随机约束(它们不是方阵)。mHC 给它们套逐元素 Sigmoid

A_l = torch.sigmoid(raw_A_l)   # ∈ (0, 1),非负 + 有界
C_l = torch.sigmoid(raw_C_l)   # ∈ (0, 1),非负 + 有界

非负保证 4 路残差不会出现"互相抵消"的奇怪相位;有界保证子层贡献不会被无穷放大。 三件套合起来,整个 HC 的每个映射环节都被夹在合理区间

4.7 交互可视化②:Sinkhorn–Knopp 一步一步

点 "迭代一次",看一个随机正矩阵怎么被洗成双随机:

0 / 20
行和最大偏差 |Σ_row − 1|
列和最大偏差 |Σ_col − 1|

4.8 V4 的实际配置与工程代价

V4 实际取值说明
hc_mult(残差流展宽)44 路并联残差,介于训练稳定性与显存开销的甜点
hc_sinkhorn_iters2020 次足够误差 < 1e-4
Bl 约束双随机(Sinkhorn-Knopp)谱范数 ≤ 1,残差变换 non-expansive
Al / Cl 约束Sigmoid逐元素非负 + 有界
训练 wall-time 额外开销+6.7%融合 kernel + 选择性 recompute + 调整 DualPipe 压下来的
显存额外开销4× 残差流用 BF16 存且不参与 MoE 通信,实际增量可控
训得动的尺度1.6T 模型 × 32T+ token对照组(普通 HC)在 ~8T token 出现 loss spike

4.9 "流形约束"是不是标题党?

悲观读法 "流形"听起来像微分几何,实际上做的事不过是把矩阵奇异值夹到 1 以内—— 跟 spectral normalization、weight clipping 一类技巧没本质区别。 名字玄、实质朴素。
乐观读法 "夹奇异值"通常做不到多层乘积也夹住。双随机矩阵集合在矩阵乘法下封闭, 数学上保证多层叠加仍稳定——这是 spectral normalization 给不了的。 "流形"二字配得上。

4.10 一个比喻:水管系统

标准残差

一根直水管,每层都可以加压。压力一路累积,最后一节管子爆。

普通 HC

分成 4 根并联水管,每层加权汇流再分配。压力分散了,但单根仍可加压,叠久了照爆

mHC

4 根管 + 每层装一个限流阀(双随机矩阵)—— 流量可以重新分配但总和不能放大。再叠 100 层水管也不会爆。

所以 mHC 真正的价值不在 benchmark 上多 0.3 个点,而在让 1.6T × 32T 的训练运行不崩。 没有它,V4 的所有其他创新都没机会展示。