Ch 03 · mHC
第一部分 · 架构 · 03

mHC — 残差通路的几何护栏

从"残差等于加法"到"残差等于带几何约束的矩阵混合"—— V4 把 60+ 层堆叠的稳定性问题搬到了流形上。

名词速通 · 一分钟看懂 mHC

mHC = Manifold-constrained Hyper-Connection(流形约束的超连接)

把"残差连接"从一根标量 highway 变成 $n_{hc}$ 条并行 highway,再把它们之间的"换道矩阵"强制关进一个不会放大输入的几何集合里。这就是 V4 在 60+ 层超深堆叠下还能稳得住的核心。

残差连接(Residual Connection)
Transformer 里 $x_{l+1} = x_l + F_l(x_l)$ 那条"加法支路",让深网络的梯度能直接传回去。简单好用,但深度一上去,能量越加越大、异常值越传越远,是这一章一切麻烦的根源。
Hyper-Connection(HC,Zhu 2025)
把单条残差扩成 $n_{hc}$ 条并行残差流(V4 取 $n_{hc}=4$)。每层多三个学习矩阵 $A_l, B_l, C_l$ 控制"读哪几条流 / 把输出写到哪几条流 / 流之间怎么混"。表达力上去了,但 $B_l$ 无约束 ⇒ 稳定性反而更差
Manifold(流形)
这里特指双随机矩阵的 Birkhoff 多面体 —— 所有"元素非负、行和为 1、列和为 1"的方阵构成的集合 $\mathcal M$。它有两个救命性质:里头任何矩阵的谱范数 $\le 1$,且乘法封闭(俩双随机矩阵相乘还是双随机)。
Constrained(受约束)
把每层学到的"未约束"矩阵 $\tilde B_l$ 用 Sinkhorn-Knopp 迭代 20 步可微地投影回 $\mathcal M$。"可微"是关键 —— 反向传播能直接穿过去,整个 mHC 端到端可学。
一句话定位:把 4 条 highway 之间的"换道矩阵"关进双随机牢笼里,让 60 层堆叠后的累积变换永远不会放大输入。
标准残差、Hyper-Connection、Manifold-Constrained HC 三种结构对比
图 3-1 · 标准残差 → HC → mHC 的三段式演进。 (a) 标准残差:单条 highway,$x_l \xrightarrow{\mathcal F} \oplus \to x_{l+1}$,下文 §1 讲它为什么扛不住 60 层。 (b) Hyper-Connection:把残差扩成多条 highway,引入 Pre / Res / Post 三个 无约束 线性 mapping(橙色块),表达力上去了但 §3 会说明它仍会爆炸。 (c) mHC:把这三个 mapping 都包进流形投影 $\mathcal P_{\mathcal M}(\cdot)$(绿色块),强制落在双随机矩阵的 Birkhoff 多面体上 —— 这就是 §4-6 的故事。 来源:Xie et al. 2026《Manifold-Constrained Hyper-Connection》(V4 论文 §2.2 引用)。

1. 标准残差为什么扛不住 60 层

标准残差连接 $x_{l+1} = x_l + F_l(x_l)$ 看起来无害,但在大深度下有三个具体的失效模式:

  • 能量累积:每个 $F_l$ 都向 $x$ 加一份贡献,$\|x_L\|$ 随 $L$ 增大单调上升。Pre-norm 能缓解但不能消除。
  • 有效深度坍缩:当 $\|x_L\|$ 已经很大时,新加的 $F_L(x_L)$ 相对于累积的 $x_L$ 显得微不足道,后期层的贡献被淹没。模型名义 60 层,实际有效层数远小于 60。
  • 异常值不可消除:残差路径是恒等映射,一旦某一层 $F_l$ 输出含 outlier,它会被原样复制到所有后续层。这是 LLM 训练中"激活异常值"问题的几何根源。
数值演练 假设每层 $F_l$ 的输出范数稳定在 $\|F_l(x)\| \approx 0.05 \cdot \|x\|$(中等贡献)。则 $\|x_L\|^2 \le \|x_0\|^2 \cdot \prod_{l=1}^{L}(1 + 0.05)^2 \approx \|x_0\|^2 \cdot 1.05^{2L}$, 深度 $L=60$ 时 $\|x_{60}\| / \|x_0\| \approx 1.05^{60} \approx \mathbf{18\times}$。 也就是说,最深层看到的输入幅度比最浅层大一个数量级,再叠加 LayerNorm 的非线性,训练就开始飘。

DeepSeek 团队在 V4-Pro 早期实验(深度 61)里直接撞上了这个问题。常见的解法是改 LayerNorm(DeepNorm、Sandwich-LN 等),但都是压住表象。V4 走了另一条路 —— 直接改残差的几何结构

2. Hyper-Connection(Zhu 2025):把残差从向量扩成矩阵

核心想法:与其只有一条残差流(宽度 $d$),不如同时维护 $n_{hc}$ 条并行残差流(每条宽度 $d$),把整个 state 写成矩阵 $X_l \in \mathbb{R}^{n_{hc} \times d}$。每层引入三个学习矩阵 $A_l, B_l, C_l$ 控制流之间的读写:

$$ X_{l+1} \;=\; B_l\, X_l \;+\; C_l\,F_l\!\big(A_l X_l\big) $$

每个矩阵的形状与角色:

符号形状角色V4 取值($n_{hc}=4, d=7168$)
$X_l$$n_{hc} \times d$第 $l$ 层的"残差流矩阵",$n_{hc}$ 条并行 highway$4 \times 7168$,每个 token 多带 4 份隐藏状态
$A_l$$1 \times n_{hc}$:把 $n_{hc}$ 条流加权平均成单个 $d$-向量喂给 block$1 \times 4$,4 个权重
$F_l$$d \to d$第 $l$ 层的实际计算(attention 或 FFN)原本 Transformer block 不变
$C_l$$n_{hc} \times 1$:把 block 输出分发回 $n_{hc}$ 条流$4 \times 1$,4 个权重
$B_l$$n_{hc} \times n_{hc}$混合:流之间的相互交换矩阵$4 \times 4 = 16$ 个权重
📖 公式白话翻译

$X_{l+1} = B_l X_l + C_l F_l(A_l X_l)$ 翻成大白话就是三步:

  1. :$A_l X_l$ —— 从 4 条 highway 上各取一点料,混成一份"输入"喂给本层 attention/FFN;
  2. :$F_l(\cdot)$ —— 本层正常计算,输出仍是 $d$ 维向量;
  3. 写 + 混合:$C_l \cdot \text{(输出)} + B_l X_l$ —— 一边把新结果按 $C_l$ 分发到 4 条流,一边按 $B_l$ 把旧的 4 条流重新"换道"打包。

整个过程比标准残差多了三个旋钮:选择从哪几条流读、写到哪几条流、流之间怎么换道。模型可以学会"这一层我把 outlier 关在第 3 条流里别让它污染主流"这种策略。

$n_{hc}$ 在 V4 取 4 —— 4 条 highway 之间允许"分工 + 兜底",例如某些流专门承载长程信号、另一些承载局部信号,$B_l$ 决定它们如何借换。

3. 但 HC 自己仍会"原地爆炸"

HC 的稳定性问题集中在 $B_l$。它是一个无约束的 $n_{hc} \times n_{hc}$ 矩阵,所有层堆起来后,从输入到输出的残差通路总变换是 $B_L \cdots B_2 B_1$。

定量看:

  • 如果每层平均 $\|B_l\|_2 = 1.05$(仅高出 5%),60 层乘下来 $\|\prod B_l\|_2 \le 1.05^{60} \approx 18\times$ —— 残差路径放大 18 倍;
  • 如果某些 $B_l$ 学出大的负值,相邻层流之间出现强相消,信息被洗掉;
  • 训练初期 $B_l$ 几乎随机,谱半径分布很宽 —— 训练前几千步极其不稳。

这正是 DeepSeek 在 V4-Pro 早期跑出的现象。HC 本身没解决稳定性,只是把问题包装得更大

Demo · 深度堆叠下的谱范数对比
交互
0.01 0.1 1 10 100 1 20 40 60 80 深度 L(堆叠层数) ‖∏ B_l‖₂(log scale) L=60 无约束 HC:‖B‖^L mHC:恒 ≤ 1

拖滑条调整"每层无约束 HC 的谱范数"。红线 = 60 层堆叠后的累积放大;绿线 = mHC 强制每层 ≤ 1,无论怎么堆都不放大。把滑条拉到 1.05 看 L=60 的红线读数 —— 18 倍放大正是 V4-Pro 早期训练飘掉的根因。

4. mHC 的核心约束:把 $B_l$ 关进 Birkhoff 多面体

mHC(Manifold-constrained HC, Xie 2026)的关键一步:强制 $B_l$ 落在双随机矩阵的 Birkhoff 多面体上:

$$ B_l \in \mathcal{M}\;:=\;\Big\{\, M \in \mathbb{R}^{n_{hc}\times n_{hc}} \;\Big|\; M\mathbf{1} = \mathbf{1},\;\; \mathbf{1}^{T}M = \mathbf{1}^{T},\;\; M_{ij} \ge 0 \,\Big\} $$

这个约束的含义拆开来看:

  • $M_{ij} \ge 0$:每个流给下一层各流的"权重"都是非负的,禁止相消
  • $M\mathbf{1} = \mathbf{1}$:每行和为 1,每条流"分给"出去的总权重是 1,不放大
  • $\mathbf{1}^{T}M = \mathbf{1}^{T}$:每列和为 1,每条新流"接收"的总权重是 1,不浓缩
具体例子 一个合法的 $4\times 4$ 双随机矩阵: $$ M = \begin{pmatrix} 0.6 & 0.1 & 0.2 & 0.1 \\ 0.1 & 0.5 & 0.1 & 0.3 \\ 0.2 & 0.3 & 0.4 & 0.1 \\ 0.1 & 0.1 & 0.3 & 0.5 \end{pmatrix} $$ 每行加起来 $=1$,每列加起来 $=1$,全员 $\ge 0$。它的谱范数是 $\|M\|_2 \approx 0.91 \le 1$。

反例:把右下角改成 1.5,行和变 1.9,列和也变 1.9 —— 不再双随机,谱范数会爆。
为什么 Birkhoff 多面体能根治放大问题
  1. 谱范数恒 $\le 1$:由 Birkhoff–von Neumann 定理,双随机矩阵 = 置换矩阵的凸组合。所有置换矩阵谱范数为 1,凸组合的谱范数 $\le 1$。所以 $\|B_l\|_2 \le 1$,$\|\prod B_l\|_2 \le 1$ 无论堆多深
  2. 矩阵乘法下闭合:双随机矩阵的乘积仍然双随机。这意味着累积变换永远在合法集内,60 层和 6 层在几何稳定性上没有区别。

几何直观:把 4 条 highway 想成 4 个能量罐。$B_l$ 描述的是"这一步如何把 4 个罐里的水重新分配到 4 个新罐"—— 双随机约束保证总量守恒、不浓缩、不增减,最坏情况是所有水均匀混合($M = \tfrac{1}{n_{hc}} \mathbf{1}\mathbf{1}^T$),最理想情况是直接置换($M$ 是某个排列)。回到图 3-1 (c):那三个绿色 $\mathcal P_{\mathcal M}(\cdot)$ 框做的就是这件事,把 (b) 里的橙色 mapping 都打回这个集合。

$A_l, C_l$ 的处理

  • $A_l$ 用 $\mathrm{Sigmoid}$ 投到 $(0, 1)^{n_{hc}}$ —— 读流时禁止负权重,避免主信号被异号项相消;
  • $C_l$ 用 $2\cdot\mathrm{Sigmoid}$ 投到 $(0, 2)^{n_{hc}}$ —— 写入流时给稍宽的动态范围,让 block 贡献能"压过去"。

5. 动态 + 静态参数化:让约束矩阵随上下文走

如果 $B_l$ 是固定的可学习参数,每层只有一个 $B_l$,它不能根据当前 token 调整流间路由。mHC 把它分解成静态 + 动态两部分:

$$ \tilde{B}_l \;=\; \alpha^{\text{res}}_l \cdot \mathrm{Mat}\!\big(\hat{X}_l W^{\text{res}}_l\big) \;+\; S^{\text{res}}_l $$

每个符号:

  • $\hat{X}_l$:当前层 RMSNorm 后的输入;
  • $W^{\text{res}}_l$:把 $\hat{X}_l$ 投到 $n_{hc}^2$ 维的矩阵,$\mathrm{Mat}(\cdot)$ 把这个向量 reshape 成 $n_{hc} \times n_{hc}$;
  • $\alpha^{\text{res}}_l$:可学习的标量系数,控制"动态部分"的权重;
  • $S^{\text{res}}_l$:可学习的静态 $n_{hc} \times n_{hc}$ 矩阵,提供"默认混合模式"。
📖 公式白话翻译

这条公式可以理解成"默认换道地图 + 一份按 token 微调"

  • $S^{\text{res}}_l$ 是地图:每层有一份固定的"4 条 highway 默认怎么换道",训练初期主要靠它,模式简单稳定;
  • $\hat X_l W^{\text{res}}_l$ 是实时路况:根据当前 token 内容动态生成一个补丁矩阵;
  • $\alpha^{\text{res}}_l$ 是音量旋钮:训练初期取 ≈0.1,地图占主导;后期 $\alpha$ 学大,按 token 调整变得重要。

这种"先打地基再加上层建筑"的参数化,是双阶段训练稳定性的核心 —— 模型不会在第 0 步就被一个随机大动态项推飞。

$A_l, C_l$ 也用同样的动态+静态分解,公式形状相同,只是输出维度变成 $1\times n_{hc}$ 和 $n_{hc}\times 1$。

6. Sinkhorn-Knopp:把任意正矩阵打回多面体

$\tilde{B}_l$ 经过上述参数化后只是个普通矩阵,怎么可微地投到 Birkhoff 多面体上?mHC 的做法:

  1. 先取 $\exp(\tilde{B}_l)$,保证非负;
  2. 用 Sinkhorn-Knopp 迭代交替归一化行与列,20 步收敛到双随机矩阵。
$$ M^{(t)} \;=\; \mathcal{T}_r\!\Big(\mathcal{T}_c\!\big(M^{(t-1)}\big)\Big),\qquad t = 1, 2, \ldots, 20 $$

其中 $\mathcal{T}_r$ 是行归一化(每行除以行和),$\mathcal{T}_c$ 是列归一化(每列除以列和)。

📖 公式白话翻译

Sinkhorn-Knopp 干的事就两件,反复轮流:

  1. 把每一行除以它的行和 ⇒ 行和都变成 1(但列和被打乱);
  2. 把每一列除以它的列和 ⇒ 列和都变成 1(但行和又被打乱了一点点)。

每轮两边都被"打乱"得越来越轻,20 轮后行和列和都 ≈ 1,这就是双随机。重要的是这两步都是可微的元素级除法,autograd 能正常穿过去 —— 整个 mHC 仍然端到端可训。

Demo · Sinkhorn-Knopp 在 4×4 矩阵上的逐步收敛
交互
当前矩阵 M^(t) 行和 / 列和(应都趋近 1) 下一步:行归一化(每行 ÷ 行和)
步数:0/20 行残差 0.00 列残差 0.00

初始矩阵是随机正矩阵(模拟 $\exp(\tilde B_l)$ 的输出)。每按"下一步"交替做一次行 / 列归一化。观察:3-5 步后两个残差就掉到 $10^{-3}$ 量级,10 步后基本归零。这就是 mHC 选 20 步迭代的安全边界。

为什么 Sinkhorn-Knopp 一定收敛?

经典定理(Sinkhorn 1964):任何全正矩阵在交替行列归一化下都收敛到双随机矩阵,且收敛是线性的(每次误差缩小 $\sim$ 常数比例)。 对 $4 \times 4$ 矩阵,10 步内残差就能降到 $10^{-4}$;20 步是充足的安全边界

为什么不用 Hungarian 算法(求最优排列)? 因为它给出离散的硬置换,不可微,反向传播无法穿过它。Sinkhorn 是这个分配问题的软可微版本 —— 这也是它在 OT、attention sinkformer、RL 等领域被广泛使用的原因。

7. 代价 / 还没解决的问题

  • Sinkhorn 计算开销:每层每步 20 次 $4\times 4$ 矩阵的行列归一化 $\approx$ 320 次乘除。相对 forward+backward 完全可忽略。
  • 表达力损失:双随机 $4\times 4$ 矩阵构成 9 维流形(无约束是 16 维)。理论上表达力下降,但实测 loss 曲线不显著变化,反而稳定性大幅改善。
  • 只约束了流间混合,没约束 $F_l$ 本身:mHC 让残差路径"非膨胀",但 $F_l$ 仍可能产生大幅 outlier。这部分由 Ch14 的 SwiGLU Clamping 与 Anticipatory Routing 兜底。
  • $n_{hc}$ 必须不大:$n_{hc} = 4$ 是平衡点。若 $n_{hc} \to 16$,$B_l$ 矩阵变 $16\times 16$,Sinkhorn 仍 cheap,但动态参数化的 $W^{\text{res}}$ 投影维度从 16 涨到 256,参数量上升。V4 取 4 是工程权衡。
把整章压成一句话

标准残差是无约束加法,60 层堆叠时能量与异常值都会累积。HC 把残差从向量扩成 $n_{hc}$ 条 highway,给每层三个旋钮(读 $A_l$ / 写 $C_l$ / 混合 $B_l$)。但 $B_l$ 无约束仍会爆炸,所以 mHC 把它关进双随机矩阵的 Birkhoff 多面体 —— 谱范数恒 $\le 1$ 且乘法封闭,60 层等同于 6 层的稳定性。代价是 9-vs-16 维表达力损失(实测无影响)和每层 20 步 Sinkhorn(开销可忽略)。

flowchart LR X["X_l
shape n_hc × d"] --> Norm["RMSNorm + flatten"] Norm --> Aw["A_l 通道"] Norm --> Bw["B_l 通道"] Norm --> Cw["C_l 通道"] Aw -- "Sigmoid" --> A["A_l ∈ (0,1)"] Cw -- "2·Sigmoid" --> C["C_l ∈ (0,2)"] Bw -- "exp" --> Bp["正矩阵"] Bp -- "Sinkhorn-Knopp ×20" --> B["B_l ∈ Birkhoff"] A --> F["Layer F_l"] F --> C C --> Add(("+")) X --> B B --> Add Add --> Xn["X_(l+1)"] classDef key fill:#71a4e1,stroke:#71a4e1,color:#fff class B,A,C key

图 3-2 · mHC 的动态参数化流程。Sinkhorn-Knopp 是把残差矩阵"打回流形"的关键一步,保证累积变换的谱范数永远 $\le 1$。