Seq2Seq(编码器-解码器)是什么?有什么局限?
简化版
Seq2Seq(序列到序列) 是处理「输入输出都是序列、且长度可以不同」任务(如机器翻译)的框架,经典实现由 RNN 编码器和解码器组成;这一框架也可由 CNN 或 Transformer 实现。编码器逐个读完整个输入序列,把它压缩成一个固定长度的上下文向量(context vector,通常是编码器最后的隐藏状态);解码器再基于这个上下文向量,逐步生成输出序列(每步生成一个词,并把它作为下一步输入)。核心局限:整个输入被压成一个固定长度的向量,输入很长时这个向量装不下所有信息(信息瓶颈),导致长句翻译质量下降、且容易「忘掉」开头。解决方案是注意力机制(Attention)——让解码器每步都能「回看」输入的所有位置,从而突破瓶颈。
详细版
结构:
输入序列 → [编码器 RNN] → 上下文向量 c → [解码器 RNN] → 输出序列
读完整个输入 固定长度向量 逐步生成
工作流程:
编码器:x_1, x_2, ..., x_n 逐步读入 → 最后隐藏状态作为上下文向量 c
解码器:以 c 为初始状态,逐步生成 y_1, y_2, ...
每步用上一步输出作为当前输入(自回归),直到生成结束符 <EOS>
核心局限——信息瓶颈:
| 问题 | 说明 |
|---|---|
| 固定长度向量 | 无论输入多长,都压成一个固定大小的向量 |
| 长序列丢信息 | 输入越长,向量越装不下,信息损失越大 |
| 遗忘开头 | 靠后的信息覆盖前面,长句开头易丢 |
解决:注意力机制——解码每步动态「关注」输入的相关位置,不再依赖单一向量。
完整版教学
一、Seq2Seq 要解决什么——不等长序列转换
很多任务是「一个序列转换成另一个序列,而且两者长度不一定相等」:
- 机器翻译:中文句子 → 英文句子(词数不同)。
- 文本摘要:长文章 → 短摘要。
- 语音识别:语音帧序列 → 文字序列。
- 对话生成:问句 → 回答。
普通 RNN 的「每步输出」模式(等长 many-to-many)处理不了「输入输出长度不同」的情况。Seq2Seq(Sequence to Sequence) 用编码器-解码器结构专门解决这个问题(对应不等长 many-to-many,详见 RNN 类型专题)。
二、结构:编码器 + 解码器
经典 Seq2Seq 常由两个 RNN(通常是 LSTM/GRU)组成,现代实现也可换成 Transformer:
编码器(Encoder):负责理解输入。它逐个读入输入序列的每个元素,不断更新隐藏状态,读完整个序列后,把最后的隐藏状态作为一个上下文向量(context vector)c——这个向量被认为浓缩了整个输入序列的信息。编码器本身不产生输出,只负责「读懂并压缩」输入。
解码器(Decoder):负责生成输出。它以编码器给的上下文向量 c 作为起点(初始状态),逐步生成输出序列:推理时通常把上一步生成 token 作为下一步输入;训练时常使用真实上一词进行 teacher forcing(自回归),直到生成结束符 <EOS> 停止。
[编码器] x_1→x_2→...→x_n ⇒ 上下文向量 c
[解码器] c ⇒ y_1 → y_2 → ... → <EOS>
每步用上一步的输出当输入
三、工作流程举例(翻译)
翻译「我 爱 你」→「I love you」:
- 编码:编码器依次读「我」「爱」「你」,读完得到上下文向量 c(浓缩了这句话的意思)。
- 解码:解码器从 c 开始,
- 第 1 步:结合 c 生成「I」。
- 第 2 步:用「I」和状态生成「love」。
- 第 3 步:用「love」生成「you」。
- 第 4 步:生成
<EOS>,结束。
编码器「读懂整句再压缩」,解码器「基于压缩的意思逐词翻译」——这就是 Seq2Seq 的基本思路。
四、核心局限:信息瓶颈
Seq2Seq 有一个致命弱点,也是面试重点:整个输入序列被压缩成一个「固定长度」的上下文向量 c。这带来信息瓶颈(information bottleneck):
- 长输入装不下:无论输入是 5 个词还是 50 个词,都要压进同一个固定大小的向量。输入越长,这个向量越装不下所有信息,损失越严重。
- 遗忘开头:编码器按顺序读,靠后的信息会不断「覆盖」前面的,长句子开头的信息容易被遗忘(即使用 LSTM 也只是缓解)。
- 结果:Seq2Seq 在短句上表现不错,长句翻译质量明显下降。
根源在于——让一个固定向量承载任意长度序列的全部信息,本身就是不现实的。
五、解决方案:注意力机制
为突破信息瓶颈,注意力机制(Attention) 应运而生(详见注意力专题)。核心思想:解码器生成每个词时,不再只依赖单一的上下文向量 c,而是能「回看」输入序列的所有位置,动态地关注当前最相关的部分。
- 翻译「you」时,注意力让解码器重点关注输入里的「你」,而不是把整句话挤在一个向量里。
- 每个解码步骤都计算一个针对当前步的、动态的上下文向量(对输入各位置的加权组合),权重由「当前解码状态和各输入位置的相关性」决定。
注意力显著缓解了单一固定向量的信息瓶颈——解码时可访问编码器各位置,但仍受模型容量、注意力计算与上下文窗口限制。这大幅提升了长句翻译质量,也为后来的 Transformer 铺平了道路(Transformer 干脆完全用注意力、抛弃了 RNN)。
六、训练与推理为何不同:Teacher Forcing
训练时若第 t 步总把模型自己的预测送回去,早期错误会让后续输入迅速偏离真实序列。Teacher forcing 改为输入真实的 y_{t-1},可并行计算部分解码训练并让优化更稳定;推理时没有真实答案,只能输入模型刚生成的 token。这种训练输入与推理输入不一致称为 exposure bias。
训练: BOS -> 真值 y1 -> 真值 y2 -> y3
推理: BOS -> 预测 ŷ1 -> 预测 ŷ2 -> ŷ3
若 ŷ1 错,后续条件分布随之改变
| 阶段 | 上一步输入 | 是否可看到真值 | 主要风险 |
|---|---|---|---|
| 训练 | 常用真实 token | 是 | exposure bias |
| 贪心推理 | 最高概率预测 | 否 | 局部最优 |
| Beam search | 保留 k 条候选 | 否 | 计算增加、长度偏置 |
Seq2Seq 是条件序列生成框架,不等同于“两个 RNN”这一种实现。回答局限时除固定向量瓶颈,还应提到自回归解码延迟、错误累积和搜索策略。
易错点:训练阶段“喂真值”和推理阶段“喂预测”不是同一数据流,这是 Seq2Seq 常见误差累积来源。
七、常见误区与追问
- 误区:Seq2Seq 必然由两个 RNN 构成。 编码器-解码器是框架,组件也可使用 Transformer 或 CNN。
- 误区:训练和推理时解码器输入完全相同。 teacher forcing 训练常喂真值,推理只能喂自身预测。
- 追问:什么是 exposure bias? 训练条件主要来自真值,而推理条件来自模型预测,分布不一致。
- 追问:Beam search 一定优于贪心吗? 它搜索更广但不保证任务指标更高,还受长度归一化等影响。
- 追问:注意力是否消除了所有长序列问题? 它缓解固定向量瓶颈,但计算、窗口、优化和容量限制仍存在。
八、加强记忆
Seq2Seq 处理输入输出都是序列、长度可不同的任务(机器翻译、摘要、语音识别),由编码器 + 解码器组成:编码器读完整个输入、压成一个固定长度的上下文向量 c(最后隐藏状态,浓缩全句);解码器基于 c 自回归逐步生成输出(每步输出当下一步输入,到 <EOS> 停)。核心局限是信息瓶颈——把任意长度输入压进一个固定向量,长序列装不下、易忘开头、长句质量下降。解决方案是注意力机制:解码每步动态回看输入所有位置、按相关性加权,不再依赖单一向量,突破瓶颈——这也催生了 Transformer(完全用注意力、抛弃 RNN)。