目录
前两课里,我们看到了生成过程:模型根据已有文字,预测下一个 Token,再把它追加到末尾。
但模型一开始并不知道什么词应该接在后面。它是怎样学会的?答案并不神秘:给它大量文本,遮住每个位置的正确答案,让它不断预测、对答案、改参数。
输入:小猫 趴在 窗边
目标:趴在 窗边 因为
训练的核心不是背下一整句话,而是在许多上下文中反复练习“下一个 Token 是什么”。
1、训练目标其实很朴素
假设训练文本是:
小猫趴在窗边
经过 Tokenizer 后,模型看到一串 Token。每个位置的任务都是:根据左侧内容,预测紧随其后的 Token。
| 已知上下文 | 正确的下一个 Token |
|---|---|
| 小猫 | 趴在 |
| 小猫 趴在 | 窗边 |
| 小猫 趴在 窗边 | <结束> |
这就是 Next Token Prediction,也叫自回归语言建模。
2、一句话如何变成训练样本
实现时不需要把一句话手工拆成许多条数据。只要把同一个序列错开一位:
Token IDs: [小猫, 趴在, 窗边, 因为, 它]
输入 X: [小猫, 趴在, 窗边, 因为]
标签 Y: [趴在, 窗边, 因为, 它]
输入和标签长度相同,标签只是整体向左移动一位。若批次形状为 $[B,T]$,模型最后会输出 $[B,T,V]$:每个位置都有一份覆盖整个词表的预测分数。
3、Teacher Forcing:一次并行预测
生成时,模型必须先生成第一个 Token,才能继续生成第二个,因此是串行的。
训练时,完整正确文本已经存在。模型在每个位置都使用真实的前文作为输入,这叫 Teacher Forcing。配合 Causal Mask,它可以同时计算所有位置的预测:
| 位置 | 模型能看到 | 要预测 |
|---|---|---|
| 1 | 小猫 | 趴在 |
| 2 | 小猫、趴在 | 窗边 |
| 3 | 小猫、趴在、窗边 | 因为 |
“同时计算”不等于偷看答案。Causal Mask 仍然遮住未来位置,只是 GPU 可以把各位置的计算并行完成。
4、用交叉熵衡量错得多远
模型输出 Logits,Softmax 把它们变成概率。假设正确答案是“窗边”:
| 候选 Token | 模型概率 |
|---|---|
| 窗边 | 0.10 |
| 沙发 | 0.45 |
| 门口 | 0.25 |
| 其他 | 0.20 |
模型给正确答案的概率只有 0.10,损失就会比较大。单个位置常用的交叉熵可以写成:
\[L=-\log p(y)\]$p(y)$ 是模型给正确 Token 的概率。概率越接近 1,损失越小;概率越接近 0,损失越大。训练时会对有效位置的损失取平均,Padding 位置通常不参与计算。
5、反向传播:模型如何改正
算出 Loss 后,训练进入“改参数”阶段:
- 反向传播计算每个参数对 Loss 的影响,也就是梯度。
- 优化器根据梯度更新参数。
- 下一批文本再做一次前向计算。
- 重复许多次,让正确 Token 的概率逐渐升高。
被更新的不只是 LM Head,也包括 Embedding、Attention、FFN 等可训练参数。可以把一次更新简化为:
\[\theta \leftarrow \theta-\eta\nabla_{\theta}L\]其中 $\theta$ 表示模型参数,$\eta$ 是学习率。梯度告诉模型往哪个方向改,学习率决定每次改多少。
6、训练与生成有什么不同
| 对比项 | 训练 | 生成 |
|---|---|---|
| 前文来源 | 数据中的正确 Token | 模型刚生成的 Token |
| 计算方式 | 多个位置并行 | 一次生成一个 Token |
| 是否有标签 | 有 | 没有 |
| 是否计算 Loss | 是 | 否 |
| 是否更新参数 | 是 | 否 |
训练是在“有答案的练习册”上改参数;生成是在“没有答案的新问题”上使用已经学到的参数。
一次完整训练
| 阶段 | 发生了什么 | 典型形状 |
|---|---|---|
| Tokenize | 文本变成 Token ID | $[B,T]$ |
| Forward | Transformer 计算上下文表示 | $[B,T,d_{model}]$ |
| LM Head | 映射到词表 Logits | $[B,T,V]$ |
| Cross Entropy | 与右移一位的标签比较 | 标量 Loss |
| Backward | 计算参数梯度 | 与参数同形状 |
| Optimizer Step | 更新参数 | 新的 $\theta$ |
容易混淆的三件事
- 训练目标简单,不代表模型学到的能力简单。 大量数据和参数让预测任务迫使模型学习语法、事实和上下文关系。
- Loss 下降不等于模型真正“理解”了世界。 它只说明模型在训练目标上做得更好。
- 一次训练不是记住一次答案。 参数更新来自大量样本的共同作用。
第三课复习总图
下一课,我们可以继续看:模型训练时,数据究竟是怎样被整理、拼接并送进 GPU 的?