
前言上一期我们学习了大模型微调 (SFT) 的过程这一期我们正式进入强化学习阶段本章我们的重点是 GRPO我们先梳理一下过去学习的内容我们知道大模型简单流程是图片 Prompt 进入 Qwen-9b 生成 Response对于 SFT 的训练流程是图片 Prompt 进入 Qwen-9b 生成预测的 Response接着和人工标准 Response 比较后反向传播进行学习而对于 GRPO 而言图片 Prompt 进入 Qwen-9b 生成多个预测的 ResponseReward 判断好坏让好的概率变大坏的概率变小简单串了一遍流程之后我们可以发现实际上后两者的区别在于是否有监督前者是有人工标注的答案作为监督后者是用 reward 函数评判好坏接下来我们详细看看这个 GRPO 是什么GRPO强化学习是什么什么是强化学习百度百科的解释是我们翻译一下强化学习就是让一个智能体在一个环境里通过不断试错来学习它每做一个动作环境会给它一个奖励或惩罚。智能体的目标不是只看眼前奖励而是学会一套策略让长期累积奖励最大化这个过程属于一个无监督学习也就是说并没有标签它只能在反馈中不断的纠正学习强化学习里最典型的例子就是 AlphaGo 的训练过程SFT 的短板在学习 GRPO 之前我们先思考一下为什么有 SFT 还要学习 GRPO因为 SFT 的短板是我知道回答的格式但是我不知道怎么样的回答是好的回答也就是学习一个模仿能力按照之前的数据集来说就是你知道格式但是你的回答实际上是没有脑洞的因此 GRPO 就是解决让模型自己思考答案的好坏GRPO 的过程这个方法的第一次提出是 DeepSeek 团队Rollout第一步是对同一个 Input我们输出多组的回答为什么要多组原因是GRPO 不仅想知道答案本身多少分还想知道这个答案相对于同一道题其他回答表现怎么样因为我们可以通过对比才能知道回答质量的好坏num_generations 4比如这行代码表示的就是我们要生成 4 组回答这个过程也就是 GRPO 的 GReward第二步接着我们需要给我们的回答打分采用得分函数进行评判数学公式可以这样表达 其中 x 表示的是输入y 表示模型生成的回答R 表示奖励得分Reward 可以分成两大类分别是 Constraint Reward 和 Objective Reward前者保证别犯基本错误而后者表示我们想让你变成什么样比如同一道题通过得分函数可以得到每一个的得分回答RewardA0.42B0.81C0.53D0.74相对于传统的得分函数我们采用用大模型作为裁判的形式——LLM as a judge我们先声明用 LLM 做 Judge 的时候并不是判断像不像“标准答案”如果这样的话实际上就是变成了 SFT 的过程了因此在我们这个任务里Judge 要判断的是这个回答本身是否符合我们定义的“优质剧情推演”那么要怎么样才可以给高分应该要满足以下的条件真的看懂了图片剧情必须能接得上平淡、正常、脑洞真的要有层次脑洞要“意外但合理”不能奖励“写得漂亮”要奖励“推演得好”指标也就是指标判断什么Grounding是否基于图片Logic剧情是否接得上Progression三层是否递进Creativity是否有真正的新意Controlled Surprise是否意外但合理实际上用 LLM 去评分绝对打分是一件比较困难的事情可能全部挤在 8 分附近这是 LLM Judge 很常见的问题分数压缩为了解决这个问题可以先排序再打分的形式这样有一个好处天然制造了 GRPO 需要的组内相对差异Relative作为 GRPO 的 R并不是单纯看某个回答的得分而是对比本次回答和同组答案之间的差距通常会先计算得分的平均值将同组的所有得分减去平均值小于零的我们惩罚大于零的我们奖励其中概念 Advantage 表示相对于同组表现怎么样因此可以有 Rward 0但是 Advantage 0 的情况简单来说就是和平均值的差值当然实际公式并不是这样下面我们会介绍奖励方差假设一组得分都是一样的那么方差等于 0说明 Reward Function 根本无法区分这些回答也就是说这一组基本没有 GRPO 学习信号假设得分有明显差异存在明显的奖励方差时这对可以说 GRPO 才有用但是不是说方差可以越大越好当方差极大的时候可能会有一下的情况Reward 函数写坏了被模型钻漏洞了某个规则权重过大得分的存在问题有异常样本数据存在问题了因此我们希望的是Reward 有稳定、合理的区分能力一般来说我们把 Advantage 做标准化统一尺度真正的公式如下 Policy前面 GRPO 还没有真正改模型下面我们正式来看看是怎么修改模型的通过上面的学习我们知道什么样的回答应该要鼓励什么的回答要抑制其实 Qwen 本身就是一个 Policy整体的概率分布可以看成是 其中 s 表示的是我们前面的输入和已经生成的 tokena 表示的是下一个 token因为每一个 token 都是一次 Action而我们的一个整个 Response 其实是一串 Action可以通过下面这样表示 但是每一个 token 的生成概率乘起来最后的数会变得很小因此我们采用了对数的形式采用对数的形式有一个好处就是可以把累成拆分成为累加的形式 通过上述的形式整个回答可以通过每个 token 的 log probability 相加来表示前面我们有讲述到 advantage这个参数是怎么去影响概率呢可以先简单看成下面的形式 当 A 0 的时候也就是好回答这个时候为了降低 Loss。会提高好回答的概率同理当 A 0 的时候也就是差回答这个时候为了降低 Loss会降低差回答的概率Old Policy但是可能会存在一个问题就是可能一次性改太猛了可能第一次的概率是 0.2但是下一次直接变成了 0.8方向看起来是对的但是过于激进了尤其 Reward 不可能百分之百完美如果 Reward 有漏洞模型就可能迅速把漏洞学得非常熟为了解决这个问题于是出现 Old Policy简单来说就是保存上一次的概率和这一次的概率做比对生成的 token 的概率做约束如下面公式所示 但是一般在代码中不会这么描述因为 因此可以写成指数的形式 在代码中我们通常是写成ratio torch.exp( new_log_probs - old_log_probs )clip现在我们知道了我们的概率比率是起到约束的作用那么这个比例的范围一般是多少一般我们会先设置一个参数一般参数的默认值是 0.2因此默认允许变化的范围是 0.8~1.2Reference Model虽然 clip 可以小范围控制每一个 token 的概率但是问题在于当迭代多次之后实际上变化可能会很大因此我们要有 Reference Model也就是在 GRPO 之前的可靠模型主要是负责训练很久以后也不要整体偏离原模型太远KL Divergence那 Reference Model 是怎么去控制模型的偏离呢研究员提出可以用 KL Divergence 来控制模型的漂移简单来说就是两个模型的两个概率分布有多不一样假设 KL 很大说明偏离严重因此要惩罚论文公式分析有了前面的铺垫我们可以正式分析 GRPO 的损失函数我们先看最下面的 Advantage 公式和我们之前的分析是一样与平均值做差后除于标准差做标注化第一个公式先是比率乘上 Advantage右半部分就是做 clip 后的比率(目的是做每一步的约束)同样也是乘上 Advantage取两者的最小值实际上就是在正常更新和受限制更新之间选更保守的那个最右边就是减去惩罚的 KL防止模型越学越不像之前的模型效果对比经过 SFT GRPO只有 SFT看完两者的回复之后效果高低直接立判经过强化学习后的大模型效果确实比之前微调的好