一、写在前面
在 OpenAI o1 刚放出来时,它有限的技术报告里,有 2 个内容格外抓人眼球:
- Inference/test-time scaling
- RL
我一直是把这 2 者理解为两个独立的个体,在这个基础上,当时我给出了一些关于 o1 实现思路的猜想(https://zhuanlan.zhihu.com/p/...):
我认为 o1 走的可能是上述 framework3 的路线,总结来说:
Inference/test-time scaling
:这一块的主要作用是为 RL 过程自动化地制造高质量数据集。包括用于 format 模型产生思考过程的 long cot 数据集,以及带 preference labels 的数据集。我把这一块的系统抽象为 PRM + some search methods 的形式。例如讨论度很高的 MCTS,本质上也可理解为 fixed PRM + some search methods。RL
:这部分应该就是 openAI 自己惯有的一套 RL 流程。- 在这样的训练框架下,最终推理时是否要再次引入 inference-time scaling 模块,就是一个可选项了。只要 RL 过程做得充分好,那么直接用训完的 policy 模型就可以,完全不需要再做优化。
那么,我为什么当时会认为 inference-time scaling 和 RL 应该是 2 个独立的过程呢?因为在我的认知里,我认为如果没有显式的引导,模型是不具备产生 long cot(乃至带反思的 cot)的能力的(在模型训练初期,这个能力是指 formatting 模型,让它知道要产出这种格式的回答;在训练过程中再来慢慢提升这种回答的质量)这个显示引导就是指诸如 sft 这样的过程。所以在这个认知里,上面的 2 个过程就应该是独立的。
而我第一次发现这样的认知可能有问题,是在我阅读红杉对 openAI 的访谈中,在这个万字长文里,有一句话格外引起我的兴趣,我当时把它划了出来:
这句话的意思是:没有人为的刻意为之,模型在某种训练过程中自发出现了反思的行为。而如果这一点都是能实现的,那是否意味着没有人为的刻意为之,模型本来也具备产生 long cot 的能力呢?
如果是这样的话,那么 o1 可能除了数据工程 + 惯常的 RL 技巧外,整个系统要比想的简单很多。可是我的水平有限,实在不知道除了显式引导外,模型怎么可能自发产生这样的能力呢?
而直到前几天,又是蹭着热点读到了 dpsk-r1 的这篇技术报告,我这下才发现:原来单纯的 RL 就可以激发模型产出带有 long cot(甚至是反思)的回复的能力!(可能在此之前已有很多研究发现了这点,是我对这一块的 follow-up 太少了,确实直到跟着热点读了 dpsk-r1,才发现了这点)。这里单纯的 RL 是指:我并没有显式提供一些真正的 long cot 数据让模型去背去学,我只是在 sys_msg 里告诉模型先思考,再回答。接着通过 RL 一轮又一轮的训练,模型产出的 responses 越来越长,且在某个时刻出现了自我评估和反思的行为。这个实验探索就是 dpsk-r1-zero 在做的事情。
如果 RL 有这种能力,那么 inference time scaling 和 RL 就可以不是 2 个独立的过程,而是在 RL 的过程里自发出现了 inference time scaling 的现象,而如果它们不再独立,那么类 o1 的训练架构也许就比我们想得要简单很多。
原本我只是抱着追热点的心态扫一下 dpsk r1,我甚至没打算看完它的 tech report。不过开头关于 dpsk-r1-zero 的实验结论一下吸引了我,所以把核心内容简单记录下,我会侧重训练流,略去评估。(这边的重点并不在于讨论什么路子是对的、什么是错的,只是对我来说发现一种可能)。
二、DeepSeek-R1-Zero
在 dpsk r1 的这篇报告里,提到了 2 个模型,分别是 DeepSeek-R1-Zero
和 DeepSeek-R1
,总结来看:
- zero 算是一个实验性质的模型,在 zero 上不通过任何 sft 的方式,仅使用 RL + 规则 RM,就能激发模型产出带反思的 long cot。这个重要的实验发现进一步启发了 r1 的训练。
- r1 是受到 zero RL 相关的实验结果启发,而新训的最终版的模型。zero 所采用的 RL 方法(即什么样的 RL 能激发模型主动产出 long cot,甚至是反思)将被 r1 参考。
下面简单记录下两者的训练细节。
2.1 强化学习方法
dpsk 家的 GRPO,不是文本关注的重点,暂略。
2.2 奖励模型-规则式 RM
在训练 DeepSeek-R1-Zero 时,采用了基于规则的奖励系统,主要包括两种类型的奖励:
(1)准确性奖励(Accuracy Rewards)用于评估模型 responses 的准确性。例如数学问题的答案是否正确,代码是否通过测试用例等。
(2)格式奖励(Format Rewards)
- 作用:除了准确性奖励模型外,还需要评估模型的输出是否遵从了一定的格式要求,以此规范模型的思维过程。
- 具体要求:要求模型将其思维过程放在‘’和‘’标签之间。这种格式化有助于明确模型的推理步骤。
(3)为什么不使用神经网络式的 RM?
- Reward Hacking
- 训练资源与复杂性
2.3 RL 数据的 prompt 设计
为了训练 DeepSeek-R1-Zero,我们首先设计了一个简单的模板,指导基础模型遵循我们指定的指令:
- 从中可以看出,这个模版就是sys_msg + question,整体作为 prompt
- 这里不是说用 sft,而是说直接用这个 prompt 喂给 base 模型(就是 actor),同时由于 RM 是规则式的,不需要用数据训练了,所以接下来就可以正常走 rlhf 过程了。
模版如下:
2.4 关于 zero 的重要结论
和别的模型的性能比较这里略去,简单介绍一下对于 R1 zero 性能重要的几个结论:
- r1 zero 证明了无需 sft,直接用 base model 做 RL,已经可以取得强大的 reasoning 能力。
- 使用多数投票策略(例如对一条 prompt 采样多次,取出现次数最多的那个答案)可以进一步增强模型性能。
- 随着训练 steps 的增加,r1 zero 倾向于产出更长的 response(long cot),并且还出现了反思行为。这些都是在没有外部干预的情况下,r1 zero 模型在训练中自我进化的结果。
- response 的长度随着训练时间增加而变长(思考得更多了)
- r1 zero 自然而然学会了重新评估和反思
2.5 zero 的缺陷
- 可读性差
- 多种语言混合
所以接下来探索 deepseek r1,这是独立于 r1 zero 的正式训练流程了。可以说,r1 zero 的训练是一个探索性的过程,它验证了 RL 本身对于激励模型产生推理的能力。在这个探索结论上,开始正式进入 r1 的训练。
三、DeepSeek-R1
r1 的训练总体训练过程如下:
- 从 base 模型开始:
- 使用量少、质量高的冷启动数据(cold data)来 sft base 模型,使得 base 模型可以有个良好的初始化
- 使用 RL 提升模型的推理能力
- 在 RL 阶段接近收敛时,用这个时候的 checkpoint 生成高质量的数据,将它们与现有的 sft 数据混合,创建新的 sft 数据集
- 再次从 base 模型开始:
- 使用新创建的 sft 数据集做 finetune
- 执行二阶段 RL
- 得到最终的 r1
3.1 使用冷启动数据做 sft
- 冷启动数据收集的方法如下(共收集约千条):
- few_shot:用带有 long cot 的例子作为 few_shot,引导模型生成回答(引导的是 base 模型)
- 直接在 prompt 中,要求模型生成带有反思和验证的回答(引导的也是 base 模型)
- 收集前面对 r1 zero 的部分结果
- 使用人工对数据做一些后处理
- 最后,我们要求冷启动数据遵从一定的数据格式:
`|special_token|<reasoning_process>|special_token|<summary>
`
- 使用这千条冷启动数据,对 base 模型进行 sft。
3.2 冷启动 sft 后的 RL
- RM 衡量的内容有 2 方面(看样子也是规则式的):
- 语言混合问题:这里 RM 在打分时,也要对语言一致性进行打分(计算目标语言词汇的比例)
- 答案的准确性
- 然后继续做类似于 r1 zero 的 RL 过程
3.3 创建新的 sft 数据集
这里新的 sft 数据集来自两个方面,一共约 80w 条。
1. 当前正在训练的模型产出的结果(reasoning data)
- 取 RL 接近收敛时的 checkpoint
- 构造 prompt 模版,使用拒绝采样的方式来筛选轨迹数据。在判断一条轨迹是否应该保留时,除了使用之前规则式的 RM,还会引入 deepseek v3 作判断(比如这条轨迹所指向的答案和 v3 的结果是否一致)。引入多个判断标准的目的是为了更好扩展数据集,保证多样性(这是我猜的)
- 最后在做一些过滤,这部分收集约 60w 条新 sft 数据集
2. 不是当前正在训练的模型产出的结果(no reasoning data)
- 已经有的高质量 sft 数据集(dpsk v3 做 sft 的数据集)
- 通过 prompt 引导 deepseek v3 产出的有 cot 的数据集等
- 这部分大约收集了 20w
3.4 使用新的 sft 数据集继续 finetune,并做 RL
- 再次回到 base 模型上,首先用这 80w 的新数据对它做 2 个 epoch 的 sft。
- 接着执行 2 个阶段的 RL:
- 第 1 阶段 RL:旨在增强模型推理方面的能力。采取类似 r1 zero 的 RL 方法,使用基于规则的 RM,对模型进行 RL 训练,以提升模型在数学、代码和逻辑方面的推理能力。(这里用的数据集应该不是那 80w,是类似于 zero 直接构建 prompt)
- 第 2 阶段 RL:旨在针对模型的 helpfulness 和 harmlessness,类似于 dpsk v3 的训练 pipeline
3.5 为什么还有 sft 的过程
当你观察上面对 r1 的两个阶段训练时,你会发现它们依然用到了 sft,表现在:
- 在第 1 阶段,使用千条冷启动数据做 sft,这千条冷启动数据都是带有 long cot 的 reasoning data
- 在第 2 阶段,使用约 80w 条新的数据做 sft,这里有 60w reasoning data 和 20w general data。
那么你看可能会有这样的疑问:如果还用 sft,那前面 zero 的实验是不是白做了? 既然得到了 RL 本身就有激发模型做 long cot 和反思的能力,那要 sft 干嘛?这岂不是和开头所说的 RL 中实现 inference time scaling 有矛盾吗?
这里谈一下我的理解:
- 首先,总体来看,sft 的作用是为了让模型拥有一个好的训练起点。
- 具体来说,在冷启动阶段,你只是用了千条数据做 sft 而已;在第 2 阶段,虽然使用了 80w 这一较多数量的数据,但这波数据的使用是一次性的,你不需要让这个过程贯穿在 RL on-policy 训练的每个 step。而且相比于设计一个复杂独立的 inference 系统,它的生成是容易的。这里做的事情不过是让模型拥有强壮的训练起点。
- 而在拥有这个起点之后,更强的推理和反思能力,则是靠 RL 来做,这正是受到 zero 的启发。
四、蒸馏 dense 模型
使用以上 80w 数据,对 llama 和 qwen 系的部分 dense 模型做 sft,然后检测这些模型的推理能力。
结论:对于小模型,不需要依然 RL,只用蒸馏就可以使得其推理能力得到显著提升(对于大模型会是怎么样的,这里没有提)
END
来源:GiantPandaCV
推荐阅读
- WTPose 框架:基于 Transformer 的 Waterfall 模块提升姿态估计能力 !
- 高效 CUDA 算子编写指南:结合 NCU 与 Cursor Claude-sonnet-3.5
- EFTViT: 在资源受限的边缘设备上对带遮罩图像的视觉变换器的高效联合训练 !
- 使用 Triton 加速 2D 动态块量化 Float8 GEMM 简介
欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式 AI 专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。