Seq2Seq 模型的基本结构
Seq2Seq(Sequence-to-Sequence)的核心思想是将变长输入序列映射为变长输出序列,通过"编码-解码"两阶段架构实现。
整体架构
输入序列: x₁ x₂ x₃ x₄ <EOS> ↓ ↓ ↓ ↓ [Encoder RNN] ← 编码器:将输入序列压缩为语义向量 ↓ ↓ ↓ ↓ h₁ h₂ h₃ h₄ ↓ 上下文向量 c ← 最终隐藏状态,编码整个输入序列的语义 ↓ [Decoder RNN] ← 解码器:从上下文向量逐步生成输出序列 ↓ ↓ ↓ ↓ y₁ y₂ y₃ <EOS> ← 输出序列(长度可与输入不同)1. 编码器(Encoder)
编码器是一个 RNN(LSTM/GRU),逐个读取输入序列,最终将整个序列的信息压缩到一个上下文向量 c中:
hₜ = f(h_{t-1}, xₜ) ← 逐步编码 c = h_T ← 最后一步的隐藏状态作为上下文向量- 输入序列长度 T_x,编码器处理后得到固定维度的向量 c
- c 是整个输入序列的"语义摘要"
- 编码器通常用双向 RNN,以捕获完整上下文
2. 解码器(Decoder)
解码器是另一个 RNN,以上下文向量 c 为初始状态,自回归地逐步生成输出:
s₁ = f(c, <SOS>) ← 第一步:以 c 初始化,输入起始符 y₁ = g(s₁) ← 生成第一个输出 s₂ = f(s₁, y₁) ← 第二步:以上一步输出作为输入 y₂ = g(s₂) ...直到生成 <EOS> 停止关键特点:
- 自回归:每一步的输入是上一步的输出,形成自循环
- 长度自由:输出序列长度 T_y 由模型自行决定(遇到
<EOS>停止) - 起始/结束标记:
<SOS>触发生成,<EOS>终止生成
3. 训练与推理的差异
训练(Teacher Forcing): 解码器每步输入 = 真实标签 y_{t-1}(而非模型自己的预测) 优点:收敛快,梯度稳定 缺点:训练/推理分布不一致(exposure bias) 推理(自回归): 解码器每步输入 = 上一步的预测 ŷ_{t-1} 误差会逐步累积4. 核心瓶颈:上下文向量 c 的信息压缩问题
基本 Seq2Seq 的最大缺陷是:整个输入序列被压缩为单一固定维度的向量 c。
输入: "The weather is nice today and I want to go for a walk in the park" ↓ 全部压缩到一个向量 c(如 256 维) ↓ 解码器: 逐步生成翻译问题:
- 长输入序列的信息无法被有限维向量完整编码
- 解码器在生成后面的词时,对输入序列早期部分的信息访问困难
- 序列越长,信息丢失越严重
解决方案 → 注意力机制(Attention):
不使用单一 c,而是每一步动态计算对输入各位置的注意力权重: 解码第 t 步: α_{t,i} = softmax(score(s_{t-1}, h_i)) ← 对每个编码器隐藏状态打分 cₜ = Σ α_{t,i} · h_i ← 加权聚合,每步一个不同的 cₜ sₜ = f(s_{t-1}, cₜ, y_{t-1}) ← 用动态 cₜ 解码注意力机制让解码器在每一步都能"回看"输入序列的所有位置,彻底解决了信息瓶颈问题,也是 Transformer 的直接前身。
常用于解决的问题
Seq2Seq 适用于输入和输出都是变长序列,且两者之间存在某种映射/转换关系的任务:
| 任务类别 | 具体任务 | 输入 → 输出示例 |
|---|---|---|
| 机器翻译 | 语言间翻译 | “我爱自然语言处理” → “I love NLP” |
| 文本摘要 | 长文压缩为摘要 | [长篇文章] → [几句话摘要] |
| 对话生成 | 对话回复 | “你好,今天天气怎样?” → “今天晴天,25度” |
| 语音识别 | 语音帧转文本 | [声学特征序列] → “你好世界” |
| 代码生成 | 自然语言转代码 | “排序一个列表” →list.sort() |
| 拼写纠错 | 错误文本转正确 | “I havv a appl” → “I have an apple” |
| 语音翻译 | 语音直接转目标语言文本 | [中文语音] → “Hello” |
共同特征
这些任务都满足:
- 输入是序列(token 序列、帧序列等)
- 输出是序列(长度不固定,与输入长度无确定关系)
- 存在输入到输出的系统性映射(而非逐词对齐)
- 输出需要逐步生成(自回归)
总结
Seq2Seq 由编码器和解码器两部分组成:编码器将变长输入序列压缩为上下文向量,解码器从该向量出发自回归地生成变长输出序列。它解决的核心问题是变长到变长的序列映射,广泛应用于翻译、摘要、对话等任务。基本 Seq2Seq 的主要瓶颈是单一上下文向量的信息压缩损失,注意力机制通过让解码器每步动态关注输入的不同位置解决了这一问题,并最终演化为 Transformer 架构。