F18|一次训练从头到尾:标签、交叉熵和Adam
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
训练:给每个位置一道“下一项”题
为什么训练看完整句,生成却只能往前走?
训练时答案放在试卷的评分区,所以各位置的题目可以同时准备;mask负责不让模型读到自己的答案。生成时后续Token还未决定,下一题的前缀依赖本题选择。两者共享因果预测目标,但已知信息不同。
输入与适用条件:标签对齐使用5项序列;单位置交叉熵与PAD平均分别是明确独立的小例,不假称那些概率来自对齐图的模型。
1 / 5 · 把输入和目标错开一格
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
完整教学序列为“我/爱/学习/!/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降很低,只说明这个训练过程学会了该分布,不能据此声称模型能理解任意语言。真正工程结果还要看新任务、新数据、稳定性和成本。
把三个训练位置逐一评分,不让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]。示例输入和场景由本书明确设定。
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排除PAD | PAD不贡献loss,也不贡献有效数量 | 有效数量是3,而不是安排位置数4。 |
| 3求均值 | 2.302585/3 | 平均loss≈0.767528。 |
| 4反例 | 只把PAD的loss置零,却仍除以4 | 得到0.575646,数值变小但模型没有变好。 |
| 5接到变长批次 | 不同补齐比例若用错分母 | 仅改变组批策略,就可能使训练曲线产生虚假的改善。 |
把过程连起来。忽略标签不只是“让那一格等于0”,还要保持聚合与归一化口径正确。
边界与反例。这里采用无权重有效标签均值;带类别权重、样本权重或自定义归约的实现,分母可能另有定义。
依据与适用范围:[CE]。示例输入和场景由本书明确设定。
课后自检
正确项概率从0.25升到0.5,负对数损失是上升还是下降?
查看参考答案收起参考答案
为什么恢复训练可能还需优化器状态而不只是权重?
查看参考答案收起参考答案
延伸阅读:相关系统问题
01|输入究竟是什么:从用户的一句话到模型张量03|注意力的深入追问:位置、掩码、多头与反向传播
05|训练的一步:从正确标签到参数真正改变
06|后训练、MoE与模型定制:能力和行为如何改变
28|研究深水区与系统综合判断
机制依据:[F-AUTOGRAD][ADAMW][RLHF]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。