# mHC 与 Single-Pass mHC

> mHC 把一条残差主干扩成 4 条并行的残差流，并把流间的混合矩阵约束成双随机矩阵；V4.1 沿用它，只把混合系数错后一层，让整个残差更新能在一次读写里做完。

- 作者：David（道雾轩）
- 专栏：DeepSeek V4.1 Flash 深度解析（https://daiw.net/manual/deepseek-v4-flash.md）
- 最后更新：2026-09-19
- 原文：https://daiw.net/manual/deepseek-v4-flash/mhc
- 转载与引用：请注明出处并附原文链接（https://daiw.net/about/copyright）

**沿用，并做了改进。** V4 引入了 **mHC**（Manifold-Constrained Hyper-Connections，流形约束超连接）来强化残差连接；V4.1 报告的说法是把原有的 mHC “升级为 Single-Pass mHC”，配套一个部署用的 Mega-mHC kernel [1][2]。超参数没变：4 条残差流，Sinkhorn-Knopp 迭代 20 次 [1][2][3]。

这一章先讲 mHC 本身，再讲 V4.1 改了什么。

## 先回顾：残差连接只有一条主干

标准 Transformer 的每个子层都是这个形状：

> **输出 = 输入 + 子层(归一化(输入))**

那个“+ 输入”就是残差连接，它给梯度开了一条直通的高速公路，深层网络才训得动。这个设计从 2015 年的 ResNet 沿用至今 [6]。它的结构性限制是：**整个模型只有一条残差主干**，所有子层的输出都往同一条河里汇，浅层写进去的东西会被后面几十层反复读写。

## 超连接：一条变四条

**Hyper-Connections**（超连接，HC）把残差流的宽度扩成 $n$ 倍，也就是 $n$ 条并行的残差流 [5]。每一层引入三个映射 [2]：

- 输入映射 $A$：把 $n$ 条流混成这一层真正的输入；
- 残差变换 $B$：一个 $n \times n$ 的矩阵，决定 $n$ 条流之间怎么互相混合、传到下一层；
- 输出映射 $C$：把这一层的输出写回 $n$ 条流。

$$
X_{l+1} = B_l X_l + C_l \, \mathcal{F}_l(A_l X_l)
$$

$\mathcal{F}_l$ 是这一层本身（例如 MoE 层），它的输入输出仍是原来的宽度，所以扩宽残差流不影响层内部的设计。V4 系列取 $n=4$ [2]。

问题在训练稳定性：V4 论文说，HC 叠很多层时频繁出现数值不稳定 [2]；mHC 论文把原因归结为 HC 破坏了残差连接最本质的“恒等映射”性质 [4]。

## “流形约束”约束的是什么

mHC 的核心是把残差变换 $B$ 限制在**双随机矩阵**的集合里（也叫 Birkhoff 多胞形）[2][4]：

- 所有元素非负；
- **每一行的和是 1，每一列的和也是 1**。

白话说：信号在 4 条流之间**只能被重新分配，不能被放大，也不会凭空消失**。数学上这保证了 $B$ 的谱范数不超过 1，残差变换是“不扩张”的，前向和反向传播都更稳；而且双随机矩阵相乘还是双随机矩阵，几十层叠起来也不会失控 [2]。输入映射和输出映射则用 Sigmoid 限制成非负、有界，避免信号互相抵消 [2]。

怎么保证 $B$ 是双随机的？先对原始参数取指数得到正矩阵，再**交替做行归一化和列归一化**，这就是 Sinkhorn-Knopp 算法；V4 取 20 次迭代 [2]。三个映射的参数还分成“随输入变化的动态部分”和“固定的静态部分”，由当前的残差状态预测出来 [2]。

<Callout type="info">
  **一处更正**：本专栏初版把“流形约束”解释成“把连接权重限制在一个学习到的低维流形上”，还说官方没有公开具体形式。**两处都不对**：V4 论文第 2.2 节写明了约束的对象是双随机矩阵构成的 Birkhoff 多胞形，用 Sinkhorn-Knopp 投影，流的条数是 4、迭代 20 次 [2]。这一节已按论文重写。
</Callout>

## Single-Pass mHC：把依赖错开一层

V4.1 的改动不在数学性质上，而在**内存访问**上 [1]。

每个块之间的残差更新要做三件事：更新残差（用上一块的输出）、根据新的残差预测三个映射的系数、用输入映射把残差混成下一块的输入。问题是第三步依赖第二步——系数要等对整个隐藏维度做完归约才能算出来，于是 V4 的实现要分几个 kernel 顺序执行、多次读写激活。报告算过：连同预归一化在内，原实现的激活读写量是理论下界的**两倍** [1]。

Single-Pass mHC 的办法很简单：**每一块用上一块预测出的输入混合系数**，而不是等自己这块的系数算完 [1]。依赖一旦错开，残差的每个分块读进来就能同时用于“混合出输入”和“累积下一块系数所需的统计量”，不用等整行归约。

- 部署时，残差更新、输入混合和系数预测被融合进**一个 kernel（Mega-mHC）**，连同预归一化和 FP8 转换一起做；残差只读一次、写一次，达到理论下界，激活读写量比原来的实现**减半** [1]。
- 预训练时仍用原来的多 kernel 实现，因为这个改动只改变“每一块用哪一组系数”，数学上两者都能表达 [1]。
- 效果上，报告称这个错位带来的性能损失“可以忽略”（官方口径）[1]。

## 为什么这个方向值得关注

残差连接是过去十年最稳定的一块设计，前沿实验室专门花力气改它，说明它在某个规模上真的成了瓶颈。同期的 [Kimi K3 用 AttnRes 补的是同一个问题](https://daiw.net/manual/kimi-k3/attn-res)：K3 是“加一条专线”，DeepSeek 是“把主干改成四条、再约束它们怎么混”。而 V4.1 这次说明了另一件事：**一个结构能不能长期留下来，很大程度看它能不能被高效地实现**。mHC 的数学没动，改的是 kernel 能不能一次读写做完。

下一章讲 V4.1 新加的两个组件。👉 [Engram 与 DSpark](https://daiw.net/manual/deepseek-v4-flash/engram-dspark)

## 参考文献

- [1] DeepSeek-AI. “DeepSeek-V4.1-Flash: Pushing the Limits of KV Cache Compression.” 2026-09. [arXiv:2609.19969](https://arxiv.org/abs/2609.19969) —— 第 2.4.1 节（Single-Pass mHC、激活读写量分析、Mega-mHC）、第 4.2.1 节（扩展因子 4、Sinkhorn-Knopp 20 次）。
- [2] DeepSeek-AI. “DeepSeek-V4: Towards Highly Efficient Million-Token Context Intelligence.” 2026-04. [arXiv:2606.19348](https://arxiv.org/abs/2606.19348) —— 第 2.2 节：HC 的三个映射、双随机约束与谱范数、Sigmoid 约束、动态参数化、Sinkhorn-Knopp 投影。
- [3] Hugging Face：[deepseek-ai/DeepSeek-V4.1-Flash 的 config.json](https://huggingface.co/deepseek-ai/DeepSeek-V4.1-Flash/blob/main/config.json) —— `hc_mult: 4`、`hc_sinkhorn_iters: 20`。
- [4] Xie et al. “mHC: Manifold-Constrained Hyper-Connections.” 2025-12. [arXiv:2512.24880](https://arxiv.org/abs/2512.24880) —— mHC 的原始论文：恒等映射性质与训练不稳定的关系。
- [5] Zhu et al. “Hyper-Connections.” 2024-09. [arXiv:2409.19606](https://arxiv.org/abs/2409.19606) —— 超连接这一族方法的原始工作。
- [6] He et al. “Deep Residual Learning for Image Recognition.” 2015-12. [arXiv:1512.03385](https://arxiv.org/abs/1512.03385)
