编程与 AI14 分钟阅读更新于 2026-08-03

Transformer 生成到什么时候才停:EOS、长度上限与自回归循环

围绕解码流程和输出层内容,解释模型如何逐步生成词元、识别结束标记,并在合适时机停止。

相关工具

生成不是预测一次就结束

Transformer 解码器每次只输出当前位置的概率分布,再从词表中选择一个词元。这个词元会被追加到目标前缀,下一轮解码器再根据新的前缀预测下一个词。文中把这个过程描述为逐时间步输出,重复直到生成结束符。

因此,生成文本不是一次从隐藏状态直接展开成完整句子,而是一个不断更新前缀的循环。每一步都会重新计算或复用解码器中的部分状态,输出层再给出新的词表概率。停止条件决定了这个循环何时结束。

Transformer 自回归生成文本并循环预测的流程图
Transformer 的自回归生成循环

模型预测一个词元并追加到前缀,再用新的前缀继续预测,直到满足停止条件。

EOS 是什么

EOS 是 End of Sequence 的缩写,表示序列结束。它通常作为词表中的一个特殊词元,和普通词元一样可以被模型预测,但它的含义不是正文内容,而是告诉生成过程已经可以收束。

如果当前 EOS 的概率最高,解码策略可能选择它,生成循环随后停止。最终展示给用户的文本通常不会把 EOS 当作普通字符,而是把它当成内部控制标记。训练时,目标序列也需要在合适位置包含 EOS,让模型学习何时结束。

为什么不能只靠 EOS 停止

理想情况下,模型会在完整答案后生成 EOS。但模型并不总是可靠:它可能迟迟不给 EOS 足够概率,也可能过早生成 EOS。为了避免无限循环或输出过短,实际生成还需要最大新词元数、最大总长度等限制。

最大长度不是告诉模型答案应该有多长,而是一个外部边界。达到边界后,即使模型没有生成 EOS,系统也会停止继续追加。这样可以避免重复生成、资源消耗过大或异常输出持续占用计算。

Transformer 生成过程检查结束标记和长度上限的示意图
生成过程中的停止判断

每轮预测后检查 EOS、最大长度和其他边界条件,再决定结束或继续生成。

EOS 和句号不是一回事

句号、问号和感叹号是自然语言中的标点,可能出现在句子中间,也可能出现在最后。EOS 则是模型和生成流程使用的控制词元,表示当前输出序列可以结束。一个答案可以以句号结束,但模型仍可能需要继续生成 EOS。

如果把普通标点当成停止条件,模型可能在列举内容、编号或缩写时过早停止;如果完全忽略 EOS,又会让生成过程只能依赖长度上限。因此,文本内容和生成控制需要分开理解。

选词策略会影响什么时候遇到 EOS

EOS 是否被选中,取决于它在当前概率分布中的位置以及采用的解码策略。贪心选择会直接取最高概率词,束搜索会比较多条候选路径,采样则可能按照概率选择非最高项。相同模型和提示,在不同策略下可能得到不同长度的输出。

温度、Top-k 和 Top-p 等设置会改变候选分布或可选范围,也会间接影响 EOS 被选中的机会。参数越鼓励探索,输出可能更有变化,也可能更容易拖长或偏离;更确定的策略通常更容易稳定结束,但不一定总能找到最好的完整路径。

Transformer 不同解码策略选择词元并结束生成的对比图
不同选词策略的结束路径

贪心、束搜索和采样可能沿着不同候选路径到达 EOS 或长度上限。

为什么会出现重复生成或迟迟不结束

如果模型不断重复某些词,可能是当前概率分布在重复上下文中形成了循环,或者解码策略过于偏向局部最高概率。若模型一直不选择 EOS,可能是训练数据中的结束边界不清晰、目标序列处理不一致,或当前生成路径让结束标记始终处于低概率。

排查时先分清是模型分布问题还是停止规则问题。观察每一步的 EOS 概率、已生成长度和最近词元,比单看最终文本更容易判断。也要确认 EOS、起始标记和 Padding Token 没有被混用。

训练时模型如何学会结束

训练时,目标序列通常在真实内容之后追加 EOS。解码器在最后一个正文词的位置学习预测 EOS,之后的补齐位置则不应继续作为普通目标计算损失。这样,模型会把“内容完成”与“选择结束标记”联系起来。

如果训练样本有的包含 EOS、有的不包含,或者结束位置处理不一致,模型对停止的学习就会变得模糊。EOS 不是在推理时凭空添加的规则,而是训练目标的一部分,同时还需要生成过程的长度边界做保护。

把生成循环完整串起来

开始时,解码器接收起始标记或用户提供的目标前缀;模型计算下一词概率,选出一个词元并追加;随后检查它是否是 EOS,是否达到长度上限,是否触发其他停止条件。若都没有满足,就带着更新后的前缀进入下一轮。

这条流程把解码器、输出层和停止规则连接起来。解码器负责根据上下文形成隐藏状态,Linear 和 Softmax 负责给出候选分布,选词策略负责决定追加什么,EOS 和长度边界负责决定何时收束。

常见问题

EOS 会显示在最终文本里吗?

通常不会。EOS 是模型内部的结束控制词元,生成系统检测到它后停止,展示给用户的文本一般会去掉这个标记。

生成达到最大长度但没有 EOS,算生成失败吗?

不一定。最大长度是防止无限生成的保护边界,达到边界只说明本轮生成被截断。还需要结合文本是否完整、EOS 概率和模型任务判断结果。

句号可以代替 EOS 吗?

不能简单替代。句号是正文标点,EOS 是生成控制标记。模型可能在句子中间使用句号,而 EOS 用来表示整个目标序列结束。