K 的一隅

AI Transformer 入门

正确答案藏在原文右边:Transformer 的完整训练流程

跟随一条训练样本,看标签右移、交叉熵、反向传播和优化器更新如何接成闭环。

4 分钟阅读 更新于 2026-07-28
本文目录

一条训练样本的完整处理过程

训练闭环

跟着一条样本走完:右移 → 损失 → 更新

自监督里的“下一个 Token”标签,就藏在原文右边一位。

原文
上下文
目标 · 下一个 Token

前缀进入模型

构造训练对

语言模型预训练常采用自监督(Self-Supervised Learning):监督信号来自原文自身,而不是人工为每个位置手写标签。对“我 爱 猫 。”做标签右移,就得到:

  • 上下文“我” → 下一个 Token“爱”
  • 上下文“我 爱” → 下一个 Token“猫”
  • 上下文“我 爱 猫” → 下一个 Token“。”

真实训练会把许多位置并行计算,并用因果掩码防止偷看未来。

从 Logits 到交叉熵

前向传播经过 Embedding、多层 Transformer Block 和输出投影,得到词表上每个候选的 Logits。交叉熵(Cross-Entropy)根据正确 Token 的概率计算损失;正确答案概率越低,惩罚越大。

随后反向传播用链式法则计算各参数的梯度。优化器再根据梯度与学习率更新参数:前者算出“该往哪改”,后者执行“这一步改多少”。

每个 Token 要单独训练 QKV 吗

不需要。训练保存并更新的是各层共享的 W_Q/W_K/W_V 等权重。每批输入的 Q/K/V 都由当前隐藏表示实时乘这些权重得到。新句子仍使用同一套规则,所以模型学习的是转换规律,而不是保存所有句子的 QKV。

一次参数更新通常汇总一个 Mini-Batch 的损失。许多批次构成持续训练过程,而不是人工在每轮之间介入。

标签右移为何能产生许多训练题

一段长度为 n 的 Token 序列可以提供接近 n−1 个“根据左边预测右边”的位置。模型不需要把每个前缀复制成独立文件;因果掩码允许整段在矩阵中并行计算,同时保证每个位置看不到自己的未来。

例如整句 Token 是 [我, 爱, 猫, 。]。训练时可以把输入写成前三个位置 [我, 爱, 猫],对应目标写成右移后的 [爱, 猫, 。]——第三个目标「。」来自原句最后一个 Token。第一个输出与“爱”比较,第二个与“猫”比较,第三个与“。”比较。各位置的交叉熵通常汇总成批次损失,再进行一次反向传播。

这就是自监督的关键:正确答案仍然存在,只是它由原始文本自动构造,不要求人工逐个标注。数据质量依然重要;混乱、重复或错误文本也会提供不理想的学习信号。

交叉熵具体惩罚什么

若正确 Token 的预测概率是 p,单个位置的损失可写成:

L = −log(p)

当 p 接近 1,损失接近 0;当 p 很小,负对数迅速增大。它关注正确类别获得了多少概率,而不是只检查概率最大的候选是否恰好正确。因此即使模型选对了第一名,把正确答案从 0.55 提升到 0.9 仍会降低损失。

实现时通常直接从 Logits 计算稳定的交叉熵,不需要先手动生成可能数值不稳定的完整 Softmax。概念上仍可理解为:输出分布与正确 Token 之间的差距。

一次 Mini-Batch 更新发生什么

训练程序取一批序列,完成前向传播,汇总所有有效位置的损失,再执行一次反向传播。每个参数会收到这一批样本共同形成的梯度。优化器读取梯度并更新参数,然后清空或重置梯度缓冲,进入下一批。

一个 Epoch(训练轮次)通常指训练数据被整体使用一遍,但大模型语料极大,训练安排不一定强调传统意义上的多轮遍历。真正决定更新次数的是 Token 数、批量大小、梯度累积和训练步数。

训练时哪些东西在变化

Embedding、每层 Attention 的投影矩阵、FFN、Norm 系数以及输出投影都可能是参数。Q/K/V、注意力分数、隐藏状态和 Logits 则是当前批次产生的中间结果。参数在优化器步骤后改变;中间结果在下一批输入到来时重新计算。

因此“第二句话里的猫是否重新训练 QKV”不是准确问法。第二句话会生成新的 Q/K/V;它产生的损失会继续调整共享的 W_Q/W_K/W_V。久而久之,同一套权重能处理许多未见过的组合。

训练什么时候停止

训练不会只盯着训练损失是否接近 0。开发者还会观察验证损失、下游评测、学习率曲线、梯度稳定性和计算预算。训练损失继续下降而验证表现变差,可能提示过拟合;损失突然爆炸则可能意味着数值或学习率问题。

训练完成后保存的是模型参数和配置。推理阶段通常不再运行反向传播或优化器,而是用固定参数一次次执行前向计算。下一篇的 Prefill 与 Decode 就发生在这个阶段。