GRPO 是一种在线学习算法,这意味着它通过在训练期间使用受训模型自身生成的数据来迭代改进。GRPO 目标背后的直觉是最大化生成补全的优势,同时确保模型保持接近参考策略。
GRPO 的四个主要步骤:生成补全、计算优势、估计 KL 散度和计算损失。
与传统的RL方法不同,后者通常依赖外部评估者(批评者)来引导学习,GRPO通过评估一组响应之间的相对关系来优化模型。这种方法提高了训练效率,使GRPO在需要复杂问题解决和长链思维的推理任务中表现尤为出色。
步骤分解
步骤1:选择查询
• 从训练数据集$ P(Q) $中选择一个查询$ (q) $。
• 示例:假设查询是“8 + 5的和是多少?”
步骤2:生成一组响应
• 模型针对该查询生成一组$ G $个响应。
• 示例:模型生成以下响应:
• o1:“答案是13。”
• o2:“十三。”
• o3:“是12。”
• o4:“和是13。”
步骤3:计算每个响应的奖励
• 什么是奖励?奖励通过量化响应的质量来引导模型的学习。
• GRPO中的奖励类型:
• 准确性奖励:基于响应的正确性(例如,解答数学题)。
• 格式奖励:确保响应符合结构化要求(例如,推理过程需要包含在标签中)。
• 语言一致性奖励:惩罚语言混杂或格式不一致的响应。
• 根据每个响应的好坏,赋予一个奖励($ r_i $)。
例如,奖励可能取决于:
• 准确性:答案是否正确?
• 格式:响应是否结构良好?
示例:
• r1 = 1.0(正确且格式良好)
• r2 = 0.9(正确但较不正式)
• r3 = 0.0(错误答案)
• r4 = 1.0(正确且格式良好)
步骤4:比较响应(群体优势)
• 计算每个响应相对于群体的优势$ (A_i) $,paper中相关术语如下:
用简单的方式理解,就是这样:
• 比较结果优于群体平均水平的响应会获得正分,而表现较差的响应会得到负分。
• 这种方式在群体内部激发竞争,推动模型生成更好的响应。
步骤5:使用裁剪更新策略
示例:如果新策略开始给o1分配过高的概率,裁剪机制确保不会过度强调这个响应。
这种方式保证了即使在像推理这样复杂的任务中,策略优化也能保持稳定和可靠。
步骤6:通过KL散度惩罚偏差
GRPO实现
Open R1
在Open R1的复现路径中
实现了基于GRPO算法的训练,脚本如下
ACCELERATE_LOG_LEVEL=info accelerate launch --config_file recipes/accelerate_configs/zero3.yaml --num_processes=7 src/open_r1/grpo.py --config recipes/qwen/Qwen2.5-1.5B-Instruct/grpo/confg_full.yaml
confg_full.yaml
# 基座模型
model_name_or_path: deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
model_revision: main
torch_dtype: bfloat16
# 训练数据集
dataset_name: AI-MO/NuminaMath-TIR
dataset_configs:
- all
# Num processes is less by 1 as vLLM is using 1 GP