最近deepseek-r1和kimi k1.5的论文引起了广泛的关注,今天给大家带来一篇好友@真中合欢的文章,《看DeepSeek R1的论文时,我突然想起了AlphaGo》。
等了好久,终于等来R1的论文,我在当天晚上第一时间拜读。整篇论文的实验和理论给我一种简洁的优雅,和DeepSeek-V3那篇论文的感觉完全不同。读论文的过程中,我就想起了曾经看过的AlphaGo。于是也想发表一些浅显的看法,有不对的地方欢迎指出。
Reward设计
读完这篇论文,或者说读论文的过程中,R1的reward模型就给我留下了深刻印象:基于规则的奖励模型。
R1在文中提到,自己为什么没有用PRM:
第一,在一般推理中,明确界定细粒度的推理步骤比较困难。第
二,判断当前推理中间步骤是否正确非常困难。使用模型进行自动标注差强人意,而手动标注不利于扩大规模。
第三,一引入基于模型的 PRM,就不可避免地会有奖励劫持问题,动态重训奖励模型资源开销大。
我非常认同这一观点。因为从事LLM之初,我首先负责的是预训练,所以一个方法能否 scaling up 成为了我后面做持续训练、post-train时,评估这个方法最终能不能work并上到线上模型的重要维度(事实也证明,这样的方法基本都是work的),所以我很认同第二点。虽然现在有很多MC构造数据训练PRM的方法可以scaling up,但是前段时间qwen 数学推理的论文也提到了MC的方法就是会有幻觉,不如llm as judge,更不如人类标注,这里R1索性不用PRM了。但是r1因为要避免reward hacking,直接连基于模型的ORM都抛弃了,我觉得还是有魄力的。毕竟很多工作也表明了稠密reward要好于稀疏reward。但是仔细想想,其实qwen的那篇论文也提到了ORM有一定的PRM的特性,其实也会出幻觉。
模型训练
对于模型主体训练,R1使用了一个多阶段策略:
-
首先利用base 模型+ 一些prompt + rule-based reward ,跳过SFT直接上GRPO强化,目标是让reward提升,也就是提升做题准确率。这个过程中模型的输出不断变长,开始学会反思,但是这个阶段的推理过程很难理解。这个时候的模型命名为R1 Zero
-
第二步利用 R1 Zero 生成数据进行RS,留下推理过程正常的。再混合一些非推理数据,对base 模型SFT,再上强化,得到最终的R1。
首先能够直接在base模型上RL我不是很意外,因为我们现在都会把SFT数据加到pretrain里。比如qwen系列的pretrain模型,调一调prompt,基本的指令是能follow的。而且模型越贴近pretrain,幻觉越少这一点也让我看好这种做法。
其次是看到模型自然的产生反思我也不是很意外,在我做的一些RLHF的实验中,模型只要输出能够变长,经常能看到自然的出现反思,不过我的反思大多最终反思出一个错误的结果。
我猜测是因为如果模型输出有变长的趋势,在输出完答案后,自然会用剩下的“额度”去check答案对不对。不过这两年的大模型经验也让我认识到一点,模型一个能力的“涌现”,必定是训过这种类型的数据。所以根本问题其实是为什么强化能在采样的过程中采出这种response,以及为什么模型可以学会这种response而不是更多的去学别的response。(强化的时候模型的输出为什么变长或变短,为什么学了这种类型而没学另一种类型的response,探索稳定训练的症结所在,正好是我最近的研究内容,希望能有个明确的结果)
另一个是关于GRPO使用的KL loss。这个KL loss不是像 PPO 一样加在 reward 里乘在概率上,而是单独减去这个KL loss。并且这个KL loss 使用了 http://joschu.net/blog/kl-approx.html,而不是直接用蒙特卡洛估计。
我在做RLHF、蒸馏、自约束等需要KL loss的方法时也发现,当使用乘性KL时,比如将KL蕴含在reward分数里,乘在动作的对数概率上:
可以采用蒙特卡洛估计的KL,允许KL估计值为负:
为什么想起了AlphaGo
最后
(文:机器学习算法与自然语言处理)