Notes

Residual 学习笔记(一):Manifold-Constrained Hyper-Connections

从 AttnRes 留下的问题开始

上一篇读 Attention Residuals 时,我留下了一个没有想明白的问题:AttnRes 引入的动态性,真正带来好处的究竟是什么?

这里似乎存在两种可能。

第一种可能是:模型在训练结束后,实际上仍然会形成一个相对稳定的系统。每一层承担的功能是稳定的,可以用一个固定的 feature 来描述;动态性主要来自当前 token 的需求不同,因此只需要让动态的 token 去选择具有稳定功能的层。换句话说,层本身是什么并不随输入改变,改变的只是当前 token 要调用哪一层。

第二种可能是:模型在训练结束后也不是一个稳定系统。每一层产生的内容、承担的功能,以及它与其他层之间的关系,都会随着当前输入共同变化。在这种情况下,路由不能只由 token 去查询一个固定的层表示,而必须同时依赖当前层的状态和其他层的动态输出。

我的目的,是先把这里究竟发生了什么想清楚。训练结束之后,固定下来的是网络的权重,因此我们仍然可以把每一个网络层看成一个固定的函数:输入会动态变化,函数的输出也会动态变化,但函数本身是固定的。从这个角度看,跨层路由实际选择的,也许不是某个抽象的“层”,而是不同层所对应的不同函数;路由真正需要识别的,是这些函数各自的特征。

这里就产生了一个很大的怀疑。假如这种理解确实反映了网络中的归纳偏置,那么当路由直接根据各层的动态输出做选择时,函数的输出 feature 不仅需要表达当前 token 的内容,还需要体现“这是由哪个函数产生的”、或者“这个函数擅长处理什么”。换句话说,为了让路由能够辨识不同函数,feature 可能不得不额外携带函数身份或函数特征,从而消耗一部分原本用于表达内容的能力。

这样,我们确实获得了动态选择函数的好处,却也给 feature 增加了新的负担。这一点与 dynamic query 并不冲突:query 本来就应该随当前情况动态变化,因为模型需要根据当前 token 的需求选择合适的函数。真正值得怀疑的是,作为被选择对象的 key,是否也必须由函数的动态输出承担;还是说,可以用一个额外的、稳定的函数特征来描述每一层,让动态 query 去选择它,而不必要求内容 feature 同时承担“表达内容”和“标识函数”两种任务。

那么,哪一种才更接近真实的网络?或者换一个更实际的问题:哪一种结构更利于训练,并且能在规模扩大时保持稳定?带着这个问题,我想继续阅读其他 residual 方向的工作。

Highway Networks:用门控制 residual

Highway Networks 1 在旧状态与当前层的新输出之间加入动态门控:

\[h_l = (1-g_l)\odot h_{l-1} + g_l\odot f_l(h_{l-1}).\]

模型由此可以决定保留多少旧状态、接受多少新输出。

Hyper-Connections

Hyper-Connections 2 不再只维护一条 residual stream,而是保留 $n$ 条 residual state。每个子层首先通过 $A_m$ 从多条状态流中读取一个组合输入:

\[x_l = A_{m,l}^{\top}H_{l-1}.\]

接着,让这个组合输入经过第 $l$ 个 Transformer 子层:

\[u_l = T_l(x_l).\]

最后,子层输出通过 $B_l$ 写回多条状态流;与此同时,旧状态流通过 $A_{r,l}$ 得到保留和相互混合。两个分支相加,形成新的多流状态:

\[H_l = A_{r,l}^{\top}H_{l-1} + B_l^{\top}u_l.\]

因此,可以把 HC 的过程概括成三步:$A_m$ 负责从多条状态流中读取,$T_l$ 负责完成当前子层的计算,$B_l$ 负责把新结果写回;而 $A_r$ 则控制旧状态如何被保留,以及不同状态流之间如何相互混合。

值得注意的是,HC 发现当 $n=1$ 时,引入门控的结构反而比经典 residual 效果更差。这说明上面 Highway Networks 式的门控直接用在 Transformer 中并不奏效;HC 真正的核心不是门控本身,而是引入多条 residual stream。

HC 又可以分成静态和动态两种。静态 HC 的读取、保留和写入方式在训练结束后固定下来;由于它只维护少量状态流,从跨层加权组合的角度看,可以把它视为 DWA 的一个受限子集:它没有显式保存所有历史层输出,而是通过少量状态压缩历史,再从这些状态中进行固定组合。

动态 HC 则会根据当前 token 的多流状态,动态决定如何从状态流中读取输入、如何保留和混合旧状态,以及如何把当前子层的输出写回各条状态流。也就是说,$A_m$、$A_r$ 和 $B$ 不再只是固定参数,而会随当前 token 的状态发生变化。

分析一下,由于这里需要把当前子层的输出动态写入多条 residual stream,历史层的内容其实也不是固定的,因此这里更接近 dynamic query、dynamic key 的设定。$H_l$ 的内容并不是对过往各层输出进行一次动态组合,而是根据过往层的状态形成的一种组合;由于它是 stateful 的,这个状态会随着层数增加而不断变化和累积。不过,因为 HC 设计了多条状态流,它仍然保留了一定的历史查询能力。比如当 $n$ 大于等于层数时,原则上就有能力保留全部历史层的输出。

但是显然,在这种设定下 $n$ 需要比较小,否则带来的额外开销就太大,并不值当。所以,这个设定虽然是 dynamic query、dynamic key,但对历史状态进行压缩仍然会造成自由度的损失;相比 DWA 这种固定权重的方法,也不见得就一定会更好。我似乎没有看到相关的消融实验。对于前面提出的问题,HC 增强了我对 dynamic query、dynamic key 有效性的认识,但关于 static key 是否有效,我们在这里仍然没有得到解答。

Manifold Constraint

到了 mHC: Manifold-Constrained Hyper-Connections 3,我的理解是,核心就是对 stream 之间的线性矩阵构建约束,避免深层网络中的数值爆炸。

如果矩阵的谱半径大于 $1$,那么我们可以认为它在不断放大原始的数值,经过多层累积之后会指数增长,最终导致数值爆炸。因此,我们需要对矩阵的谱半径进行限制。这里对矩阵进行了行和列的 normalization,可以保证谱半径为 $1$,那么数值上整体不会爆炸,也不会全部消失。

但是我理解,这仍然会带来一些问题。最大特征值是 $1$,但是其他特征值通常小于 $1$,所以经过多层之后,除了旋转之外,这种累积只会保留原始主方向的信息,其他方向的信息会被衰减掉。也就是说,历史信息并没有按照我们的设计来进行累积。这也是为什么有人声称,使用 identity 矩阵的效果会更好。

仔细分析这件事情,如果我们想通过限制谱半径来限制数值增长,又不想损失信息,那么只能使用正交矩阵,也就是旋转和反射的组合。从这个逻辑看,似乎直接使用 identity 矩阵确实也合理,因为从设计上,我们就不应该预期这个矩阵具有太多额外的表达能力,不如让网络从其他地方来弥补。

总结

读到这里,我们进一步看到了 dynamic query、dynamic key 的有效性,但最开始提出的问题仍然没有得到解决。接下来,我会继续读一些其他工作。

References

  1. Highway Networks · Srivastava, Greff & Schmidhuber · 2015
  2. Hyper-Connections · Zhu et al. · ICLR 2025
  3. mHC: Manifold-Constrained Hyper-Connections · DeepSeek-AI · 2025/2026