最近在Hugging Face上看到Luca Massaron分享的一个有趣项目:使用GRPO(Group Relative Policy Optimization)方法对Gemma 2 2B-IT模型进行数学推理能力的强化学习训练。作为一个长期关注小语言模型(SLM)应用的从业者,这种通过强化学习"引导"模型展现潜在能力的方法让我眼前一亮。
Gemma 2是Google推出的开源轻量级语言模型系列,其中2B参数版本特别适合在消费级硬件上运行。但小模型在复杂推理任务上的表现往往不尽如人意。这个项目通过GRPO方法,仅用GSM8K数学题数据集进行训练,就将模型的准确率从32.9%提升到了57.3%,效果令人印象深刻。
GRPO是一种基于组的相对策略优化方法,源自DeepSeek团队的研究。与传统的PPO(Proximal Policy Optimization)不同,GRPO的创新点在于:
具体流程分为五个关键步骤:
相比传统RLHF方法,GRPO有几个显著优势:
特别值得注意的是,GRPO能够发掘模型"已有但不常表现"的能力。就像实验中观察到的,Gemma 2B其实具备解决GSM8K问题的潜力,只是需要适当的激励来更频繁地展现这种能力。
实验在一台配备NVIDIA RTX 3090(24GB显存)的工作站上进行,关键配置:
提示:对于想复现实验的读者,Google Colab Pro的A100实例也能满足需求,但需要适当调整batch size。
主要使用了以下Python库:
bash复制uv pip install vllm trl transformers datasets flash-attn
特别说明几个核心组件的作用:
使用GSM8K数据集,包含约7.5K训练样本和1.3K测试样本。每个样本格式如下:
python复制{
"question": "Natalia sold clips to 48 friends...",
"answer": "Natalia sold 48/2 = <<48/2=24>>24 clips... #### 72"
}
预处理时,我们将问题和答案转换为特定提示格式:
code复制A conversation between User and Assistant...
<reasoning>{step-by-step thinking}</reasoning>
<answer>{final number}</answer>
采用LoRA(Low-Rank Adaptation)进行参数高效微调:
python复制peft_config = LoraConfig(
lora_alpha=64,
r=64, # 相对较高的秩,增强表达能力
target_modules=[
"q_proj", "k_proj", "v_proj",
"o_proj", "gate_proj", "up_proj", "down_proj"
],
bias="none",
task_type="CAUSAL_LM"
)
这里选择全部7类投影矩阵进行适配,确保能影响模型的所有关键部分。r=64的设定比常规值(8-32)更高,是为了给小型模型提供足够的适应能力。
核心训练配置如下:
python复制training_args = GRPOConfig(
use_vllm=True,
learning_rate=1e-5,
beta=0.005, # KL散度系数
num_generations=4, # 每组生成4个响应
temperature=0.5, # 平衡探索与利用
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
max_grad_norm=0.1 # 保守的梯度裁剪
)
关键参数选择考量:
定义了两个奖励函数,总分为3分:
python复制def format_reward_func(completions):
pattern = r"^<reasoning>[\s\S]*?<\/reasoning>\s*<answer>[\s\S]*?<\/answer>$"
return [1.0 if re.match(pattern, r) else 0.0 for r in responses]
python复制def correctness_reward_func(completions, answers):
extracted = [extract_last_xml_answer(r) for r in responses]
return [2.0 if ex == ans else 0.0 for ex, ans in zip(extracted, answers)]
这种设计强调正确推理过程的重要性,而不仅仅是最终答案。
通过TensorBoard可以清晰看到训练过程中的关键指标变化:
KL散度:
奖励曲线:
梯度范数:
在约1000步时观察到明显的"顿悟时刻":
这表明模型开始更详细地展示推理步骤,而不只是直接给出答案。
| 指标 | 原始模型 | GRPO训练后 |
|---|---|---|
| 格式正确率 | 48.0% | 29.1% |
| 答案正确率 | 32.9% | 57.3% |
| 响应平均长度 | 128 | 197 |
看似格式正确率下降,实则是因为:
原始模型响应:
code复制48 / 2 = 24. Total is 72.
训练后响应:
code复制<reasoning>
1. April sales: 48 clips
2. May sales: 48 / 2 = 24 clips
3. Total: 48 + 24 = 72 clips
</reasoning>
<answer>72</answer>
明显看到训练后的模型更遵循推理过程,尽管偶尔会出现标签重复的小问题。
温度参数:
LoRA秩选择:
显存不足:
训练不稳定:
奖励不增长:
这种GRPO方法不仅适用于数学推理,还可以应用于:
特别是在小模型场景下,GRPO提供了一种高效的能力引导方式,不需要庞大的奖励模型或海量训练数据。
这个项目最让我惊讶的是,即使是2B参数的小模型,通过适当的强化学习方法,也能展现出超出预期的推理能力。在实际操作中,有三点特别值得注意:
对于想尝试类似项目的朋友,建议从Google Colab的免费T4实例开始,适当减小LoRA秩和batch size,虽然训练时间会延长,但可以低成本验证想法。