模型架构 / 层间连接与计算深度 原理笔记进阶 10 分钟阅读 查看源文件 ↗

残差连接:Hyper-Connections 与 mHC#

本页内容5 个部分

1. Residual#

1.1 核心思想#

传统神经网络里, 每一层学的是一个完整的映射 H(x)H(x). 残差网络 (ResNet, He et al. 2015) 改成让这一层学 残差 F(x)=H(x)−xF(x) = H(x) - x, 然后输出:

y=F(x)+xy = F(x) + x

那个 +x+x 就是 skip connection (跳跃连接) 或 shortcut, 把输入直接加到几层之后的输出上.

1.2 为什么要这么做#

1. 解决深层网络退化问题. 理论上网络越深表达能力越强, 但实际上 50 层往往比 20 层还差 -- 不是过拟合, 而是优化变难了. 残差连接让 "什么都不学" 变得很容易: 只要 F(x)≈0F(x) \approx 0, 这一层就等于恒等映射, 不会让网络变差.

2. 缓解梯度消失. 反向传播时:

∂L∂x=∂L∂y⋅(1+∂F∂x)\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \left(1 + \frac{\partial F}{\partial x}\right)

那个 11 来自 skip connection, 提供一条直接梯度通路;与其他项的抵消、激活函数及投影仍可能使总梯度消失.

3. 让损失曲面更平滑. 实证研究 (Li et al. 2018, Visualizing the Loss Landscape) 显示, 加了残差之后 loss landscape 明显更光滑, 更容易找到好的极小值.

1.3 一个 Residual Block (PyTorch 风格伪代码)#

def forward(self, x):
    identity = x
    out = self.conv1(x)
    out = self.bn1(out)
    out = self.relu(out)
    out = self.conv2(out)
    out = self.bn2(out)
    out = out + identity   # ← 残差连接
    return self.relu(out)

如果 F(x)F(x) 和 xx 的维度对不上 (比如改了通道数或下采样), shortcut 上会加一个 1×11 \times 1 卷积来对齐, 这叫 projection shortcut.

1.4 影响#

  • ResNet 让 100+ 层的网络真正能训练, 2015 年 ImageNet 冠军, 152 层.
  • Transformer 每个 sub-layer (attention、FFN) 外面都包了一层残差 + LayerNorm, 没有它训练不稳定.
  • 现在几乎所有深层架构 (U-Net、Diffusion model、LLM) 都默认用残差连接, 已经是基础设施级别的组件.

一句话总结: 与其让网络学 H(x)H(x), 不如让它学 H(x)H(x) 相对于 xx 的修正量 -- 这个看似微小的改动让 "训练任意深的网络" 从难题变成了默认操作.

2. Hyper-Connections#

残差连接虽然好用, 但存在一个两难权衡:

归一化位置 优点 缺点
Pre-Norm (x+F(Norm(x))x + F(\text{Norm}(x))) 直接残差路径有利于优化 表征坍缩: 深层 hidden state 越来越相似, 深度收益递减
Post-Norm (Norm(x+F(x))\text{Norm}(x + F(x))) 表征更有区分度 初始化与学习率更敏感,非必然梯度消失

具体地说, 讨论 Pre-Norm vs Post-Norm 时常常这样写:

  • Pre-Norm: xl+1=xl+F(LN(xl))x_{l+1} = x_l + F(\text{LN}(x_l)), 残差通路上没有 LN, 有直接梯度通路,但不保证所有方向的梯度不消失.
  • Post-Norm: xl+1=LN(xl+F(xl))x_{l+1} = \text{LN}(x_l + F(x_l)), 每层都要穿一次 LN, ∂L/∂x\partial L / \partial x 随深度衰减.

但实际更新的是参数 θ\theta, 不是 xx. 为什么分析 ∂L/∂x\partial L / \partial x 就能说明 ∂L/∂θ\partial L / \partial \theta 的行为?

2.1 参数梯度的链式分解#

设第 ii 层的参数为 θi\theta_i, 做的运算是 Fi(⋅ ; θi)F_i(\cdot\,;\, \theta_i). 链式法则:

∂L∂θi  =  ∂L∂xi+1⏟全局因子  ⋅  ∂xi+1∂θi⏟局部因子\frac{\partial L}{\partial \theta_i} \;=\; \underbrace{\frac{\partial L}{\partial x_{i+1}}}_{\text{全局因子}} \;\cdot\; \underbrace{\frac{\partial x_{i+1}}{\partial \theta_i}}_{\text{局部因子}}

  • 全局因子: 从顶部传下来的梯度, 要穿过 i+1,…,L−1i+1, \ldots, L-1 层.
  • 局部因子: 只跟第 ii 层自己的运算有关, 与深度无关.

局部 Jacobian 取决于该层输入与参数,而输入分布也随深度和训练变化。全局因子与局部因子都影响参数梯度,不能只看其中一个就推出稳定性。

2.2 把全局因子展开#

全局因子可以再拆:

∂L∂xi+1  =  ∂L∂xL  ⋅  ∂xL∂xi+1⏟深度的累积效应\frac{\partial L}{\partial x_{i+1}} \;=\; \frac{\partial L}{\partial x_L} \;\cdot\; \underbrace{\frac{\partial x_L}{\partial x_{i+1}}}_{\text{深度的累积效应}}

2.3 Pre-Norm#

xL  =  xi+1+∑j>iFj(LN(xj))x_L \;=\; x_{i+1} + \sum_{j>i} F_j(\text{LN}(x_j))

∂xL∂xi+1  =  I⏟identity 项, 不随 L 衰减  +  ∑j>i∂Fj(LN(xj))∂xi+1\frac{\partial x_L}{\partial x_{i+1}} \;=\; \underbrace{I}_{\text{identity 项, 不随 } L \text{ 衰减}} \;+\; \sum_{j>i} \frac{\partial F_j(\text{LN}(x_j))}{\partial x_{i+1}}

恒等项是直接通路的贡献,但其余项可能与它抵消,因此不能从“存在 I”推出整个 Jacobian 有非零下界。最简单的反例是一般残差块 F(x)=−xF(x)=-x,其总 Jacobian 为零。Pre-Norm 的结论也应结合归一化和完整 Jacobian 分析。

2.4 Post-Norm#

每层穿一次 LN:

xj+1  =  LN(xj+Fj(xj))x_{j+1} \;=\; \text{LN}(x_j + F_j(x_j))

∂xL∂xi+1  =  ∏j=i+1L−1LNj′⋅(I+∂Fj/∂xj)⏟每层一个 LN 雅可比连乘\frac{\partial x_L}{\partial x_{i+1}} \;=\; \prod_{j=i+1}^{L-1} \underbrace{\text{LN}'_j \cdot (I + \partial F_j / \partial x_j)}_{\text{每层一个 LN 雅可比连乘}}

Post-Norm 的梯度涉及归一化 Jacobian 连乘,可能放大或衰减;仅从某些方向的局部特征值小于 1,不能推出非交换矩阵乘积的所有梯度必然指数消失。

2.5 HC 的核心思想#

ByteDance Seed 团队 2024 年底的工作 (Zhu et al., Hyper-Connections), 目标是 取代残差连接, 同时拿到 Pre-Norm 和 Post-Norm 两边的好处.

把单一的 residual stream 扩展为 nn 条并行的 hidden streams, 并让每一层用可学习的连接矩阵决定:

  • 从这 nn 条流里怎么 "读" 出输入喂给 FF (attention/FFN)
  • FF 的输出怎么 "写" 回这 nn 条流
  • nn 条流之间怎么相互混合

设有 nn 条并行流, 每条 dd 维:

H∈Rn×d,F 的输入/输出∈RdH \in \mathbb{R}^{n \times d}, \quad F \text{ 的输入/输出} \in \mathbb{R}^d

每一层做三件事:

读:h~=α⊤H,α∈Rn算:o=F(h~),o∈Rd写:Hnew=BH+β o⊤,B∈Rn×n, β∈Rn\begin{aligned} \text{读:} \quad & \tilde{h} = \alpha^\top H, & \alpha &\in \mathbb{R}^n \\ \text{算:} \quad & o = F(\tilde{h}), & o &\in \mathbb{R}^d \\ \text{写:} \quad & H_{\text{new}} = B H + \beta\, o^\top, & B &\in \mathbb{R}^{n \times n},\ \beta \in \mathbb{R}^n \end{aligned}

2.6 为什么 α,β\alpha, \beta 是向量, BB 是矩阵?#

维度上的必然:

  • α,β\alpha, \beta 必须是 nn 维向量, 因为它们在 "nn 条流" 和 "FF 的单一 dd 维输入/输出" 之间架桥. 一头是 nn, 一头是 11, 桥本身就是 nn 维.
  • BB 必须是 n×nn \times n 矩阵, 因为它做的是 nn 条流 →n\to n 条流的内部重组. 两头都是 nn, 桥就是 n×nn \times n.

如果把 BB 也降成向量 (等价于 B=diag(b)B = \text{diag}(b), 对角阵), 更新就变成:

Hnew[i]=bi⋅H[i]+βi⋅oH_{\text{new}}[i] = b_i \cdot H[i] + \beta_i \cdot o

此时残差分支本身不直接混合各条流,但 α\alpha 读入和 β\beta 写回仍通过共享的 FF 耦合它们,因此并不等于独立残差网络。完整矩阵 BB 额外提供直接跨流的线性混合。

矩阵 BB 的非对角项才是 hyper-connection 真正多出来的东西: 它允许第 ii 条流从第 jj 条流 "取信息". 比如:

  • 某条流可以专门保留浅层原始信息 (BB 里它对自己权重接近 11, 其它流权重接近 00)
  • 某条流可以做 "深层加工", BB 里它从其它流大量吸收信号
  • 两条流甚至可以在某层 swap

把参数特殊化一下就能退回普通残差:

n=1,  B=[1],  α=[1],  β=[1]⇒xl+1=xl+F(xl)n = 1,\; B = [1],\; \alpha = [1],\; \beta = [1] \quad \Rightarrow \quad x_{l+1} = x_l + F(x_l)

所以 BB 的对角项扮演的就是 "传统残差里的那个 11", 而 off-diagonal 项 == hyper-connection 相对 residual 的真正增量. 把 BB 限制为对角阵会删掉直接跨流混合,但是否值得采用仍需消融实验。

2.7 Static vs Dynamic#

  • Static Hyper-Connections (SHC): 连接权重 α,β,B\alpha, \beta, B 是纯参数, 与输入无关.
  • Dynamic Hyper-Connections (DHC): 连接权重由当前 token 的 hidden state 动态生成 (类似一个小 router). 表达力更强, 效果也更好, 但多一点参数和计算.

2.8 为什么有效 (直觉)#

  • 多条流: 不同的流可以扮演不同角色 -- 有的保留浅层信息 (防坍缩), 有的承载深层加工后的信号 (保性能), 不再被迫挤在一条 residual stream 里.
  • 可学习路由: 每层自己决定从哪条流读、写到哪条流, 相当于在深度方向上多了一种 soft 的 "层间注意力".
  • 保留恒等通路: BB 矩阵里包含了 identity 成分, 所以梯度依然能直通到底层, 没丢残差的核心好处.

2.9 实证#

  • LLM 预训练: 同等参数量下, Pre-Norm + Hyper-Connections 比 Pre-Norm 残差收敛更快、最终 loss 更低, 论文里报告等价于约 1.8×1.8\times 的训练加速.
  • 视觉任务 (ViT、图像生成) 也有一致的提升.
  • 推理开销很小: nn 一般取 44 左右就够, 额外 FLOPs 主要是几个小矩阵乘.

2.10 要点回顾#

残差连接 == 一条 hidden stream ++ 固定的恒等加法; Hyper-Connections == nn 条 hidden stream ++ 可学习 (甚至动态) 的层间路由. 它把 "如何把过去的信息和当前层的输出融合" 这件事从硬编码变成了可学的, 从而绕开 Pre-Norm/Post-Norm 的二选一困境.

3. mHC: Manifold-Constrained Hyper-Connections#

DeepSeek-AI 于 2025 年 12 月首次发布的工作 (Xie et al., arXiv 2512.24880). 这篇直接回答了 "BB 是矩阵, 那它能随便取吗?" -- 答案是 不能, 它必须落在一个特定的流形上.

3.1 HC 在 scale 上的问题#

把 HC 多层展开 (论文 Eq.4):

令 Bi=HiresB_i=\mathcal H_i^{\mathrm{res}}、ui=Hipost⊤F(Hiprexi,Wi)u_i=\mathcal H_i^{\mathrm{post}\top}F(\mathcal H_i^{\mathrm{pre}}x_i,W_i)。按乘法顺序定义 Pb:a=BbBb−1⋯BaP_{b:a}=B_bB_{b-1}\cdots B_a,空乘积为 II,则

xL=PL−1:lxl+∑i=lL−1PL−1:i+1ui.x_L=P_{L-1:l}x_l+\sum_{i=l}^{L-1}P_{L-1:i+1}u_i.

动态映射时,这些矩阵沿当前前向轨迹取值;求导还需包含它们对输入的依赖。

跟普通 residual 的展开 xL=xl+∑F(⋯ )x_L = x_l + \sum F(\cdots) 对比:

  • residual 里浅层信号 xlx_l 是 直接 传到深层的 (系数为 II, identity mapping).
  • HC 里浅层信号要穿过 ∏Hres\prod \mathcal{H}^{\text{res}}. Hres\mathcal{H}^{\text{res}} 是无约束矩阵, 连乘 LL 次之后这个 product 既不接近 II, 也没界 -- 信号可能被显著放大或衰减.

实测数据: 在 27B 模型上, 复合映射 ∏Hres\prod \mathcal{H}^{\text{res}} 的 "Amax Gain" 峰值达到 3000 (理想值是 11), 训练在 12k 步附近 loss 出现尖峰, gradient norm 也跟着炸. 即: HC 砸碎了 residual 的 identity mapping 性质, scale 一上来就不稳.

3.2 解决方法: 把 Hres\mathcal{H}^{\text{res}} 约束到 Birkhoff polytope 上#

mHC 强制 Hres\mathcal{H}^{\text{res}} 必须是 doubly stochastic matrix (双随机矩阵): 每一个行/列和都为 11, 元素非负.

PMres(Hres):={H∈Rn×n∣H1n=1n, 1n⊤H=1n⊤, H≥0}\mathcal{P}_{\mathcal{M}^{\text{res}}}(\mathcal{H}^{\text{res}}) := \{H \in \mathbb{R}^{n\times n} \mid H \mathbf{1}_n = \mathbf{1}_n,\ \mathbf{1}_n^\top H = \mathbf{1}_n^\top,\ H \geq 0\}

这个集合叫 Birkhoff polytope -- 所有 n×nn \times n 置换矩阵的凸包.

3.3 为什么偏偏是双随机矩阵?#

三个性质, 每一个都是为大规模训练稳定性量身定做的:

1. Non-expansion(固定残差混合不放大范数)

双随机矩阵的谱范数 ∥H∥2≤1\|H\|_2 \leq 1, 固定 HH 时,该线性混合 non-expansive,但不是保持所有向量范数:例如均匀平均矩阵会消去流间差异。动态 H(x)H(x) 的总 Jacobian 还包含 ∂H/∂x\partial H/\partial x,加上非线性分支后,不能由此保证整个网络的梯度不放大/不消失。

2. Compositional Closure (深度也不会爆炸)

双随机矩阵的乘积仍是双随机矩阵. 这意味着 ∏Hres\prod \mathcal{H}^{\text{res}} 不管乘多少层, 都还在这个 manifold 里, 谱范数永远 ≤1\leq 1. 这正是 HC 缺失的 "跨层不发散" 性质.

3. 退化回 residual

当 n=1n = 1, 双随机条件退化为标量 11, ∏Hres=1\prod \mathcal{H}^{\text{res}} = 1, 完全恢复了 residual 的 identity mapping. 所以 mHC 是 residual 的严格泛化: 把 11 推广为 doubly stochastic matrix.

几何直观: HH 是若干 permutation matrix 的 convex combination -- 把 nn 条流之间的混合解释成 "软的置换", 反复施加就是稳健的特征融合.

另外 Hpre,Hpost\mathcal{H}^{\text{pre}}, \mathcal{H}^{\text{post}} 也被约束为 非负 (用 sigmoid), 防止正负系数相消时的 signal cancellation.

3.4 怎么把矩阵投到 Birkhoff polytope? Sinkhorn-Knopp#

经典做法 (Sinkhorn & Knopp 1967):

  1. 先把矩阵指数化保证非负: M(0)=exp⁡(H~res)M^{(0)} = \exp(\tilde{\mathcal{H}}^{\text{res}})
  2. 交替按行归一化、按列归一化:

M(t)=Tr(Tc(M(t−1)))M^{(t)} = \mathcal{T}_r\big(\mathcal{T}_c(M^{(t-1)})\big)

正矩阵满足适当条件时可收敛到双随机缩放。固定 20 次与浮点算术只给近似结果,应监控行/列和残差;这不是任意矩阵到该集合的欧氏正交投影。

完整的层操作 (论文 Eq.7-9):

{Hlpre=σ(H~lpre)(sigmoid, 非负)Hlpost=2σ(H~lpost)(2× sigmoid)Hlres=Sinkhorn-Knopp(H~lres)(投到 Birkhoff)\begin{cases} \mathcal{H}^{\text{pre}}_l = \sigma(\tilde{\mathcal{H}}^{\text{pre}}_l) & \text{(sigmoid, 非负)} \\ \mathcal{H}^{\text{post}}_l = 2\sigma(\tilde{\mathcal{H}}^{\text{post}}_l) & \text{(2× sigmoid)} \\ \mathcal{H}^{\text{res}}_l = \text{Sinkhorn-Knopp}(\tilde{\mathcal{H}}^{\text{res}}_l) & \text{(投到 Birkhoff)} \end{cases}

3.5 Hres\mathcal{H}^{\text{res}} 是怎么被 "学" 出来的? (注意: 不是 projected GD)#

先对齐符号: 我们前面 HC 一节里写的 BB, 就是 mHC 论文里的 Hres\mathcal{H}^{\text{res}} -- 同一个 "nn 条流互相混合" 的 n×nn \times n 矩阵.

一个常见的误解: "Hres\mathcal{H}^{\text{res}} 是参数, 每步梯度下降之后再投影到 Birkhoff" (这就是经典的 projected gradient descent).

mHC 不是 这么做的. Hres\mathcal{H}^{\text{res}} 根本不是被直接存储的参数, 真正被存储的是无约束的 φres,αres,bres\varphi^{\text{res}}, \alpha^{\text{res}}, b^{\text{res}}. Hres\mathcal{H}^{\text{res}} 在每次 forward 时 临时算出来:

forward (每层每个 token):
    raw = α^res · mat(x · φ^res) + b^res    # 由参数 + 输入算原始矩阵
    H^res = SinkhornKnopp(raw)              # 投到 Birkhoff (forward 计算图的一部分)
    用 H^res 做 HC 更新

backward:
    Sinkhorn-Knopp 是可微的, 梯度直接穿过它
    更新的是 φ^res, α^res, b^res (普通无约束 SGD/Adam)

所以 没有显式的 "projection step" -- 投影本身就是 forward 计算图里的一个可微算子, 跟 ReLU、softmax 同级.

3.6 跟 softmax 的类比#

这个 pattern 你其实很熟, 只是平时没意识到:

输入 投影算子 输出落在 真正学的参数
Attention logits ∈Rn\in \mathbb{R}^n softmax 单纯形 (行和 =1= 1) WQ,WKW_Q, W_K
mHC raw matrix ∈Rn×n\in \mathbb{R}^{n \times n} Sinkhorn-Knopp Birkhoff polytope (行 == 列和 =1= 1) φres,αres,bres\varphi^{\text{res}}, \alpha^{\text{res}}, b^{\text{res}}

注意力里你不会说 "学一个概率分布然后投影", 你是学 logits, 让 softmax 在 forward 把它投到单纯形上. Sinkhorn-Knopp 就是 softmax 在 二维约束 (行和 == 列和 =1= 1) 下的推广版本.

3.7 为什么不用 projected GD?#

  1. Hres\mathcal{H}^{\text{res}} 是 input-dependent 的 (DHC 形式): 每个 token 的 Hres\mathcal{H}^{\text{res}} 都不一样, 根本没法存一个统一的 Hres\mathcal{H}^{\text{res}} 当作参数. 因此本文采用输入依赖参数化;这是一种设计选择,不排除其他受约束参数化。
  2. Differentiable projection 让梯度信息更丰富: raw matrix 的梯度直接告诉你 "该往哪个方向调 φ,b\varphi, b 才能让投影后的 Hres\mathcal{H}^{\text{res}} 更好". 两者优化的变量与约束不同,不能直接断言 projected GD 的梯度“信息量更少”。

3.8 工程实现#

朴素实现 mHC 慢且费显存. 论文做了大量底层优化:

  • Kernel Fusion (TileLang): 把 RMSNorm、线性投影、bias、sigmoid、Sinkhorn 都融合到少数几个 fused kernel 里.
  • Recomputing: 丢掉 mHC 中间激活, 反向时按块 (Lr∗≈nL/(n+2)L_r^* \approx \sqrt{nL/(n+2)}) 重算.
  • DualPipe 通信重叠: nn-stream residual 的 PP 通信量是 nn 倍, 他们扩展了 DualPipe schedule, 把 Fpost,res\mathcal{F}_{\text{post,res}} kernel 放在 high-priority compute stream 上, 跟 attention/MLP 的通信重叠.

最终 n=4n=4 时 训练只多了 6.7%6.7\% 时间开销.

3.9 实证 (27B MoE 模型, DeepSeek-V3 架构)#

稳定性:

  • HC 在 12k 步左右出现 loss 尖峰, gradient norm 不稳.
  • mHC 全程稳定, gradient norm 跟纯 baseline residual 几乎一样.
  • 复合映射的 Amax Gain: HC 峰值 30003000; mHC 上限约 1.61.6 -- 降了三个数量级.

性能 (27B, 相对 baseline residual 和 HC, 零/少样本):

Benchmark Baseline HC mHC
BBH 43.8 48.9 51.0
DROP 47.0 51.6 53.9
GSM8K 46.7 53.2 53.8
HellaSwag 73.7 74.3 74.7
MMLU 59.0 63.0 63.4
TriviaQA 54.3 56.3 57.6

mHC 相对 HC 在推理类任务 (BBH +2.1, DROP +2.3) 改善尤其明显.

Scaling: 3B / 9B / 27B 三档下, mHC 相对 baseline 的优势在 compute scaling 曲线上保持稳定, 没有衰减.

3.10 一句话回到主线#

residual →\to HC →\to mHC 是这样一条线:

1  →  n×n 任意矩阵  →  n×n 双随机矩阵1 \;\to\; n \times n \text{ 任意矩阵} \;\to\; n \times n \text{ 双随机矩阵}

也就是说, BB 不光得是矩阵 (HC 的回答, 表达力), 它还得是 doubly stochastic 矩阵 (mHC 的回答, 稳定性). 这类约束旨在保留 HC 的多流表达力, 又恢复了 residual 在 scale 上 identity-mapping 的稳定性 (连乘不发散).

4. 参考资料与边界#

mHC 原论文。上述性能数字是论文相应配置的报告值,未在本文独立复现。Birkhoff polytope 是凸多面体,不应把整个含边界的集合直接当作光滑流形;“manifold-constrained”沿用论文名称。双随机约束控制残差混合的范数上界,不保证整体训练稳定或信息无损。

延伸阅读#

相关阅读路线

理解 Transformer 与架构变体 ↗