交叉熵衡量模型给正确答案分配了多少概率。正确 token 的概率越大,loss 越小;它没有要求训练时先选出一个离散 token。
一个位置:100 项为何只剩一项
Section titled “一个位置:100 项为何只剩一项”设词表的 logits 为 z,softmax 概率:
正确 token ID 为 y。one-hot 目标 q_y=1,其他 q_j=0,则:
求和化简了,softmax 分母没有化简。 所有 100 个 logits 都参与概率归一化。把错误 token 的 logits 调高,也可能降低正确 token 的概率。
库通常直接接收整数标签 y,内部等价于取正确类别的 log probability,不需要显式创建 100 维 one-hot。若使用 label smoothing、soft targets 或类别权重,就不能不加说明地照搬这个单项结论。
三个位置:平均 loss
Section titled “三个位置:平均 loss”训练 ids=[11,23,37]、labels=[23,37,42]。人为给三个正确 token 的概率分别 0.5,0.2,0.1:
| 输入位置 | 正确标签 | p_y | −ln p_y |
|---|---|---|---|
| 小猫11 | 坐在23 | 0.5 | 0.6931472 |
| 坐在23 | 窗边37 | 0.2 | 1.6094379 |
| 窗边37 | 晒太阳42 | 0.1 | 2.3025851 |
这是 3 个被监督位置的平均负对数概率,不是“错了 2 个词”的计数。日志可能按 token、样本、批次或梯度累积步骤归约,比较前先看口径;ignore_index 的位置不进入这个分母。
logits 梯度:p−q
Section titled “logits 梯度:p−q”对单位置普通 CE:
正确类梯度是 p_y−1,错误类梯度是 p_j。若取三个位置均值,各位置的 logits 梯度再除以 3。训练最终按链式法则把这些梯度传到 LM Head、Block 和 Embedding 的参数。
例:第 0 个位置给正确 ID23 概率 0.5,单位置梯度为 −0.5;错误 ID37 若概率 0.1,则梯度为 +0.1。对 logits 直接做梯度下降时前者上升、后者下降;实际更新的是模型参数,多个位置和参数共享会共同影响结果。
实现时接收 logits
Section titled “实现时接收 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 目标。