对正确类别,logit 梯度为 p−1;对每个非目标类别为 p。完整词表 softmax 因此通常给所有候选输出梯度,不需要逐个标注负例。
本页章节
02 / TRAINING LOOP
训练回路:从ID 与目标到参数更新
模型先接收 token ID 或样本配对,查表得到浮点向量,再经过上下文层和输出层。 损失函数把预测与目标之间的差变成标量;反向传播求出各可训练参数的梯度,优化器据此更新查表行与其他层的权重。
一个 causal LM batch 长什么样?
真实训练里,数据加载器会把许多样本拼成 batch。每个样本包含 token ID、目标位置和相应的 mask。
{
"tokens": [103, 4821, 17, 889, 320],
"attention_mask": [1, 1, 1, 1, 1],
"labels": [4821, 17, 889, 320, 77]
}
原始序列为 [103, 4821, 17, 889, 320, 77]:输入取前五个,标签取后五个。这里已在数据侧错开一格;若框架内部会 shift labels,就应传原始对齐标签,不能再错开一次。
raw_ids # [B, T+1]
ids = raw_ids[:, :-1] # [B, T]
labels = raw_ids[:, 1:] # [B, T]
x = E[ids] # [B, T, d]
h = Transformer(x, causal=True)
# RoPE 在各层 Q/K 上;绝对位置才常加到 x
logits = h @ W_out.T # W_out [V,d]
loss = CE(logits.reshape(-1, V),
labels.reshape(-1))
进入第一层的浮点张量是 x;它由 token ID 和当前 embedding 表共同决定。
输入 ID:分词后得到整数 ID,例如 17。模型据此定位 embedding 表中索引为 17 的一行。
查表结果:取出该行当前的 d 个参数。例如 d = 768 时,得到一个 768 维向量;后续训练会更新这些数值。
沿着一条训练样本走完整回路
先选训练范式,再按“上一步 / 下一步”走。输入、输出和损失会一起切换。
下一词预测 / CAUSAL LM
先准备“前文 → 下一词”的监督样本
把语料中的前文和真实下一 token 组成样本。模型可以同时看到整个 batch 中许多位置的真实目标;训练时使用 teacher forcing,直接把真实历史喂进去。
[B, T] int64labels = ids[:, 1:][B, T-1] int64batch 里的 ID 长度不同,通常要 padding;attention mask 让模型忽略补齐位置。
for prompt, text in corpus:
ids = tokenizer(text).input_ids
x = ids[:, :-1]
y = ids[:, 1:]
train(x, y)
自动微分怎样计算梯度
反向模式自动微分从标量 loss 往回走,用每一步的局部导数相乘,得到每个参数对 loss 的敏感度。
token k 出现三次,lookup 分支就把三个位置的梯度加回同一行。未出现的行没有 lookup 梯度,但绑定输出头时仍可能有输出梯度;历史动量与权重衰减也可能改变参数。
η 是学习率。AdamW 等优化器还会结合一阶/二阶矩估计并做权重衰减;“负号”表示往降低当前损失的方向走。
梯度的形状与计算量: 对 embedding 行求导得到 d 维向量;对整个模型求导则得到与所有可训练参数同形的梯度。反向自动微分沿计算图组合局部导数,计算量通常是前向的常数倍,不需要在参数空间逐个试方向。它提供局部方向,不保证有限步更新一定降 loss 或达到全局最优。
四种训练信号的来源与作用
它们都会产生梯度,但监督信息从哪来、惩罚什么,差别很大。
| 信号 | 谁提供目标 | 正 / 负怎么来 | 典型损失 | 主要改变 |
|---|---|---|---|---|
| 自监督预测 下一词 / 掩码 |
文本自身 | 真实 token 是正类;词表其他 token 概率相对降低 | 交叉熵 | 语言规律、上下文状态与词表输出 |
| 显式负采样 Word2Vec |
语料中的真实搭配 + 采样器 | 真实上下文为正;按频率分布抽取噪声词为负 | logistic negative sampling | 静态词向量的局部共现几何 |
| 成对监督 对比 embedding |
人工/规则/模型构造的 pair、triplet | query 的对应文档为正;batch 内与其他难样本为负 | InfoNCE / triplet | 句级或检索级距离与排序 |
| 偏好信号 RLHF / DPO |
人类或 AI 的 A > B 偏好 | 对两个完整回答给出相对排序 | reward / pairwise preference | 回答行为与策略分布 |
对比学习支线:已经理解语言模型回路后,再用正负样本观察另一种目标如何产生梯度。可以按任务需要选读。
负样本怎样变成梯度?
这里用二维向量和 logistic 负采样做真实一步 SGD。固定 query 是为了看清 context 向量往哪走。
TOY 2D / 教学投影
点积相似度空间
TARGET / 目标
提高 query 与正样本的点积,降低它与两个负样本的点积。
0.70应上升 ↑0.69应下降 ↓0.65应下降 ↓正例梯度为 (σ(q·p)−1)q,负例梯度为 σ(q·n)q;梯度下降的更新方向与导数相反。这里只优化点积,不保证欧氏距离按同样方向变化。
此处固定 q,只更新上下文向量,并把每个坐标限制在 [-1,1],触及边界后可能出现损失平台。这里限制的是参数取值;L2 归一化约束向量长度,梯度裁剪限制更新前的梯度幅度。经典 SGNS 通常更新两张表的采样行。
沿训练回路继续看小型 decoder 的实际学习、自由生成与独立泛化实验,分别比较 loss、token accuracy 和整段 exact match。
适用范围与一手资料
本页负责一次更新的端到端路径;公式推导在“损失与梯度解剖”。SGNS、MLM、causal LM 与 InfoNCE 各有对应的候选集合和监督目标。
公式与机制的原始依据 · 3 项
- Distributed Representations of Words and Phrases (2013, v1)2026-10-29 核对第 2 节:输入/输出表示、完整 softmax、树路径与负采样分别产生不同的梯度覆盖
- BERT (2018)MLM 的 15% 位置与 80/10/10 替换规则
- PyTorch · CrossEntropyLoss完整类别分母、ignore_index 与 reduction