05-Attention:解决Seq2Seq信息瓶颈,增加注意力机制
1、研究背景:Seq2Seq 很强,但有一个“信息瓶颈”
- Encoder 把整段输入读完(直到
<eos>) - 然后 Decoder 才开始一个词一个词生成输出(论文 Figure 1 就是这个流程)
这种结构往往把“整段输入”的信息压缩到一个固定维度的表示里(你可以理解为一个“总结向量”),Decoder 主要靠这个总结来输出。
通俗理解(形象类比)
- 你读完一本书(输入序列)
- 然后只允许你写一个“100字摘要”
- 接下来考试所有题目都只能靠这 100 字来答
2、核心动机:Decoder 生成每一步时,应该“回头看输入的相关部分”
注意力机制可以让模型在翻译时选择性地聚焦源句的部分内容。
动态地去输入序列里“找当前最相关的片段”来参考。
通俗理解(形象类比)
- 以前:只能靠你脑子里那份摘要(瓶颈)
- 现在:每写一句答案,都可以翻书定位到最相关那一页再写
- Global attention:每一步都看“所有输入位置”
- Local attention:每一步只看“一小段输入窗口”(更省计算)
通俗理解(形象类比)
- Global:写每一句答案都把整本书从头翻到尾找信息(准但慢)
- Local:先估计“信息大概在第几页”,只翻那几页(快很多)
用 Seq2Seq 做多步预测时
- Encoder 把过去 48/168 步压成一个“摘要”
- Decoder 预测未来第 1、2、…、24 步时,每一步需要的历史信息其实不同
- 预测明天早高峰 → 更关注“昨天同一时刻”
- 预测趋势变化 → 更关注“最近一段”
- 预测周期 → 更关注“上周同周期”
3、Global Attention 模型结构
先教你读图:每种颜色代表什么?
✅ 蓝色柱子(左边一排):Encoder 的输出序列 hˉs
- 每一个蓝色柱子代表 Encoder 在某个时间点的隐藏状态
- 可以理解成:输入序列每个时刻的“记忆摘要”
- 输入是过去 48 个点
- Encoder 会产生 48 个蓝色柱子
- 每个柱子是一段“历史时刻的信息编码”
蓝色柱子 = 历史每个时刻的“特征表示/笔记”
✅ 红色柱子(右边):Decoder 的当前状态 ht
ht = Decoder 在第 t 步“正在想什么”(当前生成状态)
✅ 虚线框:Attention Layer(注意力层)
- 算 “对齐权重” at(global align weights)
- 算 “上下文向量” ct(context vector)
Global Attention 的核心:三个步骤(按图走)
Step 1:拿着当前问题 ht,去和所有历史 hˉs做匹配
- 从红色的 ht 出发
- 连向所有蓝色柱子 hˉ1,hˉ2,...,hˉS
Decoder 现在要生成第 t 步输出,它会问:“历史里哪些时刻对我现在最有用?”
- 昨天同一时刻?
- 上周同一天?
- 最近趋势?
Step 2:得到一组全局权重 at(图中 global align weights)
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,不是凭空想的, 而是 = “你当前脑子里的推理 + 翻书找到的关键依据”。
为什么叫 Global Attention?
每生成一个输出步 t,它都会看“所有” Encoder 的状态(全部蓝色柱子)。
- ✅ 不遗漏
- ✅ 更准确
- ❌ 计算量更大(序列长时会慢)
- local 只看一小段蓝色柱子(窗口)
- global 是全部都看
4、Local attention模型结构
1)一句话理解 Local Attention
每一步生成输出时,先判断“最相关的信息大概在输入序列的哪个位置”, 然后只在那个位置附近看一小段(窗口),不看全局。
- Global attention:写作业时把整本书从头翻到尾找答案
- Local attention:先判断答案大概率在第 50 页,然后只翻第 45~55 页
2)读图:这张 Local attention 和 Global attention 最大区别在哪?
✅ “Aligned position” pt
先预测一个位置 pt,表示“当前输出步 t 要对齐输入的哪个位置”。
只对 pt 附近的几根蓝色柱子打分(Local weights)
3)Local attention 的网络结构(按图走,4个步骤)
Step 1:Decoder 产生当前状态 ht(红色柱子)
Decoder 此刻正在“思考什么”,准备生成 yt
Step 2:先用 ht 预测对齐位置 pt
“我现在要找答案,但我不想翻整本书,我先猜答案大概在第几页。”
- 输入序列长度假设是 S(有 S 个蓝色状态)
- pt是一个在 [1,S]之间的位置(可能是小数)
- 它表示:当前步最该关注的输入位置
Step 3:以 pt为中心,截取一个窗口 Window(只看局部)
只看 pt 左右各 D 个位置的 encoder 状态
- [pt−D, pt+D]
你定位到第 50 页后,只翻 45~55 页,而不是翻全书。
Step 4:在窗口里计算局部权重 at,得到上下文向量 ct
- Local weights at
- Context vector ct
- 给窗口里的每个蓝色柱子分配权重(注意力权重)
- 用权重把这些蓝色柱子加权平均
- 得到 ct 当前步最有用的历史信息摘要
ata_tat 不再是对全部输入位置的权重,而只对窗口内的位置分配权重。
4)最后输出:ct+ ht 决定 yt
- Decoder 的当前状态 ht:我自己推理的结果
- Context ct:我从历史里翻到的依据
5、Local attention 的两种版本
A) local-m:Monotonic alignment(单调对齐)
we simply set pt=t assuming that source and target sequences are roughly monotonically aligned
我默认输入序列与输出序列是“顺序对应”的。
- 你输出第 5 步,就主要看输入第 5 步附近
- 输出第 10 步,就主要看输入第 10 步附近
你读书做翻译时,默认翻译是按顺序来的: 英文第5个词大概率对应中文第5个词附近。
✅ 在时间序列预测里怎么理解?
- 明天 8 点的预测 → 主要看今天 8 点附近
- 下周一的预测 → 主要看上周一附近
- 超级简单
- 训练稳定
- 速度快
- 太死板:如果真实对齐不是严格顺序,它就会错
B) local-p:Predictive alignment(预测对齐)
instead of assuming monotonic alignments, our model predicts an aligned position
✅ 通俗解释(非常关键)
我不强行规定“第 t 步输出就看第 t 个输入附近”, 而是让模型自己学会: “我现在应该去输入的哪个位置找信息?”
- Decoder 在生成 yt 时
- 根据当前状态 ht
- 预测一个“注意力中心点” pt
你写答案时,不一定第5题就翻书第5页。你会根据题目内容判断:答案大概率在第50页。这就是预测 pt。
local-p 还有一个非常聪明的技巧:高斯“聚焦”
✅ 通俗解释
你虽然会翻第 50 页附近,但你最重点还是看第 50 页, 第 49/51 页次之, 第 40 页基本不看。
- 中间亮
- 两边暗