后训练(Post-Training)对于大型语言模型(LLM)至关重要,它弥合了通用能力与特定任务卓越性之间的差距。本文将深入探讨一种新兴的后训练方法——Group Relative Policy Optimization (GRPO),并以一个 Wordle 智能体的强化学习案例,阐释 GRPO 在优化策略、提升性能方面的独特优势。不同于传统的监督微调 (SFT) 和基于人类反馈的强化学习 (RLHF),GRPO 提供了一种稳定、无需评论家的途径,通过奖励信号直接优化语言模型,尤其是在需要可验证推理或思维链 (CoT) 的任务中,表现出卓越的性能。
后训练策略:SFT、RLHF 与 RFT
在探讨 GRPO 之前,我们需要了解几种主流的后训练策略:监督微调 (SFT),基于人类反馈的强化学习 (RLHF),以及强化微调 (RFT)。SFT 是最直接的方法,利用带有标记示例的精选数据集对模型进行微调。例如,如果我们想要训练一个能够识别垃圾邮件的LLM,就可以使用大量标记好的邮件数据,其中每封邮件都被标记为“垃圾邮件”或“非垃圾邮件”。LLM 通过学习这些标记数据的模式来提高识别垃圾邮件的准确性。
RLHF 则更复杂,它使用基于人类偏好数据训练的奖励模型来指导策略优化,通常通过近端策略优化 (PPO) 实现。想象一下,你想要训练一个能够生成流畅对话的聊天机器人。你可以让人类评估聊天机器人生成的不同回复,并给出偏好评分。然后,你可以使用这些评分来训练一个奖励模型,该模型可以预测人类对聊天机器人回复的满意程度。PPO 算法会利用这个奖励模型来调整聊天机器人的策略,使其生成更受人类欢迎的回复。
RFT 同样依赖奖励模型,但它简化了流程,无需 PPO 的复杂性,而是基于奖励信号直接优化模型的输出。这使得 RFT 对于那些希望在没有传统强化学习全部开销的情况下进行对齐的企业更具吸引力。一个例子是训练一个自动完成数学题的LLM,可以编写一个程序化的函数来验证LLM的答案是否正确。如果答案正确,则给LLM提供高奖励,如果答案错误,则提供低奖励。通过反复训练,LLM可以学会生成更准确的数学答案。
选择 SFT、RFT 还是 RLHF 取决于数据的性质和任务。如果有大量真实数据,SFT 通常是最有效且实用的选择。如果数据集很小,但任务受益于结构化推理(如 CoT 提示),RFT 可以通过直接优化特定任务的奖励来实现更好的泛化。对于代码正确性或数学答案等可验证的任务,即使没有标记数据,也可以通过定义编程奖励函数来使用 RFT。对于诸如有用性或语气等不可验证或主观的任务,RLHF 成为必不可少的,它利用人类偏好来指导模型行为。
GRPO 的独特之处:无需评论家与群体基线
Group Relative Policy Optimization (GRPO) 是一种强化学习方法,旨在提高模型训练的效率和稳定性,特别适用于需要可验证推理或 CoT 的任务。与 PPO 等方法不同,GRPO 放弃了值函数(评论家),从而减少了内存和计算开销。
GRPO 的独特之处在于其群体基线:对于每个提示,模型生成一组响应(“群体”),对它们进行评分,并使用群体平均奖励来计算相对优势。这降低了方差,并通过比较同一群体内的响应来强制执行更平滑的策略转变,通常集成 KL 惩罚以实现一致性杠杆作用。
例如,假设我们有一个关于“如何制作一杯完美的咖啡”的提示。一个传统的强化学习方法可能会让模型生成一个关于如何制作咖啡的段落,然后使用一个奖励模型来评估这个段落的质量。但是,GRPO 方法会让模型生成多个关于如何制作咖啡的段落(例如,五个),然后对这些段落进行评分,并计算平均奖励。然后,GRPO 会使用这个平均奖励来确定哪些段落比平均水平更好,以及哪些段落比平均水平更差。通过这种方式,GRPO 可以更准确地评估每个段落的质量,并更有效地训练模型。
GRPO 的双模型架构:稳定保守的策略改进
GRPO 的一个特点是其双模型架构,这是一种确保训练期间策略改进稳定和保守的策略。
- 参考模型:这是在整个训练过程中保持冻结的基础 LLM。它作为评估当前输出好坏的基线。
- 策略模型:它与参考模型完全相同,但包括一个 LoRA 适配器,这是一个轻量级的、可训练的组件。在 GRPO 训练期间,仅更新 LoRA 参数,从而可以进行高效的微调,同时保持基础模型的大部分行为。
这种设置使优化过程保持稳定,避免了与原始模型的剧烈偏离。例如,假设我们想要训练一个能够生成诗歌的 LLM。我们可以使用一个预训练的 LLM 作为参考模型,然后使用一个 LoRA 适配器来微调 LLM 的诗歌生成能力。在训练过程中,我们只会更新 LoRA 适配器的参数,而保持参考模型的参数不变。这可以确保 LLM 在训练过程中不会忘记它已经学到的其他技能,并且可以更稳定地生成诗歌。
GRPO 损失函数:奖励高优势完成
GRPO 损失函数旨在加强模型输出,这些输出优于平均水平,通过比较两个模型的行为来衡量,这两个模型分别是:一个冻结的参考模型 (π_ref) 和一个通过 LoRA 在训练期间更新的策略模型 (π_θ)。
核心机制分解:
-
对数概率差:对于给定的提示 x 和生成的输出 y,两个模型都计算完成的对数概率:
- 来自策略模型的 log π_θ(y | x)
- 来自参考模型的 log π_ref(y | x)。
差值给出对数比率:log_ratio = log π_θ(y | x) – log π_ref(y | x)。
-
概率比率(重要性权重):将此对数比率取幂会产生策略模型相对于参考模型的相对概率:ratio = exp(log_ratio) = π_θ(y | x) / π_ref(y | x)。
-
优势加权缩放:每个输出 y 都与一个优势分数 A(x, y) 相关联,该分数基于它与来自同一提示 x 的其他完成相比的表现。该示例的核心损失贡献是:loss(y) = – ratio * A(x, y)。
- 如果 A(x, y) 为正(即,优于平均水平),则鼓励模型增加 y 的概率。
- 如果 A(x, y) 为负,则不鼓励模型再次生成 y。
-
Token 级别聚合:由于完成是 token 序列,因此最终损失仅在生成的部分(而不是提示)上平均每个 token 的损失。设 M 为完成 token 上的掩码:total_loss = sum_t [ -ratio_t * A_t * M_t ] / sum_t [M_t]。
这确保仅使用模型生成的 token 来计算梯度。
例如,假设我们想要训练一个能够生成摘要的 LLM。我们可以给 LLM 提供一篇新闻文章,然后让它生成多个摘要。然后,我们可以使用一个奖励模型来评估这些摘要的质量,并计算每个摘要的优势分数。如果一个摘要的优势分数很高,这意味着它比其他摘要更好,那么 GRPO 损失函数会鼓励 LLM 增加生成这个摘要的概率。相反,如果一个摘要的优势分数很低,这意味着它比其他摘要更差,那么 GRPO 损失函数会不鼓励 LLM 再次生成这个摘要。
裁剪 GRPO 损失:稳定策略更新
随着训练的进行,策略模型可能会开始与冻结的参考模型发生显着偏离。为了保持更新的稳定和保守,GRPO 采用了一种裁剪策略,灵感来自 PPO,以限制 token 概率中过于激进的变化。
对于给定的提示-完成对 (x, y),我们计算:
-
策略模型和参考模型之间的概率比率:ratio = π_θ(y | x) / π_ref(y | x)(实现为 exp(log π_θ – log π_ref))
-
策略目标的两个版本:
- 未裁剪:L_unclipped = ratio * A(x, y)
- 裁剪:L_clipped = clip(ratio, 1 – ε, 1 + ε) * A(x, y)
GRPO 损失使用两者中更保守的一个:
L = min(L_unclipped, L_clipped)
loss = -mean_over_tokens(L)
这确保了(1)如果策略略有改进,则会得到奖励,并且(2)如果它与参考模型的偏移太远,则更新将被裁剪,从而防止不稳定。
第一步行为:最初,策略和参考是相同的,因此 ratio = 1,并且裁剪没有效果。损失减少为 -A(x, y),仅根据相对质量加强完成。仅在以后的步骤中,当策略偏离参考模型时,裁剪才变得至关重要,从而确保安全探索和对齐保留。
KL 正则化 GRPO 损失:鼓励稳定性
为了进一步稳定 GRPO 训练,尤其是在策略偏离参考模型时,我们可以将 KL 散度惩罚添加到损失中。虽然裁剪限制了策略可以改变的程度,但 KL 正则化温和地鼓励它保持接近原始行为。这对于长篇完成或对齐敏感的任务特别有用。
损失结构 -> 对于每个提示-完成对 (x, y):
-
计算策略和参考模型之间的概率比率:ratio = π_θ(y | x) / π_ref(y | x)。
-
策略目标:与裁剪 GRPO 中一样,我们定义:L_policy = min(ratio * A(x, y), clip(ratio, 1 – ε, 1 + ε) * A(x, y))。
-
KL 散度惩罚:每个 token 的反向 KL 散度是:KL = exp(log π_ref – log π_θ) + (log π_θ – log π_ref) – 1。
这会惩罚策略偏离参考模型太远的完成。
-
最终损失:我们从策略奖励中减去 KL 惩罚(由超参数 β 加权):L_total = – (L_policy – β * KL),并且仅在生成的 token 上计算平均值。
为什么它很重要:
- 平滑策略更新:KL 抑制了 token 概率的突然变化。
- 更强的正则化:在输出可能漂移的开放式生成任务中尤为重要。
- 与裁剪互补:裁剪防止极端更新;KL 提供了一致的拉动以趋向参考。
在训练的第一步中,由于策略和参考是相同的:ratio = 1,因此裁剪是不活动的,KL = 0,因此不应用惩罚。损失仍然简化为 -A(x, y)。
随着模型的改进,KL 项逐渐有助于平衡探索和稳定性。
Wordle 智能体:GRPO 的理想试验场
选择 Wordle 智能体 作为探索 GRPO 的基础,是因为它提供了一个简单但功能强大的环境,可以理解强化微调的机制。作为一个可验证的、回合制的游戏,具有明确定义的奖励信号,Wordle 能够:
- 程序化奖励设计:可以根据目标单词确定性地评估每个猜测,使其成为测试基于 RL 的优化的理想选择,而无需人工参与的反馈。
- 快速迭代和反馈:短的 episode 长度和明确的成功标准允许快速实验和学习。
- RFT 和 GRPO 的具体应用:Wordle 平衡了语言生成和结构化推理,提供了一种易于访问的方式来了解 GRPO 如何随着时间的推移提高性能。
该项目 (https://github.com/teeratornk/posttrainingproject) 探索了在 Wordle 智能体的上下文中,使用 GRPO 对语言模型进行后训练。grpo_local_data.py
文件使用单词列表和为 GRPO 定制的提示-响应格式设置训练循环。reward_functions.py
文件定义了多个特定于任务的奖励函数,这些函数评估智能体的行为、检查输出格式、战略性地使用先前的反馈并获得信息,以及提供稳定、无需评论家的微调所需的必要奖励信号。
grpo_local_data.py
:GRPO 训练的主入口点
此脚本是使用 GRPO 在 Wordle 游戏中微调语言模型的主要训练入口点。它执行以下操作:
- 提示设置:定义一个结构化的
SYSTEM_PROMPT
,该提示概述了 Wordle 游戏规则,并使用<think>
和<guess>
标签强制执行一致的输出格式。 - 数据加载:加载和过滤本地 Wordle 数据集(通过 Hugging Face: predibase/wordle-grpo · Datasets at Hugging Face),确保仅使用有效的 5 个字母的单词。然后,它使用提示-响应对构建训练和验证分割。
- 模型初始化:使用环境变量加载预训练的因果语言模型和 tokenizer,准备好进行基于 LoRA 的微调。
- 奖励函数:集成一个自定义奖励函数 (
wordle_reward_func
),该函数组合了多个评估器、输出格式验证、先前反馈的使用和信息增益,从reward_functions.py
导入。 - GRPO 训练循环:从
trl
库配置GRPOTrainer
,其中包含训练参数(例如,批次大小、生成次数、评估频率),并在本地数据集上启动训练过程。
该脚本使用 Qwen/Qwen2.5–3B-Instruct
作为训练的基础模型。这个指令微调的 3B 模型提供了一个紧凑但功能强大的基础,用于理解 GRPO 如何提高对齐和对结构化任务(如 Wordle)的推理,而无需大量的计算资源。
reward_functions.py
:指导 Wordle 智能体的奖励信号
此文件定义自定义奖励函数,以通过 Group Relative Policy Optimization (GRPO) 训练 Wordle 智能体。奖励通过评估每个猜测的质量和策略来指导智能体进行强化微调。该文件改编自 DeepLearning.AI GRPO 课程,包括:
output_format_check
:奖励遵循正确的 XML 样输出格式(...``...
)并生成有效 5 个字母单词的完成。uses_previous_feedback
:它通过奖励重复使用已确认的正确字母、惩罚重复无效的模式以及奖励基于先前反馈探索新字母来鼓励战略性猜测。guess_value
:根据标准化信息增益计算奖励,该信息增益量化了猜测减少关于秘密单词的不确定性的程度。它利用熵和反馈建模来优先考虑消除更多可能候选者的猜测。
总结与展望
本文作为 GRPO 的概念性和介绍性指南,用于在后训练语言模型的上下文中,使用 Wordle 智能体作为案例研究。它旨在培养对 GRPO 的机制、奖励设计和训练设置的清晰理解。在未来的文章中,我将比较 GRPO 的性能与 SFT 和基本模型。此外,我将提供对优化策略的更深入探索,例如超参数调整,以增强训练稳定性并提高特定于任务的性能。GRPO 作为一种新型的强化学习方法,在后训练大模型领域展现出巨大的潜力,值得我们进一步探索和应用。