任务与先修:不让训练目标自己证明成功
最后一章把前面的数学与工程转成有边界的实验结论。读者需能计算logprob、KL、有限期望,理解response-only与固定参考。我们同时保留有限策略和完整decoder,不能从前者精确可算的量借名给后者。评价首先回答“哪个模型、哪个数据、哪个分布、哪个指标”;若只有一个没有单位的总分,即使小数很多也无法判断它支持什么。项目版本从固定seed与预算运行,测试不参与超参数选择,格式探针只用于冻结后的诊断。
有限参考实现lab.py的test是四个预先留出的数值上下文。它只有四个可能动作,故正确质量、简短质量、oracle期望与前向KL都能精确求和,无需Monte Carlo。序列版sequence_lab.py却可能生成任意字节路径,四个指定回答只占其中一部分,不能把候选条件期望当全策略期望。两者的任务语义相近,但概率空间不同,图表和字段必须分开,避免把一个小模型的数学便利变成另一个模型未运行的能力声明。
算例一:有限策略的行为改善确实是什么
固定seed十三、SFT与DPO各二百更新,有限策略在test上的正确质量从base约0.509411到SFT约0.894645,再到DPO约0.984084;简短质量分别约0.515398、0.660011、0.980910。期望oracle分别约0.412491、0.826647、0.980266。最后一个数可独立用0.984084减0.2乘一减0.980910恢复;差值来自四个候选的完整质量分布,而不是挑一条好看的输出。
DPO相对SFT参考的精确前向KL约0.416272。参考对自身KL为零;base到SFT的KL约2.026211,这只是把随机起点放到固定SFT基准下的分布差,并非训练中优化的惩罚记录。BT小奖励模型在留出pair上排序全对,说明其两个特征足以表达这套合成比较;它没有学习人类判断,也没有给decoder外部奖励评分。所有这些数值必须带着四动作空间与已知规则解释。
独立检查一是从逐x四概率重新求三个期望,再跨四个上下文平均;独立检查二是概率求和为一、oracle恒等式与KL非负在数值容差内成立。若使用greedy动作代替四概率期望,会得到另一项统计,可能掩盖仍存在的错误质量。有限模型全参数中心差分和真实训练都通过,只能说明定义的算法链路在该样本上正确,不从一个seed推断所有初始化都改善。
算例二:完整decoder出现不同目标的真实冲突
完整序列模型11472参数,CPU单线程,SFT六十步后冻结参考,再DPO四十步。训练DPO loss从log2约0.693147降到最后更新前约0.020371;测试十二条比较的reference校正margin全为正。canonical四提示的greedy短答在SFT与DPO阶段都是四对四,因此DPO没有在这个已达满分的小greedy指标上产生可观察改善。只展示DPO后四个正确样本会隐藏这个天花板。
与此同时,test示范的平均完整回答NLL从SFT约1.284213恶化为32.205868;按回答目标平均则从0.132850变为3.331642。原因不是分母漏算,而是示范中仍有三分之一正确冗长回答,偏好阶段把它们作为loser显著压低。这个实测符合第二章的目标冲突:模仿示范频率与偏向简短不是相同任务。它不自动等于“DPO坏了”,也不能被改名成所有性能都提升。
更强的诊断是第七章的绝对概率:x=-3.5的正确短答NEG从约0.492814降为0.103779,虽其候选条件概率趋近一。这说明即使预定winner的真实路径概率也下降,概率被移往未枚举字符串,DPO相对目标仍能变好。完整decoder真的出现了理论反例,而非我们事后造一个只有输出表的示意数字。应同时保留绝对logprob、候选总质量与条件概率,不能把候选softmax漂亮的一列当作完整生成分布。
评价比较模型时的特殊陷阱
序列收据中的implicit_pair_accuracy看乘相对reference log比差是否为正。SFT等于reference时所有margin恰好零,按严格大于零计数准确率为零;这不表示SFT对偏好完全错误,只表示它相对自己没有任何偏好改变量。这个指标专门诊断DPO隐式margin,应与原始回答logprob排序、实际生成和oracle区分。把名称省成“回答准确率”会造成严重误读。
candidate_conditioned_kl先把四条指定回答的logprob重新softmax,再对这个四类分布计算KL。测试平均约0.156170,它没有包含候选之外质量流向,所以可能很小而完整生成行为已明显变化。项目不报告未测的全语言分布KL上界,也不把DPO 直接当作某个实测KL阈值。若要估计完整路径KL,需要明确有限生成树或采样策略、包含EOS与abort、并给误差与支持条件;当前没有执行这一额外估计。
格式迁移:全部失败都留下来
固定权重后,probe_formats.py一次性运行五个预定变更:Unicode减号、把x字段改为value、用英文negative two、显式正号+、以及正值value字段。它们都保留对应数值真值,但超出了训练时“x=定点小数;answer:”的canonical格式。所有结果写入同一文件,不按成功失败筛选,也不据它们调新参数。格式迁移诊断与四个canonical测试分开,不用五失败修改原先固定测试分母。
真实输出中,Unicode减号提示“x=−2.0;answer:”得到“G”并EOS;显式正号“x=+2.0;answer:”得到“NEG”,符号判断错误。负值value字段与正值value字段产生含非法UTF-8替代字符的字节串,并在二十四步上限内未结束;英文negative two得到格式外片段并未结束。五项严格正确率为零。原始token编号、valid_utf8、EOS与完整显示文本均保存,替代显示没有被当成原始字节修正后再评分。
这个结果说明模型学到的可能是canonical格式中ASCII负号及固定位置的模式,而不是格式无关的数值语义。固定字节词表使Unicode减号可编码,不代表模型已经学会把其三个字节等同ASCII减号。learned位置与极少提示变化也使字段长度改变产生分布迁移。不能从这一次失败断言所有模型必然如此;可以精确说当前冻结微型模型在这五项探针失败,且结果反驳了“canonical满分就具有通用判断能力”的外推。
beta网格与选择边界
有限参考另保留0.1、0.5、2三个验证点,其他预算相同。对应验证KL约0.398593、0.410743、0.334603,并不单调;验证期望oracle约0.999108、0.999653、0.995182。变化同时影响margin尺度、梯度与饱和,所以有限步结果不遵守“更大实测KL必更小”的简单口号。这个小表用于解释训练动力学与理论最优的差别,不从三个点提炼普遍最优。
序列版0.1和六十加四十更新预先固定,没有用格式探针或test挑选。若将来看到失败后扩充格式数据,那是合理的新实验,但需要新版本、重新划分验证及新留出条件;不能把修改后的结果覆盖原失败后声称同一冻结版本一直稳健。比较模型改进时应匹配训练预算、数据与解码规则,保留原有失败类型,避免只添加模型刚学过的新测试模板。
不确定性与未测行为
四个数值test与五个格式探针太少且设计相关,不适合给自然语言总体的狭窄置信区间。零失败率或满分只是这几项观测,不是未知分布的保证。我们没有多seed序列训练,没有随机采样成功率估计,没有人工偏好重复标注,也没有开放回答任务。不能把奖励排序全对、greedy四对四或候选条件概率一改写为安全、事实准确或商用可用的证明。
项目没有实现PPO、在线奖励反馈、LoRA或多轮对话;DPO使用离线比较和完整参数梯度。序列checkpoint只为冻结评价,不含完整AdamW恢复状态。标准库reference能精确续一步SGD的收据仍独立有效,不能替它补上序列训练未保存的状态。把未实现项列清,不是缩减已做的完整decoder训练,而是确保每个动作都对应真实代码和证据。
最终验收件
项目压缩包应包含有限参考、decoder副本、sequence_lab、严格格式评分、格式探针、两套固定状态与收据,及十七项测试。先在独立解压目录运行测试,再独立载入sequence-state.pt评分与重算有限指标。源码与数据契约摘要绑定版本,作者收据不吞并网站主任务后来生成的独立验收文件。课程页面代码标明standalone、project或command,防止把需要模型文件的片段当成单文件标准库例子。
本课闭合的能力是从示范与比较定义目标,推导BT/KL/DPO,训练一个真正全参数小decoder,并用独立证据识别成功与失败。它没有把线上API调用称为训练,也没有用查表替代完整模型。所有正式结论都带着任务、数据、模型与预算边界;读者应能从同一份冻结产物重算每个指标,保留目标冲突与失败,而不是只记住“对齐后更好”这个没有操作含义的口号。
分样式只读诊断防止把混合NLL恶化说成所有能力都差:长答是偏好主动压低的类别,但短答平均NLL同样由0.690142升至2.658300,提供独立证据。BOS屏蔽则只属于greedy解码,不属于response_logps原始softmax;故四对四是受该解码规则约束的行为观测。报告将两条区别与原始分数一起保留,不用候选归一化或解码约束掩盖真实概率空间。
数据规则和格式探针都随项目公开,读者可重算而不必相信作者的主观评分。独立验收应先核对冻结模型与源码身份,再按同一停止和解码规则检查原始编号;若改变评分规则,必须把它登记为新评价协议,而不是覆盖旧结果。
import math
correct=.9840835773986907;brief=.9809099070167226
oracle=correct-.2*(1-brief)
assert abs(oracle-.9802655588020353)<1e-12
sft_nll=1.2842129468917847;dpo_nll=32.205867767333984
assert dpo_nll>sft_nll
winner_abs=.1037786202280831;candidate_mass=.1037786202280831
conditional=winner_abs/candidate_mass
assert conditional==1 and winner_abs<.11
failures=[True,True,True,True,True]
print('finite expected oracle',oracle,'sequence NLL change',dpo_nll-sft_nll,'winner conditioned',conditional,'format failures',sum(failures))
TRY IT YOURSELF
练习一:不同准确率
SFT参考的implicit_pair_accuracy为0,而greedy正确率为1,是否矛盾?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:结果陈述
依据真实收据写一句支持的结论和一句不支持的结论。
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:下一版本验收设计
若要修复显式+号失败,怎样避免把已见失败变成新的虚假泛化证明?