序列到序列模型 (Seq2Seq):Encoder-Decoder 架构
📂 所属阶段:第二阶段 — 深度学习与序列模型(进阶篇)
🔗 相关章节:长短时记忆网络 LSTM/GRU · 注意力机制
如果你用过翻译软件、跟 AI 聊过天,或者见过图片被自动转换成文字描述,那你大概率已经接触过 序列到序列(Seq2Seq)模型了。它是深度学习中处理 变长输入 → 变长输出 任务的经典架构,也是后来火遍 AI 圈的 Transformer 的 老祖宗之一。啃透它,能帮你搞懂 Attention 机制为什么“必须横空出世”。
1. Seq2Seq 是什么?
1.1 一句话定义 + 主流场景
Seq2Seq 的核心逻辑可以概括成一句话:
这个框架几乎覆盖了所有“序列转化”类任务,下面是一些大家耳熟能详的例子:
简单来说,只要输入和输出都是序列,而且长度不固定,Seq2Seq 就能派上用场。
1.2 经典 Encoder-Decoder 架构拆解
尽管 Seq2Seq 的应用场景五花八门,但核心结构始终是两个循环神经网络(RNN/LSTM/GRU)组成的组合拳:
我们用中文→英文翻译(“我 爱 NLP”→“I love NLP”)来举一个具体的例子:
-
Encoder(编码器)
把输入的中文词序列(“我”“爱”“NLP”)逐个读进去。早期常用双向 LSTM,这样每个词都能同时看到上文和下文。读完整个句子后,模型的最终隐藏状态(以及细胞状态,如果使用 LSTM)会被打包成一个固定长度的上下文向量(Context Vector)。- 你可以把这个 Context Vector 理解为:模型把整个输入序列的语义“压缩”成了一张摘要卡片。
-
Decoder(解码器)
以这张“摘要卡片”作为初始状态,从一个特殊的<START>标记开始,一个词一个词地生成英文翻译。每生成一个新词,就把它当作下一步的输入,直到遇到<END>标记为止。
这一套“压缩—生成”的过程,就是最经典的 Seq2Seq 流程。
2. PyTorch 极简 Seq2Seq 实现
光说不练假把式!我们用 PyTorch 写一个 基于双向 LSTM 的 Encoder + 简单单向 LSTM 的 Decoder 的小模型,并附上两种最常用的解码方法。
2.1 完整的基础模型代码
在训练 Decoder 时,上面这个模型会以一定概率(例如 50%)使用真实的目标词作为下一步的输入,而不是模型自己预测的词。这就像老师带着学生写句子,每一步都给出正确答案,帮助模型更快收敛。这个方法就叫 Teacher Forcing。
2.2 两种核心解码策略
模型训练好之后,如何根据输出的概率分布生成合理的目标序列? 下面介绍两种最常用的方法。
① 贪婪解码(Greedy Decode)
最直接的策略:每一步只选择概率最高的那个词,直到遇到 <END> 或达到最大长度。
优点:速度快,实现简单。
缺点:只看眼前利益,容易错过后面更合理的整体组合(局部最优)。
② 集束搜索解码(Beam Search)
为了缓解贪婪解码的短视问题,Beam Search 会同时维护 top-k 个“当前最优候选序列”,k 被称作“beam size”。
Beam Search 的本质:在每一步都多留几条路,最后选出整体分数最高的一条。虽然速度慢了一些,但通常比贪婪解码更通顺、更合理。
:::tip 如何选择 beam size?
- beam size = 1:其实就退化成了贪婪解码。
- beam size 太大:计算量明显增加,而且可能生成重复或枯燥的内容。
- 机器翻译中常用的 beam size 一般在 4~8 之间,具体可以靠实验和验证集来调整。 :::
3. 经典 Seq2Seq 的致命问题 → 引出 Attention
我们上面的实现里,用的是一个固定长度的 Context Vector 来压缩整个输入序列。无论输入句子是 3 个词还是 100 个词,Encoder 都必须把所有信息塞进同一个维度的向量里。
这就是经典 Seq2Seq 最大的 信息瓶颈:
- 对于长句子,后面的信息很容易被前面的“淹没”,模型生成到后半段时已经“忘得差不多了”。
- 翻译时,模型只能凭借这一个压缩后的记忆,无法动态地参照原文的不同部分。
为了解决这个问题,Attention 机制 被提了出来。它让 Decoder 在生成每一个词时,都能“主动看一眼”输入序列里所有位置的信息,并自己决定哪些位置跟当前生成任务最相关。这样一来,就再也没有那个单一 Context Vector 的容量限制了。
这也正是我们下一篇(注意力机制)要重点讲解的内容。
💡 小总结
- 经典 Seq2Seq = 双向 Encoder 压缩 + 单向 Decoder 逐词生成 + Teacher Forcing 训练加速
- 解码常用贪婪(快但易局部最优)和 Beam Search(慢但更通顺)
- 它是理解 Transformer 的必经之路,但现在纯 Seq2Seq 已经基本被 Transformer 取代
🔗 扩展阅读与论文

