超长输出的 RL 有两个坎:批内少数超长样本拖住整批解码(长尾),以及训练中熵持续下降(熵坍塌)。 UloRL 用分段 rollout 把解码切成固定长度段落,已完成样本立即进入经验池;再用 DMMPTs 在熵低于目标值时屏蔽「已熟练掌握的正向词元」。 代价是分段带来的跨模型混合——论文选择直接把它近似成 on-policy。
128k 输出下,一批里只要有几条样本跑到最长的 128k,整批都要等它们;但大部分样本早就该入池了。UloRL 把最大长度切成 8 段、每段 16k,每次只解码 16k 就更新一次,完成的样本立即训练,没完成的带着前缀进入下一轮。
副作用是一条样本由多个版本的模型拼成。论文给了两种处理:按段查旧策略的 SAIS,以及把全部旧策略都当作当前策略的 POIS——所有权重恒为 1,永远不会被 clipping 截掉。最终选 POIS:它在 4k / 32k / 64k 三个长度上都优于 SAIS。
熵坍塌的根因被定位为过度训练已熟练掌握的正向词元(概率 ≥ τ,论文取 0.99)。全部屏蔽会让熵一路上涨,DMMPTs 只在熵低于目标 σ=0.2 时屏蔽,把熵稳在目标附近,不引入熵损失项。
读完这节应该知道:超长输出 RL 的浪费不在总量,而在「等」。
RLVR 的做法是采样一组回答、按最终答案给奖励、再用 GRPO / DAPO 这类算法更新策略。标准框架里,一批中所有样本都解码完毕,才能进入下一步训练。输出长度一拉到 128k,长度分布就是重尾的。
§3.1 的原话:一批里 80% 的样本长度不超过 64k,但所有样本都必须等最长的 128k 输出解码完,才进入下一次解码迭代。GPU 在一整段时间里只在为少数长尾样本服务,其余样本已经生成完却闲置。
长度本身不是浪费的来源——长推理确实能提升难题上的表现。浪费在于轮次的结构:长度为 L 的样本和长度为 128k 的样本被绑在同一个同步屏障上。
第二个问题与长度无直接关系,但同样在长训练中放大:熵坍塌。训练越久,模型输出分布越尖锐,探索能力随之下降(§3.2 与 Figure 4 的 baseline 曲线),最终伤害推理上限。UloRL 的两块主要技术分别对应这两个问题。
两路已有方案,各自的限制都写在论文的 Introduction 里。
K1.5 最早提出把解码拆成部分进行。UloRL 认可这个方向,但指出:缺少对不同模型生成的段落如何参与训练的详细说明,也没有给超参数设置,难以复现。
UloRL 的做法是同构的:切段 → 完成即入池 → 未完成挂起。区别在于把「跨模型混合段落的训练学」写清楚了——SAIS 与 POIS 两种重要性采样方案,以及二选一的实验对比。
① 加熵损失项。直接把它当优化目标之一。论文认为「维持熵」与「提升推理」目标并不完全一致,可能拉低性能天花板。
② 改训练样本或词元。DAPO 的 clip-higher 只对 off-policy 有效,on-policy 下没有 clipping 可放;W-Reinforce 降低正样本权重,但对本身就低概率的重要词元,减速训练同样伤学习。
UloRL 对熵的立场是第三种:既不加优化目标,也不用重要性采样,只决定「哪些词元参与梯度」——当熵偏低时,把模型早已熟练的正向词元从梯度里拿掉。
§2.3 说明训练沿用 DAPO 的 dynamic sampling、token-level gradient loss、去掉 KL 项。与 DAPO 不同的是奖励取值:论文用 {0, 1} 而不是 {−1, 1},这样数据集上平均奖励直接等于准确率;在 GRPO 组内归一化下,奖励为 1 的样本优势恒为正、为 0 的恒为负,梯度方向与优化目标一致。
实现基于 volcengine/verl(§3 脚注)。
机制本身很短,难点在切段之后重要性采样怎么定义。
全局最大长度 128k、段数 8,则每次最多解码 128k / 8 = 16k。每解码一步,输入有两个来源:上一轮没完成的样本,以及数据集里新取的 prompt。解码在三种条件下停下(§3.1.1):
看四种长度怎么被切:段数越大,短样本越早离开批次,而不分段时全部样本被绑在 128k 那一条上。
切段之后,同一条样本的不同段落由不同时刻的策略生成。GRPO / DAPO 的比值 ri,t = πθ / πθold 里,分母不再唯一。论文给了两种定义(§3.1.2,Eq. 8;POIS 由 Figure 1(c) 描述):
ri,t = πθ(oi,t) / πθold,f(i)(oi,t)
f(i) 把第 i 个词元映射到它所属段号的旧模型。精确,但老段落的比值可能远离 1,会被 clipping 截断。
把各段旧策略统一替换成 πθ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(True On-Policy Importance Sampling)是段数为 1 的对照组,SAIS 与 POIS 都是段数为 4。所以 TOIS 与 POIS 的曲线重合含义是「4 段 POIS 的熵和准确率跟不分段的真 on-policy 几乎一样」,即切段本身没有明显代价。
「伪 on-policy」不是数学上无偏。把所有段的旧策略都换掉,本质是用当前模型重新打分旧段落,比值偏离 1 的部分被忽略。论文的实验依据是 POIS 优于 SAIS、且 entropy 更稳;为什么没有造成更严重的偏差,原文只给了上面的直觉解释,没有梯度层面的分析。
论文反对「训练正样本是熵下降主因」的说法(Zhu et al.),把根因收窄到正样本里已被熟练掌握的词元。定义(Eq. 9):样本满足 r(sk) = 1 且词元满足 p(ti) ≥ τ,即为 MPTs。
Figure 3 的机制:继续更新 MPTs 会进一步提高它的预测概率,分布更尖,熵下降;更新非 MPTs 则不一定。Figure 4 是直接证据——在 Qwen3-4B、Qwen3-8B、Qwen3-30B-A3B 上,全部词元参与训练时熵逐渐下降;只屏蔽 MPTs 时熵随时间上升。
只屏蔽 MPTs 又会让熵一路上涨,同样不稳。DMMPTs 加了一个条件开关:
| 𝕀msk(i,t) | 条件 | 该词元 |
|---|---|---|
| 1 | H̄i < σ 且 oit ∈ MPTs | 屏蔽,不产生梯度 |
| 0 | 其他情况 | 照常训练 |
这里的 H̄i 是单条回答的逐词元熵平均,即 (1/|oi|) Σt Σj ptj log ptj。目标是让熵不低于 σ:低时收回最没信息量的梯度,高时全部照训。论文没有对「恢复全部训练后熵如何变化」的瞬态做定量刻画,Figure 5 只看熵是否稳在目标附近。
熵正则项会把目标函数变成「奖励 + 熵」的加权和,需要调权重;DMMPTs 改的是哪些词元给梯度,目标函数本身不变。所以在熵充足时,训练与不加 DMMPTs 完全一致。代价是新增两个超参数 τ 与 σ(论文取 0.99 与 0.2)。
这一节全是「让它跑得稳」的工程细节:验证器、数据清洗、超长处理。
| 项 | 取值 |
|---|---|
| 优化器 / 学习率 | AdamW,常数 1×10−6 |
| prompt batch / 每题采样 | 128 / G = 8,采样温度 0.85,top_p 1.0,top_k −1 |
| 最大长度 / 段数 / 段长 | 128k / 8 / 16k |
| mini-batch | 1024,一个 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)。因此训练了一个生成式模型来判断语义等价。
DAPO 给过两种处理:过度长过滤、软惩罚。论文的实验结论是——过滤会让输出长度快速变长,不可取;软惩罚的效果与「直接当作答错」相当。所以 UloRL 直接给截断样本奖励 0(§3.5)。
整个流程是两池一循环:unfinished_pool 装没写完的,experience_pool 装可以训的。
max_len。断点续写、经验池的接入都是流水线工程;算法层新增的只有 POIS 的比值定义和 DMMPTs 的掩码。下面把 Algorithm 1 中的一个时刻切片出来:经验池里恰有一条 8 段的样本,每一段由一个时刻的策略生成。切换方法,看每个词元计算比值时,分母取的是哪个模型。
主表的两处反直觉:更强的分结果不是 128k 那个模型;「越长越好」到 64k 之后边际在收窄。
| 模型 | AIME-2025 | BeyondAIME | AVG |
|---|---|---|---|
| DeepSeek-R1-0528 | 87.5 | 63.3* | 75.4 |
| Seed-1.6-thinking | 86 | 56.3 | 71.2 |
| Qwen3-235B-A22B | 81.5 | 59.0* | 70.3 |
| Qwen3-30B-A3B(基线) | 70.9 | 50.7* | 60.8 |
| UloRL-A3B-128k | 82.8 | 60.2 | 71.5 |
| UloRL-A3B-w/o-DMMPTs | 78.6 | 57.1 | 67.9 |
| UloRL-A3B-128k-Yarn | 85.1 | 61.9 | 73.5 |
* 为论文团队自行评测,其余来自官方报告(Table 2 注)。Yarn 版本把输出延长到 140k(factor 1.5,original_len 93k)。
| 模型 | AIME-2025 | BeyondAIME | AVG |
|---|---|---|---|
| Qwen3-30B-A3B(基线) | 70.9 | 50.7 | 60.8 |
| UloRL-A3B-32k | 73.5 | 52.3 | 62.9 |
| UloRL-A3B-64k | 79.9 | 58.5 | 69.2 |
| UloRL-A3B-96k | 81.6 | 59.4 | 70.5 |
| UloRL-A3B-128k | 82.8 | 60.2 | 71.5 |
段数设置:32k 用 1 段,64k 用 4 段,96k / 128k 用 8 段(§4.3)。
读表时值得注意的三点:
在 Qwen3-30B-A3B、64k 输出上测每步耗时:不分段 1240s,2 段 774s(1.6x),4 段 601s(2.06x)。论文没有报告 8 段的加速。注意这是 64k 上的测量,而主实验是 128k 切 8 段。
论文自己的方法取舍与缺失,比结论更值得记下来。
把伪 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 的清洗步骤(删多小问、删过简题、纠正错参考答案)任何一步出问题,都会在奖励上体现为假阳性或假阴性。