想象你在读一篇小说,每读一个新词就必须忘记之前的大部分内容——你的工作记忆只有一张便利贴,读完第 100 个字时,第 1 个字已经被擦掉了。这就是 RNN 处理序列的方式。

今天我们要回答一个根本问题:为什么序列模型需要「注意力」?答案藏在 RNN 的三个痛点上。

顺序处理:一个 CPU 核心的寂寞

RNN(循环神经网络)处理序列的方式是逐词扫描。它维护一个「隐状态」向量 hth_t,每读一个新词 xtx_t,就更新一次:

ht=tanh(Whht1+Wxxt)h_t = \tanh(W_h h_{t-1} + W_x x_t)

这条公式看起来简单,但有一个致命后果:要算 h3h_3,必须先有 h2h_2;要算 h2h_2,必须先有 h1h_1。每一步都在等前一步算完。这就是 串行依赖——一个长度 TT 的序列,必须经过 TT 个时间步才能处理完。

GPU 擅长的是同时做大量矩阵乘法,而 RNN 让 GPU 大部分时间在「排队等待」。实测训练 LSTM 时 GPU 利用率常在 5–15% 之间,而同等规模的 Transformer 可以达到 70–95% 1。训练一个 8 层 LSTM 的机器翻译模型,在 8 张 V100 上需要几天到一周的时间 2。在大模型时代,「训练得起」本身就是硬约束。

长距离依赖:信息在传递中衰减

第二个问题更隐蔽。RNN 把信息一步一步往前传,每传一步就经过一次非线性函数和矩阵乘法。数学上,梯度沿时间步连乘,如果权重矩阵的奇异值小于 1,梯度就会指数衰减——这就是 梯度消失。Vanilla RNN 实际能稳定的记忆长度只有 10–20 步 3

LSTM 通过引入一条「加法高速公路」(cell state CtC_t)缓解了这个问题,让梯度可以几乎不衰减地传递。但实证研究发现,LSTM 的有效记忆长度仍然只有 200–300 个 token 左右 4。超过这个范围,信息就变得模糊甚至丢失。

换个角度理解:自然语言中,句子开头的「主语」和 50 个词之后的「谓语」之间可能存在重要依赖。RNN 需要走 50 步才能把信息从主语传到谓语,每一步都可能丢失信号。这就好比玩传话游戏——传 5 个人还能还原,传 50 个人就面目全非了。

信息瓶颈:一个向量装不下整段话

在早期的 Seq2Seq(序列到序列)模型中,编码器把整个输入序列压缩成一个固定长度的向量,然后解码器从这个向量生成输出。Sutskever 等人在 2014 年的实验发现:句子长度从 30 个词增加到 60 个词时,翻译质量(BLEU 分数)暴跌 5

原因很直观:一个固定维度的向量承载不了无限的信息。长句子的前几个词的信息,在编码过程中会被后面的词「覆盖」或「稀释」。这就是 信息瓶颈——压缩必然有损,序列越长,损失越大。

核心想法:让每个词直接看见彼此

2014 年,Bahdanau、Cho 和 Bengio 在论文中提出了一个在当时看来很激进的想法:与其把所有信息压成一个向量,不如保留编码器每一步的隐状态,让解码器在生成每个词时,自己决定「回头看」输入的哪些部分 6

这就是注意力机制的雏形。它的核心直觉是:不再把信息一步步传过去,而是让每个词直接「看见」所有其他词。

想象一下,如果把序列比作一间坐满人的会议室,RNN 的做法是:第一个人把话传给第二个人,第二个人传给第三个人……传到第 50 个人时,原话已经走样了。注意力机制的做法是:每个人都可以直接对所有人说话,也可以直接听任何人的话——信息传递的距离从 O(N)O(N) 步降到了 O(1)O(1)7

加上了注意力机制的 Seq2Seq 模型,在长句翻译上的性能不再衰减 6。这个「补丁」的效果如此显著,以致于研究者开始思考一个问题:如果注意力本身就能让任意两个位置直接交互,那 RNN 的循环结构是不是根本不需要?

从补丁到主角

2017 年,Vaswani 等人在《Attention Is All You Need》中给出了答案:去掉 RNN,只用注意力机制。这篇论文提出的 Transformer 架构,一次性解决了 RNN 的三个痛点:

  • 并行计算:所有位置同时计算,不再串行等待;
  • 长程直达:任意两个 token 之间的路径长度恒为 1,不再衰减;
  • 动态容量:不再把信息压缩成固定向量,而是保留所有位置的表示,按需加权组合。

代价是什么?注意力需要计算所有词对之间的相似度,复杂度是 O(N2)O(N^2)——序列长度翻倍,计算量翻四倍。但在大多数实际场景中,这个代价换来了训练速度快 5–10 倍、长程建模能力大幅提升,是划算的交换 7

这一篇我们只建立动机。下一篇会进入注意力机制的核心数学:Query、Key、Value 三件套到底是什么,以及为什么点积可以衡量「相似度」。