基础篇

F18|一次训练从头到尾:标签、交叉熵和Adam

基础篇约 3.4 千字1 组分步图解

从具体对象与小例子开始,理解计算过程与适用条件。

本章目录
动态图解 · F18

训练:给每个位置一道“下一项”题

为什么训练看完整句,生成却只能往前走?

训练时答案放在试卷的评分区,所以各位置的题目可以同时准备;mask负责不让模型读到自己的答案。生成时后续Token还未决定,下一题的前缀依赖本题选择。两者共享因果预测目标,但已知信息不同。

标签用于评分的真实下一Token。
交叉熵本例为真实目标概率的负对数。
有效目标数实际参与评分的位置数,不必等于补齐长度。

输入与适用条件:标签对齐使用5项序列;单位置交叉熵与PAD平均分别是明确独立的小例,不假称那些概率来自对齐图的模型。

1 / 5 · 把输入和目标错开一格

第1步,共5步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

训练:给每个位置一道“下一项”题:把输入和目标错开一格我输入0爱输入1学习输入2!输入3爱目标0学习目标1!目标2EOS目标3

完整教学序列为“我/爱/学习/!/EOS”。输入用前四项,目标用后四项。每个输入位置预测的是其后一个真实Token。

输入=[1,2,3,5];目标=[2,3,5,6]

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

用清晰的预测任务,把参数更新与语言序列关系连接。

怎样实现

正确移动标签、限制可见性、屏蔽无效目标、按有效数归一化。

可能的代价与误解

偷看未来会产生漂亮但虚假的训练成绩;训练样本重复或泄漏也会高估泛化。

如何判断是否做对

用极小固定序列验证每个输入位置和目标位置,再验证PAD不影响有效损失。

先把“要预测什么”对齐

有一段Token序列[a,b,c,d]。下一Token训练可以组织为:

输入位置:a  b  c
目标标签:b  c  d

a所在位置根据a预测b,b所在位置根据ab预测c,c所在位置根据abc预测d。标签label是本次要比较的正确答案;teacher forcing是在训练中使用数据里的真实前缀,而不是总用模型自己刚生成的前缀。

为什么不是输入a就预测a?因为这个目标会变成拷贝已知输入,而不是学习接下来出现什么。实际模型API可能内部移动标签;外部代码再次移动会错两位,必须确认责任边界。

交叉熵从一个正确候选开始

假设正确下一Token是c,模型给它概率0.8。一种常用损失是−ln(0.8)≈0.2231。若只给0.2,则−ln(0.2)≈1.6094,错误更大。

这种对正确目标的负对数概率,是单一正确标签下的交叉熵损失。概率越接近1,损失越接近0;给真实标签的概率越小,惩罚越大。

若正确候选用one-hot表示,即词表长度的一排0里只有正确项为1,记作y,那么通式是L=−Σ_i y_i ln p_i。因为其他y_i为0,最后只留下正确项。

对softmax前分数z的导数简化为∂L/∂z_i=p_i−y_i。这解释了为什么训练会推动正确项分数提高、错误项分数下降;再经输出矩阵与各层反传到前面的参数。

多位置与填充怎样评分

对每个有效目标位置算损失,然后求和或平均。PAD位置通常不应当成真实语言目标;指令微调还可能只对助手输出部分计分。这就是loss mask。

如果每批真实长度不同,按样本平均和按有效Token平均可能得到不同权重。报告loss时,要知道分母是什么。不能只看数字变小就断言学习更好。

困惑度perplexity常为平均负对数似然的指数。只有分词、数据和计分条件可比时才适合直接比较,不是任意两个模型的统一聪明指数。

把一个优化步写完整

取一批训练样本
-> 准备输入、标签与mask
-> 用现有参数前向计算概率
-> 计算损失
-> 反向传播得到梯度
-> 按训练意图合并或清理梯度
-> 优化器更新参数
-> 进入下一批

梯度累积是先对若干小批计算并累积梯度,再更新一次,以模拟更大的有效批次;它不让单条超长输入的激活存储自动消失。梯度如何缩放必须与损失平均方式对应。

Adam为什么会保存额外状态

本节的训练记号:g是当前参数的梯度;m是梯度的滑动平均;v是平方梯度的滑动平均;β₁、β₂是设置的平滑系数;t是优化步编号;帽子记号如m̂表示经过偏差修正。这里的小写v不是Attention的Value,β也不是LayerNorm中的偏移参数。m/v会随训练步骤更新并占用额外存储;它们不是本次输入的Token特征。

最简单梯度下降只用当前梯度g。Adam还保存梯度的平滑平均m和平方梯度的平滑平均v,帮助调整各参数步幅。示意式为:

m新 = β1×m旧 + (1−β1)×g
v新 = β2×v旧 + (1−β2)×g²

β是0到1之间的平滑系数,不是模型学到的词义。因为初值常为0,开始时平均偏小,所以会做偏差修正。例如首步g=2、β1=0.9:m=0.2,除以1−0.9得到修正后的2。

随后用修正m除以修正v的平方根再更新。AdamW把权重衰减作为解耦操作处理。完整公式在高级章节;本课先解释“为什么要多存m和v”,这也说明训练显存不能只算权重。

学会训练不等于已经学会泛化

训练集用于更新参数;验证集用于选择方案与调参;测试集用于相对独立地评估。把测试答案放进训练或反复按测试结果调Prompt,会污染评估。

在固定小序列上loss降很低,只说明这个训练过程学会了该分布,不能据此声称模型能理解任意语言。真正工程结果还要看新任务、新数据、稳定性和成本。

运行示例 · F18

把三个训练位置逐一评分,不让PAD混入平均数

输入与条件。真实序列是“我/爱/学习/EOS”,输入 [1,2,3] 对应目标 [2,3,EOS]。假设三个正确目标的预测概率分别为0.8、0.5、0.25。

步骤与对象内部动作中间结果 / 新状态
1第1位置看到“我”,目标是“爱”损失 −ln(0.8)≈0.223144。
2第2位置看到“我爱”,目标是“学习”损失 −ln(0.5)≈0.693147。
3第3位置看到“我爱学习”,目标是EOS损失 −ln(0.25)≈1.386294。
4合并有效位置三项相加再除3平均约0.767528,不是先平均概率再取负对数。
5补齐对照若后面还有2个PAD且不计分仍除以3;除以5会把损失假装压低。

把过程连起来。训练标签向后错一位,含义就从“预测下一个Token”变成另一目标。损失下降也不能证明对齐正确。

边界与反例。使用自然对数;概率是构造的。表中结果由程序计算,未训练真实模型。

依据与适用范围:[CE]。示例输入和场景由本书明确设定。

运行示例 · X12

padding位置不计损失,分母也必须一起变

输入与条件。安排4个预测位置,其中1个是PAD。3个有效标签的正确Token概率分别为0.8、0.5、0.25;不使用样本权重。

步骤与对象内部动作中间结果 / 新状态
1逐项算负对数−ln0.8≈0.223144,−ln0.5≈0.693147,−ln0.25≈1.386294有效损失和≈2.302585。
2排除PADPAD不贡献loss,也不贡献有效数量有效数量是3,而不是安排位置数4。
3求均值2.302585/3平均loss≈0.767528。
4反例只把PAD的loss置零,却仍除以4得到0.575646,数值变小但模型没有变好。
5接到变长批次不同补齐比例若用错分母仅改变组批策略,就可能使训练曲线产生虚假的改善。

把过程连起来。忽略标签不只是“让那一格等于0”,还要保持聚合与归一化口径正确。

边界与反例。这里采用无权重有效标签均值;带类别权重、样本权重或自定义归约的实现,分母可能另有定义。

依据与适用范围:[CE]。示例输入和场景由本书明确设定。

课后自检

自检 1

正确项概率从0.25升到0.5,负对数损失是上升还是下降?

查看参考答案收起参考答案
下降,从约1.3863降到0.6931。这里使用自然对数。
自检 2

为什么恢复训练可能还需优化器状态而不只是权重?

查看参考答案收起参考答案
Adam等优化器保存历史平滑量,此外步数和学习率状态也会影响后续更新。只恢复权重未必延续同一训练轨迹。

机制依据:[F-AUTOGRAD][ADAMW][RLHF]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。