从 Seq2Seq 到注意力:用「翻译一句话」搞懂编码器、解码器与 Query/Key/Value
本文基于序列到序列Seq2Seq与注意力Attention的核心教材内容用日常比喻和图示把概念讲清楚。适合已经知道「神经网络」「序列」等基础词的读者。一、先问一个问题为什么需要 Seq2Seq传统 RNN 往往假设输入有多长输出就有多长。但现实里很多任务不是这样机器翻译中文 10 个字英文可能是 15 个词。摘要一篇长文章输出一段短摘要。对话对方说一长句你只回一句。Seq2SeqSequence-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那是后话先把「对齐 加权」吃透后面会轻松很多。