UloRL
RLVR · arXiv 2025 · 2507.19766

UloRL:把 128k 输出切成 8 段解码,让已完成样本先入池训练

超长输出的 RL 有两个坎:批内少数超长样本拖住整批解码(长尾),以及训练中熵持续下降(熵坍塌)。 UloRL 用分段 rollout 把解码切成固定长度段落,已完成样本立即进入经验池;再用 DMMPTs 在熵低于目标值时屏蔽「已熟练掌握的正向词元」。 代价是分段带来的跨模型混合——论文选择直接把它近似成 on-policy。

Dong Du, Shulin Liu, Tao Yang 等 · Tencent Hunyuan Team arXiv 2507.19766 ↗ 代码 ULORL ↗
TL;DR · 30 秒抓住核心

128k 输出下,一批里只要有几条样本跑到最长的 128k,整批都要等它们;但大部分样本早就该入池了。UloRL 把最大长度切成 8 段、每段 16k,每次只解码 16k 就更新一次,完成的样本立即训练,没完成的带着前缀进入下一轮。

副作用是一条样本由多个版本的模型拼成。论文给了两种处理:按段查旧策略的 SAIS,以及把全部旧策略都当作当前策略的 POIS——所有权重恒为 1,永远不会被 clipping 截掉。最终选 POIS:它在 4k / 32k / 64k 三个长度上都优于 SAIS。

熵坍塌的根因被定位为过度训练已熟练掌握的正向词元(概率 ≥ τ,论文取 0.99)。全部屏蔽会让熵一路上涨,DMMPTs 只在熵低于目标 σ=0.2 时屏蔽,把熵稳在目标附近,不引入熵损失项。

2.06x
4 段解码的每步耗时
1240s → 601s(Table 1,64k)
82.8%
AIME-2025,UloRL-A3B-128k
基线 70.9%(Table 2)
+11.9
AIME-2025 32k → 128k 点数
73.5 → 82.8(Table 3)
01

长尾让整批 RL 卡在最长的几条样本上

读完这节应该知道:超长输出 RL 的浪费不在总量,而在「等」。

RLVR 的做法是采样一组回答、按最终答案给奖励、再用 GRPO / DAPO 这类算法更新策略。标准框架里,一批中所有样本都解码完毕,才能进入下一步训练。输出长度一拉到 128k,长度分布就是重尾的。

论文给的典型场景

80% 的样本在 64k 内结束,却要等那 128k 的

§3.1 的原话:一批里 80% 的样本长度不超过 64k,但所有样本都必须等最长的 128k 输出解码完,才进入下一次解码迭代。GPU 在一整段时间里只在为少数长尾样本服务,其余样本已经生成完却闲置。

长度本身不是浪费的来源——长推理确实能提升难题上的表现。浪费在于轮次的结构:长度为 L 的样本和长度为 128k 的样本被绑在同一个同步屏障上。

第二个问题与长度无直接关系,但同样在长训练中放大:熵坍塌。训练越久,模型输出分布越尖锐,探索能力随之下降(§3.2 与 Figure 4 的 baseline 曲线),最终伤害推理上限。UloRL 的两块主要技术分别对应这两个问题。

02

长尾有人试过、熵也早有人管——各有堵点

两路已有方案,各自的限制都写在论文的 Introduction 里。

对长尾

K1.5 的 partial rollouts

K1.5 最早提出把解码拆成部分进行。UloRL 认可这个方向,但指出:缺少对不同模型生成的段落如何参与训练的详细说明,也没有给超参数设置,难以复现。

UloRL 的做法是同构的:切段 → 完成即入池 → 未完成挂起。区别在于把「跨模型混合段落的训练学」写清楚了——SAIS 与 POIS 两种重要性采样方案,以及二选一的实验对比。

对熵

两类思路,两类堵点

① 加熵损失项。直接把它当优化目标之一。论文认为「维持熵」与「提升推理」目标并不完全一致,可能拉低性能天花板。

② 改训练样本或词元。DAPO 的 clip-higher 只对 off-policy 有效,on-policy 下没有 clipping 可放;W-Reinforce 降低正样本权重,但对本身就低概率的重要词元,减速训练同样伤学习。

UloRL 对熵的立场是第三种:既不加优化目标,也不用重要性采样,只决定「哪些词元参与梯度」——当熵偏低时,把模型早已熟练的正向词元从梯度里拿掉。

论文继承了什么?Base:GRPO + DAPO 的几项修改,框架用 verl

§2.3 说明训练沿用 DAPO 的 dynamic sampling、token-level gradient loss、去掉 KL 项。与 DAPO 不同的是奖励取值:论文用 {0, 1} 而不是 {−1, 1},这样数据集上平均奖励直接等于准确率;在 GRPO 组内归一化下,奖励为 1 的样本优势恒为正、为 0 的恒为负,梯度方向与优化目标一致。

实现基于 volcengine/verl(§3 脚注)。

03

两块技术:切段解码,以及「熵低了就别练已会的词」

机制本身很短,难点在切段之后重要性采样怎么定义。

3.1 分段 rollout:三种终止条件

全局最大长度 128k、段数 8,则每次最多解码 128k / 8 = 16k。每解码一步,输入有两个来源:上一轮没完成的样本,以及数据集里新取的 prompt。解码在三种条件下停下(§3.1.1):

Tstep = maxs(Ls)  /  段数    →    屏障只等「当前段」写完,不等整条样本
四条示意样本长度 20k / 48k / 96k / 128k(形状示意,非论文数据);色块宽度来自 Table 1 的每步耗时
当前设置

看四种长度怎么被切:段数越大,短样本越早离开批次,而不分段时全部样本被绑在 128k 那一条上。

3.2 跨模型段落:SAIS 与 POIS

切段之后,同一条样本的不同段落由不同时刻的策略生成。GRPO / DAPO 的比值 ri,t = πθ / πθold 里,分母不再唯一。论文给了两种定义(§3.1.2,Eq. 8;POIS 由 Figure 1(c) 描述):

SAIS

按段查各自的旧策略

ri,t = πθ(oi,t) / πθold,f(i)(oi,t)

f(i) 把第 i 个词元映射到它所属段号的旧模型。精确,但老段落的比值可能远离 1,会被 clipping 截断。

POIS · 采用

全部旧策略换成最后一段的策略

把各段旧策略统一替换成 πθold,t,所有词元权重恒为 1,不会被截断。只有一段的样本是真 on-policy;多段样本里最后一段是真的,其余是「伪 on-policy」。

依据:on-policy 下熵更稳、性能更好,而过大的比值被裁剪会削弱多样性。

POIS 到底比 SAIS 差在哪?论文用 Figure 2 在三个输出长度上对比:4k、32k、64k 下 POIS 的表现都优于 SAIS;4k 时 POIS 的熵与准确率曲线几乎和 1 段的 TOIS 重合。另外 SAIS 配合 clip-higher(εhigh = 0.28)会出现熵爆炸。直觉解释是:每条样本最后一段是真的 on-policy,可以部分抵消伪 on-policy 段的负面影响。

两个容易看错的地方TOIS / SAIS / POIS 的设置,与决定「是否 on-policy」的到底是什么

三个设置的段数不同。TOIS(True On-Policy Importance Sampling)是段数为 1 的对照组,SAIS 与 POIS 都是段数为 4。所以 TOIS 与 POIS 的曲线重合含义是「4 段 POIS 的熵和准确率跟不分段的真 on-policy 几乎一样」,即切段本身没有明显代价。

「伪 on-policy」不是数学上无偏。把所有段的旧策略都换掉,本质是用当前模型重新打分旧段落,比值偏离 1 的部分被忽略。论文的实验依据是 POIS 优于 SAIS、且 entropy 更稳;为什么没有造成更严重的偏差,原文只给了上面的直觉解释,没有梯度层面的分析。

3.3 熵坍塌:谁在把分布磨尖

论文反对「训练正样本是熵下降主因」的说法(Zhu et al.),把根因收窄到正样本里已被熟练掌握的词元。定义(Eq. 9):样本满足 r(sk) = 1 且词元满足 p(ti) ≥ τ,即为 MPTs。

MPTs = ∪k=1…N ∪i=1…Lk { ti ∈ sk } , 其中 p(ti) ≥ τ,r(sk) = 1
Eq. 9 · MPTs 是「做对的回答」里「模型本来就很有把握」的那些词元;论文取 τ = 0.99

Figure 3 的机制:继续更新 MPTs 会进一步提高它的预测概率,分布更尖,熵下降;更新非 MPTs 则不一定。Figure 4 是直接证据——在 Qwen3-4B、Qwen3-8B、Qwen3-30B-A3B 上,全部词元参与训练时熵逐渐下降;只屏蔽 MPTs 时熵随时间上升。

3.4 DMMPTs:熵低于 σ 才屏蔽

只屏蔽 MPTs 又会让熵一路上涨,同样不稳。DMMPTs 加了一个条件开关:

J(θ) = E[ (1 / |V|) · Σi,t [1 − 𝕀msk(i,t)] · min( ri,tÂi,t , clip(ri,t, 1−ε, 1+ε) · Âi,t ) ]
Eq. 10 的简写:|V| 代表分母 Σi=1G|oi|;𝕀msk 为 1 时该项被丢弃。正常配置只有 (1 − 0.2)×100 = 80% 被计权
𝕀msk(i,t)条件该词元
1H̄i < σ 且 oit ∈ MPTs屏蔽,不产生梯度
0其他情况照常训练

这里的 H̄i 是单条回答的逐词元熵平均,即 (1/|oi|) Σt Σj ptj log ptj。目标是让熵不低于 σ:低时收回最没信息量的梯度,高时全部照训。论文没有对「恢复全部训练后熵如何变化」的瞬态做定量刻画,Figure 5 只看熵是否稳在目标附近。

直觉

它是一个「熵的下限开关」,不是熵正则

熵正则项会把目标函数变成「奖励 + 熵」的加权和,需要调权重;DMMPTs 改的是哪些词元给梯度,目标函数本身不变。所以在熵充足时,训练与不加 DMMPTs 完全一致。代价是新增两个超参数 τ 与 σ(论文取 0.99 与 0.2)。

04

奖励的质量决定了这套方法的上限

这一节全是「让它跑得稳」的工程细节:验证器、数据清洗、超长处理。

超参(§4.1,Qwen3-30B-A3B)

项取值
优化器 / 学习率AdamW,常数 1×10−6
prompt batch / 每题采样128 / G = 8,采样温度 0.85,top_p 1.0,top_k −1
最大长度 / 段数 / 段长128k / 8 / 16k
mini-batch1024,一个 rollout 步做一次梯度更新
MPTs 阈值 τ / 目标熵 σ0.99 / 0.2
评测AIME-2025、BeyondAIME,各跑 32 次取 avg@32;温度 0.85,top_p 0.95,top_k 20

生成式验证器:规则判等不行

奖励是结果的二值判等:正确 1,其余 0。但「两答案是否等价」靠规则容易判错——论文举的例子是 (27cm, 0.27m) 与 (1/2, one half)。因此训练了一个生成式模型来判断语义等价。

数据清洗:问题维度与答案维度

问题维度

让题面适合短答

  • 删除一个题含多个小问的样本,避免只答对部分子题被判错。
  • 选择题、证明题、判断题改写为短答格式,防止猜答案。
  • 用 Qwen3-30B-A3B 每题推理 8 次,8 次全对的题视为过简删除。
答案维度

让参考答案好判

  • 从参考答案里抽出短答案,降低验证器判别难度。
  • 删除参考答案过长的题(如矩阵答案)。
  • 多个 SOTA 模型给出一致但与参考答案不同的答案时,判定参考答案错误并删除。

超长处理:截断即判错

DAPO 给过两种处理:过度长过滤、软惩罚。论文的实验结论是——过滤会让输出长度快速变长,不可取;软惩罚的效果与「直接当作答错」相当。所以 UloRL 直接给截断样本奖励 0(§3.5)。

05

Algorithm 1:每一步都从「未完成池」续写

整个流程是两池一循环:unfinished_pool 装没写完的,experience_pool 装可以训的。

unfinished_pool 上一轮没解码完的样本(带前缀) prompts 新从 RL 数据集取的题(第 8 行) rollout,max_len = each_segment_length 每次只解码一段,例如 16k 段满,但未到全局上限 → unfinished_pool(第 9 行) 遇到 EOS / 到 128k 截断 → experience_pool(第 10 行) 截断样本奖励 = 0(§3.5) update_model(第 11 行) GRPO/DAPO 目标 + DMMPTs 掩码 段形成后经验池立即训练 下一轮
图:Algorithm 1 的数据流重绘。每一步只做一次 rollout,三出口决定样本是挂起、入池还是直接训练。
展开说明 ▸
  • 每步都有样本离开批次。短样本在第 1 段遇到 EOS 随即入池;长样本继续挂起。批次的重心随时间从长样本转向「长样本尾巴 + 新 prompt」。
  • 截断样本照样训练。到 128k 仍没写完的样本被截断后进入经验池,奖励记为 0——这是有意为之,让模型学会在预算内收尾。
  • update_model 用的是经验池里所有可训样本。Algorithm 1 第 11 行只有 experience_pool 一个输入;分段的「伪 on-policy」性质就来自这些样本里的不同段落。
  • 与不分段的差别只在第 8 行的 max_len。断点续写、经验池的接入都是流水线工程;算法层新增的只有 POIS 的比值定义和 DMMPTs 的掩码。

三种方法怎么落到「一条样本的每一段」上

下面把 Algorithm 1 中的一个时刻切片出来:经验池里恰有一条 8 段的样本,每一段由一个时刻的策略生成。切换方法,看每个词元计算比值时,分母取的是哪个模型。

当前读数
06

不加 DMMPTs 少 4.2 点;Yarn 再加 2.3 点

主表的两处反直觉:更强的分结果不是 128k 那个模型;「越长越好」到 64k 之后边际在收窄。

Table 2:Qwen3-30B-A3B 上的整体结果

模型AIME-2025BeyondAIMEAVG
DeepSeek-R1-052887.563.3*75.4
Seed-1.6-thinking8656.371.2
Qwen3-235B-A22B81.559.0*70.3
Qwen3-30B-A3B(基线)70.950.7*60.8
UloRL-A3B-128k82.860.271.5
UloRL-A3B-w/o-DMMPTs78.657.167.9
UloRL-A3B-128k-Yarn85.161.973.5

* 为论文团队自行评测,其余来自官方报告(Table 2 注)。Yarn 版本把输出延长到 140k(factor 1.5,original_len 93k)。

Table 3:输出长度的影响

模型AIME-2025BeyondAIMEAVG
Qwen3-30B-A3B(基线)70.950.760.8
UloRL-A3B-32k73.552.362.9
UloRL-A3B-64k79.958.569.2
UloRL-A3B-96k81.659.470.5
UloRL-A3B-128k82.860.271.5

段数设置:32k 用 1 段,64k 用 4 段,96k / 128k 用 8 段(§4.3)。

读表时值得注意的三点:

Table 1:切段带来的速度

在 Qwen3-30B-A3B、64k 输出上测每步耗时:不分段 1240s,2 段 774s(1.6x),4 段 601s(2.06x)。论文没有报告 8 段的加速。注意这是 64k 上的测量,而主实验是 128k 切 8 段。

07

三处需要带着疑虑看的地方

论文自己的方法取舍与缺失,比结论更值得记下来。

边界一

POIS 是近似,论文没给梯度层面的论证

把伪 on-policy 段按权重 1 处理,意味着这些旧段落的数据没有被严格校正。论文的实验(Figure 2)显示 POIS 优于 SAIS,但为什么没有把训练带偏,原文只有「最后一段是真 on-policy」这条直觉。若分段更多、或策略更新更快,这个近似的误差是否会放大,论文没有系统探索。

边界二

τ 与 σ 固定,且没有敏感性分析

论文只给出 τ = 0.99、σ = 0.2 两个取值和 Figure 5 的熵稳定曲线,没有扫描不同 τ / σ 对性能的影响。换模型、换任务时该取多少,需要自己试。

边界三

证据集中在数学,且增益很大程度来自「延长长度」

评测只有 AIME-2025 与 BeyondAIME 两个数学基准。从 Table 3 看,32k 训练的收益很小;主要提升发生在把长度上限推到 64k 以上之后。换句话说,「UloRL 提升了推理」在实验里主要表现为「让模型能在更长预算下训练并受益」。这套流程在代码、多学科等长推理任务上是否同样有效,论文没有验证。

还有两处工程细节值得记:冻结熵的方案不能只看熵——DMMPTs 的前提是「已熟练的词元不训也不伤性能」,但摘要在 Table 2 的检验里只用了「w/o-DMMPTs 掉 4.2 点」来间接证明;奖励依赖验证器与数据清洗,§3.3–3.4 的清洗步骤(删多小问、删过简题、纠正错参考答案)任何一步出问题,都会在奖励上体现为假阳性或假阴性。