GRPO 为什么不用价值网络,却能训出推理模型
2026/9/14 0:54:38 网站建设 项目流程

GRPO 为什么不用价值网络,却能训出推理模型

同一道题让模型多答几遍,谁好谁坏自己就浮出来了——GRPO 靠这个朴素想法,把 PPO 的价值网络整个省掉。

一、背景与痛点

想让大模型真正学会解数学题、写对代码,光靠监督微调常常不够,还得用强化学习(RL)拿"答案对不对"这个信号去打磨它的推理链。业界最成熟的在线做法是 PPO,可 PPO 的显存账单很吓人:策略模型、参考模型、奖励模型、价值网络,四个模型得同时待在显存里。其中价值网络几乎和策略同量级,等于凭空多养一个同样大的网络,在十几亿甚至上百亿参数上,这笔开销常常直接压垮单机训练。另一条路 DPO 倒是甩掉了奖励模型,但它是离线的,训练数据覆盖不到的地方它没法主动去试,探索能力天生受限。矛盾就摆在这里:既想要在线 RL 的探索能力,又想把价值网络这笔开销省掉。GRPO 给出的答案很巧妙——基线根本不必"学",让同一道题的多个回答互相比较就足够了。

二、核心原理

要弄清 GRPO 省掉了什么,得先回到 PPO 的优势估计。优势A t = G t − V ( s t ) A_t=G_t-V(s_t)At=GtV(st)里的V VV是基线,作用是把"回报绝对值"这个干扰项扣掉,只留下"这一步比平均好多少"的信号,从而降低梯度方差。关键结论是:只要基线b bb与动作无关,它就不改变策略梯度的期望:

E [ ( G − b ) ∇ θ log ⁡ π θ ( a ) ] = E [ G ∇ θ log ⁡ π θ ( a ) ] . \mathbb{E}\big[(G-b)\nabla_\theta\log\pi_\theta(a)\big]=\mathbb{E}\big[G\nabla_\theta\log\pi_\theta(a)\big].E[(Gb)θlogπθ(a)]=E[Gθlogπθ(a)].

既然任何与动作无关的量都能当基线,那又何必花钱学一个价值网络?

GRPO 的做法是"群体采样"。对同一个 promptx xx,用当前策略采样一组G GG个回答{ y 1 , … , y G } \{y_1,\dots,y_G\}{y1,,yG},每个回答拿到奖励r i = r ( x , y i ) r_i=r(x,y_i)ri=r(x,yi)——奖励既可以来自奖励模型,也可以来自确定性的答案校验器。然后计算组内均值与标准差:

r ˉ = 1 G ∑ i = 1 G r i , s = 1 G ∑ i = 1 G ( r i − r ˉ ) 2 . \bar r=\frac{1}{G}\sum_{i=1}^{G}r_i,\qquad s=\sqrt{\frac{1}{G}\sum_{i=1}^{G}(r_i-\bar r)^2}.rˉ=G1i=1Gri,s=G1i=1G(rirˉ)2.

G GG个回答共享同一个 prompt、同一份难度,它们之间的差异恰好把"题目难易"这个混杂因素剥离掉了,留下的就是"这条回答本事的相对高低"。于是优势直接定义为组内标准化:

A ^ i = r i − r ˉ s + ε . \hat A_i=\frac{r_i-\bar r}{s+\varepsilon}.A^i=s+εrirˉ.

分母的标准化不能省:不同题目的奖励尺度可能相差一个数量级,不归一化时梯度会被高方差题目主导;除以标准差后,每道题贡献的梯度尺度大致相当,训练更稳。对语言模型,这条序列级的A ^ i \hat A_iA^i会广播到该回答的每个 token 上;正因为同一条回答内所有 token 共享同一个优势,逐 token 的价值估计就不需要了,价值网络和 GAE 被整体拿掉。

GRPO 的优化目标沿用 PPO 的裁剪外壳,只把优势换成组内标准化的A ^ i \hat A_iA^i,末尾再加一项相对参考模型的 KL 惩罚:

J G R P O ( θ ) = E [ 1 G ∑ i = 1 G 1 ∣ y i ∣ ∑ t = 1 ∣ y i ∣ min ⁡ ( ρ i , t A ^ i , c l i p ( ρ i , t , 1 − ϵ , 1 + ϵ ) A ^ i ) − β D K L ( π θ ∥ π r e f ) ] , \mathcal J_{\mathrm{GRPO}}(\theta)=\mathbb{E}\Big[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|y_i|}\sum_{t=1}^{|y_i|}\min\big(\rho_{i,t}\hat A_i,\ \mathrm{clip}(\rho_{i,t},1-\epsilon,1+\epsilon)\hat A_i\big)-\beta D_{\mathrm{KL}}\big(\pi_\theta\|\pi_{\mathrm{ref}}\big)\Big],JGRPO(θ)=E[G1i=1Gyi1t=1yimin(ρi,tA^i,clip(ρi,t,1ϵ,1+ϵ)A^i)βDKL(πθπref)],

其中ρ i , t = π θ ( y i , t ∣ ⋅ ) / π θ o l d ( y i , t ∣ ⋅ ) \rho_{i,t}=\pi_\theta(y_{i,t}\mid\cdot)/\pi_{\theta_{\mathrm{old}}}(y_{i,t}\mid\cdot)ρi,t=πθ(yi,t)/πθold(yi,t)是 token 级重要性比率。裁剪项保证单步更新不会过猛,KL 项把策略拴在参考模型附近,防止它为了刷奖励跑出可信分布。把它和 PPO 并排看:PPO 四个模型、要训练价值网络、优势逐 token 估计;GRPO 三个模型、无价值网络、优势整组估计——显存与工程复杂度显著下降,在线探索能力却被完整保留。这正是它撑起推理模型训练的底气。

三、代码实战

下面这段 numpy 代码在一个玩具"序列目标匹配"任务上,手写 GRPO 并与两种 REINFORCE 基线对照。任务里 6 个 prompt 各对应一条长度 8 的 0/1 目标串,策略逐位输出 0/1,奖励就是与目标串匹配的位数占比——一个确定性、可验证、无需奖励模型的信号,正是 GRPO 最擅长的情形。

# -*- coding: utf-8 -*-# 第070期配套:numpy 手写 GRPO——去掉价值网络,用组内标准化做优势importnumpyasnp rng=np.random.default_rng(3)defsigmoid(z):return1.0/(1.0+np.exp(-z))# 1) 玩具可验证任务:6 个 prompt,各对应一条长度 8 的 0/1 目标串N_PROMPT,L=6,8TARGETS=rng.integers(0,2,size=(N_PROMPT,L))defreward(seqs,pid):# 确定性校验器:匹配位数占比returnnp.mean(seqs==TARGETS[pid][None,:],axis=1)# 2) 策略:以 prompt 为条件的逐位 Bernoulli 表classPolicy:def__init__(self):self.theta=np.zeros((N_PROMPT,L,2))# (prompt, 位置, {0,1})defprobs(self,pid):p1=sigmoid(self.theta[pid,:,1]-self.theta[pid,:,0])returnnp.stack([1.0-p1,p1],axis=1)defsample(self,pid,G):p=self.probs(pid)return(rng.random((G,L))<p[:,1][None,:]).astype(int)defgrad_logp(self,pid,seqs,adv):p=self.probs(pid)g=np.zeros((L,2))forcin(0,1):oh=(seqs==c).astype(float)g[:,c]=np.mean((oh-p[:,c][None,:])*adv[:,None],axis=0)returng# 3) 三种优势估计——差别只有一行defadv_none(r):returnr# 无基线defadv_mean(r):returnr-r.mean()# 批内均值基线defadv_grpo(r):return(r-r.mean())/(r.std()+1e-8)# 组内标准化(主角)# 4) 训练并对照G,LR,ITERS=16,0.8,900forname,fnin{"无基线":adv_none,"均值基线":adv_mean,"GRPO":adv_grpo}.items():pol=Policy();succ=[]for_inrange(ITERS):pid=int(rng.integers(0,N_PROMPT))seqs=pol.sample(pid,G)r=reward(seqs,pid)pol.theta[pid]+=LR*pol.grad_logp(pid,seqs,fn(r))succ.append(float(np.mean(r==1.0)))print("%-6s 末段完全匹配率 = %.3f"%(name,np.mean(succ[-60:])))print("GRPO prompt#0 输出1概率:",np.round(pol.probs(0)[:,1],2))

运行结果:

无基线 末段完全匹配率 = 0.695 均值基线 末段完全匹配率 = 0.675 GRPO 末段完全匹配率 = 0.986 GRPO prompt#0 输出1概率: [1. 0. 0. 0. 0. 1. 1. 1.]

三个版本的差别只有优势函数那一行,其余超参完全一致。无基线与均值基线都卡在 0.68 附近打转,而 GRPO 一路爬到 0.986,几乎能精确复现目标串(输出 1 的概率逼近 0/1 二值)。这既是"基线降方差"的教科书证据,也说明组内标准化对可验证任务格外有效。

四、关键经验与避坑

  1. 组大小G GG是核心效率旋钮。G GG太小,均值和标准差不稳、优势噪声大;G GG太大,采样成本线性上涨。实践中常在 8~64 之间取值,并随任务难度调整。
  2. 组内奖励几乎全相同时标准化会失效。当一道题对当前策略"全对"或"全错"时s → 0 s\to0s0,优势反被噪声放大。对策是保留s + ε s+\varepsilons+ε下界,并直接过滤这类退化的组。
  3. 是否除以标准差要斟酌。有工作指出纯除以s ss会系统性抬高难题的梯度,改为只减均值更稳。任务难度差异极大时,值得把两种变体都试一遍。
  4. 优势在回答内广播时注意长度归一化。整条回答共享一个优势,长回答会累积更多梯度,是否按 token 数平均对稳定性影响很大。
  5. KL 惩罚仍是必须的缰绳。GRPO 保留了相对参考模型的 KL 项,防止策略在奖励上钻空子、跑出可信分布。
  6. 验证器越确定,GRPO 越香;同时盯住组内奖励分布。奖励来自确定性校验器时,组内对比几乎不受奖励模型噪声干扰;训练时除了平均奖励,还应观察组内方差与"全对组/全错组"的比例。

五、完整系列推荐

📚 本文选自《强化学习详解》100 期系统教程(第 070 期:GRPO 群体相对策略优化),每期配可运行 Python 代码。

完整系列(100 期正文 + 3 篇番外,每期文章+代码)已在 ima 知识号【Kruptos】持续更新:

  • 🗂 69+ 技术知识库:强化学习、计算机视觉、推荐系统、大模型微调、操作系统、AI Agent……几乎覆盖全部软硬件技术栈
  • 🧠 8 款 AI 技能:系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等,已在 ima 技能广场上架,即装即用
  • ✅ 全部免费订阅,后续更新自动推送

🔍 订阅方式:打开 ima(腾讯智能工作台)→ 搜索「Kruptos」→ 一键订阅;或在 ima 内直接搜索《强化学习详解》。


作者:Kruptos(西电毕业,13 年无线通信/DSP/嵌入式科研,现深耕 AI 与云原生)
原创内容,转载注明出处。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询