← 返回书架人工智能 · 交互式 Wiki
训练目标与优化入门专题讲解学习主线 3 / 6

02 / TRAINING LOOP

训练回路:从ID 与目标到参数更新

模型先接收 token ID 或样本配对,查表得到浮点向量,再经过上下文层和输出层。 损失函数把预测与目标之间的差变成标量;反向传播求出各可训练参数的梯度,优化器据此更新查表行与其他层的权重。

01

一个 causal LM batch 长什么样?

真实训练里,数据加载器会把许多样本拼成 batch。每个样本包含 token ID、目标位置和相应的 mask。

batch item 教学示例
{
  "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,就应传原始对齐标签,不能再错开一次。

forward pass 形状示意
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 表共同决定。

01

输入 ID:分词后得到整数 ID,例如 17。模型据此定位 embedding 表中索引为 17 的一行。

02

查表结果:取出该行当前的 d 个参数。例如 d = 768 时,得到一个 768 维向量;后续训练会更新这些数值。

02

沿着一条训练样本走完整回路

先选训练范式,再按“上一步 / 下一步”走。输入、输出和损失会一起切换。

下一词预测 / CAUSAL LM

先准备“前文 → 下一词”的监督样本

01 / 06

把语料中的前文和真实下一 token 组成样本。模型可以同时看到整个 batch 中许多位置的真实目标;训练时使用 teacher forcing,直接把真实历史喂进去。

IN[B, T] int64
THIS STEPlabels = ids[:, 1:]
OUT[B, T-1] int64
注意

batch 里的 ID 长度不同,通常要 padding;attention mask 让模型忽略补齐位置。

for prompt, text in corpus:
    ids = tokenizer(text).input_ids
    x = ids[:, :-1]
    y = ids[:, 1:]
    train(x, y)
03

自动微分怎样计算梯度

反向模式自动微分从标量 loss 往回走,用每一步的局部导数相乘,得到每个参数对 loss 的敏感度。

01loss 很小或很大当前预测与目标差多少
02dL/dlogits抬高/压低哪些得分
03dL/dhhidden state 怎样改
04dL/dE[row]查表行怎样改
05optimizer.step()按学习率迈一小步
SOFTMAX + CROSS ENTROPY
∂L∂z=p−y\frac{\partial\mathcal L}{\partial z}=p-y

对正确类别,logit 梯度为 p−1;对每个非目标类别为 p。完整词表 softmax 因此通常给所有候选输出梯度,不需要逐个标注负例。

EMBEDDING LOOKUP
∇Ek,:L=∑t:idt=k∇xtL\nabla_{E_{k,:}}\mathcal L=\sum_{t:\mathrm{id}_t=k}\nabla_{x_t}\mathcal L

token k 出现三次,lookup 分支就把三个位置的梯度加回同一行。未出现的行没有 lookup 梯度,但绑定输出头时仍可能有输出梯度;历史动量与权重衰减也可能改变参数。

UPDATE
E←E−η∇ELE\leftarrow E-\eta\nabla_E\mathcal L

η 是学习率。AdamW 等优化器还会结合一阶/二阶矩估计并做权重衰减;“负号”表示往降低当前损失的方向走。

梯度的形状与计算量: 对 embedding 行求导得到 d 维向量;对整个模型求导则得到与所有可训练参数同形的梯度。反向自动微分沿计算图组合局部导数,计算量通常是前向的常数倍,不需要在参数空间逐个试方向。它提供局部方向,不保证有限步更新一定降 loss 或达到全局最优。

04

四种训练信号的来源与作用

它们都会产生梯度,但监督信息从哪来、惩罚什么,差别很大。

信号 谁提供目标 正 / 负怎么来 典型损失 主要改变
自监督预测
下一词 / 掩码
文本自身 真实 token 是正类;词表其他 token 概率相对降低 交叉熵 语言规律、上下文状态与词表输出
显式负采样
Word2Vec
语料中的真实搭配 + 采样器 真实上下文为正;按频率分布抽取噪声词为负 logistic negative sampling 静态词向量的局部共现几何
成对监督
对比 embedding
人工/规则/模型构造的 pair、triplet query 的对应文档为正;batch 内与其他难样本为负 InfoNCE / triplet 句级或检索级距离与排序
偏好信号
RLHF / DPO
人类或 AI 的 A > B 偏好 对两个完整回答给出相对排序 reward / pairwise preference 回答行为与策略分布

对比学习支线:已经理解语言模型回路后,再用正负样本观察另一种目标如何产生梯度。可以按任务需要选读。

05

负样本怎样变成梯度?

这里用二维向量和 logistic 负采样做真实一步 SGD。固定 query 是为了看清 context 向量往哪走。

TOY 2D / 教学投影

点积相似度空间

当前损失 2.312
query / center 正样本 负样本

TARGET / 目标

提高 query 与正样本的点积,降低它与两个负样本的点积。

query · 正样本0.70应上升 ↑
query · 负样本 A0.69应下降 ↓
query · 负样本 B0.65应下降 ↓
单正样本 + 2 负样本
L=−log⁡σ(q⊤p)−∑ilog⁡σ(−q⊤ni)\mathcal L=-\log\sigma(q^\top p)-\sum_i\log\sigma(-q^\top n_i)

正例梯度为 (σ(q·p)−1)q,负例梯度为 σ(q·n)q;梯度下降的更新方向与导数相反。这里只优化点积,不保证欧氏距离按同样方向变化。

已更新 0 次

此处固定 q,只更新上下文向量,并把每个坐标限制在 [-1,1],触及边界后可能出现损失平台。这里限制的是参数取值;L2 归一化约束向量长度,梯度裁剪限制更新前的梯度幅度。经典 SGNS 通常更新两张表的采样行。

沿训练回路继续看小型 decoder 的实际学习、自由生成与独立泛化实验,分别比较 loss、token accuracy 和整段 exact match。

选读 / 其他训练目标

按任务需要,继续比较后训练目标

适用范围与一手资料

本页负责一次更新的端到端路径;公式推导在“损失与梯度解剖”。SGNS、MLM、causal LM 与 InfoNCE 各有对应的候选集合和监督目标。

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