在 Seq2Seq 模型中,编码器和解码器各负责什么功能?
编码器与解码器的功能分工
整体数据流
输入序列 x₁ x₂ x₃ <EOS> ↓ ↓ ↓ ┌─────────────────┐ │ 编码器 │ ← "理解"输入 │ (Encoder RNN) │ └────────┬────────┘ │ 上下文向量 c ← 输入序列的语义压缩 │ ┌────────┴────────┐ │ 解码器 │ ← "生成"输出 │ (Decoder RNN) │ └────────┬────────┘ │ 输出序列 y₁ y₂ y₃ <EOS>编码器:将变长输入压缩为固定向量
核心功能:理解输入序列,将其语义信息编码为上下文向量 c。
逐步编码: h₁ = f(h₀, x₁) ← 读取第一个 token h₂ = f(h₁, x₂) ← 结合历史记忆读取第二个 h₃ = f(h₂, x₃) ← ... c = h_T ← 最后一步隐藏状态 = 整个序列的语义摘要具体职责:
| 职责 | 说明 |
|---|---|
| 序列读取 | 逐个 token 读入输入序列,维护隐藏状态作为"运行记忆" |
| 语义压缩 | 将任意长度的输入序列压缩为一个固定维度的向量 c |
| 信息承载 | c 需要编码输入序列的全部关键信息(语义、结构、顺序) |
| 双向编码(可选) | 常用 BiLSTM/BiGRU,使 c 同时包含前向和后向上下文 |
关键约束:无论输入序列多长,输出 c 的维度固定(如 256/512 维),这是信息瓶颈所在。
解码器:从固定向量展开为变长输出
核心功能:以上下文向量 c 为起点,自回归地逐步生成输出序列。
初始化: s₀ = c ← 用上下文向量初始化解码器隐藏状态 第1步: s₁ = f(s₀, <SOS>) ← 输入起始符,生成第一个词 y₁ = softmax(W · s₁) ← 输出概率分布,取概率最高(或采样) 第2步: s₂ = f(s₁, y₁) ← 上一步生成的词作为当前输入 y₂ = softmax(W · s₂) 第3步: s₃ = f(s₂, y₂) y₃ = softmax(W · s₃) ...直到生成 <EOS> 停止具体职责:
| 职责 | 说明 |
|---|---|
| 状态初始化 | 用编码器输出的 c 初始化解码器的隐藏状态 |
| 自回归生成 | 每步以上一步输出为输入,逐步生成下一个 token |
| 长度决定 | 自行决定输出何时结束(生成<EOS>即停止) |
| 分布输出 | 每步输出词表上的概率分布,通过 argmax 或采样得到具体词 |
训练 vs 推理的关键差异
训练(Teacher Forcing): s₁ = f(c, <SOS>) → y₁ 输入: <SOS> s₂ = f(s₁, y₁*) → y₂ 输入: 真实标签 y₁*(而非预测 ŷ₁) s₃ = f(s₂, y₂*) → y₃ 输入: 真实标签 y₂* ↑ 每步用真实标签,梯度稳定,收敛快 推理(自回归): s₁ = f(c, <SOS>) → ŷ₁ 输入: <SOS> s₂ = f(s₁, ŷ₁) → ŷ₂ 输入: 自己的预测 ŷ₁ s₃ = f(s₂, ŷ₂) → ŷ₃ 输入: 自己的预测 ŷ₂ ↑ 误差逐步累积,可能偏离正确轨道编码器与解码器的对比
| 维度 | 编码器 | 解码器 |
|---|---|---|
| 角色 | 理解输入 | 生成输出 |
| 输入 | 完整输入序列 | 上下文向量 c + 上一步输出 |
| 输出 | 上下文向量 c | 逐步生成的 token 序列 |
| 方向 | 通常双向(BiRNN) | 单向(因果,只能看已生成部分) |
| 长度 | 由输入决定 | 由模型自行决定(遇<EOS>停止) |
| 信息流 | 逐步压缩:T 个 token → 1 个向量 | 逐步展开:1 个向量 → T’ 个 token |
| 参数 | 独立的权重矩阵 | 独立的权重矩阵(与编码器不共享) |
信息瓶颈与注意力机制的引入
基本 Seq2Seq 中,编码器的全部输出仅为一个向量 c,解码器只能通过这一个"窗口"访问输入信息:
无注意力: 编码器: x₁ x₂ x₃ x₄ x₅ → c(一个向量) 解码器: c → y₁ y₂ y₃ y₄ ← 生成 y₄ 时仍只能访问 c,早期信息已模糊 有注意力: 编码器: x₁ x₂ x₃ x₄ x₅ → h₁ h₂ h₃ h₄ h₅(保留所有隐藏状态) 解码器: 每步动态计算 cₜ = Σ αₜᵢ · hᵢ ← 生成 y₄ 时可重点"回看" h₂注意力机制让解码器在每一步都能动态聚焦于编码器的不同位置,而非依赖单一压缩向量,这是从 Seq2Seq 到 Transformer 的关键演进。
总结
编码器负责"读":将变长输入序列逐步编码为固定维度的上下文向量 c,是信息从序列到向量的压缩过程。解码器负责"写":以 c 为起点,自回归地逐步生成变长输出序列,是信息从向量到序列的展开过程。两者通过 c 连接,参数独立,各自承担理解与生成的职责。基本架构中 c 是唯一的信息桥梁,这一瓶颈催生了注意力机制,最终演化为 Transformer。
