R1 的一些认知:4 个经典误区


MLNLP社区是国内外知名的机器学习与自然语言处理社区,受众覆盖国内外NLP硕博生、高校老师以及企业研究人员。
社区的愿景是促进国内外自然语言处理,机器学习学术界、产业界和广大爱好者之间的交流和进步,特别是初学者同学们的进步。
来源 | AINLP
作者 | ybq@知乎

r1 技术报告的发布已经两个多月了,开源社区的各种复现工作让人眼花缭乱,这里我也简单总结一下过去两个月的个人认知与社区认知。

考虑到 tensorboard 曲线属于公司财产,我不太敢贴出来。所以这篇文章我就纯尬聊了,都是些很基础的东西,偏科普性质。如有错误,还望大佬指正!

简单复盘

o1 和 r1 之间间隔了四个月,在此之前,rule-based reward 并没有被主流技术方案所认可。我们不妨做个简单的复盘,去思考下在那探索的四个月中,为什么大家更青睐于 prm / mcts 路线,为什么沿着这条路线做不出来突破?以及到底有哪些关键点是当时所被忽略的?

base model and data distribution are all you need

在复现 r1 的工作中,qwen 和 llama 展现出了不同的趋势,qwen-base、qwen-instruct、qwen-math-base 也展现出了不同的趋势。rl 本来就是一个发掘模型潜力的方法,如果模型没有潜力,那还发掘啥呢?

同理,数据分布也一样,目前开源的复现 r1 工作已经很多了,但也不是说任何工作都能和它们技术报告一样完美复现。orz 的 57K 数据,就是一个整理的比较好的数据,训练较为稳定。正如 kimi1.5 报告中所说,我们要观测很多统计指标:每个 prompt 的多次采样的平均准确率、平均输出长度、是否不经过 cot 能直接说出答案等,甚至 prompt 的 ground truth 是否易于 verifier 进行判别(或提前统计好,或在训练过程中利用课程学习的思想动态调控)。

过去的时间内,小作坊团队们还是过于聚焦在“厨艺”上了,对“食材”的分析反倒是有所欠缺。

scaling is all you need

“结果正确”就是比“过程正确 + 结果正确”训出来的模型效果好,即使是现在也没人敢打包票吧。

r1 的成功并不能宣判 prm 的死刑,它只能说明,100W 条 orm 数据 > 1W 条 prm 数据。换个角度,深度学习的一个发展范式就是“scaling + 雕花”:先大力出奇迹,再一点点缩小成本、优化细节。显然 orm 属于 scaling,prm 属于雕花,不是 prm 的技术路线有问题,而是对 prm 的投入应该放在 orm 已经完全吃透之后。

infra is all you need

rlhf 和 llm-reasoning 这两个方向有什么区别吗?prompt 的难度和 response 的长度。

以往我们使用 rlhf 的场景主要是:安全问题、诗歌创作修复韵脚问题、简单的代码数学问题等,往往都是几百个 token 就搞定的任务。现在不一样了,模型的一条回复就达到了上万个 token,这会让显存压力和解码时长陡增。作为应对,vllm 或 sglang 已经成为 rlhf 框架的标配。最初我也认为 grpo 省掉 critic_model 这一点并不关键,现在看来我还是只考虑了算法和数据的视角,并没有充分理解到额外维护一个和 actor_model 相同规模的 critic_model,对训练框架的稳定性有多大的挑战。

当模型 size 和 response_len 逐渐增大,“训练效率和预防训练过程中莫名其妙的 OOM ”就是复现 r1 工作中最大的难点(对,就是莫名其妙,在程序断了之前,你不会知道明明限制了最大 response_len,为啥它还会 OOM)。截止目前,大模型的强化算法没有什么创新,grpo 也已经出现一年半了。如果说各公司复现 r1 的进度不太一致,那大概率是因为各公司的 rl-infra 水平参差不齐吧。

hyper-parameter is all you need

因为之前没有坚定 rule-based reward 这个路线,所以大多数团队不会花很多时间去调整学习率、kl 系数、回报折扣系数、n_samples、使用的强化算法 …… 仅凭几组参数就敲定实验结论。再加上算法同学们通常都对训练数据十分敏感,观察到“过程瞎说但结果蒙对了的 response”,就会更坚定的认为当前的技术方案不行。

dpsk 也在技术报告里提到说他们尝试过了 prm / mcts 的路线,只不过遇到了种种瓶颈,最终选择了 orm 的路线,然后“顺利”地做出了 zero 和 r1。

没有足够的技术自信和训练算力,确实不会下那么大的决心去调参,所以 r1 注定是要由精英团队率先做出来的。

常见误区

我相信大家对如何复现 r1 都心里有数,毕竟网上的开源工作和科普实在是太多了,我也就不重复了。这里,我简单聊聊在复现 r1 的工作中,很多新人容易陷入的误区。

误区1:r1 的关键在于对 base 模型做强化

如果熟读 dpsk 的技术报告,应该会有印象:基于 base 模型做 rl 得到的 zero 模型,仅仅是在 r1 的训练过程中提供了一些 long cot 的启动数据罢了,这个冷启动数据还要经过数据专员的大幅度修正。也就是说,r1 的训练,是基于一个 sft model 进行的(1000 条冷启动数据训练)。

  • 对 base model 直接做 rl,好处在于模型没有受到任何限制, explore 的空间极大,有发挥的空间,缺点在于模型的 follow 格式能力很差;
  • 对 long cot model 做 rl,好处在于模型 follow 格式的能力很强,同时在 long cot sft 阶段,会被灌输很多正确的思考模式,缺点大概是模型的起始输出长度过长;
  • 对 instruct model 做 rl,复现 r1 的效果应该是最差的,因为模型的思考模式已经有些固化了,explore 空间比较小。

三种 setting,孰优孰劣,我的认知也未必正确,大家自己在实验中自己找感觉吧。也可以花时间比较一下模型在 rl 之前、rl 之后的 response 有什么变化,统计一下最高频的 N-gram 看看。

误区2:r1 的复现在于看见 response_len 的稳定增长

在 response_len 这个指标上,很多人都有点倒果为因了,认为观察到 response_len 和 reward 一起上涨就代表模型的效果在变好。

复杂的问题,往往需要更高级的思考逻辑,而高级的思考逻辑往往会具有更长的长度。换言之,在不考虑 attention 衰减的情况下,response_len 几乎与 explore_space 呈正比关系 —— 所以我们并不是希望 response_len 上涨,而是希望模型 explore 到更有价值的或者是全新的思考逻辑。如果只是想增加 response_len,我们有一百种方法,把 eos_token 的 probability 调小一倍,开 dropout,加各种 noise 让模型训崩,诱导模型出现复读机现象 …… 有意义吗?显然没有。

reflection pattern 也是同理,不是说看见模型说出了 however、wait,就代表模型具有反思能力了。而是要看是否这些反思 pattern 帮助模型提高了准确率,或者说是,带反思 token 的 response 的 accuracy 是否真的高于 response 的平均 accuracy。此外,不同的 reflection pattern 对 accuracy 的贡献也不相同,try another approach 就是比 compute again 要高级一些,模型能不能在 reward 持续上涨的过程中,自发地提升优质 reflection pattern 的出现概率,也是我们要观察的重点。

误区3:打点太少,只关注 reward、loss、response_len

工欲善其事,必先利其器,打点就是做 rl 时最重要的“器”。毕竟打点又不增加训练耗时,能多记录信息就多记录,就算是把每条 response 的生成耗时都写到 tensorboard 里也不会让人觉得奇怪。

比如下面这些指标,我们都可以记录下来,万一就能从中找到些灵感呢?

  • 模型的输出同质化指标:最常见的指标自然是 policy_model response 的 entropy。但也可以是别的,同一 prompt 下 N 条 response 的编辑距离,N-gram 重复比例等都可;
  • 模型的各种 response_len:答对时候的 len,答错时候的 len,答对且有反思时候的 len,答错且有反思时候的 len 等;
  • 模型的 ACC:不仅是整体的 ACC,也要有各种设定下的 ACC,比如单条 prompt 下的 ACC,出现反思 pattern 时的 ACC,高于平均 response_len 时的 ACC 等;
  • 模型的异常现象占比:response 没有 follow 格式,response 超出预设长度了,response 出现复读机现象,或者是 repeat_score 过高,response 中英混杂等;
  • 算法的异常现象占比:ppo / grpo 都有一个 clip 操作,记录 clip 发生的频率,到底是上溢多还是下溢多,溢出的比例随着实验推进会发生什么变化?
  • ……

误区4:忘了实验目标是什么

在和朋友做 r1 的技术交流的时候,我发现大家都会时不时陷入到一个死胡同里去。具体来说,就是为了让某个指标好看而忽略了实验原本的目标是什么?最典型的死胡同莫过于:想方设法的让 policy_model response 的熵不要低于某个值。

  • 为什么希望熵别太低呢?因为希望模型的 N 条 response 足够有区分度,信息量足够大;
  • 那具体的做法是什么呢?加 entropy_loss,调 temperature,调 clip 的上下界;
  • 有效果吗?可能有,但更可能把模型训崩溃;
  • 分析模型为什么崩溃?可这怎么去分析呢,熵 loss 和 语言模型 loss 本来就是相反的目标,temperature 过大则会让各种牛鬼蛇神 token 都冒出来;
  • 陷入痛苦,为什么我的“改动”让模型训崩溃了!

简单来说,模型 response 趋向于同质化是一个必然现象,rlhf 的目标不就是:把模型从 decode 10 次答对一次,训成 decode 3 次答对一次吗?把 path@N 的收益集中在 path@1 上。

如果模型没训崩溃,reward 和 response_len 持续增长,那就不要纠结 response 多样性是否过低的问题了。或者我们就直接换数据啊,response 多样性低大概率是 prompt 太难或太简单了,考虑用课程学习思想淘汰这条数据。这个问题上太纠结于设计 loss 很容易走火入魔。

总之,目前的 long cot 实验重点是两个目标:reward 稳定提高,response 探索出一些高级的思考 pattern至于什么 response_len 持续增长,什么 aha moment,并不是实验的关键!要知道,o1 和 r1 目前更擅长的其实是 planning,而不是无休止的“wait、but、however”。

未来展望

数学底子好的人,就应该继续去优化 rl 算法,往大了搞可以提出一个新的算法,往小了搞就从理论上去证明 grpo / ppo 中 clip 公式、kl_loss、advantage_norm、batch_norm 等是否合理,是否有优化的空间。

卡多的人则可以搞排列组合,是否加 kl loss,是否直接丢弃超长的 response,是否应该给损失函数加熵,是否应该动态调 temperature,是否对 prompt 引入课程学习等等 —— 消融实验会证明一切。

infra 能力强的人,则应该持续优化训练框架的稳定性和训练效率,解决一些很底层但都被大家选择性忽略的问题,比如推理引擎 vllm 的结果和 model.forward() 其实还是有不少精度 diff 的。

前瞻性强的人,就该收一收手头的 math 工作,赶紧搞 code 了。AIME2024 显然已经走上了 GSM8K 的后尘,被大家玩的炉火纯青。除此之外,如何像 dpsk 一样把模型从 code / math 上学到的 long cot 能力,泛化到模型的通用能力上,亦是一个极具挑战的难题,也是 o1 / r1 真正牛的地方。

(白嫖的人,可以等千问团队发布 qwen3 和 qwq 的详细报告与 checkpoint 哈,感觉快来了)


希望大家都能在 qwen7b / qwen 32b 上训出自己的 r1 模型。qwen 还是牛的,打听了一圈,几乎所有人的实验都是在这两个模型上做的。


(文:机器学习算法与自然语言处理)

欢迎分享

发表评论