状态:草稿(2026-10-31),实测。 所有训练和评估均由笔者在一张 8GB 笔记本电脑 GPU 上直接运行。条件和判定标准在看到结果之前就已经写好,在训练前做出的两次更改(关于任务和评分)及其原因已在第 4 节中说明。论文中的数据是从 arXiv 原文的表格和图表编号中摘录的。 编写规则:以实测数据为基础,无法测量的标注为“未实测”,无法确认的标注为“未确认”。
目录
1. 问题:强化学习是否创造了新能力
自 2025 年初 DeepSeek-R1 问世以来,在“能够通过机器机械化验证答案的问题”(数学、代码)中,通过强化学习构建推理模型的方法已经成为了标准。这被称为 RLVR(使用可验证奖励的强化学习)。模型生成多个答案,对正确的答案提升概率,对错误的答案降低概率。
然而,这个过程究竟是在模型中 创造了原本没有的能力,还是 让本来偶尔就能给出的正确答案出现得更频繁,则是两回事。衡量这种差异的工具就是 pass@k。
- pass@1:抽取一次即答对的概率。这就是平时常用的准确率。
- pass@k:抽取 k 次且 至少答对一次 的概率。如果存在答案检验器,这就是通过 best-of-k(抽取多个并挑选出正确的一个)能够获得的上限。
如果强化学习只是在“筛选”,那么 pass@1 会上升,但 pass@k(当 k 很大时)几乎会保持不变。因为如果抽样次数足够多,基础模型最终也会给出那个答案。如果要创造新能力,pass@k 也必须上升。
2. 论文们的观点
GRPO:无需价值网络,在同个问题的答案之间进行比较
DeepSeekMath(arXiv 2402.03300)提出的 GRPO 是一种从 PPO 中去掉了价值网络(critic)的方法。针对一个问题抽取 G 个答案,从每个答案的奖励中减去 组平均值并除以标准差,将该值用作该答案所有 Token 的优势。同一问题的不同答案起到了基准线的作用。原论文的设置为学习率 1e-6、KL 系数 0.04、每个问题 64 个。在原论文的图 7 中,已经观察到了“强化学习提升了 Maj@K,但没有提升 Pass@K”这一现象。
Dr. GRPO(arXiv 2503.20783)指出,GRPO 公式中的两次除法会产生偏差。如果除以答案长度,错误的答案越长受到的惩罚就越小,从而导致错误答案变长;如果除以组标准差,权重就会过分集中在太容易或太难的问题上。Dr. GRPO 提出去掉这两者并除以一个常数。本实验遵循 Dr. GRPO。
pass@k 曲线的交点 (2504.13837)
Yue 等人的论文《Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?》在多个模型和任务中将 k 增大到几百甚至上千,并绘制了 pass@k。当 k 较小时,强化学习模型获胜;但当 k 变大时,基础模型会迎头赶上并超越它。强化学习模型解决的问题几乎是基础模型解决的问题的子集。测量设置为温度 0.6,top-p 0.95,每个问题抽取 n 个(n = 曲线中最大的 k),并用无偏估计量 1 − C(n−c, k)/C(n, k) 进行计算,本文也同样采用了这种方法。不过,看同一篇论文的表 4 可以发现,Qwen2.5-7B 的 MATH500 pass@256 在基础模型中为 96.2,GRPO 150 步时为 97.2,300 步时为 96.0,450 步时为 95.4。在训练时间较短时,上限反而略有提升,而训练时间越长反而越下降。这意味着,正如本次实验一样,在较短的训练中上限是有可能上升的。
强化学习改变的 Token 占 1–4% (2605.06241)
2026 年的论文《Rethinking RL for LLM Reasoning: It's Sparse Policy Selection, Not Capability Learning》从 Token 层面看待了同一个问题。对比强化学习前后的模型的贪婪解码,强化学习挑选出不同 Token 的位置占总数的 1–4%,并且在这些位置上,强化学习模型挑选的 Token 几乎总是位于基础模型前 5 个候选之内(表 2,平均排名约为 2)。发生改变的位置集中在基础模型犹豫不决(熵较高)的决策点上。基于这一观察,作者们仅使用 50 个问题和离线 Rollout 就构建了能够修正决策点选择的 ReasonMaxxer,并报告说其取得了与整体强化学习相近的性能(表 3)。阅读原文时需要注意两点。第一,ReasonMaxxer 不是 GRPO,而是用优势加权的离线学习;第二,正文 3.1 节中的句子“没有一个移动的位置”与表 2 中的 0.01–0.12% 不符。在同一篇论文的表 3 中,对 Qwen3-0.6B 应用 GRPO 的结果是,MATH500 从 0.338 小幅上升至 0.372。
哪怕只有一个示例 (2504.20571)
1-shot RLVR 报告称,通过复制 Qwen2.5-Math-1.5B 的 单个问题来进行 RLVR,MATH500 的准确率从 36.0 提升到了 73.6,这与包含该问题的 1.2k 个问题进行训练的结果相同。挑选的标准是训练期间正确率方差较大的问题,而基础模型一次也解不出来的问题或标签错误的问题则没有效果。作者们与仅提供格式奖励的基准线进行了对比,单独剥离出了“修正格式所占的份额”,而小模型实验中这一份额较大,这与本次实验的核心教训息息相关。
在小模型上可能会有所不同 (2607.16097)
通过国际象棋全面梳理了从 5M 到 1B 模型预训练到强化学习过程的论文《Understanding Reasoning from Pretraining to Post-Training》认为,强化学习并非均匀且锐利地提升,而是答案放大、发现稀有答案以及错误放大交织在一起的重新分配。并且在 20M 模型中,在强化学习初期 pass@16 也快速上升了(图 2)。这给我们的警示是,在使用小模型进行复现时,不应盲目期待一定会出现交点。
3. 实验设计
将其缩减到了单张 8GB 笔记本电脑 GPU 即可运行的规模。
- 模型:Qwen2.5-0.5B-Instruct (Apache-2.0)。固定 bf16 权重,仅训练 LoRA(秩为 32,α=64,注意力机制与 MLP 的所有线性层)。全量微调连同 AdamW 状态大约需要 8GB,因此无法容纳。LoRA 和 GRPO 均未使用库而直接编写(加起来总共约 300 行)。这也是希望在博客中逐行展示损失函数的原因之一。
- 任务:三位数 × 两位数 − 三位数算术(例如:
413 * 41 - 882)。问题是通过代码生成的(训练集 4,000 个,测试集 128 个,无重叠)。提示词要求“<think>内写推导过程,<answer>内写答案 - ”。奖励:
<answer>里的最后一个整数如果是正确答案则为 1,否则为 0。不单独给予格式分数。 - GRPO(Dr. GRPO 公式):每一步 16 个问题 × 8 个答案(温度 1.0,最大 384 个 Token)。优势 = 奖励 − 组平均值(不除以标准差)。损失 = −Σ 优势 × Token 对数概率 ÷ (16 × 8 × 384)。无 KL 项。由于只抽样一次并更新一次,PPO 的比率与裁剪机制不生效。AdamW(β 0.9·0.99),150 步。
损失函数的核心只有几行。
rs = np.array([score(t, p) for t, _ in outs]) # 그룹 8개의 보상(0 또는 1)
adv = rs - rs.mean() # Dr. GRPO: 표준편차로 나누지 않는다
...
logp, mask = completion_logprobs(model, tok, prompts, completions) # 응답 토큰의 log π
loss = -(A * logp * mask).sum() / (16 * 8 * 384) # 응답 길이로 나누지 않는다(상수)
loss.backward()
三种条件与基准线
| 条件 | 训练问题 | 每步 | 在 150 步期间 |
|---|---|---|---|
| 大量问题 | 混合 4,000 个并各过一遍 | 16 个不同的问题 | 将 2,400 个问题各过一遍 |
| 16 个问题 | 在基础模型通过率介于 0 和 1 之间的的问题中,p(1−p) 较大的 16 个 | 相同的 16 个问题 | 每个问题 150 次 |
| 1 个问题 | 将其中的第一个复制 16 份(1-shot RLVR 方式) | 相同的 1 个问题 | 2,400 次 |
| 无强化学习 | 直接对基础模型抽样 32 次计算 pass@k |
16 个问题和 1 个问题是通过让基础模型对训练问题的前 128 个各解答 16 次(温度 1.0)从而挑选出通过率参差不齐的问题。在 128 个问题中有 31 个介于 0 和 1 之间。这与 2605.06241 中的“能力边缘(edge of competence)”、1-shot RLVR 中的“偶尔能给出正确答案的问题”是相同的思路。
学习率:在使用 LoRA 进行 GRPO 时,论文中并没有关于学习率的依据,因此通过“大量问题”条件下的 30 步简短测试了 {1e-5, 5e-5, 2e-4},并将最后 10 步平均奖励最高的值同样应用到了三个条件中。结果为:1e-5: 0.38, 5e-5: 0.60,2e-4: 0.00。在 2e-4 下,策略崩溃了,所有答案直到 384 个 Token 结束都在重复相同的话。
评估:在每个测试集的 128 个问题上抽取 32 个(温度 0.6,top-p 0.95),使用无偏估计量计算 pass@1–32。基础模型以及各条件在 75 步和 150 步时的结果。判定采用以问题为单位的自助法(2,000 次),得出(强化学习 − 基础模型)差值的 95% 区间。预先确定的标准是:“pass@1 上升 = 区间下限 > 0”,“上限保持不变 = pass@32 差值区间包含 0 或差值小于 pass@1 差值的 1/3”。
4. 训练前做出的两个改变
在查看结果前,我们在训练前两次修改了既定条件。两次修改都在开始执行 RL 之前,并且修改的时间和原因都已记录在预注册文档中。
1. 任务:倒计时 → 算术。 最初的计划是倒计时(组合三个数字通过四则运算得出目标数字)。测量基础通过率时发现,0.5B 模型在 32 道题目 × 16 个样本下几乎没有答对过(pass@16 为 0–3%)。如果 8 个组的全为 0,则优势(Advantage)为 0,因此 GRPO 将没有可学习的信号(如 2609.25463 总结的 p^G + (1−p)^G)。所以我们将其改为了算术。
2. 将评分分为两类,并提高算术难度。 在两位数 × 两位数 − 三位数算术中,基础模型的 pass@1 为 0.10;但如果忽略答案格式,仅根据“回答中的最后一个整数”评分,则为 0.62,pass@32 为 1.0。模型其实已经会计算了,做不到的是 <answer> 标签格式(格式遵守率为 25%)。通过这个任务无法探讨“RL 是否提升了能力上限”(已经达到了 1.0)。因此我们做了两项更改。
- 在评估中加入 宽松评分(标签内的答案正确,或者回答的最后一个整数正确),从而将“格式”与“计算”区分开来。训练奖励依然采用严格评分。两种判定都会给出,而对“RL 是否进行了筛选”的判断则侧重于宽松评分。因为格式并非能力,而是输出规范。这一顺序同样在看到结果之前就已经写好。
- 将任务提高难度为 三位数 × 两位数 − 三位数。基础模型的宽松 pass@1 为 0.18,pass@32 为 0.81,计算能力仍有提升空间。
| 任务候选(32道题目 × 32个样本) | 严格 pass@1 | 严格 pass@32 | 宽松 pass@1 | 宽松 pass@32 | 格式遵守率 |
|---|---|---|---|---|---|
| 两位数 × 两位数 − 三位数 | 0.097 | 0.875 | 0.623 | 1.000 | 24.5% |
| 三位数 × 两位数 − 三位数 | 0.010 | 0.281 | 0.179 | 0.812 | 16.3% |
| 四个两位数:a×b − c×d | 0.021 | 0.438 | 0.436 | 0.969 | 11.6% |
| 三位数 × 三位数 − 四位数 | 0.004 | 0.094 | 0.098 | 0.594 | 11.6% |
此外,在模型文件中发现 generation_config.json 带有 1.1 的重复惩罚并干扰了采样,我们在训练前将其找到并固定为 1.0。由于 RL 的梯度公式建立在样本即策略本身的假设之上,隐藏的采样设置会悄悄改变结果。尽管曾因内存限制导致 Pod 崩溃过两次,但这与条件无关。
5. 结果
训练曲线
| 条件 | 前 10 步平均奖励 | 最后 10 步 | 回答长度(开始 → 结束) | 每步耗时 |
|---|---|---|---|---|
| 多题 | 0.17 | 0.68 | 131 → 173 Token | 8.4秒 |
| 16题 | 0.63 | 1.00 | 118 → 384(最大) | 10.7秒 |
| 1题 | 0.80 | 1.00 | 76 → 62 | 3.5秒 |
16题和1题在 50 步内就答对了所有训练题目。此后 8 个组全部为 1,因此优势为 0,即再无学习信号。
pass@k:采用两种评分
| 模型 | 评分 | pass@1 | pass@4 | pass@32 | 格式遵守率 |
|---|---|---|---|---|---|
| 基础 | 严格 | 0.019 | 0.066 | 0.258 | 16.2% |
| 基础 | 宽松 | 0.248 | 0.466 | 0.836 | |
| 多题 75步 | 两者相同 | 0.660 | 0.741 | 0.805 | 100% |
| 多题 150步 | 两者相同 | 0.610 | 0.642 | 0.680 | 100% |
| 16题 150步 | 两者相同 | 0.141 | 0.166 | 0.195 | 100% |
| 1题 150步 | 两者相同 | 0.182 | 0.231 | 0.297 | 99.9% |
RL 之后的模型几乎 100% 遵守了格式,使得严格评分和宽松评分趋于一致。只有基础模型存在差异。
预定判定(按题目进行自助采样,95% 区间)
| 模型 | 评分 | Δpass@1 | Δpass@32 | 判定 |
|---|---|---|---|---|
| 多题 75 | 宽松 | +0.412 [+0.341, +0.484] | −0.031 [−0.109, +0.047] | pass@1 上升, 上限保持不变 |
| 多题 150 | 宽松 | +0.361 [+0.269, +0.447] | −0.156 [−0.250, −0.055] | pass@1 上升, 上限下降 |
| 16题 150 | 宽松 | −0.107 [−0.154, −0.060] | −0.641 [−0.727, −0.547] | pass@1 下降 |
| 1题 150 | 宽松 | −0.067 [−0.116, −0.019] | −0.539 [−0.625, −0.453] | pass@1 下降 |
| 多题 75 | 严格 | +0.641 [+0.567, +0.709] | +0.547 [+0.445, +0.641] | 两者皆升 |
| 16题 150 | 严格 | +0.122 [+0.072, +0.175] | −0.062 [−0.133, +0.016] | pass@1 上升 |
| 1题 150 | 严格 | +0.163 [+0.110, +0.223] | +0.039 [−0.031, +0.109] | pass@1 上升 |
在宽松评分中,“32个中至少答对一个的题目”数量(覆盖率)从基础模型的 107 个下降到了:多题 75 步的 103 个(仅在 RL 中解出的有 12 个,仅在基础模型中解出的有 16 个)、150 步的 87 个(12 / 32)。16 题为 25 个,1 题为 38 个。
如何解同一道题
针对测试的第一道题 413 * 41 - 882(正确答案 16051)的回答(150 步,温度 0.6,32 个中的第一个,换行符用 / 表示)。
- 基础(32 个中格式正确的答案 0 个,宽松为 7 个):“1) 计算 413 × 41 / 413 × 41 = 17073 / 2) 减去 882 ……”虽然分了步骤,但乘法本身有时会一步算错,且未将答案放入标签中。
- 多题(32 个中 27 个正确):“413 * 41 = 413 * (40 + 1) = 413 * 40 + 413 * 1 = 16520 + 413 = 16933 / 16933 − 882 = 16051 / ……”选择了拆分乘法的方法。这种解法基础模型偶尔也会采用。
- 16题(0 个):“413 * 41 = 16613 / 16613 − 882 =
<answer> 15731 </answer></think></think>……”将乘法放在同一行,并在答案后面反复输出闭合标签直到达到最大长度。 - 1题(0 个):“413 * 41 = 16633 / 16633 − 882 =
<answer> 15751 </answer>”虽然简短整洁,但由于把乘法一次性算完而导致错误。
6. 解读
1. 采用多题的 GRPO “进行了筛选”。 从计算能力来看,pass@1 从 0.25 大幅上升至 0.66,但抽样 32 次时至少答对一个的概率(pass@32)从 0.84 统计性地等同于 0.81。随着 k 增大,基础模型迎头赶上,75 步模型在 k=16 与 32 之间、150 步模型在 k=8 与 16 之间被基础模型超越(见图)。Yue 等人的交叉现象在 0.5B 模型和算术任务中同样出现了。当训练延长到 150 步时,pass@32 显著下降至 0.68,覆盖率也从 107 题减少到 87 题。这与同篇论文表 4 中“训练越长,pass@256 反而下降”的方向一致。从回答中也能看出筛选出了什么。这是一种将乘法拆解为 (40 + 1) 的解法,原本就存在于基础模型的分布中。这与 2605.06241 所说的“在基础模型的上层候选之中改变决策点的选择”这一图景相符(未对 Token 级进行实测)。
2. 如果只看严格评分,结论就会截然不同。 在严格评分下,三种条件下的 pass@1 都有所上升,多题条件的 pass@32 更是大幅上升至 0.26 → 0.81。这些数字很容易被解读为“RL 提高了上限”。然而,其中大部分归功于学会了使用 <answer> 标签。基础模型的格式遵守率为 16%,而 RL 之后达到了 100%。这就是 1-shot RLVR 设立单独的“格式奖励基线”、Dr. GRPO 指出模板问题的原因。模型越小,格式所占的比重就越大。
3. 采用少题的 GRPO 在此设置下失败了。 16 题和 1 题虽然学会了格式(严格 pass@1 增加 +0.12 和 +0.16),但计算能力反而下降了(宽松 pass@1 减少 −0.11 和 −0.07),多样性遭到破坏,pass@32 下降到了 0.20 和 0.30。在训练题目于 50 步内全部答对后,奖励全部为 1 且没有信号,在此期间模型陷入了“单行乘法”的短解法或“在答案后重复标签”的坏习惯中。这并没有反驳 2605.06241 的“几十个问题就足够了”以及 1-shot RLVR 的结果。因为条件不同。
- 1-shot RLVR 使用了 KL(0.001)和熵奖励,并报告称熵项在饱和后能增强泛化能力。本实验中两者皆无。
- ReasonMaxxer (2605.06241) 采用的不是 GRPO,而是离线 Rollout 上的加权训练,决策点之外的 Token 则被绑定在基础模型分布中(KL 锚点)。“少题”成功的原因离不开这种绑定机制。
- 学习率(5e-5)是根据多题条件选择的。对于将同一题目看 150 次的条件来说,这个学习率可能过大了。
- 模型是一个 0.5B 的通用指令模型,任务是算术。而许多论文使用的是 1.5B 及以上专注于数学的模型。
归根结底,这个小型实验所展示的是:“如果想用少量题目进行 RL,似乎需要一种机制将策略约束在不远离基础模型的状态。”这是下一个实验的假设,目前尚未实测。
7. 局限性
- 只有一个随机种子(每个条件一次)。自助采样区间仅包含题目抽样的波动,不包含训练过程的波动。
- 单一模型(0.5B 指令模型)、单一任务(合成算术)、LoRA(秩 32)、150 步。这与论文的规模(1.5B–671B,数千步)有所不同。
- 宽松评分采用的是“回答中的最后一个整数”,因此可能会稍微低估基础模型的计算能力(如果在答案后面写了其他数字,则会被算作错误)。
- 未进行包含 KL、熵、格式奖励基线的对照训练(未实测)。学习率也没有针对每个条件进行调整。
- pass@k 仅计算到 k=32。交叉点出现在 k=8–16 之间,这对得出结论已经足够,但更大 k 的形态尚未实测。
原始数据与参考资料
- 代码:
grpo.py(LoRA、GRPO、评估、题目选择),countdown.py(题目生成与评分),pipeline.py(既定顺序),analyze_b.py(判定)。 - 原始数据:每次评估的
eval_*.json(每题正确数、格式遵守数、回答样本)、训练train_log.csv、学习率选择lr_choice.json、预注册PLAN.md(修改 1–4)。 - 模型:Qwen2.5-0.5B-Instruct(Apache-2.0,版本 7ae5576)。题目通过代码生成,没有下载现成的数据集。
- Shao 等人,“DeepSeekMath”,arXiv 2402.03300。DeepSeek-AI,“DeepSeek-R1”,arXiv 2501.12948。
- Liu 等人,“Understanding R1-Zero-Like Training: A Critical Perspective”(Dr. GRPO),arXiv 2503.20783。
- Yue 等人,“Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?”,arXiv 2504.13837。
- Wang 等人,“Reinforcement Learning for Reasoning in LLMs with One Training Example”,arXiv 2504.20571。
- Akgül 等人,“Rethinking RL for LLM Reasoning: It's Sparse Policy Selection, Not Capability Learning”,arXiv 2605.06241。
- Shen 等人,“Understanding Reasoning from Pretraining to Post-Training”,arXiv 2607.16097。
- Gholipour 等人,“Rollout Efficiency in RL for Reasoning LLMs”,arXiv 2609.25463。