论文TTRL: Test-Time Reinforcement Learning完全开源NeurIPS 20251087 stars会议NeurIPS 2025链接https://arxiv.org/abs/2504.16084GitHubPRIME-RL/TTRL | 1087 stars作者Yuxin Zuo, Kaiyan Zhang, Li Sheng, Shang Qu, Ganqu Cui 等清华大学 PRIME 实验室、Boston University目录一、这篇论文解决了什么问题二、关键方法三、实验结果四、本地部署全流程五、为什么重要六、适用场景与生态七、局限一、这篇论文解决了什么问题RLVRReinforcement Learning with Verifiable Rewards训练 LLM 做数学推理需要一个前提你得有标准答案。每条训练数据配一个 ground truth策略采样出回答后拿去对答案对就给 1错就给 0。这个范式在 MATH、GSM8K 这类有标注数据集上跑得很好Qwen2.5-Math、DeepSeek-R1 都是这么练出来的。但真实场景里标签稀缺。你拿到一批 AIME 竞赛题没有标准答案或者你想在一个新领域的测试集上做 inference-time 适配标注成本扛不住。没有 ground truthreward signal 就断了RL 训练无从谈起。TTRL 解决的正是这个在没有 ground truth 标签的数据上做 RL 训练。不是去找外部奖励模型不是搞无监督预训练而是直接从模型自己的采样分布里提取奖励信号。具体做法是 majority voting——对同一道题采样 N 个回答出现次数最多的答案当作伪 ground truth用它来计算 reward驱动 GRPO 更新策略。这件事能 work 的直觉在于一个经过预训练的数学模型即使整体 pass1 不高对同一道题的多次采样中正确答案往往占多数。majority voting 从 1959 年就是统计推断里的经典工具测试时扩展Test-Time Scaling也普遍用 majn 来估精度。TTRL 把这个已有的做法从推理阶段拉到训练阶段用 majn 的结果当 reward 去回传梯度。二、关键方法TTRL 的核心改动极其精简不动模型结构不动训练算法只改 reward 的来源。整个 pipeline 跑在 verl 框架上底层是 GRPOGroup Relative Policy Optimization用 vLLM 做 rollout。数据流整个训练循环的数据流如下测试题无标签 → vLLM 采样 N64 个回答rollout 阶段temperature1.0 → 提取每个回答的 boxed 答案 符号化归一 → Counter 统计取 most_common(1) 作为 majority_gt → 从 64 个 rollout 中取前 k32 个用于训练downsampling → 用 majority_gt 替换 ground_truth 字段 → 标准 GRPO reward 计算回答与 majority_gt 一致则 reward1否则 reward0 → advantage (reward - group_mean) / group_std → PPO clip 更新 actorvalue 网络更新 critic → 回到步骤 1进入下一个 episode关键代码路径在verl/trainer/ppo/ttrl_utils.py。apply_ttrl_gt()函数在每次 rollout 后被调用把模型生成的 N 个回答做 majority vote然后把结果写回reward_model.ground_truth字段。之后的标准 reward 计算流程verl/utils/reward_score/ttrl_math/__init__.py完全不变——reward_func()拿到ground_truth字段后调用grade(model_answer, gt_answer)匹配返回 1.0不匹配返回 0.0。Majority Voting 奖励的形式化定义给定一道题q qq模型p i θ pi_\thetapiθ​采样N NN个回答{ a 1 , a 2 , … , a N } \{a_1, a_2, \ldots, a_N\}{a1​,a2​,…,aN​}。对每个回答提取数值答案并做符号化归一sympy 简化得到{ a ^ 1 , a ^ 2 , … , a ^ N } \{\hat{a}_1, \hat{a}_2, \ldots, \hat{a}_N\}{a^1​,a^2​,…,a^N​}。伪 ground truth 定义为a ^ ∗ arg ⁡ max ⁡ a ∑ i 1 N 1 [ a ^ i a ] \hat{a}^* \arg\max_{a} \sum_{i1}^{N} \mathbb{1}[\hat{a}_i a]a^∗argamax​i1∑N​1[a^i​a]即出现频次最高的答案。majority ratio 定义为r m a j max ⁡ a ∑ i 1 N 1 [ a ^ i a ] N r_{maj} \frac{\max_{a} \sum_{i1}^{N} \mathbb{1}[\hat{a}_i a]}{N}rmaj​Nmaxa​∑i1N​1[a^i​a]​奖励函数R ( a i ) { 1.0 if a ^ i a ^ ∗ 0.0 otherwise R(a_i) \begin{cases} 1.0 \text{if } \hat{a}_i \hat{a}^* \\ 0.0 \text{otherwise} \end{cases}R(ai​){1.00.0​ifa^i​a^∗otherwise​这与标准 RLVR 的 reward 完全同构唯一区别是 ground truth 从外部标注换成了模型自采样的 majority vote。GRPO 策略更新TTRL 用 GRPO 做策略优化advantage 估计不依赖独立 value 网络而是在 group 内做归一。对 promptq qq的G GG个采样回答{ a 1 , … , a G } \{a_1, \ldots, a_G\}{a1​,…,aG​}reward 为{ R 1 , … , R G } \{R_1, \ldots, R_G\}{R1​,…,RG​}A i R i − mean ( R 1 , … , R G ) std ( R 1 , … , R G ) ϵ A_i \frac{R_i - \text{mean}(R_1, \ldots, R_G)}{\text{std}(R_1, \ldots, R_G) \epsilon}Ai​std(R1​,…,RG​)ϵRi​−mean(R1​,…,RG​)​策略 loss 采用 PPO 的 clipped objectiveL p o l i c y − 1 G ∑ i 1 G min ⁡ ( ρ i A i , clip ( ρ i , 1 − ϵ , 1 ϵ ) A i ) \mathcal{L}_{policy} -\frac{1}{G} \sum_{i1}^{G} \min\left( \rho_i A_i, \; \text{clip}(\rho_i, 1-\epsilon, 1\epsilon) A_i \right)Lpolicy​−G1​i1∑G​min(ρi​Ai​,clip(ρi​,1−ϵ,1ϵ)Ai​)其中ρ i π θ ( a i ∣ q ) π θ o l d ( a i ∣ q ) \rho_i \frac{\pi_\theta(a_i | q)}{\pi_{\theta_{old}}(a_i | q)}ρi​πθold​​(ai​∣q)πθ​(ai​∣q)​是重要性采样比率ϵ \epsilonϵ是 clip ratio。代码里algorithm.adv_estimatorgrpoalgorithm.kl_ctrl.kl_coef0.00——KL 惩罚系数设为 0作者认为 majority vote reward 本身已经提供了足够的正则化信号额外 KL 约束会拖慢学习速度。关键设计选择为什么是 GRPO 而不是 PPO论文选 GRPO 而非标准 PPO核心原因在于 value 网络的不可靠性。在无标签设置下reward 来自 majority vote 而非确定性标注reward 信号本身有噪声。如果再训一个 value 网络去估计 baseline这个 baseline 会被同样的噪声污染advantage 估计的方差反而更大。GRPO 用 group 内均值做 baseline不引入额外参数在这个场景下更稳定。训练脚本里 critic 仍然存在critic.optim.lr9e-6但 advantage 估计器设为grpo而非gae说明 critic 主要用于监控而非实际参与 advantage 计算。Downsampling 机制一个容易被忽略的细节TTRL 采样 64 个回答用于 voting但只用前 32 个做训练。select_top_k_per_prompt()函数从n_votes_per_prompt64个 rollout 中取前n_samples_per_prompt32个。这样做的原因是计算效率——64 个样本足够统计 majority但 32 个已经够做 group normalization多出来的采样只用于 label voting 不回传梯度。关键超参数超参数值AIME 实验说明actor learning rate5e-7cosine warmupwarmup ratio 0.03critic learning rate9e-6-n_votes_per_prompt64用于 majority voting 的采样数n_samples_per_prompt32实际参与训练的采样数train batch size8每个 batch 8 道 promptmini batch size1PPO mini batchmicro batch size2per-GPU micro batchrollout temperature1.0 (Qwen2.5-Math) / 0.6 (Qwen2.5)采样温度KL coefficient0.00不加 KL 惩罚advantage estimatorgrpogroup-relative不用 GAEmax prompt length512-max response length3072 (K3)1024 × Kepisodes80总训练轮数n_gpus88 × A100 80GBval n16验证时采样数val top_p0.95-三、实验结果主实验TTRL 在多个数学推理 benchmark 上验证覆盖不同模型规模和基座。核心结果如下模型任务方法pass1 (greedy)majn (初始模型)Qwen2.5-Math-7BAIME 2024TTRL~16.0 (211% 提升)~5.1Qwen2.5-Math-7BAIME 2024标准 RLVR (有标签)~18.0-Qwen2.5-7BAIME 2024TTRL~4.7~1.3Qwen2.5-Math-1.5BAIME 2024TTRL~10.0~3.3Qwen2.5-Math-7B 在 AIME 2024 上的 pass1 从约 5.1 提升到约 16.0相对提升 211%。这个数字看起来夸张但绝对值只有 10 个百分点左右——AIME 本身难度极高7B 模型能做到 16% 已经不低。更值得关注的一点TTRL 只用 majn 信号训练但最终 pass1 超过了初始模型的 majn 上限。这意味着 TTRL 不是简单地把模型往 majority 方向拉而是真正学到了新的推理能力。论文将此归因于预训练模型中已有的 prior 被 RL 激活——majority vote 提供的弱信号足以引导模型探索到正确的推理路径。与有标签训练的对比TTRL 训练的模型性能接近用 ground truth 直接训练的 RLVR 模型但两者之间仍有 gap。在 AIME 2024 上有标签 RLVR 约 18%TTRL 约 16%差距约 2 个百分点。考虑到 TTRL 完全不需要标注这个 trade-off 在实际场景里是可以接受的。复现稳定性README 里提到作者做了三次独立 runpreview 版代码两次 pass1 (greedy) 达到 43.3一次达到 46.7。注意这里的 43.3 和 46.7 是 Qwen2.5-Math-7B 在 AIME 2024 上的数值与论文正文报告的 211% 提升基线不同——preview 版代码可能有更新。所有实验在 8 × A100 80GB 上运行。Ablationn_votes_per_prompt 的影响论文讨论了 voting 样本数对训练稳定性的影响。N64 时 majority vote 的置信度高训练稳定N 太小如 8 或 16时 majority 容易被噪声主导尤其当模型本身能力较弱、正确答案不占多数时伪标签质量下降训练可能发散。这也是脚本里 N64 而 training samples 只取 32 的原因——用更多样本投票保证 label 质量用较少样本训练控制计算成本。四、本地部署全流程环境要求GPU8 × NVIDIA A100 80GB论文设定单卡 80GB 是硬需求7B 模型 FSDP 训练 vLLM rollout 需要大量显存OSLinuxFlashAttention、vLLM 均需 Linux 环境Python3.10CUDA12.x配合 torch 2.6.0Step 1克隆仓库gitclone https://github.com/PRIME-RL/TTRL.gitcdTTRL/verlStep 2创建 conda 环境conda create-nttrlpython3.10conda activate ttrlStep 3安装依赖bashscripts/install_ttrl_deps.sh pipinstall-e.install_ttrl_deps.sh脚本做的事情按顺序安装 vLLM 0.8.5.post1 PyTorch 2.6.0 torchvision/torchaudio tensordict 0.6.2安装 transformers4.51.0、accelerate、datasets、peft、ray[default]、hydra-core、wandb、liger-kernel、mathruler 等基础包安装 FlashAttention 2.7.4.post1预编译 whlcu12 torch2.6 cp310安装 FlashInfer 0.2.2.post1注意 vLLM 0.8.x 不支持 flashinfer0.2.3修复 opencv 兼容性安装 latex2sympy2_extended、math-verifyStep 4准备数据和模型下载 Qwen2.5-Math-7B 模型权重到本地路径。数据需要转成 parquet 格式python verl/data/preprocess.py--inputyour_json--outputoutput_parquet脚本里的路径占位符需要替换DATA_LOCAL_DIRpath/to/TTRL/verl/data# 换成你的实际路径BACKBONE_PATHpath/to/Qwen2.5-Math-7B# 换成你的模型路径Step 5启动训练bashexamples/ttrl/Qwen2.5/aime.sh这会启动 8 卡 GRPO 训练配置来自ppo_trainer_ttrl.yaml。训练日志同时输出到 console 和 WandB需提前wandb login。Step 6验证脚本每 2 个 episode 做一次验证trainer.test_freq2在测试集上采样 16 个回答并报告 pass1。checkpoint 默认不保存save_freq2000000基本等于不存如果需要 checkpoint 把这个值调小。硬件建议配置可行性说明8 × A100 80GB论文设定7B 模型标准配置4 × A100 80GB可尝试需调小 batch size可能影响 GRPO group 统计稳定性8 × A100 40GB勉强显存紧张需开 gradient checkpointing FSDP offload消费级显卡不行vLLM rollout 需要大显存4090 24GB 跑不了 7Bactor_rollout_ref.rollout.gpu_memory_utilization0.8控制vLLM 占用 80% 显存做 KV cache剩下 20% 留给训练。enable_gradient_checkpointingTrue和use_remove_paddingTrue是必开的省显存选项。五、为什么重要TTRL 打破了一个固有假设RL 训练必须有标注数据。这个假设限制了 RLVR 的应用范围——你能训练的数据集取决于你有标签的数据集。TTRL 之后任何有验证规则的任务即使没有标准答案都可以尝试用 majority vote 做弱监督 RL。更深层的影响在于测试时适配。一个模型部署到新场景后面对的分布和训练时不同传统做法是收集新数据再 fine-tune。TTRL 提供了一条更轻量的路直接在测试数据上跑 RL用模型自己的共识做 reward不需要任何外部标注。这就是论文标题Test-Time Reinforcement Learning的含义——RL 发生在测试阶段用测试数据本身驱动。从方法论角度看TTRL 把 majority voting 从推理工具变成了训练信号。这个思路可以推广到其他 self-supervised RL 场景只要模型对同一输入的多次采样存在一致性信号就可以用它驱动学习。论文后续工作 URLVRUnsupervised RLVRICLR 2026正是沿着这个方向继续走。工程上TTRL 的实现极其轻量。它不需要改模型结构、不需要训 reward model、不需要额外标注流程只是在 verl 的 PPO trainer 里加了一个ttrl.enableTrue的开关和一套 majority voting 的 reward 替换逻辑。这种最小侵入性的设计让它可以快速集成到任何 verl-based 的训练 pipeline 里。六、适用场景与生态适合用的场景数学竞赛推理AIME、AMC、MATH答案可验证majority vote 信号质量高代码生成单元测试通过率可以做 voting signal逻辑推理 puzzle有确定性答案但标注成本高的任务新领域测试时适配有测试数据但没有训练标签的场景不适合的场景开放式生成创意写作、对话没有唯一正确答案majority vote 退化为 mode collapse模型能力极弱的任务正确答案不占多数时majority vote 给出错误伪标签多步骤长 horizon 任务单步答案的 voting 信号无法反映中间推理质量生态关系TTRL 建立在 verl火山引擎开源 RL 框架之上v0.4.1 之后原生支持ttrl.enableTrue开关。底层 rollout 用 vLLM策略优化用 GRPO。与同生态的 Search-R1、R1 等项目共享 verl 训练栈可以组合使用。作者团队 PRIME-RL 来自清华 PRIME 实验室此前的 PRIMEProcess Reinforcement through IMproved Reward工作也基于同一框架。七、局限Majority vote 的正确性假设。TTRL work 的前提是模型多次采样中正确答案占多数。对能力强、预训练充分的模型Qwen2.5-Math这个假设成立。但换一个能力弱的模型或更难的任务正确答案可能只占 10%majority vote 会给出系统性的错误标签训练不仅无效还会把模型带偏。论文没有给出 majority ratio 低于多少时训练会失效的明确阈值。计算开销大。每个 episode 对每道题采样 64 个完整回答其中 32 个用于训练。相比标准 RLVR采样 16-32 个全部用于训练TTRL 的 rollout 成本翻倍。8 × A100 跑 80 个 episode实际 wall-clock 时间论文没有明确报告但从 rollout 量估算不会短。任务泛化有限。论文实验集中在数学推理答案空间是离散的数值/表达式majority vote 天然适用。推广到连续输出空间如机器人控制、文本摘要需要重新设计一致性度量论文没有讨论。与有标签训练仍有差距。TTRL 约 16%有标签 RLVR 约 18%2 个百分点的 gap 说明 majority vote 信号确实比真实标签弱。在竞赛级任务里 2 个百分点可能影响排名。Voting 答案提取的脆弱性。代码依赖extract_answer()从 \boxed{} 中提取答案再用 sympy 做符号化归一。如果模型输出格式不规范没写 boxed、答案写成了文字描述而非表达式提取失败该样本被丢弃。极端情况下大量样本被丢弃会导致 voting 统计失真。关注我每日更新论文深度解读 本地部署指南。有什么论文想看解读评论区告诉我。整理了「具身智能开源项目选型表」含主流 VLA/RL 框架的硬件需求、数据集、成功率对比。私信我获取。