作者:extreme1228
原文:https://zhuanlan.zhihu.com/p/1997363850849300572
过去半年到一年时间,自己也算是在LLM RL领域的一个科研工作者。
自从25年年初DeepSeek-R1横空出世后,LLM RL就变成了一个非常火爆的方向,与此同时基于GRPO改进的各种XXPO方法如“雨后春笋”般涌出,大家都在不同的方向尝试应用RL来取得更好的效果。
我是25年年初刚开始接触LLM,之前对于RL的理解也不是很深刻,中间断断续续学习了好几次这其中的理论推导,同时也实际上手尝试了LLM RL理解了一些工程上的问题,特此总结,希望能够帮助初学者从零理解这其中的理论推导和工程改进。
从零理解传统RL的理论推导
强化学习是一种无监督机器学习方法,它的核心思想就是不断与环境交互并利用环境的反馈来调整模型的行为,进而能够更好地解决对应的问题。
这种思想和人类学习新东西的过程类似,因此理论上具备比较强的泛化性,但通常相比传统的监督学习方法也更难以收敛,奖励信号是否准确,参数更新是否平稳,交互环境是否稳定等都影响着RL训练的收敛程度。
RL按照模型建模的对象分为Value-based和Policy-Based两个大方向,因为LLM领域中action space及其庞大,所以目前value-based方法不属于主流,这里主要以介绍Policy-Based方法为主(想从头开始了解RL的推荐参考西湖大学赵世钰老师的这门课程强化学习的数学原理[1])。
为方便理解,我们以Policy-Based中最典型的Reinforce算法为例进行推导,首先Reinforce算法的目标函数是最大化当前策略函数下所有轨迹的奖励期望:
这也很符合我们对强化学习算法的直观认知:一个策略产生轨迹的奖励期望越高,这个策略也自然更好。因此我们用梯度上升方法更新参数时即是:
接下来我们对梯度进行求解:
这其中(1) -> (2)是按照期望的定义展开,(3) -> (4) 是利用了常见的对数变化公式来凑出log的形式,(5) -> (6) 是写为期望的定义。
而随着Reinforce算法继续发展会得到Actor-Critic算法,TRPO算法以及PPO算法,这里具体的推导过程不在赘述,如果有感兴趣的可以参考这篇blog[2]。这里直接给出PPO的公式(篇幅起见省略了clip的部分,详情参考PPO[3]):
传统RL到LLM RL的过渡
从传统RL到LLM RL实际上没有很多新定义的引入,主要需要熟悉并了解下LLM背景下一些常见术语的定义:
25年年初DeepSeek-R1的爆火使得GRPO这个算法进入大家的视线,GRPO通过利用组间奖励值来计算每条轨迹的优势值,简单有效地去除了PPO算法中Critic model和Reward Model两部分组件,极大地减少了LLM-RL中所需要的显存,RLVR(Reinforcement Leaning with Verifable Reward)也因此成为25年的一个热点主题。GRPO算法公式:
工业级RL所面临的问题与解决方案
如果不考虑显存占用和运行时间,LLM RL可以简单地写为 模型采样得到样本和Reward、前向传播计算logprobs、反向传播更新模型这三个步骤。
但LLM RL相比于传统RL,采样是一个非常耗时、耗资源的时间。
因此现有的工业级RL框架大部分使用训练框架和推理框架(采样框架)相分离的架构,训练框架通常采用 FSDP / Megatron,而推理框架通常采用VLLM / SGLang等来加快推理速度。
RL框架介绍
目前开源社区已经有很多非常出色的RL框架,包括但不限于Verl、Areal、Slime、AgentRL等等。
这些开源框架如上所述基本都采用了训推分离的架构,但具体的设计细节可能不尽相同,具体的分析与讨论已经有很多出色的帖子做出了分析(框架对比分析),这里不再赘述。下面主要讨论下我认为几个RL工程上改进比较大的部分:
异步加速的引入
LLM-RL中rollout属于比较耗时的过程,如果采用完全on-policy的实现,rollout和forward_backward顺序执行,会带来GPU利用率的降低和整体RL速度的减慢。
为此多数RL框架中先后引入了异步rollout的逻辑,实现方式上大体都是利用python的asyncio来管理,维护一个buffer队列,rollout engine时刻在进行采样并将完成的轨迹存入buffer,actor、ref需要前向传播时从buffer队列中取出一定数量的样本进行前向传播和反向更新。
本质上类似于流水线的思想,通过合理的资源调配,实现GPU的满载利用,这部分的详细介绍在AgentRL[4]、AReal[5] 中均有介绍。但需要注意的一点是,采用异步加速后的RL算法并不能算是严格的on-policy的算法,引入的一定程度的off-policy可能会导致算法收敛收到影响。
对于这个问题,一方面在异步框架中都有一个类似staleness的参数控制或通过限制buffer size的大小以保证当前更新的数据和当前的policy不会超过很多的版本;另一方面则是通过重要性采样的修正。
重要性采样修正
现有的RL框架使用推理引擎VLLM/SGLang作为 Engine进行采样就是为了最大化加速推理(采样)的速度,但这些推理引擎中会有精度损失等问题,进而导致对于同一条轨迹,训练框架和推理框架产生的log_probs存在误差,而这个误差会影响算法的收敛速度和训练的稳定运行。
为此,社区提出重要性采样的概念,即在短时间内无法做到训推一致的情况下,从算法层面修正这个问题:通过在目标函数中乘以对应的重要性采样修正比例来修复。
详细地推导和理解过程可以参考TIS blog[6]。
在此基础上大家又继续探索了MoE模型上的重要性采样,MoE模型相比Dense 模型多出了expert router这个变量,如果训练和推理时激活的expert router不一致,也会导致训推不一致的问题,为稳定MoE 模型的RL训练,在TIS修正的基础上进行改进,引入per-token的mask来对TIS进行clip,公式如下:
详细地推导和细节可以参考IcePop[7]、MiniRL[8]
RL loop token 流的维护
在Agentic RL中我们一般会涉及到Multi-turn的任务处理,一般会有一个loop函数来调用llm生成assitant回复,同时会调用类似env.step()函数得到环境反馈
在这个过程中如果我们选择以text作为媒介进行交流(即每次将新的history tokenize为新的一个token ids list输入给模型)很容易导致tokenizer在进行merge的时候本轮和上一轮merge出来的token不一致,进而导致出现少数token概率异常的情况。
随着轮数的累积,这种不稳定性很容易导致整个RL训练的崩溃。
因此我们需要为训练端维护一个独立的tokens id流,每次得到环境反馈后增量式的更新这个ids列表而非整个替换,进而能够保证RL训练的稳定。
引用链接
[1] 强化学习的数学原理: https://www.bilibili.com/video/BV1sd4y167NS/?spm_id_from=333.337.search-card.all.click&vd_source=ba78eb27a55cbb3bb35bff17ca84ef3f
[2] blog: https://medium.com/data-science/understand-reinforce-actor-critic-and-ppo-in-one-go-2569f520c066
[3] PPO: https://arxiv.org/abs/1707.06347
[4] AgentRL: https://arxiv.org/abs/2510.04206
[5] AReal: https://arxiv.org/abs/2505.24298
[6] TIS blog: https://fengyao.notion.site/off-policy-rl
[7] IcePop: https://www.emergentmind.com/topics/icepop
[8] MiniRL: https://arxiv.org/pdf/2512.01374v1