Qwen3-4B · TIS · 最终 checkpoint
本模型是对 verl Score Centering 实现的独立复现实验产物,基于 Qwen3-4B 进行异步数学强化学习全参数训练。此版本来自 第 500 步,以 BF16 safetensors 导出;不包含优化器状态。不是 Qwen 或 verl 官方发布模型。
训练概况
四组对照分别为 PG、TIS、SC、SC+TIS,均训练 500 步、seed=42。使用 GRPO 组内中心化优势(不除以标准差)和 REINFORCE 更新;PG 是不使用 SC/TIS 的对照,不是 PPO clipping。SC 使用 top-128;TIS 使用 token 级重要性采样截断,阈值 2。
- 硬件:8×A100 80GB,4 卡训练、4 卡 rollout;FSDP2,vLLM TP=2。
- 数据:DAPO-Math-17k-Processed 的 all/train,17,398 条;按 prompt 长度过滤后 17,390 条。
- 每批 32 道题,每题采样 5 个回答;每批更新 1 个 epoch。
- AdamW:恒定学习率 1e-6,weight decay 0.01,梯度裁剪 1.0。
- thinking 模式;prompt 上限 1,024 token,回答上限 8,192 token;temperature=1、top_p=1、top_k=-1。
- 使用 verl 官方 math_dapo 判分,答对 +1,否则 -1;无额外 KL/熵正则。
- 异步权重每步同步,最大陈旧阈值 4,超限丢弃。SC+TIS 在 200 步恢复续训,SC 在 20 步恢复续训;其他组连续训练。异步恢复并非逐位可复现。
源码:复现仓库,训练脚本版本 55640933cac566b5ccf9250d03b30b435b2a056d;verl 固定为 8718ca30a3f002f93b7c4fd99b9b2506718681bc(PR #8010)。数据 revision 为 31dd309567e3da778038cc87d868b6097a3ccf68。
评测结果
以下数值来自训练期间记录的该 checkpoint 评测,不是导出后的独立复评。AIME2024、AIME2025 各 30 道题,每题采样 8 次;mean@8 为平均正确率,不是 pass@8。评测 temperature=1,回答上限 8,192 token。
| checkpoint | AIME2024 mean@8 | AIME2025 mean@8 | 两者平均 |
|---|---|---|---|
| 第 500 步(最终) | 50.42% | 46.25% | 48.33% |
四组第 500 步对照:
| 方法 | AIME2024 | AIME2025 | 平均 |
|---|---|---|---|
| SC+TIS | 55.00% | 41.67% | 48.33% |
| SC | 53.75% | 41.67% | 47.71% |
| TIS | 50.42% | 46.25% | 48.33% |
| PG | 50.00% | 43.33% | 46.67% |
指标图
评测曲线为原始记录,不作平滑。恢复步数处采用恢复后的重新评测值,因此可能与上一阶段末次采样评测略有不同。

训练曲线使用向后 20 步移动平均;完整数值见 metrics.json。

使用
使用支持 Qwen3 的 Transformers 加载本仓库,沿用 tokenizer 的 chat template,并设置 enable_thinking=True。建议从训练同样的 temperature=1、top_p=1、max_new_tokens=8192 开始测试。此仓库的 generation_config.json 不代表训练评测的全部参数,请显式传入采样参数。
局限与 checkpoint 选择
每种方法只有一个随机种子,基准规模较小且采样评测有波动,不能据此断言 SC 显著优于 TIS。最佳 checkpoint 按 AIME2024/2025 mean@8 的算术平均选取,因此这些基准已参与模型选择,并非独立测试集。模型面向数学训练复现,尚未系统评估通用能力保持情况。
训练前进行了训练集与评测集的文本重叠检查,但不能排除语义重叠或基础模型预训练污染。导出校验与测试范围见 verification.json。权重使用基础模型的 Apache-2.0 许可,许可证随仓库提供。
加载示例
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_id = "Palind/Qwen3-4B-TIS-repro-final"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
text = tokenizer.apply_chat_template(
[{"role": "user", "content": "求方程 x^2 - 5*x + 6 = 0 的解。"}],
tokenize=False, add_generation_prompt=True, enable_thinking=True,
)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
output = model.generate(**inputs, do_sample=True, temperature=1.0, top_p=1.0, top_k=0, max_new_tokens=8192)
print(tokenizer.decode(output[0, inputs.input_ids.shape[1]:], skip_special_tokens=True))