05-Attention:解决Seq2Seq信息瓶颈,增加注意力机制

05-Attention:解决Seq2Seq信息瓶颈,增加注意力机制

导出时间:2026/1/14 20:37:38

1、研究背景:Seq2Seq 很强,但有一个“信息瓶颈”

在早期 NMT(以及你学的 Seq2Seq Encoder–Decoder)里,最常见的做法是:
  • Encoder 把整段输入读完(直到 <eos>
  • 然后 Decoder 才开始一个词一个词生成输出(论文 Figure 1 就是这个流程)
image.png

这种结构往往把“整段输入”的信息压缩到一个固定维度的表示里(你可以理解为一个“总结向量”),Decoder 主要靠这个总结来输出。

通俗理解(形象类比)

这就像:
  • 你读完一本书(输入序列)
  • 然后只允许你写一个“100字摘要”
  • 接下来考试所有题目都只能靠这 100 字来答
当输入很长、细节很多时,“摘要”很容易丢关键信息。

2、核心动机:Decoder 生成每一步时,应该“回头看输入的相关部分”

论文开篇就用一句很直白的话点出 Attention 的核心想法:

注意力机制可以让模型在翻译时选择性地聚焦源句的部分内容

也就是说:Decoder 在生成当前输出 yt 时,不应该只靠一个固定摘要,而应该能:

动态地去输入序列里“找当前最相关的片段”来参考。

通俗理解(形象类比)

把 Seq2Seq 从“闭卷考试”变成“开卷考试”:
  • 以前:只能靠你脑子里那份摘要(瓶颈)
  • 现在:每写一句答案,都可以翻书定位到最相关那一页再写
这就是 Attention 的直接动机。

论文提出并系统比较了两类简单有效的注意力机制:
  • Global attention:每一步都看“所有输入位置”
  • Local attention:每一步只看“一小段输入窗口”(更省计算)
并解释了 local 的动机:global 每一步都看全部输入,对长序列会很贵,可能不适用于更长的段落/文档;所以他们提出 local 只关注一小段,从而降低计算量。

通俗理解(形象类比)

  • Global:写每一句答案都把整本书从头翻到尾找信息(准但慢)
  • Local:先估计“信息大概在第几页”,只翻那几页(快很多)

用 Seq2Seq 做多步预测时

  • Encoder 把过去 48/168 步压成一个“摘要”
  • Decoder 预测未来第 1、2、…、24 步时,每一步需要的历史信息其实不同
    • 预测明天早高峰 → 更关注“昨天同一时刻”
    • 预测趋势变化 → 更关注“最近一段”
    • 预测周期 → 更关注“上周同周期”


3、Global Attention 模型结构

image.png

先教你读图:每种颜色代表什么?

这张图里颜色非常关键:

✅ 蓝色柱子(左边一排):Encoder 的输出序列 hˉs

  • 每一个蓝色柱子代表 Encoder 在某个时间点的隐藏状态
  • 可以理解成:输入序列每个时刻的“记忆摘要”
例如(时间序列预测视角):
  • 输入是过去 48 个点
  • Encoder 会产生 48 个蓝色柱子
  • 每个柱子是一段“历史时刻的信息编码”

蓝色柱子 = 历史每个时刻的“特征表示/笔记”


✅ 红色柱子(右边):Decoder 的当前状态 ht

红色柱子代表 Decoder 正在生成输出的过程。
特别是图右边那个红色柱子上标的 ht:

ht = Decoder 在第 t 步“正在想什么”(当前生成状态)


✅ 虚线框:Attention Layer(注意力层)

虚线框里面做了两件事:
  1. 算 “对齐权重” at(global align weights)
  2. 算 “上下文向量” ct(context vector)

Global Attention 的核心:三个步骤(按图走)

你可以把它理解成 Decoder 每生成一个输出,都要经历下面的“翻书三步”:

Step 1:拿着当前问题 ht,去和所有历史 hˉs做匹配

图里这一步就是:
  • 从红色的 ht 出发
  • 连向所有蓝色柱子 hˉ1,hˉ2,...,hˉS
通俗理解:

Decoder 现在要生成第 t 步输出,它会问:“历史里哪些时刻对我现在最有用?”

就像你要写“未来第 t 天的销量”时,你会回忆:
  • 昨天同一时刻?
  • 上周同一天?
  • 最近趋势?
这些“相关性”就是 Attention 要计算的东西。

Step 2:得到一组全局权重 at(图中 global align weights)

图里写了 “Global align weights ata_tat”:

at 其实就是一串权重(注意力分数),长度等于蓝色柱子的数量

也就是说:
  • Encoder 有 S 个蓝色状态(S 个历史时刻)
  • a 就有 S 个权重
  • 每个权重对应“我该多关注这个历史时刻”
形象解释:

at就是你给每一页书打的“重要程度评分”。

例如:
  • 第 10 个历史时刻权重 0.5(很重要)
  • 第 3 个历史时刻权重 0.02(几乎没用)

Step 3:把所有蓝色状态做加权平均,得到上下文向量 ct

  • 历史信息很多(S 个蓝色柱子)
  • 不能全部原样塞给 Decoder
  • 所以 Attention 用权重 at做一个“加权汇总”
形象理解:

ct 就是你翻完整本书后,对当前问题最有用的“摘要结论”。


最后输出:ht + ct 共同决定 yt

图右上角灰色块是输出层:
  • 它接收 Decoder 当前状态 ht
  • 也接收 Context ct
然后产生输出 yt
你可以把它理解成:

你最终写出的答案 yt,不是凭空想的, 而是 = “你当前脑子里的推理 + 翻书找到的关键依据”。


为什么叫 Global Attention?

因为它有一个非常鲜明的特点:

每生成一个输出步 t,它都会看“所有” Encoder 的状态(全部蓝色柱子)。

这就是“global”的含义:
  • ✅ 不遗漏
  • ✅ 更准确
  • ❌ 计算量更大(序列长时会慢)
对比 local attention(你后续会学):
  • local 只看一小段蓝色柱子(窗口)
  • global 是全部都看


4、Local attention模型结构

image.png

1)一句话理解 Local Attention

Local attention 的核心思想是:

每一步生成输出时,先判断“最相关的信息大概在输入序列的哪个位置”, 然后只在那个位置附近看一小段(窗口),不看全局。

形象类比:
  • Global attention:写作业时把整本书从头翻到尾找答案
  • Local attention:先判断答案大概率在第 50 页,然后只翻第 45~55 页

2)读图:这张 Local attention 和 Global attention 最大区别在哪?

你看这张图的虚线框 Attention Layer 里,多了一个非常关键的东西:

✅ “Aligned position” pt

图中写着:Aligned position pt
这就是 Local attention 的第一步:

先预测一个位置 pt,表示“当前输出步 t 要对齐输入的哪个位置”。

然后 attention 就不再对所有蓝色柱子打分,而是:

只对 pt 附近的几根蓝色柱子打分(Local weights)


3)Local attention 的网络结构(按图走,4个步骤)

每一步 t(预测第 t 个输出)Local attention 都做以下流程:

Step 1:Decoder 产生当前状态 ht(红色柱子)

图右侧红色柱子 hth_tht 表示:

Decoder 此刻正在“思考什么”,准备生成 yt

这和 Global attention 完全一样。

Step 2:先用 ht 预测对齐位置 pt

这一步是 Local attention 新增的。
通俗讲:

“我现在要找答案,但我不想翻整本书,我先猜答案大概在第几页。”

所以模型会输出一个位置 pt:
  • 输入序列长度假设是 S(有 S 个蓝色状态)
  • pt是一个在 [1,S]之间的位置(可能是小数)
  • 它表示:当前步最该关注的输入位置
你图中从 ht指向 “Aligned position ptp_tpt” 的箭头就是这个过程。

Step 3:以 pt为中心,截取一个窗口 Window(只看局部)

这一步的意思是:

只看 pt 左右各 D 个位置的 encoder 状态

例如窗口大小是 2D+1:
  • [pt−D,  pt+D]
在图里就是:只有靠近 pt 的几根蓝色柱子跟 attention 发生连接(你看到的就是局部连线)。
形象类比:

你定位到第 50 页后,只翻 45~55 页,而不是翻全书。


Step 4:在窗口里计算局部权重 at,得到上下文向量 ct

你图中标注:
  • Local weights at
  • Context vector ct
含义:
  1. 给窗口里的每个蓝色柱子分配权重(注意力权重)
  2. 用权重把这些蓝色柱子加权平均
  3. 得到 ct 当前步最有用的历史信息摘要
这里非常关键的一点是:

ata_tat 不再是对全部输入位置的权重,而只对窗口内的位置分配权重。

所以叫 Local weights。

4)最后输出:ct+ ht 决定 yt

这一点和 Global attention 一样:
  • Decoder 的当前状态 ht:我自己推理的结果
  • Context ct:我从历史里翻到的依据
合起来输出预测 yt。


5、Local attention 的两种版本

A) local-m:Monotonic alignment(单调对齐)

论文原话:

we simply set pt=t assuming that source and target sequences are roughly monotonically aligned

local-m 就是最“朴素、最直觉”的做法:

我默认输入序列与输出序列是“顺序对应”的。

比如:
  • 你输出第 5 步,就主要看输入第 5 步附近
  • 输出第 10 步,就主要看输入第 10 步附近
形象类比:

你读书做翻译时,默认翻译是按顺序来的: 英文第5个词大概率对应中文第5个词附近。

✅ 在时间序列预测里怎么理解?

local-m 很适合那种“未来的第 k 步主要对应过去某个固定滞后”的预测任务,例如:
  • 明天 8 点的预测 → 主要看今天 8 点附近
  • 下周一的预测 → 主要看上周一附近
这种“顺序对齐感”很强的任务。
✅ 优点:
  • 超级简单
  • 训练稳定
  • 速度快
⚠️ 缺点:
  • 太死板:如果真实对齐不是严格顺序,它就会错

B) local-p:Predictive alignment(预测对齐)

论文原话:

instead of assuming monotonic alignments, our model predicts an aligned position

✅ 通俗解释(非常关键)

local-p 的思想是:

我不强行规定“第 t 步输出就看第 t 个输入附近”, 而是让模型自己学会: “我现在应该去输入的哪个位置找信息?”

也就是:
  • Decoder 在生成 yt 时
  • 根据当前状态 ht
  • 预测一个“注意力中心点” pt
形象类比:

你写答案时,不一定第5题就翻书第5页。你会根据题目内容判断:答案大概率在第50页。这就是预测 pt。

local-p 还有一个非常聪明的技巧:高斯“聚焦”

local-p 不只是预测 pt,论文还说:用这个高斯去修正权重,让离 pt越近的地方权重越大

✅ 通俗解释

这相当于:

你虽然会翻第 50 页附近,但你最重点还是看第 50 页, 第 49/51 页次之, 第 40 页基本不看。

所以它在窗口里形成一个“聚光灯”效果:
  • 中间亮
  • 两边暗
这会让 attention 更稳定、更像对齐。