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

Transformer 是怎样训练的:从目标序列到损失函数

从解码器的目标右移和 Teacher Forcing 出发,理解 Transformer 如何并行预测多个位置、用交叉熵计算损失,并区分训练阶段与生成阶段的输入方式。

相关工具

训练的目标是学会预测下一个词

解码器最终要做的事情,是根据当前已有的上下文,给下一个词分配概率。训练时,模型会看到大量源序列和目标序列样本,并不断比较自己的概率分布与真实下一个词之间的差异。这个过程把“生成文字”转成了可以计算的预测任务。

例如,目标序列是“我 喜欢 学习 <EOS>”。当解码器看到起始标记时,正确答案是“我”;看到“起始标记+我”时,正确答案是“喜欢”;看到“起始标记+我+喜欢”时,正确答案是“学习”。每个位置都对应一个明确的目标词。

模型不是直接学习一整句话的对错,而是在多个位置上反复学习“给定前缀,下一词应该是什么”。许多位置的损失汇总后,才形成一次训练样本的整体误差。

目标序列为什么要右移一位

为了让输入和目标一一对齐,训练时通常把目标序列复制成两行。解码器输入以 <BOS> 开始,后面接目标序列中已经出现的词;训练目标则从第一个真实词开始,最后以 <EOS> 结束。两行相差一个位置。

如果目标是“我 喜欢 学习 <EOS>”,解码器输入可以是“<BOS> 我 喜欢 学习”,期望输出是“我 喜欢 学习 <EOS>”。第一个输入位置预测“我”,第二个输入位置预测“喜欢”,以此类推。

右移不是为了改变句子含义,而是为每个预测位置提供一个已知的前缀起点。没有这个错位关系,模型就无法清楚判断当前输入对应哪个目标词。

Transformer 训练阶段目标序列右移和 Teacher Forcing 的对齐图
Teacher Forcing 与目标右移

训练时使用真实目标序列作为解码器输入,向右错开一位后与期望输出逐位置对齐。

Teacher Forcing 是什么

Teacher Forcing 可以译作教师强制。它指的是:训练第 t 个位置时,解码器使用真实目标序列中前面的词作为输入,而不是使用模型在第 t-1 个位置自己预测出来的词。

这样做的好处是训练稳定、收敛快。即使模型上一位置还没有预测正确,下一位置仍然能在正确前缀的条件下学习,不会因为一个早期错误马上把整条训练路径带偏。

它也带来一个需要注意的差异:训练时的前缀通常比生成时更干净。真正生成时,前一个词可能是模型自己的错误预测,错误会继续影响后面的输入。这种训练和生成条件不完全一致的现象,是理解序列生成的重要基础。

因果掩码让多个位置可以同时训练

既然训练目标序列已经完整存在,为什么不让每个位置直接看到整句答案?答案是必须使用因果掩码。第 t 个位置可以看起始标记和前 t-1 个词,但不能读取第 t 个词及其后面的内容。

掩码保证了每个位置的任务仍然是“根据过去预测未来”。在这个约束下,所有位置的输入都已准备好,模型可以一次性完成整段目标序列的注意力和前向计算,而不需要真的按词等待。

因此,训练阶段同时具备两个特点:使用真实前缀,以及对多个位置并行计算。前者来自 Teacher Forcing,后者来自 Transformer 的矩阵运算和因果掩码。

交叉熵如何评价一次预测

模型在一个位置上会输出整个词表的概率分布。假设真实目标词是 y,模型给它的概率是 p(y),那么这个位置的交叉熵损失可以写成 L=-log p(y)。正确词的概率越高,损失越小;概率越低,损失越大。

例如模型给正确词 0.9 的概率,损失约为 0.105;如果只给 0.01 的概率,损失约为 4.605。损失函数会明显惩罚那些对正确答案缺乏信心的预测,推动模型把更多概率分配给真实目标词。

交叉熵并不要求模型每次都只给正确词分配 1。它只要求真实词获得足够高的概率,同时保留一个合理的概率分布。训练过程会在很多样本和位置上寻找整体更好的分配方式。

Transformer 下一词预测中词表概率与交叉熵损失关系图
交叉熵在下一词预测中的作用

模型输出词表概率分布,交叉熵只关注真实目标词的概率,并惩罚对正确词的低置信度。

多个位置的损失如何汇总

一条目标序列通常包含多个预测位置,每个位置都有一个交叉熵损失。训练时可以把有效位置的损失相加或取平均,得到这条样本的序列损失;再对一个批次中的样本进行汇总,作为本轮参数更新依据。

填充位置通常不应该参与损失计算。如果为了组成相同长度的批次而在句尾补了 PAD,模型不需要把 PAD 当作真实目标学习,否则损失会被无意义的位置干扰。实现时会使用目标掩码,忽略这些位置。

不同任务的目标长度可能不同,所以平均方式也会影响损失数值。比较训练日志时,最好确认是按有效词元平均、按样本平均,还是使用了其他加权方式。

损失如何推动参数更新

交叉熵得到损失后,训练过程会通过反向传播计算每个参数对损失的影响,再使用优化器更新词嵌入、注意力投影、前馈网络和输出层等参数。一次更新不是只改最后的词表投影,前面所有影响预测的组件都可能获得梯度。

如果某个位置的正确词概率偏低,相关梯度会推动模型调整表示和分布,让下一次面对相似上下文时更倾向于正确答案。经过大量样本反复更新,模型逐渐学到词语关系、句法模式和任务中的输入输出对应关系。

这里的“学会”不是一次计算后立即记住答案,而是许多参数在大量例子上的共同调整。损失函数提供方向,优化器决定步长,数据决定模型反复看到哪些模式。

训练和推理的差异要放在一起看

训练时,完整目标序列已知,输入是右移后的真实序列,因果掩码允许所有位置并行预测。推理时,只有起始标记或当前前缀已知,每次只能得到一个新词,再把它追加到输入中。

训练像是在一张已经排好的练习卷上同时检查许多题,推理则像是每做完一题才能拿到下一题的题面。两者使用同一个模型,但输入条件和执行节奏不同。

这也是为什么不能只看训练损失判断生成质量。模型可能在真实前缀下表现很好,但一旦生成中出现错误,后续就要在不理想的前缀上继续预测。评估时需要结合实际生成结果和任务指标。

Transformer 训练阶段与推理阶段流程对比图
Transformer 训练与推理对比

训练使用完整目标序列和因果掩码并行预测,推理从起始标记开始逐步追加词元。

如何判断训练过程是否正常

首先看损失是否在整体下降,但不要要求每一步都下降。批次不同、样本难度不同,短时间波动很正常。更重要的是观察一段时间内的趋势,并结合验证集损失判断模型是否只是记住训练样本。

其次检查目标右移和掩码。很多训练异常并非模型能力不足,而是输入和目标错了一位、未来位置没有屏蔽、PAD 被计入损失,或者起始和结束标记处理不一致。

最后抽取一些固定样本观察概率和生成结果。如果损失下降但生成一直重复、过早结束或完全偏离任务,说明还需要检查数据、词元化、解码策略和训练验证分布,而不能只继续增加训练轮数。

训练流程的四个检查点
步骤 1
目标右移

解码器输入从 BOS 开始,期望输出向后错开一位。

步骤 2
因果掩码

每个位置只能看到自己和之前的位置。

步骤 3
损失屏蔽

PAD 等无效位置不参与交叉熵汇总。

步骤 4
结果核对

同时查看损失趋势、验证集和固定样本生成结果。

把训练链路连回 Transformer

从输入到参数更新,可以把整条链路串起来:编码器理解源序列,解码器读取目标前缀并预测下一个词,输出层产生词表概率,交叉熵比较预测与真实目标,反向传播和优化器再调整 Transformer 内部的参数。

位置编码让顺序可见,多头注意力负责信息交互,前馈网络加工表示,残差和层归一化维持深层计算的稳定,掩码和目标右移则保证训练任务与自回归生成一致。每个组件都在这条训练链路上有明确位置。

下一步继续学习优化器、学习率和解码策略,就能从“模型如何计算”进一步走到“模型如何被训练好、如何把概率变成最终文本”。

常见问题

Teacher Forcing 会不会让模型过度依赖正确答案?

它确实让训练前缀比实际生成更理想,但能显著提高训练效率和稳定性。实际系统通常还会通过验证集、生成评估或其他训练策略观察这种差异。

为什么训练时能并行预测,生成时不能?

训练时完整目标序列已知,可以结合因果掩码同时计算多个位置;生成时未来词未知,必须先得到前一个预测再继续。

交叉熵只看正确词的概率吗?

标准单标签交叉熵的核心确实是惩罚真实目标词的低概率,但概率分布经过 Softmax 后仍受到所有候选词共同约束。