打开网易新闻 查看精彩图片

训练一个翻译模型,最尴尬的不是翻错,而是翻完了还不停嘴。

原文「let's go」明明只有两词,西班牙语「Vamos」一出就该收工。但解码器(decoder,序列生成器)像个话痨主播,非要等到EOS(End of Sequence,序列终止符) token才会闭嘴。这个设计细节,把无数新手坑进无限循环的深渊。

解码器的"强迫症":没有EOS就永不停机

解码器的"强迫症":没有EOS就永不停机

Seq2Seq的解码流程像一条装配流水线。编码器(encoder,序列理解器)把英文句子压成上下文向量(context vector),解码器再逐词吐出生成结果。每一步的输入来自上一步的输出——第一个词是EOS token,之后全是自己刚预测的词。

问题就出在这个闭环里。解码器没有内置的"说完判断",它的停止条件只有一个:输出EOS。 就像老式录音机没有自动停机功能,磁带走到头还继续空转,直到你手动拔电源。

实战中这会导致两种灾难:一是模型学坏了,永远学不会输出EOS,生成结果无限拉长;二是遇到训练数据里没见过的模式,解码器陷入循环重复(比如「非常非常非常…」)。2016年Google Neural Machine Translation上线初期,工程师就踩过这个坑——某些语言对的翻译结果偶尔溢出长度限制,后台日志里全是被强制截断的半句话。

原文给的解决方案很朴素:设一个最大输出长度(maximum output length)。超过就硬掐。这招治标不治本,但至少防止了服务挂掉。

教师强制:用"作弊"换取训练稳定

教师强制:用"作弊"换取训练稳定

打开网易新闻 查看精彩图片

训练阶段有个更隐蔽的坑。按推理逻辑,解码器应该用上一时刻的预测词作为下一时刻输入。但这会让误差像滚雪球——第一步猜错,后面全歪,梯度传播时根本找不到正确的优化方向。

工程师们想了个损招:训练时直接把正确答案塞进去,不管模型上一刻预测了什么。这叫教师强制(teacher forcing)。

「这就像学骑自行车时,教练全程扶着后座,你只管蹬踏板。」Google Brain的论文里打过这个比方。好处是收敛快,模型能快速学会词与词的对应关系;坏处也明显——推理时没有教练扶车了,模型容易懵。

暴露偏差(exposure bias)由此而来。训练时解码器看到的都是标准答案,推理时却要吃自己的"残羹剩饭",分布偏移导致性能断崖。2015年Bengio团队专门发了篇论文讲这个问题,提出scheduled sampling(计划采样)来缓解——训练后期逐渐混入模型自己的预测,让解码器提前适应"自力更生"。

但scheduled sampling也有争议。Yoshua Bengio后来承认,这招在理论上有点脏,破坏了最大似然估计的纯净性。工业界用得不多,多数团队还是选择纯教师强制,靠更大的数据量和更聪明的推理策略(如beam search,束搜索)来填坑。

注意力机制:上下文向量的"越狱"

原文埋了个伏笔:下一篇讲注意力机制(attention mechanism,注意力分配机制)。这其实是解决Seq2Seq根本缺陷的钥匙。

传统编码器把整个句子压成固定长度的上下文向量,信息瓶颈明显。长句子的前半截细节,在向量里被后半截挤得稀碎。解码器生成每个词时,这个向量都是同一副面孔,不管当前要生成的是主语还是宾语。

打开网易新闻 查看精彩图片

注意力机制让解码器"回头看"。生成每个词时,它动态地扫一遍编码器的所有隐藏状态,算出一套权重,把当下最相关的信息拎出来。上下文向量不再是压缩饼干,而是按需现榨的果汁。

2014年Bahdanau等人提出这个机制时,机器翻译的BLEU分数(双语评估替补,自动衡量翻译质量的指标)直接跳涨。更关键的是,它让解码器的停止逻辑有了新可能——注意力权重分布本身可以作为"说完了"的信号。当所有位置的注意力都趋于平淡,EOS的概率自然飙升。

不过这是后话。原文的八篇系列到此收尾,基础架构的坑已经够喝一壶。

三个细节,检验你是否真懂了

三个细节,检验你是否真懂了

第一,EOS token在训练时既是解码器的起始输入,也是终止目标。这个双重身份常被忽略——它是整个序列的"书挡",一头一尾夹住生成内容。

第二,教师强制虽然"作弊",但在Transformer架构里依然标配。GPT系列预训练时,每个位置看到的都是前文的真实token,而非模型预测。自回归(autoregressive,逐词生成)的诅咒与馈赠,在此奇妙平衡。

第三,最大输出长度这个兜底策略,在ChatGPT类产品里演变成了max_tokens参数。用户感知到的"话没说完就被掐",往往是触发了这个硬边界,而非模型主动选择EOS。

InstallerPedia的结尾广告倒是贴切——安装软件时,进度条走到100%还卡住的绝望,和解码器等不到EOS的焦虑,大概是同一种现代性困境。

你的翻译模型,有没有在深夜日志里无限循环过?最后是怎么掐停的——硬截断、长度惩罚,还是干脆上了Transformer?