字体大小
第五编 注意力机制与大语言模型的形成 · 05_第五编_注意力机制与大语言模型的形成/第18章_注意力机制的提出/chapter.md

第18章 注意力机制的提出

本章核心问题

当第16章已经说明循环神经网络可以用连续隐状态压缩历史,但这种压缩在长序列中会形成明显瓶颈时,模型究竟如何才能在需要时动态访问最相关的历史信息,而不是被迫把全部过去挤进一个固定向量?

更具体地说,本章要回答:注意力机制为什么会在序列到序列任务中被提出;相似性打分、归一化权重与加权求和这三步分别在数学上表达了什么;“软对齐”为什么能替代早期刚性的单一路径压缩;以及为什么注意力机制会成为通向 Transformer 的决定性桥梁。

1. 问题背景

第四编已经沿着一条清晰路线把序列建模不断推进。第15章说明,早期统计序列模型通过条件概率链、马尔可夫假设和隐藏状态链第一次把“历史依赖”写成可分析对象;第16章则进一步说明,循环神经网络把第三编中的表示学习思想带入时间维度,用连续隐状态去压缩历史,并通过时间反向传播学习这种时间表示。这样一来,序列建模就不再只是局部统计和离散状态,而进入了神经连续表示阶段。

但第16章同样已经清楚地暴露出 RNN 路线的瓶颈。最核心的问题在于:无论简单 RNN 还是 LSTM、GRU,它们最终都倾向于把历史逐步压缩进某个当前隐状态。即使门控机制已经显著改善了长期信息保留,这种“单一路径递推 + 固定长度状态压缩”的结构仍然容易在长序列中失真。尤其在机器翻译这类序列到序列任务中,若整个源句必须被编码为一个固定长度向量,再由解码器逐步展开为目标句,那么源序列越长,编码压缩瓶颈就越严重。

这说明,问题并不只在于“状态是否足够大”或“门控是否足够巧妙”,而在于信息访问方式本身可能需要改变。若解码器在生成当前词时,并不真的需要同等依赖源句中的所有位置,那么为什么它必须只依赖编码器最后那一个统一向量?更自然的想法似乎应该是:在生成每一步时,让模型自己去判断源序列中哪些位置最相关,再把这些位置的信息加权汇总出来。

正是在这种背景下,注意力机制被提出。它的出现并不是一次孤立的技巧性修补,而是一次很深的结构转变。第16章中的循环模型默认“历史信息应被逐步压缩进当前状态”;而注意力机制则提出另一种思想:“历史不必全部提前压缩,模型可以在需要时回头查看,并动态选择最相关的部分。”这一步改变的,不只是某个具体模型性能,而是序列建模对“记忆”和“访问”的基本理解。

从全书位置看,第18章是第五编的起点,也是一条新主线真正展开的起点。第四编主要解决“如何表示时间”和“如何学习生成分布”的问题,而第五编将进一步回答:若要让序列建模继续扩展到更长上下文、更灵活对齐和更大规模语言能力,模型结构还需要怎样的变化。注意力机制正是这一变化的第一个决定性节点。

2. 数学原理

2.1 从固定编码到动态访问信息

先回看早期序列到序列模型的基本形式。设源序列为

$$ x_1,x_2,\dots,x_T, $$

目标序列为

$$ y_1,y_2,\dots,y_{T'}, $$

其中 $T$ 表示源序列长度,$T'$ 表示目标序列长度。在最基础的编码器—解码器结构中,编码器把源序列逐步压缩成一个最终状态

$$ h_T, $$

然后解码器在每个时刻 $t$ 用这个固定向量 $h_T$ 作为条件信息去生成当前输出 $y_t$。

这个结构的问题在于,整个源序列的全部信息都被迫经过同一个瓶颈变量 $h_T$。无论源序列多长、内部结构多复杂、当前解码时刻更需要依赖源句哪一部分,模型都只能通过这一固定向量来访问历史。这就使“历史信息的编码”和“当前时刻的信息选择”被捆绑成了同一个问题。

注意力机制的第一个关键思想,就是把这两件事分开:编码器仍然产生一系列源端表示,但解码器不再只看最后一个向量,而是在每个解码时刻动态决定应当关注哪些源端位置。也就是说,注意力并不是简单再造一个更大的状态,而是把“选择相关信息”本身变成一个可学习的计算步骤。

2.2 编码器表示序列为何要全部保留

设编码器对源序列每个位置都产生一个隐藏表示

$$ h_1,h_2,\dots,h_T, $$

其中 $h_i\in\mathbb R^d$ 表示第 $i$ 个源位置的上下文表示,$d$ 表示隐藏维数。这里的关键变化是:编码器不再只交出最终状态 $h_T$,而是把整个表示序列都保留下来,供后续访问。

这一步的意义非常深。它意味着模型开始把记忆从“一个压缩向量”改成“一个可查询的表示集合”。换言之,源序列中的不同位置不再在编码阶段就被彻底融合进一个单点,而是继续保留一定独立性,以便解码时按需读取。

这种设计直接为后面的注意力计算创造了条件。若所有信息都已经坍缩为单个向量,就无从谈起“选择哪一部分更相关”;而一旦源位置表示被保留为一个集合,模型就可以在每一步生成时对这些位置做动态加权。

2.3 相似性打分如何定义“相关性”

在解码器的第 $t$ 步,设当前解码状态为

$$ s_t\in\mathbb R^{d_s}, $$

其中 $s_t$ 表示到当前为止目标端的内部状态,$d_s$ 表示解码状态维数。注意力机制首先需要解决一个问题:面对全部编码器表示 $h_1,\dots,h_T$,模型如何判断哪一个位置与当前解码步最相关?

最自然的做法,是为每个源位置 $i$ 计算一个相关性分数

$$ e_{t,i}=\mathrm{score}(s_t,h_i), $$

这里 $\mathrm{score}(\cdot,\cdot)$ 表示打分函数,$e_{t,i}$ 表示在解码时刻 $t$,源位置 $i$ 与当前目标状态之间的匹配程度。这个分数越高,意味着模型认为该源位置越值得关注。

这一步非常重要,因为它第一次把“应该看哪里”写成了明确的、可学习的数学对象。过去在统计模型里,对齐关系往往要么依赖人工结构假设,要么只能被间接编码进状态设计里;而注意力机制则把“相关性评估”直接暴露为一个可微函数。

2.4 为什么需要归一化权重

原始打分 $e_{t,i}$ 只是未归一化的相关性分数,它们本身并不能直接拿来做稳定聚合。原因在于,这些分数的数值范围不受控制,也不能直接解释为“注意力分配比例”。因此,注意力机制通常会把它们通过 softmax 归一化为权重:

$$ \alpha_{t,i}=\frac{\exp(e_{t,i})}{\sum_{j=1}^T \exp(e_{t,j})}. $$

这里 $\alpha_{t,i}$ 表示在解码时刻 $t$ 对源位置 $i$ 分配的注意力权重。由于 softmax 的性质,对任意固定 $t$ 都有

$$ \alpha_{t,i}\ge 0,\qquad \sum_{i=1}^T \alpha_{t,i}=1. $$

这使得 $\alpha_{t,i}$ 可以被理解成一种概率式权重分布。它表示:在当前解码时刻,模型把总注意力如何分配到各个源位置上。

归一化这一步的意义不只是数值稳定,更是语义明确。因为有了这一步,加权和不再是对若干向量做随意线性组合,而是对“当前最相关信息来源的概率分布”做期望式聚合。

2.5 上下文向量为何是加权求和

有了注意力权重之后,模型就可以把源端信息汇总成当前解码时刻专属的上下文向量:

$$ c_t=\sum_{i=1}^T \alpha_{t,i} h_i. $$

这里 $c_t$ 表示第 $t$ 个解码时刻的上下文向量。这个公式的含义非常清楚:模型不是在所有源位置中硬选一个,也不是把全部位置一视同仁平均起来,而是根据相关性分布对源表示做加权求和。

这一步往往被称为“软选择”。所谓“软”,是因为模型不是离散地选择单个位置,而是以连续权重同时关注多个位置。这样做有两个关键好处。第一,它是可微的,因此整个机制可以与神经网络其他部分一起端到端训练。第二,它允许模型在不确定时同时参考多个位置,而不是被迫做刚性的单点决定。

因此,注意力机制的核心计算可以概括成三步:打分、归一化、加权求和。也正是在这三步中,“动态选择相关信息”第一次被写成了一个简单而强大的可微模块。

2.6 Bahdanau 注意力如何把对齐做成可学习函数

早期最有代表性的神经注意力形式之一,是 Bahdanau attention。它的打分函数不是简单点积,而是通过一个小型前馈网络来学习当前解码状态 $s_{t-1}$ 与源端表示 $h_i$ 的匹配程度。典型写法为

$$ e_{t,i}=v^\top \tanh(W_s s_{t-1}+W_h h_i+b), $$

其中 $W_s$、$W_h$ 是权重矩阵,$b$ 是偏置向量,$v$ 是投影向量,$\tanh(\cdot)$ 是双曲正切函数。这个公式中的每一项都有明确含义:$W_s s_{t-1}$ 把当前解码状态映射到某个匹配空间,$W_h h_i$ 把源位置表示映射到同一空间,二者相加后经过非线性融合,再由向量 $v$ 投影成一个标量分数。

这个结构的重要性在于,它没有预设“相关性”必须是某种固定相似度,而是让模型自己学习何种对齐模式最有用。对于翻译任务来说,这意味着模型可以在训练中逐渐学会:当解码器要生成当前目标词时,源句中哪些位置最值得参考。

因此,Bahdanau 注意力不仅是一个具体公式,更是一个方法论上的转折点:对齐关系不再依赖人工规则或外部设计,而被纳入神经网络的可学习部分。

2.7 注意力如何缓解编码压缩瓶颈

现在可以更清楚地看出,注意力到底解决了什么问题。在无注意力的编码器—解码器结构中,源序列必须先被完全压缩进一个固定向量,再提供给解码器使用;而在注意力结构中,源端信息被保留为一列表示 $h_1,\dots,h_T$,解码器每一步都可以重新计算当前所需的上下文 $c_t$。

这意味着,模型不再需要事先把源句中所有细节都挤进单一表示,而可以在生成每个目标词时,按需读取源端不同位置的信息。数学上,这种改变体现在上下文向量从“固定一个”变成了“每步一个”:

$$ c_t\neq c_{t'} $$

一般会对不同的 $t$ 取不同值。也就是说,上下文本身成为一个依赖解码时刻的动态对象。

这一步极其关键,因为它把“记忆”从静态压缩改成了动态检索。注意力机制因此不只是一个增强模块,而是序列建模中关于“如何使用历史”的思想变化。

2.8 软对齐为什么优于刚性对齐

在许多序列任务中,源端与目标端之间往往存在某种对齐关系。例如翻译时,目标词通常对应源句中的某个词或短语;摘要时,当前输出片段可能主要依赖输入文档中的某个句段;语音对齐中,某段输出标签通常对应某一时间段的声学证据。

若要求模型在每一步只选择一个源位置,就会得到一种离散、刚性的对齐机制。这种机制一方面不易训练,因为离散选择通常不可微;另一方面也不符合实际,因为很多时候当前输出确实可能同时依赖多个源位置。软注意力通过权重分布 $\alpha_{t,i}$ 解决了这个问题。它不要求唯一匹配,而允许“部分对齐”和“分布式关注”。

因此,软对齐的优势不只是技术上的可微性,更在于它更符合自然序列任务中信息依赖往往是模糊、重叠和多源的事实。

2.9 注意力机制的统一数学结构

把前面几节连起来,可以把注意力机制概括为一个统一的函数模块。给定查询向量 $q$、键值集合 $\{(k_i,v_i)\}_{i=1}^T$,注意力计算可以抽象写成

$$ e_i=\mathrm{score}(q,k_i), $$
$$ \alpha_i=\frac{\exp(e_i)}{\sum_j \exp(e_j)}, $$
$$ c=\sum_i \alpha_i v_i. $$

这里 $q$ 对应“当前需要什么信息”,$k_i$ 对应“每个候选位置如何被索引”,$v_i$ 对应“该位置真正提供什么内容”,$c$ 则是最终聚合后的上下文向量。虽然最早的注意力机制还没有把 query、key、value 这些术语完全形式化,但其数学骨架已经十分清楚。

这也是为什么注意力机制后来能够脱离 RNN、发展成更一般的序列建模框架。因为它的核心思想并不依赖某一种特定递推结构,而是依赖一个更普遍的原则:当前计算步骤可以根据相关性,动态访问整个历史表示集合。

3. 代表模型或算法

3.1 带注意力的序列到序列模型

带注意力的 seq2seq 模型是最直接的代表。结构上,它仍然保留编码器—解码器框架,但在解码器每一步生成时,不再只使用固定编码向量,而是根据当前解码状态对全部编码器隐藏状态计算注意力权重,并形成上下文向量。训练方式上,通常与一般序列到序列模型一样,仍通过最大化条件生成概率并用反向传播训练;推理方式上,则逐步生成输出序列,并在每一步重新计算注意力分布。

它在本章中的典型性极强,因为它最清楚地展示了注意力机制最初要解决的实际问题:不是替换整个序列建模框架,而是先在编码器—解码器结构中突破固定向量瓶颈。

3.2 Bahdanau 注意力

Bahdanau 注意力是历史上最具代表性的早期注意力形式之一。结构上,它通过一个可学习打分函数,把解码状态和源端表示映射成相关性分数;训练方式上,打分网络、编码器和解码器一起端到端优化;推理方式上,则在每步解码时动态生成注意力分布与上下文向量。

它在本章中的典型性,在于它第一次把“对齐”明确纳入神经网络内部,使模型不必依赖人工规则即可自动学习源端和目标端之间的对应关系。

4. 典型应用

4.1 机器翻译

机器翻译是注意力机制最经典的应用场景。设源句编码后得到表示序列

$$ h_1,\dots,h_T, $$

在生成目标端第 $t$ 个词时,解码器根据当前状态 $s_t$ 计算注意力权重

$$ \alpha_{t,1},\dots,\alpha_{t,T}, $$

再形成上下文向量

$$ c_t=\sum_{i=1}^T \alpha_{t,i}h_i. $$

这里本章数学内容与应用几乎完全一一对应:打分函数对应“当前目标词与源句哪一部分更相关”,softmax 对应“注意力如何分配到各源位置”,加权和对应“如何把相关源信息聚合成当前翻译所需上下文”。也就是说,机器翻译中的突破,不只是多加了一个模块,而是把“翻译时应看源句哪里”这一长期隐含问题,明确写成了可学习机制。

4.2 文本摘要

在文本摘要中,模型需要从较长输入文本中抽取与当前摘要片段最相关的信息。若没有注意力,编码器必须把整篇文本压缩到一个固定向量中,这在长文场景下尤其困难。注意力机制则允许解码器在生成每个摘要词时,动态回看输入文档中的不同位置。

其数学对应关系与翻译类似,但语义更偏向“内容选择”。注意力权重 $\alpha_{t,i}$ 在这里对应当前摘要生成时对原文各位置的重要性判断,而上下文向量 $c_t$ 则对应当前摘要片段的局部证据汇总。因此,文本摘要清楚展示了注意力机制如何把“信息选择”本身变成序列建模的一部分。

4.3 序列对齐任务

在更一般的序列对齐任务中,例如语音对齐、问答中的段落定位或双序列匹配,核心困难都在于:一个序列中的当前位置,应如何与另一个序列中的若干位置建立柔性的对应关系。注意力机制在这里尤其自然,因为它本质上就是一个可微的对齐分布。

设一个查询状态 $q_t$ 面对另一序列中的候选表示 $k_1,\dots,k_T$,则注意力权重

$$ \alpha_{t,i} $$

可以直接被理解为“当前位置 $t$ 与候选位置 $i$ 的软对齐强度”。因此,在序列对齐任务中,本章的数学结构几乎无需额外转译:打分就是匹配度,归一化就是对齐分布,加权和就是汇总后的对齐上下文。

5. 局限性与历史转折

注意力机制的提出极其重要,但最初的注意力仍然附着在 RNN 编码器—解码器框架之中。这意味着,虽然解码器已经可以动态访问源端信息,编码和解码本身仍然主要依赖串行递推。于是,第16章指出的并行效率问题并没有被真正消除,只是部分被缓解。

其次,早期注意力通常仍把“查询”建立在某个递推解码状态之上,而编码器侧表示也多由循环网络产生。这说明,注意力最初解决的是“固定压缩瓶颈”,而不是“如何完全摆脱递推链条”。只要主干结构仍是 RNN,长序列训练、并行计算和全局依赖传播的问题就仍然存在。

再次,注意力虽然提供了更灵活的信息访问方式,但它最初还只是一个附加模块,而不是整个架构的中心原则。研究者很快意识到:如果注意力本身已经能够在任意位置之间建立动态关系,那么是否还有必要让序列建模继续以递推为主?也就是说,注意力的真正潜力也许不止于辅助 RNN,而在于重构整个序列建模框架。

这正是本章通向下一章的历史转折。第18章改变了“序列必须被压缩成单一路径状态”的旧思路,但它还没有完全摆脱循环结构。第19章将要回答的,正是:如果把注意力从辅助机制提升为中心结构,是否能够得到一种全新的、更可并行、更适合长距离依赖建模的架构?这就是 Transformer 的问题意识。

6. 本章小结

本章讨论了注意力机制为什么会在序列建模中出现。核心结论是:当编码器—解码器结构中的固定向量压缩成为明显瓶颈时,模型需要一种机制,在每个解码步骤动态选择最相关的历史信息;相似性打分、softmax 归一化与加权求和共同构成了这一机制的数学骨架,而 Bahdanau 注意力则首次把对齐关系纳入神经网络的可学习部分。

它在 AI 发展史上的意义,在于改变了序列建模对“记忆”的理解方式:历史不必被一次性压缩完毕,而可以在需要时被动态访问。也正因为如此,注意力机制成为通向 Transformer 的决定性桥梁。

关键公式

$$ e_{t,i}=\mathrm{score}(s_t,h_i) $$
$$ \alpha_{t,i}=\frac{\exp(e_{t,i})}{\sum_{j=1}^T \exp(e_{t,j})} $$
$$ c_t=\sum_{i=1}^T \alpha_{t,i} h_i $$
$$ e_{t,i}=v^\top \tanh(W_s s_{t-1}+W_h h_i+b) $$
$$ e_i=\mathrm{score}(q,k_i),\qquad c=\sum_i \alpha_i v_i $$

关键概念

  • 注意力机制
  • 对齐
  • 相似性打分
  • 软选择
  • 上下文向量
  • 信息瓶颈
  • 序列到序列
  • 动态信息访问