词条 · AI · 核心
残差流
贯穿模型所有层的一条主干向量,每层往上加一点自己的贡献,读写都在这条流上。
也称:residual stream、残差流、残差连接、residual connection
一句话
残差流是模型内部的一条公共总线。每一层不是把前一层的结果替换掉,而是往这条总线上加一个修正量。所以最后一层看到的,是所有层贡献的累加。
先看一个麻烦:层数越多,反而越差
直觉上,网络层数越多,能表达的东西越复杂,效果该越好。
现实里长期不是这样。层数堆到几十层之后,训练开始失败——不是过拟合(训练集上表现好、测试集差),而是训练集上就学不动。更深的网络输给更浅的网络。
这件事很反常。因为深网络理论上完全可以模拟浅网络:把多出来的层都学成「原样输出」就行。它做不到,说明问题不在表达能力,在能不能被训出来。
朴素尝试为什么都不够
调小学习率、换初始化。 有帮助,但治不了根。核心困难是:每一层都是一次完整的变换,信号要穿过五十次变换才到输出,梯度要反着穿五十次才回到第一层。每次穿过都乘上一个矩阵,几十次连乘之后,梯度要么指数级缩小到消失,要么指数级放大到爆炸。
让每层学「原样输出」当保底。 想法对,但对一个矩阵变换来说,学出恒等映射其实很难——它得把权重精确地凑成单位矩阵,这在高维里是个极小的靶子。保底动作本身太难做,这是关键。
机制
改动小得出奇:给每层加一条绕过它的通路。
不带残差: 带残差:
x x ──────┐
│ │ │ 跳过这层
▼ ▼ │
[ 第 n 层 ] [ 第 n 层 ]│
│ │ │
▼ ▼ │
输出 (+) ◄───┘
│
▼
输出
写成式子就是从 变成:
这一个加号改变了两件事。
保底动作变简单了。 现在「什么都不做」只需要让 输出零。让一个变换输出零,比让它凑出单位矩阵容易得多——权重衰减到 0 附近就行。于是深网络终于能真正地「至少不比浅网络差」。
梯度有了一条直路。 反向传播时, 这一项的导数是 1,所以梯度可以顺着加号原封不动地流回去,不必每层都乘一个矩阵。几十层连乘导致的消失/爆炸就此绕开。
而对理解模型内部,更重要的是这个视角转换:既然每层都是往同一个 上加东西,那这个 就不再是「第 n 层的输出」,而是一条从头贯穿到尾的公共总线。每层做的事变成两个动作:从总线上读它关心的信息,往总线上写它的贡献。
第 0 层 第 10 层 第 20 层 末层
│ │ │ │
▼ ▼ ▼ ▼
──●──────────────●──────────────●────────────●──► 残差流
↑读↓写 ↑读↓写 ↑读↓写
为什么值得知道
这个「公共总线」的图像是当下大部分模型内部机制研究的落脚点。因为所有层都在同一个空间里读写,这个空间的方向就有了跨层的稳定含义。
一个反复被观察到的经验现象:许多高层行为——说不说真话、拒不拒绝回答、表现出何种语气性格——在残差流里近似对应一个方向。沿这个方向给向量加一点,对应行为就强一点。这让两件事成为可能:
- 测量:把某一层的激活投影到某个方向上,读出模型此刻在这个属性上的位置。
- 干预:直接在激活上加减这个方向,改变模型行为,不动任何权重。
找方向最常用的办法叫均值差:准备两组提示,一组诱发目标属性、一组压制它,把两组激活的平均值相减。
这里有个容易滑过去的坑,值得记住:两极能分开,不等于这条轴有刻度。二元对比只能证明「诱发组」和「压制组」落在不同位置,不能保证中间程度的样本落在两者之间。想声称这条轴可度量,得再造一个中间档、留出来不参与建向量,然后检验它是否确实落在中间。分类边界和测量尺是两回事。
另外,这类方向通常在中层最清晰。很粗略的解释是:前几层还在处理词形和局部语法,末几层已经在为输出具体词做准备,中间那段才是抽象属性停留得最久的地方。
来源
提到这个词条的文章
- 突现性失准有一张脸:用 Big Five 五条轴代替单一「坏方向」 2026-07-31