从 Seq2Seq 到注意力:用「翻译一句话」搞懂编码器、解码器与 Query/Key/Value
本文基于序列到序列(Seq2Seq)与注意力(Attention)的核心教材内容,用日常比喻和图示把概念讲清楚。适合已经知道「神经网络」「序列」等基础词的读者。
一、先问一个问题:为什么需要 Seq2Seq?
传统 RNN 往往假设:输入有多长,输出就有多长。但现实里很多任务不是这样:
机器翻译:中文 10 个字,英文可能是 15 个词。
摘要:一篇长文章,输出一段短摘要。
对话:对方说一长句,你只回一句。
Seq2Seq(Sequence-to-Sequence,序列到序列)要做的,就是打破「输入输出必须等长」的限制,让模型能处理变长输入 → 变长输出。
二、Seq2Seq 长什么样?——「先压缩,再展开」
可以把 Seq2Seq 想成两个人接力:
编码器(Encoder):把整句输入「读一遍」,压成一个固定长度的向量,叫上下文向量 Context。
比喻:你把一整段演讲听完,记在一张小纸条上(纸条大小固定,不能无限长)。
解码器(Decoder):拿着这张纸条,一个字一个字(或一个词一个词)生成输出,直到生成结束符或达到最大长度。
每一步往往会用到上一时刻已经生成的输出,再预测下一个。
下面用示意图表示这种Encoder → Context → Decoder的结构:
Seq2Seq 编码器-Context-解码器结构
训练时常用教师强制(Teacher Forcing):在解码端,当前步的输入不用上一步「模型自己猜的输出」,而是用真实的标准答案上一步。这样学得更稳;推理生成时再用模型自己的输出接龙。
三、经典 Seq2Seq 的三个痛点
1. 效率问题
序列一长,RNN/LSTM/GRU 往往要一步步扫过去,计算和显存都会随长度涨,训练和推理都变慢。
2. Context「装不下」——信息瓶颈
Context 是固定维度的一个向量,却要装下整句输入的全部要点。句子特别长时(比如长文档翻译),就像把一本书塞进一张便利贴:细节丢失,效果下降。这叫Context 限制或信息瓶颈。
3. 蝴蝶效应(误差沿时间传递)
解码是自回归的:第 2 个词依赖第 1 个词的输出,第 3 个依赖第 2 个……若某一步预测错了,后面会在错误基础上继续生成,小错可能滚成大错,像蝴蝶扇翅膀。
解码链式依赖与蝴蝶效应
学界缓解这些问题的一些方向包括:注意力、残差连接、更强的骨干网络等。下面重点讲注意力。
四、注意力在解决什么?——不只用一个 Context,而是「每一步都回头看原文」
核心想法:不要只用编码器最后一步的隐藏状态当唯一的 Context,而是利用编码器在每个时间步的隐藏状态 h₁, h₂, …, hₜ。
在解码每一个位置 j时,模型问一句:此刻生成输出,更应该「盯」输入的哪些位置?算出一组权重注意力权重 a,对各个 h 做加权平均,得到当前步专用的上下文向量 cⱼ。
这样:
缓解瓶颈:信息来自一整条 h 序列,而不是单一小向量硬扛全部内容。
弱化蝴蝶效应:每一步都能重新对齐到输入的相关部分,有机会纠正偏差,而不是只靠前面已经跑偏的解码状态。
无注意力 vs 有注意力的结构对比:
无注意力与带注意力结构对比
解码器第 j 步的隐藏状态sⱼ,通常与这些量有关:
上一时刻解码隐状态sⱼ₋₁
上一时刻输出yⱼ₋₁
当前步由注意力算出来的cⱼ
也就是说:每一步的「语境」是动态的,不是从头到尾只有一个 Context。
五、注意力权重在干什么?——对齐(Alignment)
注意力模块又叫对齐函数(Alignment):它在做「当前解码位置 ⟷ 输入各位置」的匹配。
每个权重a可以理解为:当前这一步,输入第 i 个位置有多重要。
所有 a 往往经过softmax归一化,变成概率分布,再乘到对应的值上求和。
这也对应综述类论文里常见的几种打分方式(加性、乘性、点积等),就是在讲这类对齐/打分的多种实现;你只需先记住:本质是算相似度,再归一化,再加权求和。
六、Query、Key、Value 到底是什么?——图书馆找书比喻
这是现代注意力(尤其 Transformer)里最常用的抽象,和 Seq2Seq 里的注意力是同一套思想的不同表述。
符号 | 名字 | 通俗理解 |
|---|---|---|
| q (Query) | 查询 | 你现在想要什么? 在解码场景里,常来自当前解码步的状态:「我要生成下一个词,该从输入里查什么?」 |
| K (Key) | 键 | 输入每个位置的「门牌/标签」,用来和 q比对是否相关。像数据库里按关键词检索。 |
| V (Value) | 值 | 每个位置实际要取的内容。先用 q 和各个 K 算出权重,再用权重对 V加权求和,得到当前步真正用到的上下文向量。 |
流程三步走:
q、K、V 与注意力计算流程
一句话:q 去「查」K,查到的强度当权重,从 V 里把信息加权拿出来。
七、小结:把整条线串起来
概念 | 一句话 |
|---|---|
| Seq2Seq | 编码器把变长输入压成表示,解码器再变长生成输出。 |
| Context 瓶颈 | 只有一个固定向量装整句,长句容易装不下。 |
| 蝴蝶效应 | 解码错一步,后面容易越错越远。 |
| 注意力 | 解码每一步对编码器各步动态加权,得到cⱼ,实现输入输出位置的软对齐。 |
| q, K, V | 查询、门牌、内容;相似度 → 权重 → 加权 V。 |
注意力并不神秘:它就是在解码的每一刻,让模型学会「该看输入的哪里」,从而减轻单一 Context 的限制,并减少误差一味向后传递的问题。从 Seq2Seq + Attention 再往前一步,就是Self-Attention 堆起来的 Transformer,那是后话;先把「对齐 + 加权」吃透,后面会轻松很多。
