第一节:引言
在深度学习进入“大模型时代”之前,处理序列任务(如机器翻译、文本摘要)的主流框架是 Encoder-Decoder(编码器-解码器) 结构,通常被称为 Seq2Seq 模型。
1.1 编码器-解码器的工作原理
在标准的 Seq2Seq 架构中,编码器(通常是一个循环神经网络 RNN,如 LSTM 或 GRU)负责将输入序列 x1, x2, ... , xN 处理成一个固定长度的向量。这个向量被称为上下文向量 (Context Vector),它被认为是整个源句子的语义核心。
解码器随后接过这个向量,像“同声传译”一样,根据这个单一的特征表示逐步生成目标语言序列。
1.2 致命的“信息瓶颈” (Information Bottleneck)
虽然这种架构在短句子上表现良好,但当输入句子变长时,问题便接踵而至:
强制压缩: 无论源句子有 5 个词还是 50 个词,编码器最终都必须将其所有语义信息“塞”进同一个维度的向量中。
信息丢失: 这种压缩会导致严重的遗忘现象。解码器在生成句尾单词时,往往已经无法从那个微小的向量中提取出句首的细节信息。
处理长距离依赖的无力感: RNN 虽然理论上能传递状态,但在实际工程中,深层的梯度消失问题使得它很难维持长距离的上下文关联。

1.3 我们的直觉解决方法
想象一下,如果让你翻译一段长文字,你不会只读一遍就合上书凭记忆翻译,而是在翻译每一个词时,都会回头看一眼原文中对应的部分。
这种“回头看”的动作,正是 Attention(注意力)机制的核心动机:我们不需要把所有东西都压缩进一个向量,而是让解码器在每一个生成步骤中,都能直接访问编码器的所有中间状态。
第二节:Attention 的核心思想
在意识到 Seq2Seq 模型的固定长度向量是一个信息瓶颈后,研究者们提出了一个极其直观且强力的改进方案:Attention(注意力机制)。
2.1 核心理念:直接连接与局部聚焦
Attention 机制的核心思想可以概括为一句话:在解码器的每一个步(Step)中,建立与编码器的直接连接,从而专注于源序列的特定部分。
如果说传统的 Seq2Seq 是让解码器凭借“模糊的记忆”去翻译,那么带有 Attention 的模型则是给了解码器一把“放大镜”。
不再孤立: 解码器不再只依赖于编码器产出的最后一个隐藏状态(那个挤压严重的上下文向量)。
动态访问: 每一时刻的解码,都可以实时地“回看”编码器在处理输入序列时产生的所有中间状态(Hidden States)。
按需分配: 并不是所有的输入信息对当前的输出都同样重要。Attention 允许模型自主学习在生成特定单词时,应该“关注”输入句子的哪一部分。
2.2 打破瓶颈的逻辑
通过这种方式,我们成功地绕过了信息瓶颈。信息不再需要被强行压缩进一个向量,而是像一个分布式的仓库,解码器在每一秒都可以根据需要,去仓库的不同货架上提取最新鲜、最相关的原始特征。

如图中所示,核心思想(Core idea)强调了 direct connection to the encoder。那把放大镜生动地展示了 Attention 的作用:它让模型在生成目标单词(如 "pie")时,能精准地定位到源句子中与之对应的部分(如 "entarté")。
第三节:图解 Attention 的运作流程 (Attention via Diagram)
为了理解 Attention 如何在实际中发挥作用,我们以将法语 "il a m' entarté" 翻译为英语 "he hit me with a pie" 为例。当解码器准备生成单词 "pie"(^y6)时,Attention 机制会经历以下四个关键阶段:
3.1 第一步:计算注意力得分 (Attention Scores)
解码器当前的隐藏状态(图中绿色的 s5)会与编码器的每一个隐藏状态(红色的 h1, ..., h4)进行对比。
这个对比过程实际上是在询问:“为了生成下一个词,我应该在多大程度上关注输入序列中的第 i 个词?”对比的结果即为注意力得分。
3.2 第二步:生成注意力分布 (Attention Distribution)
通过 Softmax 函数,我们将这些原始得分转化为概率分布(总和为 1)。
在图中可以看到,对于输入词 "entarté"(被投掷派),其对应的柱状图最高。
这意味着模型在生成 "pie" 时,自主地识别出 "entarté" 是最相关的上下文。
3.3 第三步:计算注意力输出 (Attention Output)
我们将上一步得到的概率作为权重,对编码器的所有隐藏状态进行加权平均。
这种方式产生了一个新的向量——注意力输出(Attention Output),也常被称为上下文向量(Context Vector)。
它主要包含了源句子中被“聚焦”部分的语义信息。
3.4 第四步:结合上下文进行预测
最后,将这个“注意力输出”与解码器当前的隐藏状态拼接在一起,共同用于预测当前步的单词。

第四节:数学视角下的 Attention (Attention in Equations)
为了在代码中实现上述逻辑,我们需要将“注意力”抽象为向量运算。假设输入序列长度为 N,当前解码器处于第 t 个时间步。
4.1 变量定义
首先定义参与计算的各项参数:
Encoder Hidden States (h1, ..., hN in Rh):编码器产生的 N 个隐藏状态向量,它们代表了源句子的所有原始信息。
Decoder Hidden State (st in Rh):解码器在时间步 t 的隐藏状态,代表了当前生成的上下文需求。
4.2 计算步骤的公式化
1. 计算注意力得分 (Attention Scores)
我们通过计算解码器状态 st 与每一个编码器状态 hi 的内积(Dot Product)来衡量它们的相关性:

这里的 et 是一个长度为 N 的向量,每个元素代表了对应位置的重要性。
2. 生成注意力分布 (Attention Distribution)
为了让得分具备概率含义(即总和为 1 且均为正数),我们对其进行 Softmax 归一化:

此时,ait 即为模型在当前步对第 i 个输入词的“注意力权重”。
3. 计算注意力输出 (Attention Output)
利用权重 at 对编码器状态进行加权求和,得到最终的上下文表示:

4. 拼接与预测
最后,我们将注意力输出 at 与解码器隐藏状态 st 进行拼接(Concatenate),形成一个维度为 2h 的增强向量,并按照非 Attention 的 Seq2Seq 流程继续后续的线性层与分类计算:


第五节:Attention 的优势
Attention 机制的出现不仅是解决了 Seq2Seq 的瓶颈,它更像是在神经网络中引入了一种全新的“通信协议”。其优势可以归纳为以下四个维度:
5.1 显著提升模型性能
在神经机器翻译(NMT)任务中,Attention 带来的性能提升是跨越性的。它允许解码器在每一个生成步骤中,都能根据需要从源句子中精准地提取相关信息,这使得模型处理超长序列的能力大大增强。
5.2 缓解梯度消失问题
在传统的深层 RNN 中,梯度需要通过漫长的链条逐层回传,极易消失。而 Attention 建立了一种从解码器到编码器的“快捷链接” (Shortcut)。
梯度可以通过 Attention 连接直接流向编码器的早期状态,从而让远距离的参数也能得到有效的更新。
5.3 更好的可解释性 (Interpretability)
这是 Attention 最吸引人的特性之一。通过可视化注意力权重矩阵(Attention Matrix),我们可以直观地看到:当模型翻译某个词时,它究竟在“看”源句子的哪些词。
这为我们提供了“免费的对齐信息(Alignment)”。
这种对齐是模型在训练过程中自主学习到的,而非人工标注,这证明了模型确实理解了不同语言词汇间的对应关系。
5.4 提供人类直觉般的建模方式
Attention 模拟了人类处理信息的习惯:当我们阅读或翻译时,我们并不会试图背诵整段文字,而是根据当前的任务焦点,不断地在原文中寻找关键线索。

第六节: Attention 的多种变体 (Attention Variants)
在前面的公式中,我们默认使用了最简单的“点积”来计算得分。但在实际研究中,为了提升模型的表达能力或处理不同维度的向量,科学家们提出了几种经典的变体。
6.1 基本点积注意力 (Basic Dot-Product Attention)
这是最基础的形式,直接计算 Query (s) 和 Value (hi) 的内积:

前提条件: 要求 s 和 hi 的维度必须完全一致(d1 = d2)。
特点: 计算速度极快,且没有额外的参数需要训练。
6.2 乘法/双线性注意力 (Multiplicative/Bilinear Attention)
为了打破维度的限制并增加模型的灵活性,Luong 等人在 2015 年引入了一个可学习的权重矩阵 W:

优势: W 矩阵可以学习如何将编码器的空间映射到解码器的空间,即使两者维度不同也能正常工作。


6.3 低秩乘法注意力 (Reduced-rank Multiplicative Attention)
当维度非常高时,W 矩阵的参数量会爆炸。此时可以将其分解为两个低秩矩阵 U 和 V:

这种做法在保持表达能力的同时,极大地减少了计算开销。
6.4 加法注意力 (Additive Attention)
这是由 Bahdanau 等人在 2014 年最早提出的形式。它不使用点积,而是将两者输入一个单层前馈神经网络(MLP):

评价: 虽然名字叫“加法”,但它实际上是利用非线性激活函数来学习两者之间的复杂关联。
注意: 这种形式非常重要,请记住它,因为它是我们下周讨论 Transformer 架构时的重要伏笔!

第七节:总结
经过前面的拆解,我们已经看到了 Attention 如何在 Seq2Seq 模型中大显身手。但如果你退后一步,从更宏观的视角观察,你会发现 Attention 的本质其实非常简洁且通用。
7.1 更广义的定义
在现代深度学习中,Attention 被定义为一种给定一个向量 Query 和一组向量 Values,计算 Values 的加权和的技术。
Query(查询): 代表“我当前需要什么信息”。
Values(数值): 代表“我手头有哪些可供选择的信息库”。
Attention(注意力): 就是根据 Query 对 Values 进行自适应筛选的过程。
在这个定义下,Query 会去“观察(Attend to)”所有的 Values,并根据相关性决定每个 Value 应该占据多大的权重。
7.2 直觉与本质
选择性汇总 (Selective Summary): Attention 的输出是对 Values 包含信息的一种有选择性的总结,由 Query 决定关注重点。
固定长度表示: 无论输入(Values)有多少个,Attention 都能根据另一个表示(Query)将其转化为一个固定尺寸的表示。这种灵活性是传统卷积或全连接层难以企及的。
7.3 历史地位与未来
Attention 是 2010 年以后深度学习领域最重要的创新之一。它最初起源于神经机器翻译(NMT),但其影响力早已远超翻译领域:
它就像是一个强大的、可学习的指针: 允许模型在海量数据中“指哪打哪”。
它模拟了内存操作: Query 像指令,Values 像内存条,Attention 则是读取过程。
最重要的是,这种“加权求和”的思想,直接催生了后来的 Transformer 架构(即著名的 Attention is All You Need)。在那之后,深度学习正式进入了“全员注意力”的时代。

