mHC 是 V4 三大创新里最"低调"的一个——它不省 FLOPs、不压 KV、用户感知不到。 但没有它,V4 训不动。这一节把"流形约束"从听起来玄学的名字,拆成一句话能懂的事: 让每层的残差变换都不放大信号。
标准 Transformer 的残差是教科书写法:
简单、好训。但叠到几十层、训到几万亿 token 时,三件麻烦事一起来:
字节跳动 2025 年提出 Hyper-Connections (HC):把残差流的"宽度"从 1 份扩到 n 份,
每一份独立传递,子层通过加权聚合再展开。V4 取 hc_mult = 4,相当于 4 路残差并联。
一层 HC 用三个动态生成的矩阵把 n_hc 路残差流送进子层、再展开回 n_hc 路:
形状 [1, n_hc]。把 4 路残差流加权合并成 1 份,送进子层 F(Attention / MoE)。
决定子层听谁的。
形状 [n_hc, n_hc]。决定旧的 4 路残差怎么搬到下一层的 4 路残差。
整个 HC 的稳定性核心。
形状 [n_hc, 1]。把子层的 1 份输出展开回 4 路残差流。
决定子层结果分给谁。
这三个矩阵都是 input-dependent + input-independent 两部分相加生成的—— 既能"看人下菜",也保留一份通用基底。但 HC 论文最初的版本是没有任何约束的, Bl 的奇异值可能 > 1——叠几十层之后,残差流的 norm 就指数级爆炸。
一个 3×3 双随机矩阵长什么样?
每行和 = 1(绿色) · 每列和 = 1(蓝色) · 全部 ≥ 0
相比之下,普通 HC 的 Bl 没有这个约束,多层乘积的奇异值会按几何级数累积。
训练时 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。
横轴是层数,纵轴是残差流 norm(对数刻度)。调节"残差矩阵的最大奇异值"模拟普通 HC 训练中的常见情况:
把滑块拨到 1.15、层数拨到 60,普通 HC 的信号会放大 ~3000 倍—— 这正是论文里普通 HC 实测到的数值。mHC 把这个数压到 1.6, 也就是用户提供的精读资料里那句"信号增益从 3000 压到 1.6"的真实出处。
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 的每个映射环节都被夹在合理区间。
点 "迭代一次",看一个随机正矩阵怎么被洗成双随机:
| 项 | V4 实际取值 | 说明 |
|---|---|---|
hc_mult(残差流展宽) | 4 | 4 路并联残差,介于训练稳定性与显存开销的甜点 |
hc_sinkhorn_iters | 20 | 20 次足够误差 < 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 根并联水管,每层加权汇流再分配。压力分散了,但单根仍可加压,叠久了照爆。
4 根管 + 每层装一个限流阀(双随机矩阵)—— 流量可以重新分配但总和不能放大。再叠 100 层水管也不会爆。
所以 mHC 真正的价值不在 benchmark 上多 0.3 个点,而在让 1.6T × 32T 的训练运行不崩。 没有它,V4 的所有其他创新都没机会展示。