先检查下载包是否真能独立运行
课程项目应该是一套完整实验,而不是几段依赖作者电脑隐含路径的代码。下载解压后,目录中包含decoder.py、run.py、lab.py、probe_formats.py、tests.py、README、依赖清单、数据合同、来源记录与evidence。它不导入兄弟课程,不读取网页章节JSON才能运行,也不要求外部模型或密钥。decoder虽然来自本套件自己的Transformer教学实现,已经按字节复制到项目并记录来源,学生不必再找另一个下载包补依赖。
环境要求Python至少3.11与PyTorch2.6.0;核心项目本身不用NumPy或Pillow,不能照抄其他课程依赖导致不必要安装。记录的实跑环境是Python3.12.14、PyTorch2.6.0、CPU单线程。不同硬件和库版本可能改变浮点细节或随机序列,严格重放应使用相同环境;功能复现则检查概率归一、梯度恒等式、参考冻结和评价方向,并保存新环境信息。不能没跑过就写成跨平台全部通过。
一次完整复跑的输入输出闭环
先运行stdlib lab.py,它不需要神经网络依赖,验证三个动作的解析梯度、有限差分以及组均值/留一基线的精确枚举。再运行tests.py,它包含验证器、数据划分、因果mask、采样重放、路径评分、KL梯度两路、冻结检查点以及短训练闭环。最后用run.py train --output my-run运行完整40加100步,得到新检查点和报告;evaluate重读它,probe_formats对同一新权重输出序列化压力测试。
所有命令从项目根目录运行,--output是显式实验目录。随包evidence是讲义引用的冻结原始结果,新实验写my-run,不覆盖它。输出检查点保存当前策略与参考,结果JSON保存配置、数据摘要、预算、分阶段指标、梯度和参数变化。格式报告不是训练的一部分,不修改权重;同一检查点可以反复只读评价,验证“报告数字属于这份权重”,而不是只相信训练时打印的一行摘要。
算例一:把报告中一句话追到实际文件
报告说“RL更新全部十七个参数张量”。先到results.json读取rl_tensor_max_updates,核对每个值正;再查看history最后一批tensor_gradient_norms,核对每个有限非零;最后用checkpoint重建模型,parameter_count确为2768,named_parameters确为十七个。还要检查参考哈希与加载参考模型一致、reference_unchanged为真。只有trainable计数没有梯度和差值,是意图声明,尚不足以证明实际更新发生。
报告说“测试平均成功概率0.0000325802”。运行evaluate加载同一checkpoint,对五题各一百路径重新前向,验证每题概率和接近一,把严格成功路径质量平均,得到同一量。若只是读取results.json再打印它,就没有独立重算,测试很可能把旧错误原封不动复制一遍。本项目冻结测试确实重新调用模型和验证器计算,其他统计也保留逐题数据,便于读者另写独立核对。
清单能证明联系,不能证明真理
evidence/source-manifest.json记录学生源码、README、协议、检查点、数值报告、格式压力结果以及八章讲义的SHA-256。每条明确相对路径、字节数和摘要。它绑定本次材料,能发现源码后来变化、指标被替换或检查点串台;但摘要不能证明数学推导正确,也不能替代正例、反例、梯度检查和独立评价。课程网页打包还会生成单独ZIP清单,二者用途是追踪不同交付边界。
清单不把未来由网页维护者生成的code-verification、math-verification或下载复跑文件循环纳入自身,否则每次独立验证写入耗时字段就会让旧清单失效,甚至形成自引用。原始作者证据与独立验证证据并列保留,发现变化时重新冻结相应源文件,而不是篡改旧时间或借“自动更新”掩盖来源。项目的完整性意味着链条可解释,不是所有文件必须永久拥有同一个总哈希。
算例二:最小反例足以击穿一个宽泛说法
假设有人说“模型已经掌握二步加法推理,因为训练贪心19/20”。拿冻结测试二加二即可反驳其普遍说法:正确[4,8,EOS],实际贪心[6,2,EOS]。这一个反例足以否定“所有本域输入都掌握”的全称命题,却不能估计自然数学题总体准确率。项目同时给出整个五题测试集精确概率,使失败不只停留在挑一张差例的层面。
另一个说法是“采用组相对比较就等于复现了GRPO”。查看run.py实际损失,只有on-policy采样、留一回报基线与轨迹score,不存在旧策略多轮概率比、PPO裁剪或组标准差归一,因此算法名称不成立。能解释原始论文不等于复现实验。课程把PPO/GRPO公式当导入机制,本项目则清楚命名自己的有限算法,这种区分比给微型实验贴前沿名称更能帮助以后迁移。
资源成本和停止条件
在当前RAM式计算模型中,设每步动作数K、随机长度L,一次全路径枚举有K的L次方条路径,每条需要相应前向评分;本项目K10、L2仅一百条,长文本会指数爆炸。训练采样成本按B乘G乘L个响应动作增长,模型前向还随上下文长度和隐藏宽度变化。不能用“一百条很便宜”推断真实推理RL的全分布评价可行。有限时间也来自固定40和100步循环、每条固定两步,不依赖回答中自报“我已完成”。
验证器处理固定长度列表、小整数和常数次算术,因此没有复杂表达式、除零或递归爆炸问题。若改成自由算式验证器,必须重新规定长度、树节点、整数位数和操作白名单;若改成自然语言证明,还需独立的语义或形式验证器。将这些新问题留在明确边界内,比假装本课程三行验证能覆盖所有推理任务更诚实,也给后续扩展提供明确接口。
出错时怎样定位而不是重跑到满意
若lab解析与差分不符,先查概率归一与score符号;若路径概率和不为一,查采样和评分支持是否一致;若参考哈希变,查deepcopy、优化器参数集合和共享张量;若训练结果飘,查种子、线程、dropout、步数、数据摘要与依赖版本。若代码全部通过但测试失败,则应保留模型能力失败,不能再把它当成软件故障一律重跑。错误类别不同,处置依据也不同。
本项目确实出现过一个验收设计问题:极短两步烟雾训练硬要求所有张量变化,在全零奖励、参考相同的情况下不成立。修复的是测试断言,改为检查流程和有限值;完整冻结训练仍要求实际十七张量更新并已满足。这个例子说明测试也需要理论审查,不能为了绿色勾号给奖励加噪声或改训练目标。issue记录把此区分写清,避免后人把一个无信号对照误判为失败。
完整交付的通过、失败与未运行
已通过的是明确合同内的软件和数学检查:严格验证、无交集划分、有限梯度恒等式、留一估计、因果评分、采样重放、参考冻结、完整网络更新与独立权重评价。已失败的是本次训练达到和为四外推目标、保持提示格式变化下稳定正确。未运行的是多训练种子、自然语言数学、自由长度推理、GPU、大模型、远程API以及完整PPO/GRPO复现。三类状态必须同时出现,不能用单个“全部完成”模糊不同层次。
这八章的终点是读者能独立重建并审计一次推理强化学习的小实验:从有限样本空间和验证器出发,推导score、基线和KL,接到真实共享参数解码器,运行固定预算并判断其能力边界。项目失败并不使教程不完整;隐藏失败、缺失依赖或不闭合推导才使教程不完整。读者拿走的应当是一条可检查的因果与证据链,以及在链条某处不成立时能准确指出哪里出了问题的能力。
python lab.py
python tests.py
python run.py train --output my-run
python run.py evaluate --output my-run --split train
python run.py evaluate --output my-run --split test
python probe_formats.py --checkpoint my-run --output my-run/format-probes.jsonimport json
from pathlib import Path
from run import load, hash_model, evaluate, ROOT
r=json.loads((ROOT/"evidence/results.json").read_text())
m,q=load(ROOT/"evidence")
assert hash_model(q)==r["reference_hash"]
actual=evaluate(m,q,"test")["mean_exact_success"]
assert abs(actual-r["after"]["test"]["mean_exact_success"])<1e-10
print("recomputed",actual)TRY IT YOURSELF
练习一:识别伪独立评价
一个evaluate命令只读results.json打印旧数值,为何不够?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:复杂度扩展
十动作、二步100路径。十动作、二十步是多少?说明什么边界?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:交付状态
把“软件测试通过”“外推失败”“多种子未跑”写成互不冲突的一段话。