Seq2Seq机器翻译中的编码器-解码器经典解读本文是一篇原创中文论文解读参考 Dive into Deep Learning 1.0.3 中的 “Sequence-to-Sequence Learning for Machine Translation” 章节并结合 Cho et al. 2014、Sutskever et al. 2014 的序列到序列学习思想进行梳理。本文不是逐段翻译而是围绕模型结构、训练目标、推理方式和历史影响做结构化讲解。原文与图片遵循 D2L 开源书许可正文与图示为 Creative Commons Attribution-ShareAlike 4.0 International License示例代码为 modified MIT license。为什么 Seq2Seq 是经典在深度学习进入机器翻译之前翻译系统通常依赖复杂的短语表、对齐模型和大量人工特征。Seq2Seq 的关键转折在于它把“输入一句话、输出另一句话”抽象成一个端到端的条件序列建模问题。给定源语言序列x1,x2,…,xTx_1, x_2, \ldots, x_Tx1,x2,…,xT模型要学习目标语言序列的条件概率P(y1,y2,…,yT′∣x1,x2,…,xT)P(y_1, y_2, \ldots, y_{T} \mid x_1, x_2, \ldots, x_T)P(y1,y2,…,yT′∣x1,x2,…,xT)这件事今天看起来很自然因为 Transformer、BART、T5、GPT 式生成模型都把“上下文条件下的逐 token 生成”当作基本接口。但在 2014 年前后Seq2Seq 的贡献是把可变长输入和可变长输出统一进一个神经网络框架编码器先读完源序列解码器再逐步生成目标序列。图示来自 D2L英文句子 “They are watching . ” 被编码后解码器以bos作为起点逐步生成法语序列 “Ils regardent . ”。这里最值得注意的是两个特殊符号bos告诉解码器“开始生成”eos告诉系统“这句话结束了”。编码器把变长输入压成上下文最朴素的 RNN Seq2Seq 编码器做一件事按顺序读入源句子的 token把每一步的词向量和前一时刻隐藏状态合并成新的隐藏状态。可以写成htf(xt,ht−1)\mathbf{h}_t f(\mathbf{x}_t, \mathbf{h}_{t-1})htf(xt,ht−1)其中xt\mathbf{x}_txt是第ttt个 token 的嵌入向量ht\mathbf{h}_tht是编码器到当前位置为止积累的状态。读完整个句子后编码器用某个函数qqq把全部隐藏状态汇总为上下文变量cq(h1,…,hT)\mathbf{c} q(\mathbf{h}_1, \ldots, \mathbf{h}_T)cq(h1,…,hT)在 D2L 的基础实现里最直接的选择是取最后一个隐藏状态hT\mathbf{h}_ThT作为上下文。这个设计很优雅也很残酷整句话必须被压进一个固定形状的向量。短句时它工作得不错句子变长后早期信息容易被压缩损失这也是后来注意力机制登场的直接动机之一。从层次看编码器通常是Embedding - Recurrent解码器是Embedding - Recurrent - FC。Embedding 把离散词表索引变成连续向量循环层负责时间维度上的状态传递最后的全连接层把解码器隐藏状态映射到目标词表上的概率分布。解码器条件语言模型如果暂时忘掉编码器解码器本质上就是一个语言模型根据前面已经出现的 token 预测下一个 token。Seq2Seq 的不同之处在于解码器还要看编码器给出的上下文c\mathbf{c}c。在第t′tt′个解码步解码器状态可写成st′g(yt′−1,st′−1,c)\mathbf{s}_{t} g(y_{t-1}, \mathbf{s}_{t-1}, \mathbf{c})st′g(yt′−1,st′−1,c)随后通过 softmax 得到下一个 token 的分布P(yt′∣y1,…,yt′−1,c)P(y_{t} \mid y_1, \ldots, y_{t-1}, \mathbf{c})P(yt′∣y1,…,yt′−1,c)这就是“翻译”被神经网络化后的核心形态不是一次性吐出整句话而是在源句上下文约束下一个 token 一个 token 地采样或选择。D2L 的实现还有一个重要细节它把编码器最终隐藏状态用来初始化解码器隐藏状态并且在每个解码步都把上下文变量拼接进输入。这相当于不断提醒解码器“你现在生成的词必须服从那句源语言的语义。”Teacher Forcing训练和推理为什么不一样Seq2Seq 训练时通常使用 teacher forcing。做法是解码器第t′tt′步的输入不使用模型自己上一步预测出的 token而使用真实目标序列里前一个 token。例如目标句子是bos Ils regardent . eos训练时输入给解码器的是bos Ils regardent .要求模型预测的是Ils regardent . eos这种“右移一位”的训练方式和语言模型非常相似。它的好处是收敛更快、梯度更稳定因为模型不会在训练初期被自己错误的预测带偏。代价是训练和推理存在分布差异推理时真实答案不可见模型只能把自己上一步的输出再喂回去。这个差异后来被称为 exposure bias。它解释了很多生成模型的常见现象训练损失看起来不错但一旦开头几步生成错了后续错误会逐步累积。掩码损失不要让pad参与学习机器翻译训练通常按 minibatch 处理句子。为了让一个 batch 里的句子长度一致需要在短句末尾补pad。但pad只是占位符不是实际语言内容。如果把pad也纳入交叉熵损失模型就会被迫学习“预测填充符”训练目标会被污染。因此需要 masked loss。简化伪代码如下losscross_entropy(predicted_tokens,target_tokens)masksequence_mask(valid_lengths)lossloss*mask lossloss.sum()/mask.sum()这个设计看似工程细节其实很关键Seq2Seq 的目标不是让矩阵形状好看而是让模型只在真实 token 上接受监督。今天在 Transformer、语音识别、多模态序列建模里mask 仍然是序列模型的基本工具。推理从bos到eos的逐词生成训练时有 teacher forcing推理时没有。Seq2Seq 推理流程通常是1. 编码器读完整个源句得到上下文 c 2. 解码器以 bos 作为第一个输入 3. 预测下一个 token 4. 把预测 token 再喂回解码器 5. 重复直到生成 eos 或达到最大长度最简单的策略是 greedy decoding每一步都选概率最大的 token。这种方法实现容易但不一定全局最优。比如某一步贪心选择的词局部概率最高却可能让后续句子变得别扭。D2L 在下一节引出 beam search正是为了缓解这种局部贪心问题。BLEU翻译质量如何量化Seq2Seq 输出的是一句话不能只用分类准确率评价。机器翻译里常见指标是 BLEU。它的核心思想是比较预测句子和参考句子之间的 n-gram 重合程度同时惩罚过短输出。可以把 BLEU 理解成两个部分精确率预测句子里的 1-gram、2-gram、3-gram、4-gram 有多少能在参考句子中找到。长度惩罚如果模型只输出很短的片段不能因为少犯错就拿高分。D2L 给出的形式可概括为BLEUexp(min(0,1−lenlabellenpred))∏n1kpn1/2n\text{BLEU} \exp\left(\min\left(0, 1 - \frac{\text{len}_{label}}{\text{len}_{pred}}\right)\right) \prod_{n1}^{k} p_n^{1/2^n}BLEUexp(min(0,1−lenpredlenlabel))n1∏kpn1/2n其中pnp_npn是 n-gram 精确率。这个指标并不完美它不能真正理解语义也可能低估合理但不同措辞的译文。但在神经机器翻译早期BLEU 提供了一个可重复比较的共同标尺。它的局限恰好指向下一代模型经典 RNN Seq2Seq 最大的瓶颈是固定长度上下文。源句越长最后状态越难保留所有细节。解决方向主要有三条注意力机制不再要求编码器把所有信息压进一个向量而是允许解码器在每一步动态查看源序列不同位置。更强的搜索策略用 beam search 等方法减少逐步贪心带来的全局错误。并行架构Transformer 去掉循环结构通过自注意力和位置编码在并行计算中建模长距离依赖。从历史脉络看Seq2Seq 不是被 Transformer 简单替代而是提供了序列生成任务的基本语言encoder、decoder、context、teacher forcing、autoregressive decoding、mask、BLEU。这些概念今天仍然在大模型训练和推理里反复出现。读这篇经典方法应该抓住什么Seq2Seq 的价值不只在机器翻译。它提出了一种通用接口把一个序列映射成另一个序列。后来很多任务都能放进这个框架摘要长文输入摘要输出。对话历史上下文输入回复输出。语音识别声学特征序列输入文本输出。代码生成自然语言或代码上下文输入代码 token 输出。多模态生成图像、语音、文本等不同模态之间的序列转换。如果只记住一句话Seq2Seq 把“结构化预测”变成了“条件生成”。这一步让深度学习从分类器走向可生成、可翻译、可对话的模型体系。参考来源与许可说明本文主要参考Dive into Deep Learning 1.0.3, “Sequence-to-Sequence Learning for Machine Translation”https://d2l.ai/chapter_recurrent-modern/seq2seq.htmlCho et al., 2014, “Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation”https://arxiv.org/abs/1406.1078Sutskever, Vinyals, Le, 2014, “Sequence to Sequence Learning with Neural Networks”https://arxiv.org/abs/1409.3215Papineni et al., 2002, “BLEU: a Method for Automatic Evaluation of Machine Translation”https://aclanthology.org/P02-1040/许可说明D2L 英文开源书 README 的 License Summary 声明书籍正文按 Creative Commons Attribution-ShareAlike 4.0 International License 发布示例和参考代码按 modified MIT license 发布。本文为原创中文解读保留来源链接、作者归属和许可说明所用 D2L 图示已下载备份并转换为 PNG 以便 CSDN 展示。