简单读读deepseek-r1

最近deepseek的r1非常爆火, 趁坐车的几个小时读了下论文, 简单写一写.

报告也就20多页, DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning

主要就是几点内容吧:

主要思路

  1. 模型的推理能力可以通过纯粹的强化学习完成增强.
  2. 解决了推理问题, 那输出不可读、用户不友好、思维链不清晰、通用能力弱这些应该如何解决?

强化学习部分(deepseek-r1-zero)

第一个问题是通过RL的奖励来做到的.

deepseek的奖励建模基于两个部分:

  1. 准确性奖励: 我们不关注过程, 只针对推理的最终结果做准确性奖励
  2. 格式奖励: 模型的输出应该遵守规则, 即思考部分应该放在think的tag里面.

以deepseek-v3作为base, 以GRPO为框架, 搭配上面的奖励规则, 大规模使用强化学习, 我们就可以得到deepseek-r1-zero.

有趣的是, 研究发现, 模型在训练过程中自发性地开始反思自己, "这个地方可能不对","让我重新思考",在报告里面称这类现象为aha-moment.

这类启发式的思考估计也是为啥Sam天天画饼说AGI要来了. 从oai的o1到gemini的thinking模型再到deepseek, 思考模型的思路在数学和推理这方面确实是有用的, 区别就在于o1和gemini没开源, deepseek开源了, 国外大模型偷偷摸摸不公开研究, deepseek一步步摸着石头过河摸到路了然后告诉大家思路的可行性, 一眼看出格局.

冷启动SFT+RL+通用SFT+通用RL(deepseek-r1)

deepseek-r1-zero出现之后还是存在问题, 比如可读性差, 用户不友好, 思维链不清晰, 通用能力不够好等等. 对此, r1在zero的基础之上做了sft来弥补这些方面的不足.

整个r1的训练分为几个步骤:

  1. 构建少量长CoT数据做冷启SFT.

    • RL启动阶段的稳定性更好.
    • 做冷启之后, 模型的输出数据更加可读, 并且官方设计了结尾的摘要部分用于总结推理结果.
    • 研究发现通过添加精心设计的相关先验知识, 新的模型性能优于过去的模型.
  2. 大规模RL, 需要注意的是, 区别于zero, 这里官方发现推理过程中会存在语言不一致的问题, 所以官方这里添加了语言一致性的奖励. 这样虽然模型性能会下降, 但是输出更加有可读性.

  3. 拒绝采样和监督微调, 这阶段的sft的数据主要分为两个部分:

    • 推理数据: 通过RL训练之后模型的checkpoint做拒绝采样, 筛选推理prompt并生成推理轨迹, 而不是只用前面的规则进行奖励(个人理解: 这部分开始考虑过程而不是只考虑结果准确性). 样本大概60w
    • 非推理数据: 主要是写作, 问答, 自我认知和翻译等任务, 这部分复用了deepseek-v3的sft的数据. 对非推理任务, 这里依旧要求模型输出潜在思维链(除了极其简单的对话,比如"hi"), 这里收集了20w数据
  4. 面向所有场景的RL

    • 针对推理任务: 和之前一样, 类似于deepseek-r1-zero的做法,规则奖励来指导数学和代码.
    • 针对通用任务: "对于通用数据,我们采用奖励模型来捕捉人类在复杂和微妙场景中的偏好。我们基于 DeepSeek-V3 的流程,并采用了类似的偏好对和训练提示分布。"
    • 有用性评估: 专注于最终摘要, 确保最终响应对用户是有用的, 同时要最小化对底层推理的干扰.
    • 无害性评估: 评估整个生成过程, 减轻可能出现的潜在风险,有害内容以及偏见.
    • 最终通过奖励信号和多样化的数据, 就可以训练出一个推理优秀, 且各方面有用, 且无害的大模型了.

关于蒸馏

这部分反而没啥好说的, 过去bert层面工业届实践已经知道大模型蒸小模型普遍会比小模型走一遍训练过程要好.

这里deepseek也尝试了纯RL和蒸馏deepseek-r1到qwen或者llama上, 结果表示蒸馏模型效果大幅提升, 纯RL模型表现一般.

错误的实践

程奖励模型: 存在问题

  1. 奖励粒度划分
  2. 中间步骤是否正确难以判断
  3. 奖励欺骗问题

蒙特卡罗树搜索(不太理解)

灵感来源于alphago, 将推理步骤分成一个个tag, 通过预训练的价值模型引导MCTS找到答案.

但是和国际象棋不同, token生成的搜索空间过大, 只能设置最大expand限制来解决, 但是会导致模型陷入局部最优.

结论: 不好做, 难做

题外话

simpleQA

报告里面还提到了几点, 比如deepseek-r1的中文SimpleQA打不过deepseek-v3, 这是因为设置了安全限制, 触发安全限制会导致模型拒绝回答, 如果关闭限制, 模型QA可以涨到70%.

1
2
3
然而,在中文 SimpleQA 基准测试中,DeepSeek-R1 的表现不如 DeepSeek-V3,这主要是由于其在安
全强化学习(safety RL)后倾向于拒绝回答某些查询。如果没有安全强化学习,DeepSeek-R1 的准确
率可以超过 70%

prompt

报告里面还提到了, deepseek-r1对提示词非常敏感, few-shot会持续降低其性能, 所以官方建议直接采用zero-shot准确描述进行提问.

很有意思的是之前openai的o1也被诟病这方面的问题, 越问模型越蠢, 最后气坏国外某工程师, 直接喷o1是垃圾. 后面被大家指正o1的正确使用方式是精准描述需求和使用场景, 然后提供必要信息来让模型进行思考(即o1的调用和4o不太一样, 一个注重chat一来一回, 一个要求信息完整一次回复). 只能说这方面openai也和deepseek遇到的问题不谋而合了.