跳转到内容

基础原理第 12 篇,共 13 篇

交叉熵:从正确 token 概率到 loss

解释 one-hot、softmax 分母、平均 loss 与 logits 梯度 p−q

更新于 阅读约 2 分钟

交叉熵衡量模型给正确答案分配了多少概率。正确 token 的概率越大,loss 越小;它没有要求训练时先选出一个离散 token。

先读:输入与标签对齐。接着读:梯度如何改变权重。

设词表的 logits 为 z,softmax 概率:

pj=ezj∑k=099ezkp_j=\frac{e^{z_j}}{\sum_{k=0}^{99} e^{z_k}}

正确 token ID 为 y。one-hot 目标 q_y=1,其他 q_j=0,则:

L=−∑j=099qjln⁡pj=−ln⁡pyL=-\sum_{j=0}^{99}q_j\ln p_j=-\ln p_y

求和化简了,softmax 分母没有化简。 所有 100 个 logits 都参与概率归一化。把错误 token 的 logits 调高,也可能降低正确 token 的概率。

库通常直接接收整数标签 y,内部等价于取正确类别的 log probability,不需要显式创建 100 维 one-hot。若使用 label smoothing、soft targets 或类别权重,就不能不加说明地照搬这个单项结论。

训练 ids=[11,23,37]、labels=[23,37,42]。人为给三个正确 token 的概率分别 0.5,0.2,0.1:

输入位置正确标签p_y−ln p_y
小猫11坐在230.50.6931472
坐在23窗边370.21.6094379
窗边37晒太阳420.12.3025851
Lmean=−ln⁡0.5−ln⁡0.2−ln⁡0.13=1.5350567L_{mean}=\frac{-\ln 0.5-\ln 0.2-\ln 0.1}{3}=1.5350567

这是 3 个被监督位置的平均负对数概率,不是“错了 2 个词”的计数。日志可能按 token、样本、批次或梯度累积步骤归约,比较前先看口径;ignore_index 的位置不进入这个分母。

对单位置普通 CE:

L=−zy+log⁡∑kezk,∂L∂zj=pj−qjL=-z_y+\log\sum_k e^{z_k},\qquad \frac{\partial L}{\partial z_j}=p_j-q_j

正确类梯度是 p_y−1,错误类梯度是 p_j。若取三个位置均值,各位置的 logits 梯度再除以 3。训练最终按链式法则把这些梯度传到 LM Head、Block 和 Embedding 的参数。

例:第 0 个位置给正确 ID23 概率 0.5,单位置梯度为 −0.5;错误 ID37 若概率 0.1,则梯度为 +0.1。对 logits 直接做梯度下降时前者上升、后者下降;实际更新的是模型参数,多个位置和参数共享会共同影响结果。

# 示例形状;需要先安装 torch
# logits: [1,3,100];labels: [[23,37,42]]
loss = torch.nn.functional.cross_entropy(
logits.reshape(-1, 100), labels.reshape(-1), reduction="mean"
)

这里不要先 softmax 再喂 CrossEntropyLoss。内部使用稳定的 log-softmax / log-sum-exp;减去最大 logit 可避免直接指数溢出,不改变 softmax 结果。

来源:原论文 §5.4记载 label smoothing;这里先使用未平滑的 one-hot 目标。