一句话:mHC 把“每层把结果加回同一条残差流”改成“维护 \(n\) 条并行残差流,每层从这些流里读出输入,算完后再按一张受限的分配表写回”。

它处在一条很长的发展线索上:残差连接 → 门控残差 → 多条残差流 → 受约束的多条残差流。理解 mHC 的关键不在公式,而在于它为什么要走到最后一步。

发展历程

时间 代表工作 做法 解决的问题 留下的问题
1997 前后 LSTM 的 cell state \(c_t=f_t\odot c_{t-1}+i_t\odot \tilde c_t\) 长序列中的遗忘与梯度 作用在时间维,不是层间
2015 Highway Networks 门控短路 \(T(x)\odot F(x)+(1-T(x))\odot x\) 极深网络的梯度与训练 读写同一个状态,通路仍只有一条
2015 ResNet \(h+\mathcal F(h)\) 深层退化、梯度衰减 单条加性通道,只能叠加不能搬运
2016 DenseNet / Stochastic Depth 跨层拼接 / 训练时随机丢层 特征复用、隐式集成 通路结构固定,不可学、也不逐 token
2020–2021 ReZero / LayerScale 残差分支乘一个可学习标量(初值 0 或很小) 深层训练初期的扰动 只调幅度,不调路由
2021 前后 残差流的“总线”视角 把残差流看成所有层共享的通信通道 解释信息如何在层间传递 指出瓶颈:单条总线的宽度与路由都受限
2024 前后 Hyper-Connections 残差流扩成 \(n\) 条,逐 token 学读、写与混合 跨层信息通道太窄 自由混合矩阵在深层可能指数放大或衰减
当前 mHC(DeepSeek-V4、GLM-5.3 等) 把混合矩阵约束为双随机(Sinkhorn 投影) HC 的深层不稳定 残差状态与通信量 \(\times n\),实现复杂

这条线索里反复出现三个问题:

  1. 梯度能不能走直路? ResNet 的回答是把网络从“纯串联”变成“并联 + 累加”,让梯度有一条恒等通路。这解决了收敛问题,但没有解决信息选择问题。
  2. 每层该往前传多少、传什么? Highway、LSTM、各种门控残差的回答是把“传多少”变成可学的系数。它们让幅度可调,但读写仍作用在同一个状态上。
  3. 通路本身够不够宽、够不够灵活? Hyper-Connections 的回答是把一条通路变成 \(n\) 条,并把“谁读谁、谁写谁”变成逐 token 可学的路由。

每次放开自由度都会换来新的不稳定:门控需要归一化来兜底,自由矩阵需要约束来兜底。mHC 就是第三步的兜底方案,也是它名字里“流形约束”的来源。

核心 insight

残差连接的本质是把“串联”变成“并联 + 累加”。 没有残差时,第 \(l\) 层的输入只能来自第 \(l-1\) 层,梯度必须逐层穿过雅可比;有了残差,第 \(l\) 层可以近似直接读到第 \(l-k\) 层的内容。代价是“累加”本身没有选择能力:一旦某个特征被写进残差流,后面只能不断往上叠,模型没有机制说“这条信息现在应该被搬走或抑制”。

因此残差流更像一块共享总线,而单条总线的路由能力是零。 可解释性研究把残差流描述为所有层共享的通信通道:每层读进来、算完再写回去。总线越窄、通道越少,“哪一层的输出对哪一层有用”就只能靠权重间接安排。HC 的洞察是:与其让所有层在一条总线上挤,不如给模型 \(n\) 条并行总线,并把“读哪条、写哪条”显式参数化。

但把混合矩阵完全放开,深层会失控。 如果每层都乘一个自由学习的 \(n\times n\) 矩阵,\(L\) 层之后累积的是 \(C^{(L)}\cdots C^{(1)}\),它的增益可以随深度指数放大或衰减,残差连接原本提供的稳定传播反而被抵消。这正是“自由度换表达力”的典型代价。

mHC 的选择不是调参兜底,而是把矩阵限制在一个天然安全的集合里。 非负、行和为 1、列和为 1 的矩阵(双随机矩阵)恰好具备三个想要的性质:每条输出流是输入的凸组合(不放大)、每条输入流的总权重守恒(不丢内容)、集合对乘法封闭(叠多少层都还在集合里)。由于集合本身有这种代数结构,约束可以在每一步用 Sinkhorn 迭代精确投影上去,而不是依赖“初始化得小一点”或“加一个正则项”这类逐点手段。

双随机约束的直觉

把 \(n\) 条流看成 \(n\) 个寄存器,\(C_{jk}\) 看成“第 \(k\) 条寄存器的内容有 \(C_{jk}\) 的份额在这一层之后被搬到第 \(j\) 条”。于是:

一个具体例子是“带自环的循环搬运”:

\[ C=\begin{bmatrix} 0.5 & 0.5 & 0 & 0\\ 0 & 0.5 & 0.5 & 0\\ 0 & 0 & 0.5 & 0.5\\ 0.5 & 0 & 0 & 0.5 \end{bmatrix}, \]

每行、每列的和都是 1。它的作用可以读成:每条流把一半内容留在原地,一半交给下一条流。另一个常见形式是 \(C=\frac12(I+P)\),即“一半保持、一半与邻居交换”。Birkhoff–von Neumann 定理给出统一的图像:任何双随机矩阵都是置换矩阵的凸组合,所以它的语义是随机重排各条流的平均,而不是对表示做任意线性变换。

从这个角度看,mHC 的混合层更像调度器而不是特征变换层:它牺牲了“任意线性混合”的表达力,换来深度方向上不会失控。这也是它与“把残差流变宽再自由学习”最本质的区别。

数学形式

符号 含义
\(n\) 残差流条数(配置项 hc_mult,DeepSeek-V4 为 4)
\(d\) hidden 维,即每条流的宽度
\(H^{(l)}\in\mathbb R^{n\times d}\) 第 \(l\) 个子层入口的残差流堆叠
\(\mathcal F^{(l)}\) 第 \(l\) 个子层(attention 或 MLP/MoE)
\(\text{pre}^{(l)},\text{post}^{(l)}\in\mathbb R^{n}\) 读系数与写系数
\(C^{(l)}\in\mathbb R^{n\times n}\) 跨流混合矩阵
\(W_{\text{mix}}^{(l)}\) 从残差流生成全部混合系数的投影矩阵

一个子层的完整更新为

\[ h^{(l)}_{\text{in}}=\sum_{j=1}^{n}\text{pre}^{(l)}_j\odot H^{(l)}_j, \qquad y^{(l)}=\mathcal F^{(l)}\!\left(\operatorname{Norm}\!\left(h^{(l)}_{\text{in}}\right)\right), \]

\[ H^{(l+1)}_j=\text{post}^{(l)}_j\,y^{(l)}+\sum_{k=1}^{n}C^{(l)}_{jk}\,H^{(l)}_k . \]

当 \(n=1\)、\(\text{pre}=\text{post}=1\)、\(C=[1]\) 时,它退化成标准残差。混合系数每 token 独立生成:

\[ m^{(l)}=W_{\text{mix}}^{(l)}\operatorname{RMSNorm}\!\left(\operatorname{vec}\!\left(H^{(l)}\right)\right)\in\mathbb R^{\,n(n+2)}, \]

其中 \(n(n+2)\) 分成三段:前 \(n\) 个是读系数,接着 \(n\) 个是写系数,最后 \(n^2\) 个组成混合矩阵的 logits。DeepSeek-V4 里 \(n=4\),所以每个 token 每个子层只有 24 个混合系数;生成它们的投影形状是 \(n(n+2)\times nd\)(\(n=4\) 时约 \(96d\) 个参数),相对主干权重可以忽略。

H (n × d) ──► h_in = Σ_j pre_j ⊙ H_j ──► Norm ──► 子层 F ──► y
   │                                                          │
   └────────── H ← comb(H) + post ⊗ y  ◄──────────────────────┘
                comb 由 Sinkhorn 投影到双随机集合

约束保证了什么

直觉之外,这三条性质可以严格写下来。设

\[ \mathcal B_n=\left\{C\in\mathbb R_{\ge 0}^{n\times n}\ \middle|\ C\mathbf{1}=\mathbf{1},\ \mathbf{1}^{\mathsf T}C=\mathbf{1}^{\mathsf T}\right\}. \]

行和为 1 说明每条新流是旧流的凸组合,

\[ \left\|\sum_{k}C_{jk}H_k\right\|_\infty\le\max_k\left\|H_k\right\|_\infty, \]

所以混合部分不会放大最大范数;非负性同时排除了流之间的相消。列和为 1 说明流间的平均(直流分量)在混合中保持不变:

\[ \frac1n\sum_{j=1}^{n}\sum_{k=1}^{n}C_{jk}H_k =\frac1n\sum_{k=1}^{n}\left(\sum_{j=1}^{n}C_{jk}\right)H_k =\frac1n\sum_{k=1}^{n}H_k . \]

第三条性质在深层更重要。\(\mathcal B_n\) 对乘法封闭,

\[ C_1,C_2\in\mathcal B_n\ \Longrightarrow\ C_1C_2\in\mathcal B_n, \]

于是任意层的累积混合 \(C^{(L)}\cdots C^{(1)}\) 仍然是双随机矩阵,其 \(\ell_\infty\) 诱导范数恒为 1。深度不再带来新的增益自由度,这就是“把不稳定性挡在结构之外”的含义。

需要注意它并不能禁止流之间趋同:均匀平均矩阵 \(\frac1n\mathbf{1}\mathbf{1}^{\mathsf T}\) 本身也是双随机的。约束排除的是任意线性放大与衰减,抗坍缩仍要靠门控与训练动力学。

Sinkhorn:把自由系数投影到双随机集合

系数生成后,实现里的激活方式把 24 个原始系数分成三组:

\[ \text{pre}_j=\sigma\!\left(s_0 m_j+b_j\right)+\epsilon, \qquad \text{post}_j=2\sigma\!\left(s_1 m_{n+j}+b_{n+j}\right), \]

\[ S_{jk}=s_2\,m_{2n+jk}+b_{2n+jk}, \]

其中 \(s\in\mathbb R^{3}\)、\(b\in\mathbb R^{n(n+2)}\) 是可学习的逐组尺度与偏置。两组门控的值域不同,作用也不同:

系数 个数 激活 值域 作用
\(\text{pre}\) \(n\) \(\sigma(\cdot)+\epsilon\) \((0,1+\epsilon]\) 从 \(n\) 条流读出子层输入;每条流自身的贡献只能衰减
\(\text{post}\) \(n\) \(2\sigma(\cdot)\) \((0,2)\) 把子层输出写回各条流,初值接近 1,可增可减
\(C\) \(n^2\) 仿射后 Sinkhorn \(\mathcal B_n\) 跨流混合,即深度连接

混合矩阵的 logits \(S\) 经过 Sinkhorn–Knopp 迭代。先做一次数值稳定的行 softmax,

\[ K_{jk}=\exp\!\left(S_{jk}-\max_{k'}S_{jk'}\right), \qquad C^{(0)}_{jk}=\frac{K_{jk}}{\sum_{k'}K_{jk'}}+\epsilon, \]

再反复做“行归一化 → 列归一化”,

\[ C^{(t+1)}=\operatorname{colnorm}_{\epsilon}\!\left(\operatorname{rownorm}_{\epsilon}\!\left(C^{(t)}\right)\right), \qquad \operatorname{rownorm}_{\epsilon}(x)=\frac{x}{\sum x+\epsilon}, \]

迭代 \(R\) 次后取 \(C=C^{(R)}\)。DeepSeek-V4 取 \(R=20\)、\(\epsilon=10^{-6}\),系数生成与 Sinkhorn 全部在 fp32 下进行,每次迭代都是 \(O(n^2)\) 的逐 token 计算。

这套迭代有标准解释:交替缩放收敛到 \(C=D_1KD_2\),即把 \(K\) 投影到“行列和均为 1”的矩阵集合上,等价于在 KL 意义下求 I-投影,也是熵正则最优传输的矩阵缩放形式。它对应熵正则问题

\[ \min_{C\in\mathcal B_n}\ \left\langle C,-S\right\rangle-\tau H(C), \qquad H(C)=-\sum_{j,k}C_{jk}\log C_{jk}, \]

实现里 \(K=\exp(S)\) 对应 \(\tau=1\) 的参数化,因此 logits 的尺度 \(s_2\) 实际扮演温度倒数的角色:\(s_2\) 越大,混合越接近置换矩阵(接近硬路由);\(s_2\) 越小,混合越接近均匀平均。迭代次数 \(R\) 是精度与延迟的折中,误差随迭代线性收敛,\(\epsilon\) 则提供数值下限、避免除零。

接入 Transformer

位置与流水

mHC 包住每个子层:从残差流读出输入、算子层、把输出写回并混合。DeepSeek-V4 的实现里,某个子层的写回系数会被下一个子层消费,因此系数生成 GEMM 可以与当前子层的主 GEMM 重叠执行;decode 时这些 kernel 属于 launch-bound 而不是 bandwidth-bound,所以 mHC 的统计与 Sinkhorn 被放到独立 stream 上与 attention、FFN 重叠。

宽度与并行

残差流的宽度从 \(d\) 变成 \(n d\),这会同时放大三类成本:激活显存、序列并行/张量并行下需要搬运的激活体积,以及投机解码 draft 模型的 hidden 宽度(DeepSeek-V4 与 Qwen4-Exp 的 draft 直接沿用 \(n d\) 的布局)。它与 KV Cache 无关——KV 仍然来自 attention 自己的 latent,不会因为残差流变宽而变化。新增的参数只有每个子层 \(O(n^2d)\) 量级的系数投影,以及 \(3+n(n+2)\) 个 scale/bias。

收益与代价

方案 混合矩阵 约束 深层行为
标准残差 \(C=[1]\) 无 单条恒等通路
Hyper-Connections \(C\) 自由 无 累积乘积可能指数放大或衰减
mHC \(C\in\mathcal B_n\),逐 token 双随机 + Sinkhorn 20 次 累积混合始终双随机,\(\ell_\infty\) 范数不超过 1
iHC(如腾讯 Hy4) 只有 pre/post 两组残差门控 无 combination、无 Sinkhorn 语义不同,实现不可互换

收益:跨层信息通道从 1 条变成 \(n\) 条并且逐 token 条件化;双随机约束让任意深度的混合有界,改善极深网络的训练稳定性;混合语义可解释为“流的重排与搬运”,比自由矩阵更难产生极端增益。

代价:残差流带来的激活显存与并行通信量按 \(n\) 倍增长;每个子层多一次 \(n(n+2)\times nd\) 的系数 GEMM、一次行 softmax 和 \(R=20\) 次 \(O(n^2)\) 的归一化,在 decode 这种 launch-bound 区间必须靠融合与重叠消化;没有任何 FLOP 收益,它改的是信息传播和稳定性,不是单层计算量。

与其他稳定技术的分工

这些技术控制的对象不同,可以叠加而不冲突:

一句话概括:归一化管“幅度”,mHC 管“路由”。

常见面试问题

  1. 残差连接解决什么问题?为什么还不够? 它把串联网络变成并联 + 累加,给梯度一条恒等通路,解决的是收敛;但累加没有选择能力,模型无法决定哪一层的信息该流向哪一层。
  2. 为什么要把残差流扩成多条? 残差流是所有层共享的总线,单条总线的跨层带宽和路由能力都有限;多条流把“读谁、写谁”变成可学参数,相当于显式增加跨层信息通道。
  3. 为什么混合矩阵要约束成双随机? 行和为 1 使每条新流是旧流的凸组合(不放大),列和为 1 使流间平均不变(内容守恒),对乘法封闭使任意深度的累积混合仍有界。它还等价于置换矩阵的凸组合,语义上是搬运而不是任意线性变换。
  4. 为什么用 Sinkhorn 而不是裁剪或正则项? 需要的是“每步都精确落在集合里”的结构性保证,而不是逐点惩罚;Sinkhorn(矩阵缩放)是把 \(\exp(S)\) 投影到 Birkhoff 多面体的标准算法,固定迭代次数就是取一个近似投影。
  5. 双随机能保证流不坍缩吗? 不能。均匀平均矩阵本身也是双随机的,约束排除的只是放大与衰减;抗坍缩依赖门控与训练动力学。
  6. 为什么 pre 用 \(\sigma\)、post 用 \(2\sigma\)? pre 限制每条流自身的贡献在 \((0,1)\),读出的子层输入不会被单条流放大;\(2\sigma\) 初值接近 1,写回系数可增可减,保留放大能力。
  7. 每个 token 每个子层有多少系数? \(n(n+2)\),\(n=4\) 时是 24,即 4 个读系数、4 个写系数和一个 \(4\times4\) 的逐 token 混合矩阵。
  8. mHC 会减少 FLOP 或显存吗? 都不会。它让残差流变宽、显存与通信量上升,换来的是跨层通道容量与训练稳定性。
  9. 它和 pre-norm、RMSNorm、QK-Norm 冲突吗? 不冲突:那些技术管“幅度”,mHC 管“路由”,控制对象不同可以叠加。
  10. iHC 和 mHC 是同一件事吗? 不是。Hy4 的 iHC 只有 pre/post 两组残差门控,没有 combination 步骤也没有 Sinkhorn,两者实现不可互换。

小结