wikiLLM01|前沿 LLM 的训练与推理:总览与阅读路线04|SFT、奖励模型与 DPO 的目标变化
50 分钟
1 次观看

04|SFT、奖励模型与 DPO 的目标变化

本篇主要跟踪同一道题“计算 17×2317\times23”:A 简短回答 391,B 用较长文字回答 381。事实检查、人的选择、模型预测和训练目标会在同一对答案上分别出现。§1.2 另保留一个假设切成七个 token 的“1+1”小例,只用来放大位置右移;这不是把中文片段当作真实 tokenizer 的固定切分。

同一乘法题下 SFT、奖励模型与 DPO 的监督记录和更新对象

每行是一种训练目标;先区分输入的监督,再追踪谁的参数会更新。

预训练学续写,后训练用示范、比较与奖励改变回答行为。先看角色怎样变成可训练的序列,再用同一道乘法题追踪偏好如何变成梯度。这些公开方法是机制教材,不是 GPT-6.1 或当前 Claude 的完整配方;RLHF、RLAIF、DPO 也不是固定必经流水线。

阅读路线。 先沿角色与 token 对齐读 SFT,再看同题分差怎样变成奖励;随后把 KL 约束逐步变形成 DPO,最后检查标签分歧与评测边界。已有 SFT 基础可从第 2 章开始;DPO 读者至少连读 3.2 与第 4 章。4.5 用三候选分布区分“真正的一步梯度”与“损失降低的反例”。

本篇目录

1. SFT:角色、目标与右移

SFT 仍使用下一 token 预测,但训练记录通常以指令或对话组织。模型看到完整上下文,只在需要学习的输出位置计算损失。例如用户问“用一句话解释梯度”,示范回答是一句准确解释;目标不再是任意网页的后续文本,而是在这个指令后生成对应答案。InstructGPT 公开了一条示范微调、偏好收集、奖励学习、RL 优化的路线,并展示较小后训练模型在其评估分布上也可以获得更高偏好。该结果不意味着后训练能够替代全部预训练。来源:InstructGPT。

1.1 模板把角色变成网络可读的序列

角色字段按模板展开成一条有边界的序列,角色标签不是额外网络通道

上方是两条消息记录,下方是模型实际读取的序列;位置沿横轴增加。

先看图上方,role=user 和 role=assistant 属于消息记录的字段。模板把角色、正文和结束边界排成一条 token 序列,网络再读取下方这条序列。颜色用来追踪哪一段来自用户、哪一段来自助手;它不是 Transformer 里另有一个名叫 role 的输入通道。

对话首先要序列化。这里自设一个教学模板:<user> 问题 <end> <assistant> 回答 <end>,不是任何商业模型的实际协议。角色标记、消息边界、工具名称及参数都是网络需要识别的内容。JSON 中的 role 字段不会天然进入 Transformer,必须由模板转成模型学过的序列。不同模型模板不同;重复添加 BOS/EOS、误用另一种模板或缺少 assistant 起始标记,都可能改变分布。官方参考:Chat templates。

1.2 预测右移、有效目标与代码

训练记录完整保留,只有选定助手片段复制到损失目标区

左托盘保留训练记录,右托盘只选监督片段;精确预测位置见下一图(ImageGen 教学示意)。

上方蓝灰色提问和绿色回答属于同一份记录。左下仍保留提问,说明“不对用户文本算损失”不等于“不让模型读问题”;右下只选择绿色助手回答与结束片段,说明监督选择的对象。这里分的是记录用途,不表示某个预测位置可以偷看未来答案:真正预测下一项时仍只能读取此前合法前缀,下面用索引把这件事展开。

同一原序列中,z3预测s4;监督范围按目标位置定义。

横轴是原位置0–6;上排是已知序列,下排是该位置预测的下一项;绿色框按目标定义。

图中 U/Q/E/A 只是为避免挤字使用的教学别名:U=<user>,Q=1+1?,E=<end>,A=<assistant>。这里的 A 是角色标记,不是后文候选答案 A。上排 s3s_3 是助手起始标记;在这个位置算出的 logits z3z_3,负责预测右边的 s4=2s_4=2。所以绿色监督框从预测位置 3开始,而目标本身从原序列位置 4开始。同一绿色目标在两排错开一格,是因果预测的对齐,不是漏掉了回答第一项。预测 mask 只保留 T−1=6T-1=6 项;最右端 z6z_6 不存在要对齐的下一项,代码会将它裁掉,图中不把它伪装成第七个有效 mask。

假设 tokenize 后序列恰好为以下 7 项,每一项在本例是一个 token:

原序列位置token是否作为目标受监督
0<user>0
11+1?0
2<end>0
3<assistant>0
421
5。1
6<end>1

原位置 3 的 logits 用来预测原位置 4 的 2,因此对应预测位置的 loss mask 为 1。原位置 6 的 <end> 也受监督,模型才能学到合适的终止。是否同时训练角色头或其他标签是实现选择;这里固定为 assistant 内容与终止标签。Assistant mask 遮的是损失,不是助手能读取的上下文。 用户提问虽然不作为目标,仍会经过网络并影响回答梯度。

LSFT=−1Na∑b,tmb,tlog⁡πθ(sb,t+1∣sb,≤t),Na=∑b,tmb,t.\begin{aligned} \mathcal{L}_{\mathrm{SFT}} &=-\frac{1}{N_a}\sum_{b,t}m_{b,t} \log\pi_\theta(s_{b,t+1}\mid s_{b,\le t}),\\ N_a&=\sum_{b,t}m_{b,t}. \end{aligned}
符号含义、形状与单位
b,tb,tbatch 索引和预测位置索引;tt 的 logits 预测 t+1t+1 项
ss序列化对话的 token ID,整数张量 [B,T][B,T]
πθ\pi_\theta参数为 θ\theta 的条件 token 分布,输出 [B,T,V][B,T,V]
mmassistant 监督位置 mask,形状 [B,T−1][B,T-1],值为 0 或 1
NaN_a有效目标 token 数,单位 token,假设大于零
sb,≤ts_{b,\le t}截至当前位置的全部合法历史,不只 assistant 文本
L\mathcal{L}自然对数平均 NLL,单位 nat/assistant token

若模型对 2、。、<end> 的目标概率分别为 0.5、0.8、0.9,损失为 (−log⁡0.5−log⁡0.8−log⁡0.9)/3≈0.3406(-\log0.5-\log0.8-\log0.9)/3\approx0.3406。

三预测位置在同一个六候选词表上的概率,绿色边框标出真实目标

行是预测位置,列是候选token;每行做softmax、和为1;标签只选择其中一格。

这幅图把“模型预测”与“标签目标”分开。三行分别是 t=3,4,5t=3,4,5 的预测,六列按教学词表 [U,Q,E,A,2,。][U,Q,E,A,2,。] 排列;蓝色深浅表示模型分给各候选的概率,绿色边框表示数据记录要求预测的真实下一项。softmax 的归一化轴是候选列,不是三个时间行。每行的概率和为 1,但标签只选出本行目标列的 0.5,0.8,0.90.5,0.8,0.9。这些预测概率是示意输入,不是从正确标签本身推出来的。

取每格示意 logits 为对应概率的自然对数,逐行 softmax 可还原图中分布。例如第 1 行是 [0.05,0.05,0.10,0.10,0.50,0.20][0.05,0.05,0.10,0.10,0.50,0.20],所以指数还原后的和为 1,目标 2 所在列恰得 0.50。取目标列的负对数后,再按有效目标数量平均:

−ln⁡0.5=0.693147,−ln⁡0.8=0.223144,−ln⁡0.9=0.105361,LSFT=(0.693147+0.223144+0.105361)/3=0.340550 nat/assistant token.\begin{aligned} -\ln0.5&=0.693147,\\ -\ln0.8&=0.223144,\\ -\ln0.9&=0.105361,\\ \mathcal L_{\mathrm{SFT}}&=(0.693147+0.223144+0.105361)/3\\ &=0.340550\ \mathrm{nat/assistant\ token}. \end{aligned}

这里除以 3,是因为有 3 个受监督目标,不是因为词表有 3 项、也不是因为序列有 7 项。用户问题预测得好不好不进入这个平均,但正确理解问题仍能帮助降低回答损失。若在多个 turn 中监督所有 assistant 消息,模型会同时学习前面的回答和最终回答;若只监督最后一轮,训练目标不同,应在数据记录里明确。

以下片段接收原序列位置上的 is_assistant_target,明确做右移。

调用前先核对接口:logits 是浮点张量 [B,T,V],ids 是整型 token ID [B,T],is_assistant_target 必须是布尔张量 [B,T]。valid 右移后是 [B,T-1];代码中的 ~valid 只有对布尔 mask 才表示逻辑非。它不是要求把用户上下文从输入中删去。它与预训练损失接口相似,但 mask 来源是角色。代码未在本篇实测;完整实验与实际输出见专题源码附录。TRL 的 assistant-only loss 同样要求模板能提供正确跨度,不能只打开配置就认为任意模板已支持。官方参考:SFT Trainer。

import torch.nn.functional as F

def sft_loss(logits, ids, is_assistant_target):
    scores = logits[:, :-1].contiguous()        # [B,T-1,V]
    labels = ids[:, 1:].clone()                 # 被预测的token
    valid = is_assistant_target[:, 1:]
    if not valid.any():
        raise ValueError("no assistant targets")
    labels[~valid] = -100
    return F.cross_entropy(scores.reshape(-1, scores.shape[-1]),
                           labels.reshape(-1), ignore_index=-100)

检查输入模板时应把解码文本、ID 和 label mask 并排打印,确认回答首 token 与终止 token 都落入监督。仅看 loss 数值不能发现用户文字被错误训练或回答第一项被漏掉。

短长两个答案的token总损失按不同分母平均,得到不同训练权重

上方每格代表一个有效目标;三个平均的分母不同,不能只比较数值大小。

再用后文的短 A 与长 B 检查单位。假设在这组教学切分中,A 有 2 个受计 token,序列 NLL 为 2 nat;B 有 6 个,序列 NLL 为 3 nat。把所有有效 token 一起平均,是 (2+3)/(2+6)=0.625(2+3)/(2+6)=0.625 nat/token;先把各答案除长度、再给两答案相同权重,是 (2/2+3/6)/2=0.75(2/2+3/6)/2=0.75 nat/token。虽然单位都写 nat/token,短答案和长答案的权重已经不同。若直接平均序列 NLL,则 (2+3)/2=2.5(2+3)/2=2.5 nat/answer。不能把 2.5 当成模型比 0.625 差四倍,因为分母是不同对象。SFT 还可能过度模仿长度、口吻、排版甚至错误思考过程,因此要按任务结果评估,而不是把“回答更像范文”当成能力更强。

1.3 工具动作与环境观测

图 1c|工具调用是动作,工具返回是观测(教学示意)

图 1c|工具调用是动作,工具返回是观测(教学示意)

横向四个片段按执行顺序排列:用户提问、助手工具请求、工具返回、助手最终回答。绿色监督标记只放在两个助手动作片段,灰色提问与工具观测提供后续上下文。本图的 calc({"expr":"1+1"}) 和返回 2 都是教学对象,不是从某次商业模型的真实日志截取。

例如请求参数有误,工具回报错误后,助手应能修正参数再试。错误回报仍是环境观测;要学习的是“在这份观测之后选哪一个修正动作”,而不是让模型假装自己已经生成了真实工具结果。

工具轨迹需要同样的精确约定。模型可以输出 calc({"expr":"1+1"}),工具返回 2,模型再生成答案。工具返回值通常是观测,assistant 的工具调用则是动作;如果把观测也作为模型生成目标,训练含义就改变了。优秀轨迹还要包含工具失败、参数修正与终止选择,不能只积累每一步都成功的演示。真实工具标签必须遵循所训练 tokenizer 的协议,不能把本例字符串加入任意模型就期待它自动执行。

2. 偏好标签与奖励模型

2.1 同一输入下的成对比较

同一乘法题的短正确答案与长错误答案:事实检查和表面偏好分离

图 2-1|同一道题,先分清事实标签与偏好标签(ImageGen 教学例)

人可能很难写出最优答案,却较容易比较两份已有答案。给同一问题 xx,记录选中的 ywy_w 与被拒绝的 yly_l。本篇固定问题为“计算 17×2317\times23”:A 简洁回答 391;B 用华丽长解释回答 381。事实核对只需拆成 340+51=391340+51=391,不能被排版或长度替代。

图中的风格徽章刻意展示一种错误的评价规则:它奖励外观,却没有核对算术。若 rubric 明确要求“先正确,再简洁”,应选 A;若标注者仍选 B,标签记录的是这次比较选择,不能把它重新解释成 B 算对了。偏好关系需要连同问题、约束和评价标准一起读。

实际候选未必一真一假:两份都正确时,可以比较简洁、约束遵循或完整证明;两份都错时,胜者仍不是所有答案中的最优。记录平局、不确定和分歧,比把每一票都写成绝对事实更有用。下面的 RM 只学习这些比较所表达的统计关系。

2.2 分差、胜率与梯度

对同一个偏好对核对分差、概率、损失和梯度。

横轴是RM分差,纵轴是预测偏好概率;标注选择与RM预测分开。

在乘法例中,先由给定 rubric 标记 A 为 ywy_w、B 为 yly_l;这是数据标签。奖励模型再对两份答案输出 rw=1.2,rl=0.2r_w=1.2,r_l=0.2;这是模型预测。图上的 sigmoid 读它们的差,不会再做一次乘法事实核查。这里不对 token 词表做 softmax,而是把一个比较分差变成“本标签被预测为偏好”的概率。

一种典型奖励模型把问题和答案编码后输出一个标量,使用 Bradley–Terry 偏好假设:两个答案的胜率由分数差决定。公开实现可以核对 TRL Reward Modeling;更早的语言模型偏好训练可见 Fine-Tuning Language Models from Human Preferences。

P(yw≻yl∣x)=σ(rϕ(x,yw)−rϕ(x,yl)),LRM=−log⁡σ(Δr),∂LRM∂Δr=σ(Δr)−1.\begin{aligned} P(y_w\succ y_l\mid x) &=\sigma(r_\phi(x,y_w)-r_\phi(x,y_l)),\\ \mathcal{L}_{\mathrm{RM}}&=-\log\sigma(\Delta r),\\ \frac{\partial\mathcal{L}_{\mathrm{RM}}}{\partial\Delta r} &=\sigma(\Delta r)-1. \end{aligned}
符号含义、形状与单位
x,yw,ylx,y_w,y_lprompt、选中答案和被拒绝答案,均为可变长 token 序列
ϕ,rϕ\phi,r_\phi奖励模型参数和标量分数;batch 输出形状 [B][B]
Δr\Delta r同一 prompt 的分差 rw−rlr_w-r_l,标量、约定无量纲
σ(a)\sigma(a)1/(1+e−a)1/(1+e^{-a}),输出无量纲概率
≻\succ偏好关系,不是事实真假的等价符号
LRM\mathcal{L}_{\mathrm{RM}}单对比较的负对数似然,单位 nat/pair

若 rw=1.2,rl=0.2r_w=1.2,r_l=0.2,分差为 1,预测胜率 0.731,损失约 0.313;分差的梯度为 -0.269,梯度下降会继续扩大分差。

把三个量按运算次序连接:e−1=0.367879e^{-1}=0.367879,故 σ(1)=1/(1+0.367879)=0.731059\sigma(1)=1/(1+0.367879)=0.731059;再取 −ln⁡0.731059=0.313262-\ln0.731059=0.313262 nat/pair;最后 ∂L/∂Δr=0.731059−1=−0.268941\partial\mathcal L/\partial\Delta r=0.731059-1=-0.268941。反向排序时 Δr=−1\Delta r=-1,预测概率只有 0.268941,损失为 1.313262,梯度为 −0.731059-0.731059,因此对这个错误排序给出更大的局部修正信号。图中曲线横轴是分差,不能把沿曲线向右读成训练已经前进了一步。

这一损失更新奖励模型参数 ϕ\phi。奖励模型学好后用于给策略行为打分,策略优化才更新生成参数 θ\theta;SFT、RM 与策略不能因为都在“训练”就混成同一目标。如果模型把败者分数设得更高,分差 -1,损失约 1.313,修正幅度就更大。将同一问题下全部分数加 100,胜率完全不变,因为只能辨认差值。因此奖励 7 分本身并不表示“70% 正确”,跨不同模型的原始分值也没有统一尺度。

偏好评分器学的是比较分布,不是自动获得真理判定能力。 长度偏好、位置偏好、华丽表达或评审知识缺口都可能变成捷径。可通过交换候选位置、控制长度、保留专家问题和独立事实检查诊断。若用 AI 提供比较,来源改为 AI feedback,但标签仍需要校准;Constitutional AI 是公开的原则与 AI 反馈路线之一,不可据此认定所有 Claude 版本都沿用同一算法和配比。来源:Constitutional AI。

3. 在线 RLHF 与 KL 约束

3.1 在线循环中的职责

奖励模型训练好以后,策略模型生成新答案,奖励模型为其打分,RL 再改变策略,使高奖励行为更常发生。这形成了在线循环。与 SFT 的逐 token 标准答案相比,RL 可以给整段行为一个反馈;反馈到底如何分配给中间步骤,是信用分配问题,后续推理强化学习篇会展开。

候选答案流向评分器、参考策略与价值估计,再形成策略更新

图 2|经典Actor–Critic的职责分离;图中RM分数1.2是示意,不是下一节手定奖励。

从上方候选纸沿三条路径读:RM评价这份答案,reference评估同一答案的概率以比较漂移,Value则读取当时历史来预测未来回报。策略更新需要把反馈和回报估计转成训练信号;图中相减节点展示Value作为基线的职责,不声称每种RL都使用Value。固定的RM与reference在这一阶段不因橙色策略更新箭头而训练。本图选择把KL项纳入回报估计 GG;如果实现还在loss中显式加入同一惩罚,应核对是否已计算过,避免无意重复扣分。

Actor 是正在训练的语言模型;Reference 通常是固定的起始策略,用于限制漂移;Reward Model 是已学到的评分器;Value 是回报估计器,帮助降低方差。

同一A/B下固定ref、采样old和当前策略的概率,分母来自不同身份

三组是三种策略身份,横轴都是完整答案A/B;PPO更新比与reference KL使用不同分母。

这几个名字里,有两条不同的“比较旧值”关系。沿同一 A/B 答案空间,把固定参考取为 πref=(0.5,0.5)\pi_{\mathrm{ref}}=(0.5,0.5),本批采样快照取为 πold=(0.6,0.4)\pi_{\mathrm{old}}=(0.6,0.4),正在优化的当前策略取为 πθ=(0.8,0.2)\pi_\theta=(0.8,0.2)。图中横向三组分别对应 ref、old、current;每组的横轴都是完整答案 A/B,纵轴是概率,每组两根柱的概率和为 1。

PPO 的 A 答案概率比是 0.8/0.6=1.33330.8/0.6=1.3333,分母来自产生本批样本的 old 快照;相对于固定参考的比却是 0.8/0.5=1.60.8/0.5=1.6,它出现在 KL 漂移关系中。本批旧策略不等于固定参考策略。 old 随采样批次更新,reference 在所讨论训练阶段保持固定,current 则在优化。RM 对完整答案给分,Value 对当时历史预测未来回报;它们也不是这三个策略分布的别名。基础离线 DPO 的四路 log-prob 后面只用 current 与 reference,不需要把这个 PPO old 快照硬塞进去。这些逻辑角色可能共享部分工程资源,但职责不能混同。PPO 使用采样旧策略与新策略的概率比限制更新幅度;它的 clip 约束和对 Reference 的 KL 惩罚处理不同关系。PPO 的一般方法来自 PPO 原论文,其机器人/游戏实验不是语言模型训练配方。

3.2 奖励与参考漂移如何共同计价

图 3a|A/B 分布变化与带 KL 目标的手算

图 3a|A/B 分布变化与带 KL 目标的手算

先看概率图:两根柱的横轴 A/B 表示完整答案类别,纵轴表示生成这些答案的概率,不是单个 token 的概率。参考为 [0.5,0.5][0.5,0.5],当前为 [0.8,0.2][0.8,0.2];当前给 A 更多质量,也必须从 B 移走相同质量。图下方把奖励收益与漂移代价分别画出,再相减得到目标,不能只看 A 的柱变高就宣布目标一定更好。

我们对固定问题写一个带 KL 的理想目标,忽略实现中的截断、长度处理及其他损失:

J(π)=∑yπ(y∣x)r(x,y)−β∑yπ(y∣x)log⁡π(y∣x)πref(y∣x).\begin{aligned} J(\pi)&=\sum_y\pi(y\mid x)r(x,y)\\ &\quad-\beta\sum_y\pi(y\mid x) \log\frac{\pi(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)}. \end{aligned}
符号含义、形状与单位
x,yx,y固定 prompt 与包含终止的完整答案;∑y\sum_y 遍历所有候选答案
π,πref\pi,\pi_{\mathrm{ref}}当前策略与固定参考策略的完整答案概率,均为标量分布
rr固定奖励函数,约定无量纲;可由奖励模型或其他机制提供
β\beta正 KL 系数;将 nat 单位转换到约定奖励尺度
JJ最大化的期望目标;第二项是 forward KL,权重来自当前策略
支持集假设当前策略有概率的答案,参考策略应有正概率;并假设归一化和期望存在

把答案暂缩成 A/B 两种,参考概率为 [0.5,0.5][0.5,0.5],当前为 [0.8,0.2][0.8,0.2],则 KL 为 0.8log⁡1.6+0.2log⁡0.4≈0.19270.8\log1.6+0.2\log0.4\approx0.1927 nat。若奖励分别为 1 和 0,当前期望奖励为 0.8;β=0.5\beta=0.5 时目标约为 0.70360.7036。

每个候选对 KL 的贡献也要保留符号:A 项为 0.8ln⁡(0.8/0.5)=0.3760030.8\ln(0.8/0.5)=0.376003,B 项为 0.2ln⁡(0.2/0.5)=−0.1832580.2\ln(0.2/0.5)=-0.183258。单个候选项可以为负,完整 KL 的和才非负。 两项加总为 0.1927450.192745 nat,乘 β=0.5\beta=0.5 得 0.0963720.096372 个约定奖励单位;所以 J=0.8−0.096372=0.703628J=0.8-0.096372=0.703628。参考策略自己与自己比较的 KL 是 0,期望奖励为 0.5×1+0.5×0=0.50.5\times1+0.5\times0=0.5,因此参考 J=0.5J=0.5。

这里的求和/平均对象是一条完整答案分布,KL 单位是 nat;它与 §1.2 的 nat/assistant token 不能直接作大小比较。β\beta 负责把 KL 的单位换到本例奖励尺度。参考策略的目标为 0.5,因此这次偏移仍值得;但继续偏移是否值得由奖励增益与 KL 增长共同决定。

在线训练能探索原偏好数据没有出现的新答案,也会把策略带到评分器不熟悉的区域。若高分来自奉承、冗长或评分器漏洞,优化越成功,真实质量可能越差。KL、独立评测、红队与奖励更新可以缓解这种问题,却不能由训练奖励单调上升证明用户收益。

4. 从约束最优策略走到 DPO

DPO 绕过显式奖励模型训练和在线 RL 循环,使用固定偏好对直接训练策略。原论文给出了它与带 KL 奖励优化之间的联系。以下是以两候选演算为核心的教学重建,目的在于把每个变换检查清楚;并不复述论文全部定理和实验。来源:DPO。

4.1 归一化约束与指数重加权

为便于手算指数,本节把上一节的 β=0.5\beta=0.5 改成 β=1\beta=1,参考仍为 [0.5,0.5][0.5,0.5]、奖励仍为 [1,0][1,0]。这是另一套明确给定系数的理想最优分布例,不是把上一节当前策略接着做一次 SGD。

图 4a|未归一化奖励权重除以 Z,得到理想最优分布

图 4a|未归一化奖励权重除以 Z,得到理想最优分布

先对上面的 JJ 增加归一化约束 ∑yπ(y∣x)=1\sum_y\pi(y\mid x)=1。以拉格朗日乘子 λ\lambda 求每个答案概率的偏导,驻点满足 ry−β(log⁡(πy/πref,y)+1)+λ=0r_y-\beta(\log(\pi_y/\pi_{\mathrm{ref},y})+1)+\lambda=0。

把这条驻点条件拆开,先固定某个答案 yy。奖励项对 πy\pi_y 的导数是 ryr_y;πylog⁡(πy/πref,y)\pi_y\log(\pi_y/\pi_{\mathrm{ref},y}) 的导数是 log⁡(πy/πref,y)+1\log(\pi_y/\pi_{\mathrm{ref},y})+1;归一化约束给出同一个 λ\lambda。因此:

log⁡πy∗πref,y=ryβ+λβ−1,πy∗=πref,yery/βeλ/β−1⏟所有候选共享的常数.\begin{aligned} \log\frac{\pi_y^*}{\pi_{\mathrm{ref},y}} &=\frac{r_y}{\beta}+\frac{\lambda}{\beta}-1,\\ \pi_y^*&=\pi_{\mathrm{ref},y}e^{r_y/\beta} \underbrace{e^{\lambda/\beta-1}}_{\text{所有候选共享的常数}}. \end{aligned}

把共享常数设为 1/Z(x)1/Z(x),才能使所有答案概率相加为 1。图中的“除以 ZZ”是一次对候选答案轴的归一化,不能把它读成给每个 token 单独打分。等价地,可以把 log⁡πref(y∣x)+r(x,y)/β\log\pi_{\mathrm{ref}}(y\mid x)+r(x,y)/\beta 当作答案分数再做 softmax。移项、取指数再归一化,得到:

π∗(y∣x)=πref(y∣x)er(x,y)/βZ(x),r(x,y)=βlog⁡π∗(y∣x)πref(y∣x)+βlog⁡Z(x).\begin{aligned} \pi^*(y\mid x) &=\frac{\pi_{\mathrm{ref}}(y\mid x)e^{r(x,y)/\beta}}{Z(x)},\\ r(x,y)&=\beta\log\frac{\pi^*(y\mid x)}{\pi_{\mathrm{ref}}(y\mid x)} +\beta\log Z(x). \end{aligned}
符号含义、形状与单位
π∗\pi^*理想函数空间中最大化 JJ 的分布;不是有限训练必然得到的结果
Z(x)Z(x)∑yπref(y∣x)er(x,y)/β\sum_y\pi_{\mathrm{ref}}(y\mid x)e^{r(x,y)/\beta},标量归一化常数
λ\lambda归一化约束乘子,与 rr 使用同一约定尺度
ry,πyr_y,\pi_y固定 xx 后 r(x,y),π(y∣x)r(x,y),\pi(y\mid x) 的简写,均为标量

用原创例核对:参考 A/B 概率均为 0.5,奖励为 [1,0][1,0],β=1\beta=1,未归一化权重为 [0.5e,0.5][0.5e,0.5],总和约 1.859,最优分布约 [0.731,0.269][0.731,0.269]。

沿左侧未归一化权重走:A 的 0.5e1=1.3591410.5e^1=1.359141,B 的 0.5e0=0.50.5e^0=0.5,所以 Z=1.859141Z=1.859141。这些权重还不是概率,因为和不是 1。两项都除以同一个 ZZ,得到 [0.731059,0.268941][0.731059,0.268941];右图纵轴此时才是概率。左图的 1.359 和右图的 0.731 不能当作同单位的两次概率测量。代入反解式,A 的第一项是 log⁡(0.731/0.5)=0.380\log(0.731/0.5)=0.380,log⁡Z=0.620\log Z=0.620,相加为 1;B 的第一项约 -0.620,加上 0.620 为 0。

4.2 同题常数相消,得到偏好 margin

同一偏好对的策略与参考,形成四路log-prob。

行是同一问题的胜者/败者,列是current/ref;四个值都是整段答案log-prob之和。

在图左侧,A、B 都已经写在偏好记录中;模型此时评估现成答案的概率,不是每做一次 loss 就重新生成答案。两行共享相同 prompt、模板与答案监督跨度。蓝色 current 列可训练,灰色 reference 列固定;先沿每一行相减,再把两行之差相减,最后乘 β\beta。这里没有 πold\pi_{\mathrm{old}} 一列,因为本基础离线损失没有 PPO 的采样概率比。

前一节的理想奖励反解包含 βlog⁡Z(x)\beta\log Z(x)。它在比较中消失的条件是同一个 xx:胜者减败者时,两份同题常数相同,才有 βlog⁡Z(x)−βlog⁡Z(x)=0\beta\log Z(x)-\beta\log Z(x)=0。若连 prompt、上下文或工具条件也换了,就不能这样直接相消。

下一步只比较同一问题的两个答案,βlog⁡Z(x)\beta\log Z(x) 相消。令语言模型直接参数化这个隐式奖励差,得到一个二元 logistic 分类损失:

aθ=β[log⁡πθ(yw∣x)πref(yw∣x)−log⁡πθ(yl∣x)πref(yl∣x)],LDPO=−log⁡σ(aθ).\begin{aligned} a_\theta=\beta\Bigl[& \log\frac{\pi_\theta(y_w\mid x)}{\pi_{\mathrm{ref}}(y_w\mid x)}\\ &-\log\frac{\pi_\theta(y_l\mid x)}{\pi_{\mathrm{ref}}(y_l\mid x)}\Bigr],\\ \mathcal{L}_{\mathrm{DPO}}&=-\log\sigma(a_\theta). \end{aligned}
符号含义、形状与单位
θ\theta可训练策略参数;πref\pi_{\mathrm{ref}} 固定,不参与梯度更新
yw,yly_w,y_l已标注偏好对;两者条件 prompt xx 必须一致
log⁡πθ(y∣x)\log\pi_\theta(y\mid x)答案 token 条件 log-prob 的和,包括选定的终止目标,单位 nat
aθa_\theta相对参考的偏好 margin,标量;batch 形状 [B][B]
β\beta此处沿用带 KL 目标的系数约定;不同实现参数化需查公式
LDPO\mathcal{L}_{\mathrm{DPO}}单对偏好损失,单位 nat/pair;不是单 token CE

假设策略对胜者/败者的序列 log-prob 分别为 -2/-3,参考值为 -2.5/-2.5。胜者相对增加 0.5,败者相对减少 0.5,取 β=0.2\beta=0.2,margin 为 0.2,胜率 σ(0.2)=0.5498\sigma(0.2)=0.5498,损失约 0.5981。

四路相减完整写成 (−2)−(−2.5)=+0.5(-2)-(-2.5)=+0.5、(−3)−(−2.5)=−0.5(-3)-(-2.5)=-0.5,差是 +0.5−(−0.5)=1+0.5-(-0.5)=1;乘 0.20.2 得 aθ=0.2a_\theta=0.2。再算 σ(0.2)=0.549834\sigma(0.2)=0.549834,−ln⁡0.549834=0.598139-\ln0.549834=0.598139 nat/pair。这里 0.549834 是隐式比较模型的概率,不是模型生成 A 的绝对概率;e−2e^{-2} 才是本教学四路值中 current 对这条 A 序列给出的概率。A/B 在这一例不是整个答案空间的全部结果,所以不要求 e−2+e−3=1e^{-2}+e^{-3}=1。与普通 SFT 不同,DPO 使用的是两答案相对参考的差,不能只拿胜者答案 CE 来代替。

4.3 梯度方向与绝对概率边界

DPO损失与梯度系数沿margin变化,只有current两路参与参数梯度

横轴是margin,不是训练步;曲线是函数值与局部梯度,reference停止梯度。

先看图中的 a=0.2a=0.2 标记:当前比较概率略高于 0.5,损失仍要求扩大胜者相对败者的 log-prob 差。上方蓝线给出单对损失,单位 nat/pair;下方紫线给出参数梯度前的标量系数,在 a=0.2,β=0.2a=0.2,\beta=0.2 时为 −0.090033-0.090033。曲线较左边的排序错误点,局部系数幅度更大;右边 margin 很大时,系数接近 0。这是某个固定偏好对上的导数关系,不是一次模型训练的质量曲线。

其单对参数梯度可以直接由链式法则得到:

∇θLDPO=−βσ(−aθ)[∇θlog⁡πθ(yw∣x)−∇θlog⁡πθ(yl∣x)].\begin{aligned} \nabla_\theta\mathcal{L}_{\mathrm{DPO}} ={}&-\beta\sigma(-a_\theta)\Bigl[ \nabla_\theta\log\pi_\theta(y_w\mid x)\\ &\quad-\nabla_\theta\log\pi_\theta(y_l\mid x)\Bigr]. \end{aligned}
符号含义、形状与单位
∇θ\nabla_\theta对全部可训练参数求梯度;形状与 θ\theta 相同
σ(−aθ)\sigma(-a_\theta)当前排序错误或不确定时较大,正确且 margin 大时较小
−βσ(−aθ)-\beta\sigma(-a_\theta)教学例 a=0.2,β=0.2a=0.2,\beta=0.2 时约 -0.0900

这给出增加胜者相对 log-prob、减少败者相对 log-prob 的更新方向。但参数共享与归一化使所有答案耦合,不能保证每次更新后胜者绝对概率一定上升;模型可能把两者都降下来,只让败者下降更多。DPO 学习相对偏好 margin,不能用它的下降直接证明绝对质量提升。

4.4 四路 log-prob 的实现约定

同一偏好记录送入current与固定ref,token概率先求和,再组成pair损失

每行是一条已知答案,格子是受计目标;先沿答案token轴求和,再比较两条答案。

延续四路值,并明确一次不对称的教学切分:A 有 2 个受计 token,current 每格 log-prob 为 −1-1,合计 −2-2;B 有 6 个,每格 −0.5-0.5,合计 −3-3。reference 对 A 两格各给 −1.25-1.25,对 B 六格各给 −2.5/6-2.5/6,两段和均为 −2.5-2.5。这些格子不声称对应真实 tokenizer,作用是让“先求和还是先除长度”可以实际检查。

固定偏好记录经current与固定ref得到四路序列分数和pair损失

图 3|基础离线 DPO 在训练循环中评估现成答案,无需每步生成新答案

图的两条模型通路读取同一份固定记录,返回四个形状为 [B] 的序列分数;reference 路径标记停止梯度。中间完成两次行内相减与一次胜败相减,最后得到每对一个 loss。这里形状 [B] 中的 B 是 batch 内偏好对数量,不是候选 B 的名字。代码末尾的 .mean() 平均的是 batch 中的偏好对,不是答案里的 token。因此这里输出 nat/pair,不能把它当作 §1.2 的 nat/assistant token。

关键实现只需要四个 [B] 序列 log-prob,但它们必须使用同一 tokenizer、模板和监督跨度。下面为未实测教学片段,预期前述输入给出约 0.5981;框架的实际选项可核对 TRL DPO Trainer。

import torch.nn.functional as F

def dpo_loss(policy_chosen, policy_rejected,
             reference_chosen, reference_rejected, beta=0.2):
    chosen_ratio = policy_chosen - reference_chosen.detach()
    rejected_ratio = policy_rejected - reference_rejected.detach()
    margin = beta * (chosen_ratio - rejected_ratio)
    return -F.logsigmoid(margin).mean()

基础公式使用序列 log-prob 的和,不能随意改成长度平均:平均会改变目标,尽管它可以是有意设计的变体。

用刚才两条不同长度答案算出改变的幅度。求和时两行相对值是 +0.5+0.5 与 −0.5-0.5,所以 margin 为 0.2。若先分别除以 2 和 6,则相对均值变为 0.5/2=0.250.5/2=0.25 与 −0.5/6=−0.083333-0.5/6=-0.083333,margin 变成 0.2×[0.25−(−0.083333)]=0.0666670.2\times[0.25-(-0.083333)]=0.066667,loss 约为 0.660369。不是小数显示精度改变,而是目标本身改了。

如果两行的相对增加都为正,长度归一化甚至可以改变排序方向。另取一个明确不同的例子:current 仍为 −2/−3-2/-3,reference 改为 −2.3/−3.6-2.3/-3.6,相对增量是 0.3/0.60.3/0.6。按序列和计算 a=0.2(0.3−0.6)=−0.06a=0.2(0.3-0.6)=-0.06;按长度平均却得 a=0.2(0.3/2−0.6/6)=+0.01a=0.2(0.3/2-0.6/6)=+0.01。这个补充反例使用了新的 reference,不能冒充原来 −2.5/−2.5-2.5/-2.5 那组数的更新结果。prompt 参与合法上下文,但不进入回答 log-prob 的求和;padding 不计入求和,也不应作为可读内容进入注意力。beta 对理论最优策略控制偏移;在固定一批 margin 的局部梯度里也影响斜率,不能脱离参考模型、训练量和实现方式断言“越大更新一定越小”。

4.5 三候选实算:损失下降,胜者就更常出现吗?

独立logits的真实一步,与另一个低损失分布分别展示。

独立logits的真实一步,与另一个低损失分布分别展示。(教学算例)

横轴是完整答案的概率质量,范围0–1;蓝A=391,橙B=381,灰C=其余答案集合。每行三段和为1。纵向三行是初态、真实SGD一步、另一合法分布,只有前两行之间有更新箭头;分隔线下的反例没有被画成同一次更新结果。

图中真实的一步使A上升;第三行是另一个合法分布,A、B都下降但A/B提高。两种损失都能降低,不能把第三行冒充第二行的SGD更新。

把同一道乘法题的完整答案暂时压缩成三个离散结果:A=391,B=381,C=其他答案。C 是剩余概率的集合,不预设它全对或全错。这一缩小空间用于检查目标性质,不是实际 tokenizer 的三个 token。 参考分布固定为 u=(1/3,1/3,1/3)u=(1/3,1/3,1/3),当前分布为 p=(0.30,0.20,0.50)p=(0.30,0.20,0.50),偏好对只有 A 胜 B,β=0.2\beta=0.2。

先把同一组数字放回三种监督:若 SFT 示范是 A,完整答案的 NLL 为 −log⁡0.30=1.203973-\log0.30=1.203973 nat/answer;它与 1.2 中按 assistant token 平均的损失口径不同。若 RM 给 A/B 打分 1.2/0.2,比较概率为 σ(1)=0.731059\sigma(1)=0.731059;C 的得分不参与这一对。DPO 则读取相对参考的概率比:

a(p)=0.2[log⁡0.301/3−log⁡0.201/3]=0.2log⁡1.5=0.081093,L(p)=log⁡(1+e−a(p))=0.653422.\begin{aligned} a(p)&=0.2\left[\log\frac{0.30}{1/3} -\log\frac{0.20}{1/3}\right]\\ &=0.2\log1.5=0.081093,\\ \mathcal L(p)&=\log(1+e^{-a(p)})=0.653422. \end{aligned}

先算真正的一步。 仅在本例中,让三个 logits zz 独立可训练,p=softmax⁡(z)p=\operatorname{softmax}(z),并取 z=log⁡pz=\log p。

三个独立logits经指数和归一化得到概率,更新logits后重新归一化

三列是完整答案A/B/C;行是logits、指数权重、归一化概率,不是三个token时间步。

先走图中“更新前”的一侧:z=(ln⁡0.30,ln⁡0.20,ln⁡0.50)z=(\ln0.30,\ln0.20,\ln0.50),约为 (−1.203973,−1.609438,−0.693147)(-1.203973,-1.609438,-0.693147)。取指数得到 (0.30,0.20,0.50)(0.30,0.20,0.50),总和恰为 1,所以 softmax 还原原分布。真实语言模型每个位置的 softmax 是在 token 词表轴上;这里则刻意缩成三个完整答案类别,用于检查 DPO 目标性质,不能混用这两种列含义。两项 log-softmax 的公共归一化项相消,所以 a=β(zA−zB)a=\beta(z_A-z_B),第三坐标梯度恰为零。

展开公共项相消的原因:log⁡pA=zA−log⁡∑iezi\log p_A=z_A-\log\sum_i e^{z_i},log⁡pB=zB−log⁡∑iezi\log p_B=z_B-\log\sum_i e^{z_i},相减只留下 zA−zBz_A-z_B。因此此特殊参数化下,zCz_C 的直接梯度为零;但更新后分母重新计算,pCp_C 仍可以改变。零 logit 梯度不代表该类别概率保持不变。梯度与学习率 η=0.5\eta=0.5 的一次下降是:

∇zL=(−0.095948,  0.095948,  0),p+=softmax⁡(z−0.5∇zL)=(0.313060,  0.189613,  0.497327),L(p+)=0.644262.\begin{aligned} \nabla_z\mathcal L &=(-0.095948,\;0.095948,\;0),\\ p^+&=\operatorname{softmax}(z-0.5\nabla_z\mathcal L)\\ &=(0.313060,\;0.189613,\;0.497327),\\ \mathcal L(p^+)&=0.644262. \end{aligned}

这一步确实提高 A 的概率,不能为了讲反例,把真实梯度步骤画成 A 下降。图中展示的是另一个合法分布 p′=(0.28,0.16,0.56)p'=(0.28,0.16,0.56):它说明仅凭目标值降低,无法反推出绝对概率增加。

pA′pB′=1.75>1.50,a(p′)=0.2log⁡1.75=0.111923,L(p′)=0.638751<0.653422,−log⁡pA′=1.272966>1.203973.\begin{aligned} \frac{p'_A}{p'_B}&=1.75>1.50,\\ a(p')&=0.2\log1.75=0.111923,\\ \mathcal L(p')&=0.638751<0.653422,\\ -\log p'_A&=1.272966>1.203973. \end{aligned}

A、B 让出的 0.02 与 0.04 都进入 C,总概率仍为 1;A/B 改善,而单独模仿 A 的 NLL 变差。真实语言网络共享参数,还同时处理许多偏好对,情况比三个独立 logits 更耦合。反例限定的是“从 DPO loss 下降推断胜答绝对概率或任务质量”的推理,不是否认这个独立 logits 例中梯度的上升方向。

本次用 NumPy float64 独立核算了归一化、两种分布的损失和一步更新;中心差分对三个 logit 梯度的最大误差约 5.7×10−125.7\times10^{-12}。这是确定性目标函数验算,没有运行模型训练。精确结果保留在本次工作记录,原有教学代码和历史验证边界保持原含义。

5. 反馈含义、分歧与独立评测

5.1 三种反馈不构成必经流水线

图 5a|固定偏好记录与在线新候选的数据来源(ImageGen 教学图)

图 5a|示范、固定偏好与在线尝试提供不同监督(ImageGen 教学图)

图左从固定文件夹取出 A=391、B=381,两张已有纸页进入评估托盘;图右才从策略生成口产生一张新候选,再到算术检查托盘取反馈,橙色回线代表策略更新。左右对照的是本步候选的来源,不是断言离线方法不更新参数。左侧 DPO 仍对现成答案做前向、计算损失和反向传播,只是不必在每个训练步重新采样答案。SFT 的单份示范来源已在第1章展开;下表把三种反馈职责放回同一问题。

方法给模型的反馈学习的直接对象主要检查
SFT一份示范轨迹示范输出的条件概率标签跨度、示范正确性、任务泛化
RM + RLHF比较训练评分器,在线轨迹获得奖励高奖励行为的采样概率reward hacking、KL、独立结果评估
基础离线 DPO固定胜者/败者对相对参考的偏好 margin标签噪声、长度效应、离线覆盖与漂移

偏好对只覆盖已有候选;若数据中从未出现正确解法,基础离线目标没有在线环境帮它发现。理论联系依赖偏好模型和理想函数空间,有限样本、矛盾标注、模型容量与优化误差都可能打破预期。SFT 也不必永远在偏好训练之前,训练系统可以混合或迭代这些信号;这里的顺序用于理解职责。

5.2 保留分歧,保留监督的统计含义

这一节先控制事实正确性,换成同题的两份正确候选:A 只回答“391”,B 给出“340+51=391340+51=391”的证明。图中 B 不再是前面错误的 381。这样才能把标注差异与长短、解释需求联系起来,而不让算术错误被风格解释掩盖。

图 5b|保留 7∶3 标签与把多数改为绝对硬标签,优化目标不同

图 5b|保留 7∶3 标签与把多数改为绝对硬标签,优化目标不同

同一偏好对可以有分歧。假设对固定问题与固定两答案重复标注,十次中七次偏好 A、三次偏好 B;

这里的 7∶3 是对固定问题、固定两答案的比较标签计数。如果继续使用前文 391/381 那一对,它意味着有人偏好了错误的 381,并不表示 381 有 30% 的概率算对。图中的十个票据是十条标注,不是十次模型生成,也不是“正确概率”分块。把十条都保留下来,logistic 目标的最优预测概率是 0.7,最优分差为 log⁡(0.7/0.3)≈0.8473\log(0.7/0.3)\approx0.8473。

这个结果来自保留频率后的平均比较损失。令 vv 是模型预测偏好 A 的概率,范围为 (0,1)(0,1):

ℓ(v)=−0.7ln⁡v−0.3ln⁡(1−v),dℓdv=−0.7v+0.31−v=0,v∗=0.7,Δr∗=ln⁡0.70.3=0.847298.\begin{aligned} \ell(v)&=-0.7\ln v-0.3\ln(1-v),\\ \frac{d\ell}{dv}&=-\frac{0.7}{v}+\frac{0.3}{1-v}=0,\\ v^*&=0.7,\qquad \Delta r^*=\ln\frac{0.7}{0.3}=0.847298. \end{aligned}

曲线在 v=0.7v=0.7 达到最低点,是对这份标注频率的拟合;把全部标签改成 A 后,目标变成 −ln⁡v-\ln v,在没有正则的理想情况下持续偏好 vv 接近 1。两条曲线的横轴是预测概率,不是标注人数或训练步。若只保留多数标签并把它当作绝对正确,信息就变成“所有标注都偏好 A”,理想的无正则 logistic 目标会持续推动分差增大。这两种数据整理方式训练的对象不同,不能把硬标签替换当成无影响的压缩。

分歧也未必只是噪声。有人重视简洁,有人需要完整证明;

本节图中正是用两个都正确的答案做控制:同题 A 只回答“391”,B 回答“17×20+17×3=340+51=39117\times20+17\times3=340+51=391”。这与前文华丽但答成 381 的 B 是不同候选对;不先控制事实正确性,就不能把 7∶3 全部归因于长度偏好。如果问题没有写清约束,两个答案可能各有合理用途。把需求写入 prompt、分项标注事实与风格、保留平局或不确定标签,可以让监督含义更清楚。胜答与败答必须对应同一个输入条件:问题、可用工具或上下文不同,序列概率之差就失去原来的偏好解释。

5.3 训练指标与独立任务结果

同一短正确和长错误答案分别接受事实、格式、偏好来源和代价检查

四个检查对象分开;答案长度仍用2/6格教学切分,不是实测tokenizer计数。

从上方 A=391 与长解释 B=381 分别往下看。事实槽用 340+51=391340+51=391 核对算术;格式槽另按用户“只回数字”的约束核对,所以内容正确和格式符合是两项结果。偏好槽保留rubric与标注来源,不让一张风格票覆盖事实;代价槽数有效目标或其他事先定义的成本。若任务还包含工具执行,就另外检查真实返回与环境状态,不能从语言回答看起来完整推出工具已经成功。

训练结束后,最好分开检查独立事实题、格式与工具执行、开放偏好和代价变化。某个偏好集胜率提高,可能主要来自更长回答或更熟悉裁判风格;某个 DPO loss 降低,也可能集中在已有候选的排序。保留训练外任务、固定推理预算,并观察回答长度、拒绝率和具体失败样本,才能判断提升是否来自期望的行为。这里仍没有从偏好标签推出真假标签的数学保证。

到这一阶段,助手学会了对话协议、输出习惯和偏好方向。要让模型自行尝试复杂数学、执行代码测试、使用工具反复验证,还需能评价结果的环境与强化学习信号。下一篇沿这个缺口解释可验证奖励、策略梯度和推理能力的增长。

下一篇:强化学习、可验证奖励与推理训练 · 返回导读

正在连接 GitHub 评论…