用 Seq2Seq 完成英译法从数据到解码的一次实现梳理机器翻译是理解 Seq2Seq 的经典入口。它的目标很直接输入一个源语言词序列输出另一个语言的目标词序列。但真正实现时数据边界、训练时输入和推理时输入往往比网络层本身更容易出错。## 1. Seq2Seq 解决什么问题Seq2Seq 是“序列到序列”的建模框架不等同于某一种网络单元。一个基础翻译模型通常由两部分构成-Encoder逐词读取英文句子将上下文编码为隐藏状态。-Decoder从起始标记出发逐步预测法语词直到结束标记。Encoder 和 Decoder 可以使用 RNN、GRU 或 LSTM。前者是架构后者是网络内部处理时间序列的实现选择。## 2. 数据准备决定了输入输出是否对齐一条翻译样本至少需要源句、目标句和两个特殊标记textsource: I like applestarget input: BOS jaime les pommestarget label: jaime les pommes EOS训练时 Decoder 的输入比标签右移一位。这使模型在每个时间步都学习“看到前面的目标词后下一个词应该是什么”。批处理还要完成词表映射、长度截断、padding 和 padding mask这些规则必须同时作用于训练和预测否则词索引或长度解释会不一致。## 3. 编码与解码的数据流基础 GRU 版本可抽象为text英文 token ids - Embedding - Encoder GRU - encoder hidden stateBOS 已生成 token - Embedding - Decoder GRU - Linear - 目标词表概率训练阶段一般通过交叉熵损失比较每个时间步的预测分布和真实目标词。计算损失时要忽略 padding 的标签否则短句补齐的无意义位置会干扰优化。## 4. Teacher Forcing 为什么有用训练时Decoder 可以把真实的上一个目标词作为下一步输入这就是 Teacher Forcing。它让每个时间步有稳定的上下文训练会更快收敛。但推理阶段没有真实标签只能把模型刚刚预测出的词喂回去。两种状态的差异会带来误差累积一个早期词预测错后续上下文也会随之偏离。常见做法是逐步降低 Teacher Forcing 比例或在验证阶段严格使用自回归解码来观察真实效果。## 5. 推理不是训练的复制单条翻译的推理循环需要明确停止条件pythongenerated [bos_id]hidden encoder(source_ids)for _ in range(max_length): logits, hidden decoder(generated[-1], hidden) next_id logits.argmax(dim-1).item() if next_id eos_id: break generated.append(next_id)这里的max_length是必要的保护避免模型始终不输出EOS时无限循环。除 greedy decoding 外还可以使用 beam search 保留多个候选序列通常能改善翻译质量但代价是更高的推理开销。## 6. 基础模型的局限与注意力改进早期 Encoder-Decoder 往往把整句压缩进最后一个隐藏状态。句子很长时这个固定向量容易成为信息瓶颈。加入 Attention 后Decoder 每一步都可以对 Encoder 的全部时间步重新分配权重不必只依赖最后状态。这也解释了学习顺序先理解基础 Seq2Seq 的“编码后再生成”再理解 Attention 如何让生成过程动态读取源序列最后过渡到 Transformer。## 总结一个可控的 Seq2Seq 实现要保证三件事目标序列右移规则正确、训练与推理输入区分明确、padding 与结束条件处理一致。网络结构只是中间环节数据和解码约束同样决定结果是否可靠。