任务与先修:先固定奖励,再优化分布
第四章拟合的是比较概率,现在暂时把实数奖励r当作已给定输入,研究另一个问题:怎样改变策略,使期望奖励增加,同时不任意远离参考策略q。读者需会有限求和、对数、导数与约束极值;拉格朗日乘子的具体操作会逐步写出,不假定读者已经知道结论。我们只在一个固定x下求四候选分布,随后逐上下文应用。真实参数共享策略可能无法同时实现所有逐x最优分布,这个表达能力限制必须与分布层面的解析解分开。
固定有限动作集合,参考概率全部严格正且和为一,奖励有限。待选概率非负、和为一。定义前向KL为各项 的和,并约定为零时该项取连续极限零。目标J是期望奖励减倍KL,严格正。这里“前向”仅指本课采用p到q的方向,不把另一方向也叫同一个惩罚。的单位与奖励相同;它不是学习率,也不是softmax采样温度的任意别名。
从一阶条件得到候选解
先在所有为正的内部寻找驻点。把和为一的约束用乘子加入目标,写成期望奖励减 KL加乘概率和减一。对求导,奖励项给,p logp/q的导数是logp/q加一,约束给。令导数零,得到等于除,再加一个与动作无关的常数。取指数后等于乘e的除次方,再乘同一个常数。
归一化决定这个常数:定义Z为所有乘e的除次方之和,Z严格正且有限,所以常数为一除Z。得到与q按奖励指数倾斜的分布。正q与有限r确保每项正,候选确实位于内部,且和为一。我们没有只把一阶条件当成最优证明;下面把任意可行分布与候选直接比较,覆盖边界与全局性质。
用另一路证明全局最优
由定义,奖励可重写为乘,再加 。代入任意p的J:期望中的 因概率和为一保持不变;剩下乘p加权的,减乘p加权的。两个q项相消,得到J(p)= − 。这是精确代数等式,而不是某种训练近似。只要KL非负,即达到全局最大 。
KL 非负须单独处理 p 的零项。定义支持集 S={a:p_a>0},零项按 0 log 0=0 的连续极限处理。对 t>0,−log t≥1−t:两边差的导数为 1−1/t,在 t=1 前负后正,最小值为零。对每个 a∈S 取 t=p*_a/p_a,乘 p_a 后在 S 上求和,得到 。第一步右边不能直接写为零:若 p=(1,0)、p*=(0.7,0.3),它是 0.3,而实际 KL=−log 0.7≈0.356675。 本章 q 各项为正、奖励有限、τ>0,故 p* 每项严格正。若 S 缺少任一动作,则 1−Σ_S p*>0,不能取等;若 S 是全集,则第一不等式取等要求每项 p*_a/p_a=1。因而等号仅在 p=p*,给出唯一全局最优。这个检查与驻点计算走不同路线,也覆盖了概率单纯形边界。
算例一:两个候选的完整最优账
令q=[1/2,1/2],奖励r=[1,0],=1。未归一化权重是[e/2,1/2],Z=(e+1)/2,=[e/(e+1),1/(e+1)],约[0.731059,0.268941]。期望奖励为0.731059,KL约0.110944,目标差约0.620115;另一条路计算也约0.620115。两个值相等是对推导的直接代回检查。
若不顾KL只选第一个,奖励达到一,但KL为log2,正则目标约0.306853,反而低于。参考q本身奖励0.5、KL为零,目标0.5,也低于。比较三者可见最优不是保持参考不动,也不是一味最大化奖励。它是在预先固定下的折中;若任务真的允许完全抛弃参考,应改变目标而不是声称这个正则解“没优化好”。
将改为0.5,变为sigmoid二与一减sigmoid二,约[0.880797,0.119203],更集中到高奖励。趋很大时指数奖励差被压小,分布趋q;趋零正侧时质量集中到奖励最大的动作,并在并列最大者内部按q比例分配。这是给定有限奖励的极限结论,不表示数值代码可以直接把设为零;公式和实现都要求严格正,极小时还需稳定log空间计算。
奖励的零点和尺度
给同一x下所有r加c,未归一化权重都乘e的c除次方,归一化后完全相消,最优策略不变;目标最大值只平移c。这个自由度与BT中共同奖励偏置不可识别一致。若把奖励乘正数k,同时把也乘k,奖励除不变,也不变。只乘奖励、不改,则策略更集中,不能称为同一优化问题的等价表述。
因此BT奖励的单位约定会进入后面的DPO 。我们固定比较sigmoid温度为一,作为奖励到策略的转换尺度。现实不同奖励模型训练出来的分数可能有不同尺度,直接复用同一个KL系数未必可比;应该基于明确目标和验证协议重新校准。当前项目只在有限响应上精确算KL,序列版还存在整个文本空间无法穷举的问题,第七章会把可算诊断与真正全分布KL严格区分。
算例二:零支持让高奖励无路可走
设参考q=[1,0],奖励r=[0,100]。若候选p给第二动作任何正概率,KL中会出现p2乘logp2除零,发散为正无穷,正则目标负无穷。要保持有限目标只能p2=0,因此最优仍为[1,0],不论第二奖励多高。先前正支持公式的条件在此不成立,不能直接算零乘无穷后说策略自动发现第二动作。
这个反例说明参考支持是实质性条件。有限softmax数学上给所有动作正概率,但实际浮点概率可能下溢,代码应优先保留log概率并做稳定归一化。项目参考小策略数值范围温和,boltzmann函数还显式拒绝非正q与非正。拒绝不等于“修复”零支持;若任务允许改变支持,需要重新定义策略空间或平滑参考,并承认它改变了目标。独立检查是枚举可行支持,而不是只看函数是否返回向量。
KL方向不是符号习惯
若惩罚改成,导数里的项会变成除,而不是加一,最优不再是同一个指数倾斜。两种KL在p=q处都为零,也都非负,但远离参考时对稀有事件的惩罚不同。看到实验日志里一个名为“KL”的数不足以知道优化对象,应注明哪一个分布负责求期望、哪个放在对数分母,以及是否只对候选子集归一化。
在语言模型里,整回答分布KL是对所有可能完整响应的求和;单个固定回答的log比只是其中一个随机变量取值,可能为负,并不等于KL。若从当前策略采样,logπ除q的期望才对应前向KL,且必须保持同一条件、边界与采样分布。有限项目可以穷举四动作,所以没有抽样误差;完整decoder候选诊断只在四条指定字符串重新归一化,不能据此报告整个语言模型的KL。
与参数化训练的关系
分布是逐x的理论最优,但共享八参数线性策略不一定能在全部x上精确表示它。即使能表示,有限次梯度更新也未必到达。完整decoder的限制更多:表示、有限数据、偏好模型误差与优化误差都可能存在。解析解提供的是推导DPO的桥梁与有限算例的检验基准,而不是对任何训练运行“最终会收敛到这个结果”的保证。
本章项目增量是boltzmann函数、精确KL与最优值的双路验算,以及零支持的故障拒绝。第六章将把BT奖励写成最优策略与参考的log比,利用同一提示下归一化常数相消,得到直接在策略上计算的DPO损失。读者应先能说出这里奖励已给定、下一章奖励来自比较假设这两层区别,避免把变量替换误当成不需要偏好数据或不需要模型条件。
“KL约束”与“减去KL惩罚”应精确区分。硬约束问题会先规定允许KL不超过某个预算,再在可行域内最大化奖励;本章固定优化惩罚形式,不事先承诺最终KL恰为某个数。特定凸条件下可以用乘子联系两者,但预算与乘子的映射依赖奖励和参考分布。若日志只写0.1,不能据此声称模型实际偏离恰好0.1 nats。第八章会用实测KL而不是系数名字描述偏离。
稳定计算最优分布时,先形成每动作的logq加r除,取这些数的最大值a,全部减a后再指数归一化。公共e的a次方在分子分母相消,结果与直接公式相同,却避免高奖励或小使指数溢出。最大值a只是数值基准,不是新奖励阈值,也不改变支持。若q本身已经在浮点中舍入成零,则应保留更早的logq,而不是对零取log后假称稳定化能恢复丢失的信息。
有限生成树提供从四动作到文本的一个概念桥梁。每个节点是已生成前缀,边是下一个token的条件概率;根到EOS路径概率是边概率连乘。若设置最大长度,应把未EOS的末端登记为abort结果,连同所有已结束路径共同构成完整样本空间。只有在这个完整空间定义奖励与参考,分布层面KL最优结论才有相同含义。项目只评分给定短路径,不枚举整棵树,因此不能把候选诊断升级为已算全树最优。
当模型参数同时服务多个x时,逐x的解析解只是一个目标分布族。共享参数训练相当于在可表达分布族内寻找折中,未必能达到每个Z给出的上界。用自由分布的最大值减去实际参数化目标,可包含表达与优化两类缺口,若奖励又是拟合得到,还多一层估计误差。把这些误差来源列清,才不会从解析式错误推断任何规模网络或任何数据量都有同样保证。
对于奖励全相同的极限,指数因子共同相消,最优分布必须回到q;这是一个很强的单测。如果函数反而输出均匀,说明实现丢掉了参考因子。对于很大同样应接近q而非默认均匀,只有q本来均匀两者才巧合。项目boltzmann单测同时检查正支持和最优值,读者可用这个退化例独立检查自己的移植代码。
import math
q=[.5,.5];r=[1.,0.];tau=1.
weights=[q[i]*math.exp(r[i]/tau) for i in range(2)];Z=sum(weights);p=[v/Z for v in weights]
kl=lambda a,b:sum(x*math.log(x/y) for x,y in zip(a,b) if x)
J=lambda a:sum(x*y for x,y in zip(a,r))-tau*kl(a,q)
assert abs(J(p)-tau*math.log(Z))<1e-12
for i in range(1,1000):
a=[i/1000,1-i/1000]
assert abs(J(a)-(tau*math.log(Z)-tau*kl(a,p)))<1e-12
assert J(a)<=J(p)+1e-12
shift=[q[i]*math.exp((r[i]+3)/tau) for i in range(2)];shift=[v/sum(shift) for v in shift]
assert max(abs(a-b) for a,b in zip(p,shift))<1e-12
print('optimal',p,'reward',p[0],'KL',kl(p,q),'objective',J(p),'logZ',math.log(Z))
TRY IT YOURSELF
练习一:联动尺度
若奖励全部乘三,tau也乘三,p星是否变化?若只乘奖励呢?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:支持条件
q=[0.8,0.2]且奖励两项相等时p星是什么?q=[1,0]且第二奖励很高时呢?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:单个log比
某个回答的logπ除q为−2,能否判定KL为负、实现错?说明完整定义。