DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models

核心流程

image.png

flowchart LR
    A["DeepSeek-Coder-Base"] -->|"math continued pretraining"| B["DeepSeekMath-Base"]
    B -->|"SFT"| C["DeepSeekMath-Instruct"]
    C -->|"GRPO reinforcement learning"| D["DeepSeekMath-RL"]

Math Continued Pretraining

image 1.png

Math Seed 初始化为 OpenWebMath 的 50 万条正样本;Common Crawl 里随机抽 50 万普通网页作为负样本

SFT

数据

总量是 776K 条数学 instruction tuning examples

数据格式:

格式作用
CoT(chain-of-thought)让模型用自然语言一步步推理
PoT(program-of-thought)让模型把部分推理写成程序
Tool-integrated reasoning让模型结合自然语言推理和工具/代码求解

训练细节

  • 基座:DeepSeekMath-Base 7B
  • 训练样本会随机拼接,直到接近 4K tokens 的最大上下文长度
  • 训练 500 steps。
  • batch size = 256。
  • learning rate = 5e-5,constant schedule。

GRPO。KL - 0.8 - 1.2

Missing image: Pasted image 20260430170048.png

From PPO to GRPO

PPO 是 actor-critic 结构:一边训练 policy model,一边还要训练一个 value model 来估计 advantage。

符号含义
question
policy 采样出来的完整回答
回答里的第 个 token
当前正在训练的 policy model
采样时用的 old policy
个 token 的 advantage
PPO 的 clipping 范围

PPO 里的 通常用 critic / value model 算出来。最朴素地看:

也就是:实际拿到的未来回报 减去 critic 预估的未来回报,说明这个 token 后面的结果比 critic 预期更好;,说明比预期更差。

实际 PPO 常用 GAE(Generalized Advantage Estimation)来降低方差:

这里的 来自 critic (value model)。它的架构通常不是另一个会生成文本的 decoder head,而是:

flowchart TD
    A["q + o_{≤t} tokens"] --> B["Transformer backbone"]
    B --> C["hidden state at each token"]
    C --> D["value head: hidden_dim → 1"]
    D --> E["V_ψ(q, o_{≤t})"]

也就是说,policy head 输出的是“下一个 token 的概率分布”,critic/value head 输出的是“当前位置往后预期能拿到多少 reward”的一个标量。

这里 是当前 token 位置的 TD error, 控制未来 reward 的折扣, 控制 advantage 估计在“低方差”和“低偏差”之间的折中。

PPO 的 通常依赖 value model / critic 来估计。

对 LLM RL 来说,这会带来两个麻烦:

  1. value model 通常和 policy model 差不多大,显存和计算开销很重。
  2. 数学题的 reward 往往只在最后答案处给出,但 PPO 需要每个 token 的 advantage,这会让 value function 的训练变得别扭。

GRPO 的核心动机就是:不要额外训练 value model,而是对同一个问题采样一组回答,用组内 reward 的相对高低来估计 baseline 和 advantage。

GRPO

GRPO 对每个问题 不只采样一个回答,而是从 old policy 里采样一组回答:

然后 reward model 分别给这些回答打分,再通过组内相对比较得到每个回答、每个 token 的 advantage 。GRPO 的目标函数可以写成:

其中:

这里的 importance sampling ratio, 它衡量当前 policy 相对 old policy,把这个 token 概率放大或缩小了多少。

在 outcome supervision GRPO 里,每个回答 只有一个最终 reward score 。GRPO 用同一组回答的 reward 做归一化,得到相对 advantage:

其中 。注意这里 无关,所以同一个回答 里的所有 token 都被赋同一个 advantage。

Missing image: Pasted image 20260430171303.png

KL penalty 放在哪里

PPO 是 reward / advantage 级别 的 KL 惩罚;GRPO 是 policy model vs reference model 级别 的单独约束。

在 PPO 里,KL penalty 通常先被加进 token-level reward:

再会进入 GAE,最后影响 。也就是说,PPO 的 KL 是先改变 reward,再通过 advantage 间接影响 policy update。

GRPO 的处理更干净:advantage 只来自组内 reward 的相对高低,KL 不混进 ,而是作为单独的 regularization term 直接放进 loss:

这里的 控制 KL 约束强度: 越大,policy 越不敢偏离 reference model; 越小,policy 更新空间越大,但也更容易跑偏。这篇 DeepSeekMath-RL 训练里用的 KL 系数0.04

这样做可以避免 KL penalty 把 advantage 的计算搞复杂,尤其适合 GRPO 这种本来就想用组内相对 reward 来替代 critic 的设计。

Towards to a Unified Paradigm

论文后面把 SFT、RFT、DPO、PPO、GRPO 放到一个统一视角里看:这些方法本质上都在决定 哪些 token 应该被提高概率、哪些 token 应该被降低概率,以及力度有多大

统一写法大概是:

这里最核心的是两部分:

表示:如果我要提高当前 token 的概率,参数应该往哪个方向动。

表示:算法 给这个 token 的更新系数,也就是这一步应该多强地强化或惩罚。

直觉上:

含义
提高这个 token 的概率
降低这个 token 的概率
不更新这个 token
绝对值越大更新力度越强

所以这条公式可以读成:

先看当前 token 的 log-prob 梯度方向,再乘上该算法定义的 gradient coefficient。然后对一个回答里的所有 token 求平均,再对数据分布 取期望,得到这个训练方法的总体更新方向。

这个统一范式里有三个关键组件:

组件作用
Data Source 训练样本从哪里来,比如人工 SFT 数据、SFT model 采样、当前 policy 在线采样
Reward Function 奖励信号从哪里来,比如规则判断、reward model、preference signal
Algorithm / 怎么把 reward signal 转成 token-level 的更新系数

这样看,SFT / RFT / PPO / GRPO 的差别是:

  • 数据从哪里来?
  • reward / 监督信号是谁给的?
  • 每个 token 的 gradient coefficient 怎么算?

几种方法:

方法数据来源监督 / reward 信号更新方式
SFT人工筛选好的 instruction tuning 数据 无额外 reward,默认示范答案是好的所有 token 都按
RFT对 SFT 题目,用 SFT model 采样回答Rule:按最终答案对错过滤只保留正确回答继续 SFT
DPO对 SFT 题目,用 SFT model 采样成对回答 Rule / preference:区分 preferred 和 rejected用 pair-wise DPO loss 拉开好坏回答概率
Online RFT对 SFT 题目,用当前 policy 实时采样回答Rule:按最终答案对错过滤在线保留正确回答继续训练当前 policy
PPO / GRPO对 SFT 题目,用当前 policy 实时采样回答Reward model 打分根据 reward 转成 gradient coefficient,强化好回答、惩罚差回答

Missing image: Pasted image 20260430192820.png

Missing image: Pasted image 20260430192717.png