记19年的生成式重排工作,才知道这个强化方法叫GRPO
2025-7-11
| 2026-11-11
字数 3483阅读时长≈ 9 分钟
本文:
  • 通俗的理解一下GRPO和Policy-Base的强化学习,GRPO的前世今生
  • 介绍下当初的强化学习生成式重排工作,用到的类GRPO方法

通俗地理解GRPO

GRPO的解读,无论是paper本身,还是网上blog的解读,都是从PPO出发,首先要理解PPO就不够通俗,我试试从最基础的Policy-Base强化方法讲起,绕过PPO。
首先,三言两语讲清楚什么是Policy-Base,假如问题定义在离散的动作空间,智能体基于此刻的状态要输出每一个动作的概率,这件事情翻译成好理解的监督学习方法就是多分类。Policy-Base就是你有一个DNN,他的最后一层是一个Softmax,输出了后续每一个动作的概率,概率越大未来的价值越高,如果是玩游戏就是未来得分高,存活几率大,如果是序列生成,就是生成的序列更优质。
那么怎么更新这个Policy呢?还是对比多分类,模型输出了每个类别的概率,你知道多类里有一个是正确的,那么用交叉熵损失即可,调大正确那一类的输出概率。到强化学习呢?你知道执行了一个动作,这个动作产生了reward,如果reward的是好的,那么应该调大这一个动作的概率,如果reward是差的,应该调小这个动作的概率。这怎么做呢?就是交叉熵乘以reward,来影响概率的调节方向和调节力度。
再用一句更简单的话总结什么是Policy-Base。我在输出的动作空间概率上做调节,结果好的动作就调大概率,结果差的动作就调小概率。
这里有一个漏洞,那就是reward可能都是设计成正数,reward无论好坏都是正的,那么概率始终在被调大,只是力度不同。我们希望调小概率时,reward应该是个负的。直观的想法,如果我见过一批reward,减去他们的均值就好了。
恭喜你,发现的这个方法叫REINFORCE with baseline,给你的reward一个baseline,让reward有正有负,直截了当地调节概率。这对强化的训练效率至关重要。
这个启发式搞出来的均值baseline不一定是最好的,我想知道的是此刻状态对应的价值,均值没有这样的物理意义。我是不是可以用一个NN模型来预估出这个价值呢?恭喜你,你获得了Actor-Critic方法,Actor就是你的动作概率模型,Critic就是用一个NN在算这个baseline,或者我们叫他value-base的model。
PPO就属于Actor-Critic,所以它带着Value-Base model,GRPO的motivation就是干掉了这个Value-Base的model,节省了显存。
如果不用一个model来估计状态的价值,还有什么好办法?那你就基于每一条原始样本生成一组序列,用他们的reward均值作为baseline,这种方法呢,就叫self-critic。他利用了蒙特卡洛方法代替了TD error。
下面这个图,对比的非常清晰
notion image
GROP的精髓呢,就是Self-Critic,某个状态开始生成多个结果,用这个结果reward的均值作为baseline。至于其他的那个KL散度的动作连续性校正,是从PPO继承来的,但那不是精髓。
这个Self-Critic方法是哪里来的?我最早溯源到了这篇paper《Self-critical Sequence Training for Image Captioning》,他就是输入图片,生成一段自然语言描述,里面剔除到Value-base model,提出了Self-critic的概念。《BUY 4 REINFORCE SAMPLES,GET A BASELINE FOR FREE!》就是更接近了,每个生成4个序列,每4个获得一个均值作为baseline,而且它宣称sample出4个边际收益已经非常高了。
为什么在游戏领域,更多的使用PPO,而在序列生成上,GRPO才有了一席之地,并且self-critic最早应用在了图生文上,答案很简单。相比游戏里的轨迹,序列生成要短的多,它有明确的终止条件,而游戏未必有,因而容易通过蒙特卡洛模拟获得baseline。

记19年的生成式强化重排

我初次遇到类GRPO方法,是在19年的生成式强化重排工作中,也是误打误撞才发现,应用后发现效果惊艳。如果上面的通俗的理论没有讲清楚,在这个推荐重排实践中,再来领略一下他的风采。
我想搞端到端重排,这个想法从18年就开始了。当时系统精排后有打散策略,后面又尝试了各种MMR方法。原始的《The Use of MMR, Diversity-Based Reranking for ReorderingDocuments and Producing Summaries 》,基于信息边际递减和类目偏好的《Adaptive, Personalized Diversity for Visual Discovery》,基于历史偏好类目和推荐结果KL散度的《Calibrated Recommendations》,基于行列式点过程的DPP《Fast Greedy MAP Inference for Determinantal PointProcess to Improve Recommendation Diversity》。我在想,这些规则目的是在精排已经最大化效率的前提下,启发式地微调列表的多样性,精排是point-wise,而多样性是list-wise,那有没有端到端数据驱动的模型方法呢?
在我脑子里,一块块拼图的碎片,有List-Wise特征和目标,特征输入是序列,预估的价值也是序列维度的;有RL方法,建模一个序列的长期价值,而非贪心地点击率最大化;有刚刚大火的Transformer,可以输入序列作为evaluator,充当强化里的模拟环境,或者叫reward model;有多样性,它本质是最大化点击数期望,避免重复带来的用户跳失,不同于精排的最大化点击率。
同时呢,一个业务场景也遇到了难题,它是一个沉浸式的图文下拉页,每个屏幕是一个图文内容,业务目标是最大化下拉量。使用传统的精排方法,建模每一个图文上的行为,停留的时长,均无法带来浏览深度的提升。
至此,我所有的碎片思路汇聚成一个方案。目标上就是最大化下拉深度,方案也能复用到双列流,最大化session点击量。
首先确定强化学习的思路,我要建模的是session的长期价值,传统排序的目标是point-wise的价值,我选择用强化学习。那选择value-base还是policy-base呢?我认为要估计出列表的价值是困难的,毕竟精排的AUC也才有0.7,但是输出选择的概率是要更简单的(召回模型可以理解成一种简单的policy RL),我优先选择Policy-Base,当然除了这个因素外,当时PPO大火也是一个理由,Policy-Base的方法最后可以升级到PPO。
监督学习基于历史日志,强化学习可以么?我一开始认为是可以的,我们在离线日志上做了很多尝试,off-policy是强化学习的噩梦,完全不work,痛定思痛,我坚定地选择on-policy。为了能做到on-policy,就不可能依赖日志,哪怕是流式训练的系统也不够,我们需要做一个模拟环境或者叫reward model。
这个reward model,它的输入是推荐的list或session,输出是每一个位置的点击率和存活率(用户能继续看下去的概率),我就能够计算这个list的点击期望了。直接把列表扔进Transformer Encoder,叠2层输出。为什么选择point-wise的evaluator,当时还是考虑监督学习的稳定性,精排上的经验,只要这个Transformer能捕捉到物品在列表中的相互影响,就算达成了,他的输入也不复杂,都带了精排的预估中间结果。
notion image
有了模拟环境,再把生成模型给搭建出来,整体架构是一个pointer-network,模型是一个GRU,这是考虑最终的部署而选择的。假如推荐的结果是20个,那么模型会执行20次next one物品的生成,它通过Softmax输出候选物品的选择概率,也就是强化学习的动作空间的概率分布。执行一步后,更新RNN的状态,并对候选物品做好Mask。
notion image
模拟环境和生成模型确定了,就是搭建强化的训练流程。思路也很清晰,从日志中拿到序列,用于持续训练模拟环境(reward model),基于用户特征和候选生成序列,给到reward model计算点击期望价值,作为reward。通过策略梯度更新生成模型的参数。
在强化训练这一步,遇到了障碍,我发现用普通的REINFORCE with baseline(whitening),还不如直接用RNN学point-wise目标,贪心的效果好。我check了模拟环境是否能感知到,物品间相互影响,它没有问题,相似的类别放在一起会提升CTR,因为出了更多用户感兴趣的类别,但是这个CTR的均值会低于他们单独出现,BPR(用户在这个的位置跳失率)会上升,导致点击期望数下降。所以还是怀疑强化学习的模型,实现了PPO,也还是与贪心的结果持平。这个时候,我调整reward的策略的时候,中间有一次误打误撞把whitening改成了,用reward减去batch的均值,训练的结果一下上升了一大截。按理说这是不对的,因为batch里的用户都不同,他们的均值不可避。当时花了很长的时间搜寻资料,找到了https://medium.com/@fork.tree.ai/understanding-baseline-techniques-for-reinforce-53a1e2279b57这篇博客,理解了reward baseline的精髓。也仿照着《BUY 4 REINFORCE SAMPLES,GET A BASELINE FOR FREE》里的方法,对于每一个原始样本,生成4个序列,相当于batch乘以4的样本数,投入reward model计算好reward,每一组的均值作为该组4条样本reward的baseline,更新模型(哈哈,看看和Group Relative Policy Optimization这个名字是否般配)。效果又好了一截,可以和贪心拉开差距,方法简单又高效。
再后来解决了一系列的工程问题,推到了线上,在我之前说很难靠精排模型建模的场景,对比下拉深度和商品点击量,击败了当时在PK的精排模型(处理不好下拉,但是做商品点击率总是没问题的,也算强基线了)。
notion image
值得一说的,我们对比强化方法和CTR和下拉率联合加权的贪心策略,在0.6的加权参数下,点击量最优。强化方法不仅点击量超越了贪心,在点击的类目数上,历史兴趣偏好的match程度都超过了贪心。而加权的参数也表明,随着CTR的权重不断增加,点击的类目数减少,在0.6的时候点击量来到了峰值,CTR权重再提升,由于曝光量减少,点击率虽然不断升高,但是点击量已经逐步降低了。这也说明当目标从精排的CTR改成list-wise的点击期望数,整个流程里没有任何的启发式重排,最终的推荐结果能获得好的多样性。所以,这篇文章的题目才叫做《CTR is not Enough: a Novel Reinforcement Learning basedRanking Approach for Optimizing Session Clicks》。
notion image
为啥paper没有中?一个是自己的论文写作功底太差了。另一个,突破点太多了,以至于很难理解:1,CTR的目标改为list-wise端到端的点击量期望目标,CTR is not Enough;2,基于强化学习的生成式重排,多轮推理产出推荐结果;3,强化基于了模拟环境,也就是reward model;4,用了一种self-critic的reward baseline技术,也可以叫GRPO;5,证明点击量期望目标下,能自然地推荐出多样性的结果。审稿人才会问出,“这么大的参数空间,你强化学习能work么?”
再感受下当时怎么描述GRPO的:
notion image

References

  • Self-critical Sequence Training for Image Captioning
  • BUY 4 REINFORCE SAMPLES,GET A BASELINE FOR FREE!
  • 推荐系统
  • 强化学习
  • 推荐系统里的“七伤拳”:那些高ROI但长期有损的优化互联网六点下班的推荐算法团队
    Loading...