← 返回书架人工智能 · 交互式 Wiki
训练目标与优化进阶计算演示

DEEP 02 / LOSS & BACKPROPAGATION

损失与梯度:从预测误差到参数导数

先看词表交叉熵怎样产生梯度,再追踪监督位置、输入查表和输出投影。 InfoNCE、SGNS、温度与难负样本放在对比学习支线中继续展开。

本页先读:词表交叉熵、有效监督位置和参数梯度。研究检索表示时,再进入 InfoNCE 与 SGNS 的对照。完整整层推导见 反向传播核验。

01

输入 Embedding 与输出词表投影

“embedding 表”未必只有一张。输入表负责查行,输出投影负责把 hidden state 映射到词表;两者可以共享,也可以分开。

token ID[B,T]
EV × d输入查表
Transformer / Encoderh [B,T,d]
WoutV × dz = h W_outᵀ
logits[B,T,V]
设置输入侧梯度输出侧梯度后果
E 与 W 分开 lookup 梯度只散射到输入中出现的非屏蔽行 完整 softmax 通常给所有候选行梯度,不仅是 label 参数更多;输入语义与输出预测可解耦
权重绑定 Wout = E scatter 到输入 token 行 同一矩阵的各行也得到输出梯度 省参数、共享统计,但两类压力互相耦合
冻结 E 把梯度停在查表处 若 W 独立仍可学习 不能靠更新输入行适配新词,但可降低显存与漂移

下一词模型在一个有效监督位置预测整个词表的概率。交叉熵使用正确类别的负对数似然;对每个 logit 求导,得到预测概率减去 one-hot 目标。对多个有效位置取平均时,还要包含对应的归一化分母。

展开一步:为什么 softmax + 交叉熵的导数是 p−y?

只看一个有效位置,真实类别为 k,z 是已经进入 softmax 的 logits。将负对数展开后:

pj=ezj∑mezm,L=−log⁡pk=−zk+log⁡∑mezm,∂L∂zj=−1[j=k]+ezj∑mezm=pj−yj.\begin{aligned} p_j&=\frac{e^{z_j}}{\sum_m e^{z_m}},\\ \mathcal L&=-\log p_k=-z_k+\log\sum_m e^{z_m},\\ \frac{\partial\mathcal L}{\partial z_j} &=-\mathbf 1[j=k]+\frac{e^{z_j}}{\sum_m e^{z_m}}\\ &=p_j-y_j. \end{aligned}
yⱼ 是 one-hot 标签。正确类得到 pₖ−1,其他类得到 pⱼ;梯度下降取反方向更新。若继续对温度缩放前的 s 求导,还要乘 ∂z/∂s=1/τ。

这是单位置、无类别权重的形式。有效位置平均会再除全局分母;soft label 在归一化到和为 1 时仍可写为 p−y。得到 logit 梯度后,还需沿网络反传,并通过优化器计算参数更新。

02

Mask、padding 与有效梯度

这些设置会改变有效监督位置,以及梯度进入参数的路径。

屏蔽 padding 会影响哪些计算路径?

attention mask 排除 PAD 键,loss mask 排除 PAD 标签位置,padding_idx 可阻止 lookup 算子累加该行梯度;三者作用不同。ignore_index 不删除有效位置 softmax 中的 PAD 类别,因此绑定输出表仍可能使 PAD 行收到梯度。PAD 与 EOS 共用 ID 时,尤其不能按 ID 把有效 EOS 标签一并屏蔽。

为什么 log-softmax 比先 softmax 再 log 稳定?

直接除指数和容易溢出。稳定实现先减去最大 logit,再用 logsumexp。InfoNCE 也应在 logits 空间做 cross-entropy;把极小或极大的概率手动乘除会破坏数值稳定性。

稀疏 gather 会让 embedding 训练省显存吗?

前向只取少数行,但优化器状态是否省取决于实现。若使用 Adam,整个 E 的矩状态仍可能驻留;分布式训练还要做 all-reduce。有些系统用稀疏梯度或分片 embedding,但会换来通信和采样复杂度。

一个 batch 只有几条样本,为什么 loss 仍能覆盖整个词表?

完整词表 softmax 的分母含 V 个类别,非目标类的 logit 梯度为 p,目标类为 p−1。输入 lookup 只散射到被访问的行;输出投影通常是稠密梯度,绑定时也会加回 E。sampled softmax 和 SGNS 属于另外的计算或目标设置。

为什么 batch 内负样本会随 batch 大小变化?

每个其它样本的正文档可能成为当前 query 的负例。batch 越大,噪声候选越多、负样本越丰富,但显存和通信成本也更高;而 in-batch 样本越多,也越可能混入 false negatives。

03

从 hidden 梯度回传到 Embedding 表

切场景,观察哪些 token 行拿到了梯度。权重绑定会改变“目标 token 不在输入里”时的结果。

SCENARIO

LOCAL GRADIENT SCOPES

两次 gather,梯度累加到同一行

dE[17] = dx[0] + dx[4]
token输入位置输出身份E 梯度W_out 梯度
17 “负”t=0, t=4非目标候选查表梯度输出梯度
4821 “样本”t=1非目标候选查表梯度输出梯度
77 “向量”未输入t=2 label零梯度输出梯度
PAD 0masked有效位置的候选类零梯度输出梯度

lookup 分支累加重复 token 的梯度;完整词表 softmax 的输出分支通常覆盖所有候选。下表采用 W_out 为 [V,d] 的存储约定,z = h W_outᵀ。

FORWARD / GATHER
xt=Eidt,:x_t=E_{\mathrm{id}_t,:}

实现上用索引取行;数学上等价于 one-hot 乘矩阵。

BACKWARD / SCATTER-ADD
∂L∂Ek,:=∑t:idt=k∂L∂xt\frac{\partial\mathcal L}{\partial E_{k,:}}=\sum_{t:\mathrm{id}_t=k}\frac{\partial\mathcal L}{\partial x_t}

同一行在一个 batch 中被访问几次,就累加几次梯度。

OPTIMIZER
E←E−η update⁡(∇EL)E\leftarrow E-\eta\,\operatorname{update}(\nabla_E\mathcal L)

AdamW 等优化器再把原始梯度变成逐步更新量。

有梯度、梯度为零、参数不更新是三件事。这里展示当前 batch 的损失梯度来源,忽略 batch 平均系数与偶然抵消。即使某行当前梯度为零,优化器的历史动量或 AdamW 权重衰减仍可能改变它;冻结参数还要确保它不参与优化器更新。

对比学习支线:下面改用 query 与候选构造监督,比较 InfoNCE、SGNS 和负样本梯度;这里的候选数与归一化方式按各节说明。

04

两个候选分布,两个不同的梯度形状

拖动温度与难负样本分数,看正例概率、loss 和正负例分数的导数一起变化。

关键差别

InfoNCE 对所有候选分数一起归一化。改变一个负例的分数,也会改变其他候选的概率。

真实类概率0.000
总 loss0.000
正例 ∂L/∂s₊0.000
最大负例 ∂L/∂sⱼ0.000
正样本难负 A负 B负 C负 D
当前公式
z=s/τ,∂L∂z=p−y,∂L∂s=p−yτ.\begin{aligned}z&=s/\tau,\\ \frac{\partial\mathcal L}{\partial z}&=p-y,\\ \frac{\partial\mathcal L}{\partial s}&=\frac{p-y}{\tau}.\end{aligned}

正例当前得分最高。温度降低会让概率更尖锐,但梯度大小还取决于 p−y;把难负例抬到高于正例可观察另一种情况。

InfoNCE

候选之间互相竞争

softmax 比较相对得分。只抬高正例就能降低这行 loss;所有候选同时加同一常数则概率不变。共享参数更新会耦合多个候选与样本,所以不能保证每项都按独立分数的方向变化。

∑jpj=1\sum_jp_j=1
SGNS

每个噪声词独立二分类

真实搭配希望 σ(s)→1,采样负例希望 σ(s)→0。K 个负例各有 logistic 损失,不做候选间 softmax 归一化。

σ(s)=11+e−s\sigma(s)=\frac{1}{1+e^{-s}}
温度 τ

控制概率与梯度的锐度

τ 小会放大分数差,但梯度同时取决于 p−y。正例已明显胜出时梯度可能饱和到零;负例胜出时则可能被 1/τ 放大。

z=s/τz=s/\tau
05

InfoNCE 的梯度,逐项长什么样?

对一个 query 行,正样本的概率 pi 与负样本概率 pj 共同决定反传梯度。

01 / SCORE
zij=qi⊤djτz_{ij}=\frac{q_i^\top d_j}{\tau}

先归一化再点积时,这就是 cosine / τ;内积训练则不一定归一化。

02 / LOSS
Li=−log⁡ezii∑jezij\mathcal L_i=-\log\frac{e^{z_{ii}}}{\sum_j e^{z_{ij}}}

对角候选是正例,其他列是负例或 in-batch negatives。

03 / LOGITS
∂Li∂zij=pij−yij\frac{\partial\mathcal L_i}{\partial z_{ij}}=p_{ij}-y_{ij}

这是 softmax + 交叉熵最常用的梯度;y 在正候选位置为 1。

04 / QUERY
∇qiLi=1τ∑j(pij−yij)dj\nabla_{q_i}\mathcal L_i=\frac1\tau\sum_j(p_{ij}-y_{ij})d_j

这是对 q 的导数;梯度下降方向与它相反。更新含朝正文档、远离负文档的分量,最终是各项的向量和。若 q 是归一化后的输出,还要继续穿过归一化算子。

难负例与假负例要按任务标注区分。“主题相关但不能回答”可以是合理难负例;真正满足相关性标准、却因漏标被当成负例的才是假负例。两者的分数导数都为 pij/τ ≥ 0,更新会压低分数,后者因此损伤有效证据。可用多正例目标、重复文档屏蔽与标注复核处理。

归一化也在计算图里。若 q 是单位向量,u 是归一化前的非零输出,继续反传时还要穿过归一化的 Jacobian。

q=u∥u∥2,∇uL=I−qq⊤∥u∥2∇qLq=\frac{u}{\lVert u\rVert_2},\qquad\nabla_u\mathcal L=\frac{I-qq^\top}{\lVert u\rVert_2}\nabla_q\mathcal L
I−qqᵀ 去掉径向分量,保留沿单位球切面的变化。该式假设 u≠0;工程中的 ε/clamp 会改变极小范数处的导数。

输出投影的完整梯度与权重共享可继续核对分块交叉熵实验:逐块重建概率并累计 hidden 与输出权重的贡献。

选读 / 后训练目标

表示后训练、SFT、DPO 和 RLHF,损失会影响哪些参数?

查看后训练目标 →

适用范围与一手资料

公式默认单个有效位置/单个 query、单正例、无 label smoothing。batch 平均、归一化算子、冻结及权重绑定都会影响最终参数梯度。

公式与机制的原始依据 · 3 项
知识目录
搜索知识库