mHC:把残差连接推进到下一个时代

从残差到 mHC:一条清晰的三代演进路

如果你训练过深层 Transformer,一定对残差连接(Residual Connection)不陌生。它是 ResNet 留下的最重要的遗产之一,也是今天所有大语言模型的标配。

但残差连接有个根本问题:它只有一条信息流

DeepSeek 在 2025 年连发两篇论文,把这个问题彻底讲透了。故事的三步是:

  1. Residual(2015)x_{l+1} = x_l + F(x_l) — 一条流,稳定但表达弱
  2. HC(2024):把残差流拓宽到 n 条并行流,表达能力暴涨,但训练直接崩
  3. mHC(2025):给 HC 加上数学约束,又强又稳

这篇文章把这三代讲清楚,重点放在 mHC 上。


残差连接的瓶颈:一条流不够用

标准 Transformer 里,每一层的计算是这样的:

1
2
x = x + Attention(Norm(x))  # 残差连接
x = x + MoE(Norm(x)) # 残差连接

Layer 0 到 Layer 42 的所有信息,全都挤在同一个向量里做加法。

浅层的语法信息、中层的语义信息、深层的推理信息,互相覆盖、互相干扰。这是残差连接的天花板。

HC(Hyper-Connections) 提出了一个很自然的想法:

为什么不把 1 条流扩成 n 条并行流,让不同深度的信息走不同的”车道”?

HC 的公式如下:

$$X_{l+1} = B_l X_l + C_l F(A_l X_l)$$

  • $A_l$:把 n 条流压缩成 1 条,送给 Attention/MoE
  • $F$:正常的层计算
  • $C_l$:把 F 的输出扩回 n 条流
  • $B_l$:n×n 矩阵,控制 n 条流之间怎么混合(残差项)

n=4 的时候,FLOPs 几乎没增加(F 只算 1 次),但信息容量翻了 4 倍。

听起来完美,对吧?


HC 的致命缺陷:训练会崩

问题出在 B_l 上。

HC 里的 B_l 是完全可学习的,没有任何约束。当模型叠到 60 层、参数量到万亿级时,这个无约束的矩阵会出问题:

多层复合后,信号被无限放大或衰减。

数学上,HC 跨层递归展开后得到:

$$x_L = \left(\prod B_i\right) x_l + \sum \left(\prod B_j\right) C_i^T F(…)$$

$\prod B_i$ 是多层 $B$ 矩阵的复合。因为 $B$ 无约束,这个复合矩阵的谱范数可以远大于 1,也可以接近 0。

实测结果(DeepSeek 27B 实验):
HC 的复合映射增益(Amax Gain Magnitude)达到 ~3000,意味着信号在前向传播中可以被放大 3000 倍。训练到第 12k 步,loss 直接 spike,梯度范数爆炸。

HC 的作者(ByteDance Seed 团队)在 ICLR 2025 发表了这个想法,但没有解决稳定性问题。


mHC:给 HC 加上”安全阀”

DeepSeek 团队在 2025 年提出的 mHC(Manifold-Constrained Hyper-Connections),只做了一件事:

把 HC 中的残差混合矩阵 B_l 约束在双随机矩阵流形上。

什么是双随机矩阵?

一个 $n \times n$ 矩阵,满足:

  • 所有元素非负
  • 每行之和等于 $1$
  • 每列之和等于 $1$

这样的矩阵,谱范数 永远 ≤ 1。也就是说,它永远不会放大信号。

而且,双随机矩阵在乘法下是封闭的:两个双随机矩阵相乘,结果还是双随机矩阵。这意味着叠 100 层,复合映射仍然稳定。

一句话:mHC = HC + 双随机约束,恢复了残差连接的恒等映射性质,同时保留了多流的表达能力。


怎么把矩阵变成双随机?Sinkhorn-Knopp 算法

mHC 的核心算法是 Sinkhorn-Knopp 迭代,操作很简单:

1
2
3
4
5
6
7
8
9
# 输入: B_raw (4×4, 可能是负数)
M = exp(B_raw) # 先保证非负

# 交替行列归一化 20 次
for _ in range(20):
M = M / M.sum(dim=1, keepdim=True) # 行归一化
M = M / M.sum(dim=0, keepdim=True) # 列归一化

# 输出: B (4×4 双随机矩阵)

为什么第一步用 exp()?因为 B_raw 是神经网络输出的 logit,可能有负数。直接归一化会产生负权重,违反”非负”约束。exp() 把任意实数映射到正数,完美解决。

20 次迭代是实验得出的经验值,足够收敛,又不会太慢。


4 条流到底解决了什么问题?

很多人问:为什么是 4 条流?不是 2 条或 8 条?

三个核心作用:

1. 梯度高速公路

普通残差的梯度路径是 43 个乘法项的连乘,容易消失或爆炸。
4 条流提供了 4 条并行的梯度路径,一条堵了还有其他。类似 DenseNet 的思路,但高效得多(F 只算 1 次)。

2. 信息分离存储

1
2
3
4
stream_0: 可能专注浅层信息(位置、语法)
stream_1: 可能专注中层信息(语义、实体关系)
stream_2: 可能专注深层信息(推理链)
stream_3: 可能做"工作记忆"(当前层临时计算)

Layer 5 学到的特征,通过 B 矩阵的合理混合,可以在 Layer 30 仍然清晰可用。而在 1 条流里,这个特征早就被 25 次加法淹没了。

3. 动态容量分配

B 矩阵是输入依赖的(由当前层的 hidden state 动态生成):

  • 简单 token(”the”, “a”):B ≈ 单位矩阵,4 条流基本不混合,省计算
  • 复杂 token(需要深度推理):B 大幅混合,让更多层的信息参与

这是 1 条流做不到的——普通残差对所有 token 都是 $x + F(x)$。

为什么选 n=4?
论文实测:n=4 是性价比最优的点。n=2 效果不够,n=8 的 Sinkhorn 开销(8×8 矩阵 × 20 次迭代)显著增加,但收益递减。


工程优化:为什么只多 6.7% 开销?

mHC 看起来很重:每行代码都有矩阵运算、Sinkhorn 迭代、4 倍 hidden state……

但 DeepSeek 做了三件事,把开销压到了 **仅 +6.7%**:

1. Kernel Fusion(算子融合)

用 TileLang 把整个 mHC 计算——RMSNorm + 线性投影 + Sigmoid + Sinkhorn——融合成一个 CUDA kernel,减少内存读写。

2. Selective Recomputing(选择性重计算)

前向时只保存每块的第一个层输入,反向时重新计算 mHC 的中间激活。最优块大小由公式给出:

$$L_r^* \approx \sqrt{\frac{nL}{n+2}}$$

3. Overlapping with DualPipe

把 mHC 的计算和流水线通信重叠。在 DualPipe 调度中,F_post,res kernel 放到高优先级流,避免阻塞 All-to-All 通信。


实验效果:又强又稳

DeepSeek 用 27B MoE 模型做了对比实验:

指标 Baseline HC mHC
训练稳定性 稳定 loss spike @12k步 稳定
最终 loss 下降 +0.021 vs baseline +0.027 vs baseline
复合映射增益 1.0 ~3000 ~1.6
训练开销 0% +?% +6.7%

下游任务(BBH / DROP / GSM8K 等 8 个 benchmark)上,mHC 全面超过 baseline 和 HC。

最重要的结论: mHC 让 1.6T 参数、60+ 层、MoE 模型能够稳定训练——这是普通 HC 做不到的。


一句话总结

mHC = HC + 双随机矩阵约束,是残差连接的最终进化形态,让万亿参数 MoE 能稳定训练。

如果你正在设计超大模型,mHC 是目前最值得考虑的残差连接方式。它不改 FLOPs,不改层计算,只改残差流的拓扑结构——但就是这一点,让深层训练从”可能崩”变成了”一定稳”。


参考资料:

  • Hyper-Connections, Zhu et al., ByteDance Seed, ICLR 2025, arXiv:2409.19606
  • mHC: Manifold-Constrained Hyper-Connections, Xie et al., DeepSeek, 2025, arXiv:2512.24880
  • DeepSeek-V4 Technical Report, 2026

写于 2026-06-02,基于 DeepSeek-V4-Pro 代码和 mHC 原始论文整理。