【强化学习】深度解析 GRPO:从原理到实践的全攻略

【强化学习】深度解析 GRPO:从原理到实践的全攻略

文章目录

一、提出背景

GRPO(Group Relative Policy Optimization,群组相对策略优化) 是一种基于强化学习的策略优化算法,旨在提升大语言模型在复杂任务(如数学推理、编程)中的表现。其提出背景主要源于传统强化学习(RL)方法在大语言模型(LLM)训练中的局限性,特别是在计算效率、训练稳定性和资源消耗方面的挑战。

  • 高计算成本:传统的PPO(Proximal Policy Optimization)需要同时训练策略模型(Actor)和价值函数模型(Critic),导致显存占用和计算开销翻倍,尤其在大模型场景下资源消耗巨大。
  • 训练复杂性:PPO依赖价值网络估计优势函数(Advantage),而奖励模型通常仅对完整序列打分,导致token级奖励信号不匹配,影响训练稳定性。
  • 样本效率低:PPO需频繁采样新数据,训练过程耗时且对超参数敏感。

GRPO最初在 DeepSeekMath 中提出,用于提升模型在开放域数学问题上的推理能力,后扩展至 DeepSeek-R1 等通用推理模型。结合LoRA(低秩适配)技术,GRPO可在消费级GPU上微调小模型,降低了RLHF门槛。

二、核心思想

GRPO(Group Relative Policy Optimization,群组相对策略优化)算法的核心思想是通过组内样本的相对比较替代传统强化学习中的绝对价值估计,从而简化训练流程、提升计算效率并保持策略优化的稳定性。

2.1 组内相对奖励

  • 多响应生成:对同一输入提示(prompt),并行生成多个响应(即一个“组”),形成组内样本。
  • 相对优势计算:通过组内样本的奖励值(由奖励模型或人类标注给出)的归一化比较计算每个响应的相对优势,替代传统PPO中依赖价值网络估计的绝对优势(Advantage)。
  • 核心公式
    相对优势 A ^ i = R i − μ R σ R + ϵ \text{相对优势} \hat{A}_i = \frac{R_i - \mu_R}{\sigma_R + \epsilon} 相对优势A^i​=σR​+ϵRi​−μR​​
    其中 R i R_i Ri​ 为第 i i i 个响应的奖励, μ R \mu_R μR​ 和 σ R \sigma_R σR​ 分别为组内奖励的均值和标准差, ϵ \epsilon ϵ 为平滑项。

2.2 去价值网络设计

  • 消除Critic模型(Critic-free):传统PPO需要额外训练价值网络(Critic)来估计状态值函数,而GRPO直接利用组内奖励的统计特性(如均值和方差)计算相对优势,省去Critic的显存和计算开销。
  • 显存优化:仅需维护策略模型(Actor)和参考模型(Reference Model),降低显存占用。

2.3 稳定优化机制

  • KL散度惩罚:约束策略模型与参考模型的输出分布差异,防止过度偏离初始策略:
    L KL = β ⋅ KL ( π θ ∥ π ref ) \mathcal{L}_{\text{KL}} = \beta \cdot \text{KL}(\pi_\theta \| \pi_{\text{ref}}) LKL​=β⋅KL(πθ​∥πref​)
  • 策略裁剪(Clipping):类似PPO,对策略更新的幅度进行裁剪,确保训练稳定性:
    L clip = min ⁡ ( π θ ( a ∣ s ) π old ( a ∣ s ) A ^ i , clip ( π θ ( a ∣ s ) π old ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A ^ i ) \mathcal{L}_{\text{clip}} = \min\left( \frac{\pi_\theta(a|s)}{\pi_{\text{old}}(a|s)} \hat{A}_i, \text{clip}\left(\frac{\pi_\theta(a|s)}{\pi_{\text{old}}(a|s)}, 1-\epsilon, 1+\epsilon\right) \hat{A}_i \right) Lclip​=min(πold​(a∣s)πθ​(a∣s)​A^i​,clip(πold​(a∣s)πθ​(a∣s)​,1−ϵ,1+ϵ)A^i​)
  • 归一化优势:组内奖励的标准化处理减少了极端值的影响,使梯度更新更平滑。

2.4 PPO vs GRPO

在这里插入图片描述

PPO
近端策略优化 (Proximal Policy Optimization, PPO) 是一种 Actor-Critic (行动者-评论家) 强化学习算法,通过最大化以下目标函数来优化 LLM:
J PPO ( θ ) = E [ q ∼ P ( Q ) , o ∼ π θ old ( O ∣ q ) ] 1 ∣ o ∣ ∑ t = 1 ∣ o ∣ min ⁡ [ π θ ( o t ∣ q , o < t ) π θ old ( o t ∣ q , o < t ) A t , clip ( π θ ( o t ∣ q , o < t ) π θ old ( o t ∣ q , o < t ) , 1 − ϵ , 1 + ϵ ) A t ] \mathcal{J}_{\text{PPO}}(\theta) = \mathbb{E}[q \sim P(Q), o \sim \pi_{\theta_{\text{old}}}(O|q)] \frac{1}{|o|} \sum_{t=1}^{|o|} \min \left[ \frac{\pi_\theta(o_t|q, o_{<t})}{\pi_{\theta_{\text{old}}}(o_t|q, o_{<t})} A_t, \text{clip} \left( \frac{\pi_\theta(o_t|q, o_{<t})}{\pi_{\theta_{\text{old}}}(o_t|q, o_{<t})}, 1-\epsilon, 1+\epsilon \right) A_t \right] JPPO​(θ)=E[q∼P(Q),o∼πθold​​(O∣q)]∣o∣1​t=1∑∣o∣​min[πθold​​(ot​∣q,o<t​)πθ​(ot​∣q,o<t​)​At​,clip(πθold​​(ot​∣q,o<t​)πθ​(ot​∣q,o<t​)​,1−ϵ,1+ϵ)At​]

其中, π θ \pi_\theta πθ​ 和 π θ old \pi_{\theta_{\text{old}}} πθold​​ 分别是当前和旧的策略模型, q q q 和 o o o 分别是从问题数据集和旧策略 π θ old \pi_{\theta_{\text{old}}} πθold​​ 中采样的问题和输出。 ε \varepsilon ε 是 PPO 中引入的用于稳定训练的 clipping(裁剪)相关超参数。 A t A_t At​ 是优势函数(Advantage),它通过应用广义优势估计(GAE)计算得出。

GRPO
GRPO 放弃了价值模型,转而从分组得分中估计基线,从而显著减少了训练资源。对于每个问题 q q q,GRPO 从旧策略 π θ old \pi_{\theta_{\text{old}}} πθold​​ 中采样一组输出 { o 1 , o 2 , ⋯ , o G } \{o_1, o_2, \cdots, o_G\} {o1​,o2​,⋯,oG​},然后通过最大化以下目标函数来优化策略模型:
J GRPO ( θ ) = E [ q ∼ P ( Q ) , { o i } i = 1 G ∼ π θ old ( O ∣ q ) ] 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ { min ⁡ [ π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) A ^ i , t , clip ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) , 1 − ϵ , 1 + ϵ ) A ^ i , t ] − β D K L [ π θ ∥ π ref ] } \mathcal{J}_{\text{GRPO}}(\theta) = \mathbb{E}[q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{\text{old}}}(O|q)] \frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left\{ \min \left[ \frac{\pi_\theta(o_{i,t}|q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}|q, o_{i,<t})} \hat{A}_{i,t}, \text{clip} \left( \frac{\pi_\theta(o_{i,t}|q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t}|q, o_{i,<t})}, 1-\epsilon, 1+\epsilon \right) \hat{A}_{i,t} \right] - \beta D_{KL} \left[ \pi_\theta \| \pi_{\text{ref}} \right] \right\} JGRPO​(θ)=E[q∼P(Q),{oi​}i=1G​∼πθold​​(O∣q)]G1​i=1∑G​∣oi​∣1​t=1∑∣oi​∣​{min[πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​A^i,t​,clip(πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​,1−ϵ,1+ϵ)A^i,t​]−βDKL​[πθ​∥πref​]}

其中, ε \varepsilon ε 和 β \beta β 是超参数, A ^ i , t \hat{A}_{i,t} A^i,t​ 是基于仅在每个组内的输出的相对奖励计算的优势函数。

特性PPOGRPO
优势估计依赖价值网络(Critic)组内奖励归一化(无Critic)
显存占用高(需同时训练Actor+Critic)低(仅需Actor)
奖励信号Token级或序列级组内序列级相对比较
训练稳定性对超参数敏感通过归一化和KL约束更稳定
适用规模大模型需分布式训练适合单卡中等规模模型

GRPO通过 “组内相对比较”“去价值网络” 两大创新,将强化学习从依赖绝对价值估计转变为基于群体统计的排序优化,在保持PPO稳定性的同时显著降低计算成本。(这一思想也可视为对 对比学习 (Contrastive Learning)和 排序学习(Learning-to-Rank)在RLHF领域的巧妙迁移)

三、算法原理

GRPO的工作原理,可分为四个主要步骤:生成响应、计算优势值、估计KL散度、计算损失

在这里插入图片描述

3.1 生成响应(Generating completions )

对于每个问题 q q q,从旧策略模型 π θ old \pi_{\theta_{\text{old}}} πθold​​ 中采样一组输出 { o 1 , o 2 , ⋯ , o G } \{o_1, o_2, \cdots, o_G\} {o1​,o2​,⋯,oG​}。

3.2 计算优势值(Computing the advantage)

针对每组生成的响应序列,通过奖励模型计算其奖励值,生成对应的 G G G 个奖励值 r = { r 1 , r 2 , ⋯ , r G } \mathbf{r} = \{r_1, r_2, \cdots, r_G\} r={r1​,r2​,⋯,rG​}。

接着,对这些奖励进行标准化处理:

A ^ i , t = r i − mean ( r ) std ( r ) \hat{A}_{i,t} = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})} A^i,t​=std(r)ri​−mean(r)​

优势函数的作用就是计算某一个输出的token数值相对于平均输出的优劣势。如果某一个输出的奖励高于平均值,则结果是正的,反之低于平均值,结果是负的。这样策略模型会更倾向于生成那些具有较高奖励的输出。

这种基于组内相对比较的方法在组内引入竞争机制,推动模型生成更好的回答,也正是GRPO命名的由来。

3.3 估计KL散度(Estimating the KL divergence)

KL散度用于衡量当前新策略 π θ \pi_\theta πθ​和参考策略 π ref \pi_{\text{ref}} πref​之间的分布差异,目标是限制 π θ \pi_\theta πθ​和 π ref \pi_{\text{ref}} πref​偏离太远。使用Schulman等人(2020年)引入的近似器进行估计。该近似器定义如下:

D K L [ π θ ∥ π ref ] = π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − log ⁡ π ref ( o i , t ∣ q , o i , < t ) π θ ( o i , t ∣ q , o i , < t ) − 1 , D_{KL} \left[ \pi_\theta \| \pi_{\text{ref}} \right] = \frac{\pi_{\text{ref}}(o_{i,t} | q, o_{i,<t})}{\pi_\theta(o_{i,t} | q, o_{i,<t})} - \log \frac{\pi_{\text{ref}}(o_{i,t} | q, o_{i,<t})}{\pi_\theta(o_{i,t} | q, o_{i,<t})} - 1, DKL​[πθ​∥πref​]=πθ​(oi,t​∣q,oi,<t​)πref​(oi,t​∣q,oi,<t​)​−logπθ​(oi,t​∣q,oi,<t​)πref​(oi,t​∣q,oi,<t​)​−1,

3.4 计算损失(Computing the loss)

目标是在最大化优势值的同时约束模型接近参考策略,因此损失函数定义为:

L GRPO ( θ ) = − 1 G ∑ i = 1 G 1 ∣ o i ∣ ∑ t = 1 ∣ o i ∣ [ min ⁡ ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) A ^ i , t , clip ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) , 1 − ϵ , 1 + ϵ ) A ^ i , t ) ⏟ 裁剪策略梯度项 − β D KL [ π θ ∥ π ref ] ⏟ KL散度惩罚项 ] \mathcal{L}_{\text{GRPO}}(\theta) = -\frac{1}{G} \sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left[ \underbrace{\min\left( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,<t})} \hat{A}_{i,t}, \text{clip}\left( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,<t})}, 1-\epsilon, 1+\epsilon \right) \hat{A}_{i,t} \right)}_{\text{裁剪策略梯度项}} - \underbrace{\beta D_{\text{KL}} \left[ \pi_\theta \| \pi_{\text{ref}} \right]}_{\text{KL散度惩罚项}} \right] LGRPO​(θ)=−G1​i=1∑G​∣oi​∣1​t=1∑∣oi​∣​​裁剪策略梯度项min(πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​A^i,t​,clip(πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​,1−ϵ,1+ϵ)A^i,t​)​​−KL散度惩罚项βDKL​[πθ​∥πref​]​​​

公式最左边, t t t 对应token-level优势,即一个句子中,每个token对应的优势是一样的。 G G G 表示每组生成的响应数量,最终需要取平均。 ∣ o i ∣ |o_i| ∣oi​∣表示第 i i i 个响应的序列长度(Token数量), 1 ∣ o i ∣ \frac{1}{|o_i|} ∣oi​∣1​ 表示对每一个生成回答的所有的token取平均。

裁剪策略梯度项表示缩放后的优势,其中Clip函数用于限制新策略与旧策略之间的比值,通过将比值限制在 1 − ϵ , 1 + ϵ 1-\epsilon, 1+\epsilon 1−ϵ,1+ϵ之间,防止新策略相对于旧策略的数值有较大的更新变动。这种机制确保策略更新处于控制范围内,稳定性更强,收敛性更好。公式表示为:
clip ( π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) , 1 − ϵ , 1 + ϵ ) A ^ i , t \text{clip} \left( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,<t})}, 1-\epsilon, 1+\epsilon \right) \hat{A}_{i,t} clip(πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​,1−ϵ,1+ϵ)A^i,t​

KL散度惩罚项惩罚偏离参考策略的行为,确保策略更新的稳定性并保留通用推理能力。 β \beta β表示的是惩罚系数。公式表示为:
β D K L ( π θ ∥ π ref ) \beta D_{KL} \left( \pi_\theta \| \pi_{\text{ref}} \right) βDKL​(πθ​∥πref​)

  • 当 D K L D_{KL} DKL​变大时,惩罚增加,迫使策略更新更加保守,不要偏离太远。
  • 当 β \beta β变大的时候,表示在原有的优势上增加惩罚,让模型更新幅度变小,更加保守。

3.5 重要性采样*(Importance Sampling)

GRPO算法的最终的优化目标是让新策略在旧策略的样本上,尽可能多地保留高奖励的输出重要性采样是其核心机制之一,通过复用旧策略(参考策略)生成的样本来优化新策略,从而提升训练效率和样本利用率。

重要性采样的本质
重要性采样(Importance Sampling, IS)是一种通过从易采样的分布估计难采样分布的期望的方法。其核心思想是使用重要性权重来修正采样的偏差。

例如,我们想计算某个难采样分布下的期望:
E x ∼ p hard [ f ( x ) ] = ∫ f ( x ) p hard ( x ) d x \mathbb{E}_{x \sim p_{\text{hard}}}[f(x)] = \int f(x)p_{\text{hard}}(x)dx Ex∼phard​​[f(x)]=∫f(x)phard​(x)dx
那我们就可以从另一个易采样的分布进行采样,使用重要性采样估计,表示为:
E x ∼ p hard [ f ( x ) ] = E x ∼ p easy [ p hard ( x ) p easy ( x ) f ( x ) ] = ∫ f ( x ) p hard ( x ) p easy ( x ) p easy ( x ) d x \mathbb{E}_{x \sim p_{\text{hard}}}[f(x)] = \mathbb{E}_{x \sim p_{\text{easy}}}\left[\frac{p_{\text{hard}}(x)}{p_{\text{easy}}(x)} f(x)\right]=\int f(x)\frac{p_{\text{hard}}(x)}{p_{\text{easy}}(x)}p_{\text{easy}}(x)dx Ex∼phard​​[f(x)]=Ex∼peasy​​[peasy​(x)phard​(x)​f(x)]=∫f(x)peasy​(x)phard​(x)​peasy​(x)dx
其中, p hard ( x ) p easy ( x ) \frac{p_{\text{hard}}(x)}{p_{\text{easy}}(x)} peasy​(x)phard​(x)​ 就是重要性权重,用于修正分布差异。

GRPO中的重要性采样
在GRPO中,训练目标是最大化新旧策略的比值乘以Advantage的数值:
π θ ( o i , t ∣ q , o i , < t ) π θ old ( o i , t ∣ q , o i , < t ) A ^ i , t \frac{\pi_\theta(o_{i,t} | q, o_{i,<t})}{\pi_{\theta_{\text{old}}}(o_{i,t} | q, o_{i,<t})} \hat{A}_{i,t} πθold​​(oi,t​∣q,oi,<t​)πθ​(oi,t​∣q,oi,<t​)​A^i,t​

其中,新旧策略的比值 π θ π θ old \frac{\pi_\theta}{\pi_{\theta_{\text{old}}}} πθold​​πθ​​就是重要性采样中的重要性比值。GRPO通过重要性采样与裁剪机制(Clipping)结合,限制策略更新幅度,从而防止过度优化导致模型崩溃。

四、代码示例

4.1 设计奖励函数

在实际使用GRPO(Group Relative Policy Optimization)训练时,设计奖励函数的核心思路需要围绕强化学习的目标任务特性展开,同时兼顾训练稳定性计算效率。以下整理出一些关键设计原则:

  1. 核心任务导向:奖励函数必须直接反映任务的核心目标。例如:
    • 数学推理:正确答案给予最高奖励。
    • 格式要求:对符合特定结构(如 <reasoning>...</reasoning><answer>...</answer>)的响应给予额外奖励。
    • 逻辑严谨性:通过关键词(如 “sum”、“unique”)或推理长度间接评估逻辑质量。
  2. 多目标权衡
    • 若任务需要平衡多个子目标(如正确性+格式+推理深度),可通过加权求和或分层奖励实现。
  3. 稀疏 vs 稠密奖励
    • 稀疏奖励(如仅对最终答案打分)需结合组内相对比较提取有效信号。
    • 稠密奖励(如对每一步推理打分)更适合复杂任务,但需注意奖励膨胀问题。
  4. 归一化与标准化
    • 组内奖励需归一化(如Z-score)以消除不同提示(prompt)间的尺度差异。
    • 对原始奖励进行裁剪(如限制到 [-5, 5])防止极端值干扰训练。
  5. 可解释性
    • 每个奖励分项(如格式、正确性、关键词)应清晰定义,便于调试和调整权重。

以下是一个示例:

分项类型示例设计要点
正确答案奖励reward_correct_answer() 检测 \boxed{A-D} 是否匹配目标答案奖励值需显著高于其他分项(如+2.0),突出核心目标。
格式合规奖励reward_strict_format() 检查XML标签完整性分层设计(严格格式1.0分,宽松格式0.5分),引导模型遵循规范。
推理质量奖励reward_reasoning_keywords() 统计关键词命中数避免过度依赖关键词,可结合语义分析(如LLM自评)提升鲁棒性。
结构完整性奖励xmlcount_reward_func() 计算标签位置和数量对标签缺失或冗余进行惩罚(如 -0.001/多余字符),确保输出整洁。
长度适度奖励reward_reasoning_length() 根据单词数分段打分防止模型生成过长或过短的无效内容(如“短于20词无奖励”)。
import re defreward_correct_answer(responses, answers,**kwargs)->list[float]:"""根据答案的正确性给予奖励。""" pattern =r"<answer>.*?\\boxed{([A-D])}.*?</answer>" rewards =[]for resp, target inzip(responses, answers): match = re.search(pattern, resp, re.DOTALL)if match and match.group(1)== target: rewards.append(2.0)# 正确选项,高奖励else: rewards.append(0.0)# 错误或无法提取,无奖励return rewards defreward_strict_format(responses,**kwargs)->list[float]:"""奖励符合严格格式 <reasoning>...</reasoning><answer>...</answer> 的回答""" pattern =r"^<reasoning>\n.*?\n</reasoning>\n<answer>\n\\boxed{[A-D]}\n</answer>$"return[1.0if re.fullmatch(pattern, r.strip(), re.DOTALL)else0.0for r in responses]defreward_soft_format(responses,**kwargs)->list[float]:"""奖励符合宽松格式 <reasoning>...</reasoning><answer>...</answer> 的回答""" pattern =r"<reasoning>.*?</reasoning>.*?<answer>.*?[A-D].*?</answer>"return[0.5if re.search(pattern, r, re.DOTALL)else0.0for r in responses]defcount_xml(text:str)->float:"""根据 XML 标签的出现次数和位置给予分数""" score =0.0if text.count("<reasoning>\n")==1: score +=0.125if text.count("\n</reasoning>\n")==1: score +=0.125if text.count("\n</answer>")==1: score +=0.125 score -=max(0,(len(text.split("\n</answer>")[-1])-1))*0.001returnmax(0.0, score)defxmlcount_reward_func(responses,**kwargs)->list[float]:"""使用 count_xml 函数计算每个回答的分数。"""return[count_xml(r)for r in responses]defreward_reasoning_length(responses,**kwargs)->list[float]:""" 根据推理部分的长度给予奖励。 - 长度小于 20 个单词,无奖励。 - 长度在 20 到 50 个单词之间,奖励 0.25。 - 长度在 50 到 100 个单词之间,奖励 0.5。 - 长度超过 100 个单词,奖励 0.75。 """ rewards =[]for r in responses: score =0.0 match = re.search(r"<reasoning>(.*?)</reasoning>", r, re.DOTALL)if match: content = match.group(1).strip() length =len(content.split())if length <20: score +=0.0elif length <50: score +=0.25elif length <100: score +=0.5else: score +=0.75 rewards.append(max(0.0, score))return rewards defreward_reasoning_keywords(responses,**kwargs)->list[float]:""" 根据推理部分是否包含特定关键词给予奖励。 每命中一个关键词,奖励 0.1 分,上限为 0.5 分。 """ key_terms =["row","column","sum","unique","digit","no repeat","clue"] rewards =[]for r in responses: match = re.search(r"<reasoning>(.*?)</reasoning>", r, re.DOTALL)ifnot match: rewards.append(0.0)continue content = match.group(1).lower() hits =sum(1for k in key_terms if k in content) rewards.append(min(hits *0.1,0.5))# 命中多个关键词,奖励上限 0.5return rewards # 合并所有奖励函数defcombined_reward_func(prompts, completions, response,**kwargs)->list[float]: responses = completions pattern =r"^<reasoning>\n.*?\n</reasoning>\n<answer>\n\\boxed{([A-D])}\n</answer>$" answers =[re.search(pattern, answer, re.DOTALL).group(1)for answer in response] rca = reward_correct_answer(responses, answers) rstf = reward_strict_format(responses) rsof = reward_soft_format(responses) xrf = xmlcount_reward_func(responses) rrl = reward_reasoning_length(responses) rrk = reward_reasoning_keywords(responses)# 返回每个回答的总奖励return[rca[i]+ rstf[i]+ rsof[i]+ xrf[i]+ rrl[i]+ rrk[i]for i inrange(len(responses))]

4.2 GRPO训练

0. 安装trl库

git clone https://github.com/huggingface/trl.git cd trl/ pip install -e .

1. 加载训练数据和模型

from transformers import AutoModelForCausalLM, AutoTokenizer from trl import GRPOConfig, GRPOTrainer import torch from datasets import Dataset import json withopen("grpo_data.json",'r')asfile: data = json.load(file) dataset = Dataset.from_list(data) model_dir ="xxx" model = AutoModelForCausalLM.from_pretrained( model_dir, torch_dtype=torch.bfloat16, device_map="auto",) tokenizer = AutoTokenizer.from_pretrained(model_dir)

2. 配置GRPO训练参数
关键参数说明:

  • num_generations: 每个prompt生成4个候选答案(用于奖励计算)
  • max_completion_length: 生成文本最大长度(8192 tokens)
  • gradient_accumulation_steps: 4步累积梯度,模拟batch_size=4

更多参数说明详见:https://huggingface.co/docs/trl/main/en/grpo_trainer

training_args = GRPOConfig( learning_rate =5e-6, adam_beta1 =0.9, adam_beta2 =0.99, weight_decay =0.1, warmup_ratio =0.1, lr_scheduler_type ="cosine", optim ="paged_adamw_8bit", logging_steps =10, per_device_train_batch_size =1, gradient_accumulation_steps =4,# 增加到 4 以获得更平滑的训练 num_generations =4,# 如果内存不足,请减少 max_prompt_length =2048, max_completion_length =8192, num_train_epochs =1,# 设置为 1 以进行完整的训练 save_steps =200, max_grad_norm =0.1, logging_dir ="output_grpo/logs", output_dir ="output_grpo",)

3. 初始化GRPO训练器

trainer = GRPOTrainer( model = model, reward_funcs = combined_reward_func, args = training_args, train_dataset = dataset,)

4. 启动训练

trainer.train()

五、总结

GRPO(群组相对策略优化)是一种高效的大语言模型强化学习微调算法,通过组内相对比较去价值网络设计,显著降低了传统PPO的计算开销。其核心创新在于利用组内响应奖励的归一化比较替代绝对价值估计,结合KL散度惩罚和策略裁剪机制确保训练稳定性。该算法特别适合数学推理、代码生成等复杂任务,能在单卡中等规模模型上高效运行。

GRPO的优势包括计算效率高、适配人类偏好数据特性、训练过程稳定等,但也存在对组大小敏感、长序列优化等挑战。实践建议优先保证核心目标奖励权重,结合渐进式训练策略,适用于资源受限但需要高质量微调的场景,为RLHF提供了一种轻量化解决方案。

Read more

基于Java的百度地图路线规划服务开发全攻略

基于Java的百度地图路线规划服务开发全攻略

目录 前言 一、驾车路线服务简介 1、百度路线规划服务 2、驾车路线服务 3、请求参数 4、响应参数 二、UniHttp接口访问集成 1、访问接口创建 2、本地调用测试 3、响应对象初探 三、响应对象的Java封装 1、驾车路线服务响应类图 2、响应对象实现         a、公共属性类         b、驾车路线数据传输类 c、导航信息类         d、具体路线分段信息类 3、使用GSON转换实例 四、常见问题 1、坐标顺序问题 2、坐标格式问题 五、总计 前言         在当今数字化时代,地理信息系统(GIS)技术已经深入到我们生活的方方面面。无论是日常出行规划、

By Ne0inhk
Java外功基础(1)——Spring Web MVC

Java外功基础(1)——Spring Web MVC

1.前置知识 1.1 Tomcat 定义:Tomcat是一个开源的轻量级Web(Http)服务器和Servlet容器。它实现了Java Servlet等Java EE规范的核心功能,常用于部署和运行Java Web应用程序 。换言之,Tomcat就是一个严格遵循Servlet规范开发出来的、可以独立安装和运行的Java Web服务器/Servlet容器核心功能:Servlet容器:支持Servlet的执行,处理HTTP请求和响应Web服务器:提供静态资源(如HTML)的访问能力,支持基本的HTTP服务安装与版本对应: tomcat官网:Apache Tomcat®目录结构:bin:存放可执行文件,如startup.batconf:存放配置文件lib:存放Tomcat运行所需的jar文件logs:存储日志文件temp:存放临时文件,如上传的文件或缓存数据webapps:默认web应用部署目录work:服务器的工作目录,存放运行时生成的临时文件(编译文件) 1.2 Servlet 1.2.1 定义

By Ne0inhk
模仿淘宝购物系统的Java Web前端项目(开源项目)

模仿淘宝购物系统的Java Web前端项目(开源项目)

提示:此项目仅作为本博主的学习笔记记录,不作为商品售卖,资源往下翻看源码获取 文章目录 * 前言 * Web端功能设计 * 首页 * 热销商品 * 新到商品 * 商品分类 * 商品详情 * 购物车 * 添加地址 * 提交订单 * 部分代码展示 * 可能会出现的错误 * 如果拿到项目后发现图片不显示 * 源码获取 前言 提示:这里可以添加本文要记录的大概内容: 本项目要求完成Java Web的开发环境准备,以及项目开发框架的搭建 Web开发环境准备,包括eclipse、MySQL、tomcat Web项目框架搭建,涉及jsp、servlet、MVC等技术 运行网址:http://localhost:8080/eshop0/index.action 提示:以下是本篇文章正文内容,下面案例可供参考 Web端功能设计 首页 热销商品 新到商品 商品分类 商品详情 ![在这里

By Ne0inhk
一文读懂 Skills:什么是 Skills?如何使用?以及如何用 Skill 生成一个 Java 方法

一文读懂 Skills:什么是 Skills?如何使用?以及如何用 Skill 生成一个 Java 方法

一、什么是 Skills? 在 AI 与智能编程工具中,Skill(技能) 可以理解为: 对某一类任务的“能力封装”或“可复用指令单元” 它不是一次性的 Prompt,而是经过抽象、总结、可以**反复使用 **的能力描述。 用一句话解释 Skill * Prompt:一次性提问 * Skill:可以反复调用的“能力模板” 例如: * 生成一个 Java Getter 方法 * 根据接口文档生成 Controller 代码 * 把自然语言需求转换成 SQL * 为已有方法补充 Javadoc 注释 这些都可以被定义为一个 Skill。 二、为什么要使用 Skills? 在实际开发中,常见问题包括: * 每次都要重新描述需求 * AI 输出风格不统一

By Ne0inhk