简介莫道桑榆晚,为霞尚满天。小伙伴们好,我是"小窗幽记机器学习"的小编卖铁观音的小男孩。近期国产开源之光GLM-5.2在长程任务的强化学习训练中弃用GRPO,转而采用基于Critic的PPO算法,此举在AI社区引发讨论。
GLM-5.2 选择 PPO 的核心原因在于其主攻超长逻辑链的复杂智能体任务,而 GRPO 的“组内相对比较”机制在面对长短极不均匀的超长轨迹时会完全失效。PPO 通过引入价值网络(Critic),能够实现 Token 级别的精准“信用分配”,准确评估动辄几万步操作中究竟哪一步才是关键。这种细粒度的绝对价值评估,是攻克百万上下文长线推理并遏制模型“作弊”的必经之路。
今天这篇小作文将从零开始,逐步推导PPO算法的核心——策略梯度(Policy Gradient)公式。
第0步:基础符号与“游戏规则”定义在强化学习中,智能体(Agent,即我们的神经网络)在环境(Environment)中不断交互。游戏按时间步 进行:
状态(State):智能体当前看到的局面。动作(Action):智能体在 决定采取的行动。奖励(Reward):环境对这个动作给出的即时反馈分数。策略(Policy):这是我们要训练的神经网络。 是网络参数,它输出的是在状态 下,采取各类动作 的概率。状态转移概率:这是环境客观规律,不随网络参数改变(比如游戏的物理引擎)。轨迹(Trajectory):玩完一整局游戏,产生的一连串“状态-动作”序列,称为一条轨迹:
这局游戏的总得分(回报)就是每一步奖励的累加:
第1步:计算某条“轨迹”发生的总概率给定当前的网络参数,玩出一条特定轨迹 的概率是多少?根据链式法则,等于每一步概率的连乘:
:游戏初始状态的概率。:模型(你控制的) 决定做动作的概率。:环境(你控制不了的)决定下一个状态的概率。第2步:定义要优化的目标强化学习的终极目的:找到最优参数 ,让模型玩游戏的“期望总得分”最大化。
所谓期望,就是把所有可能玩出的轨迹得分,乘以这条轨迹发生的概率,然后求积分(遍历所有可能性):
为了最大化,需要对参数 求梯度(求导),即求,以此来更新神经网络。
第3步:求导对目标两边同时求导,并将梯度符号移入积分号内:
(注:得分 只是环境给的一个数值,不包含参数,所以在求导时视为常数。)
工程难度:上面这个公式没法算!因为我们无法穷举宇宙中所有的轨迹来算完整的梯度。我们必须把它转换回期望的形式:,这样才能让模型自己玩几局游戏(蒙特卡洛采样)来估算平均值。
第4步:引入Log导数技巧微积分中有一个极其重要的性质:
稍作移项可得:
令 为, 为概率,代入上述等式,得到“Log 导数技巧”核心公式:
将这个魔法公式代入第3步的结果:
看!前面是概率,后面是值,它完美地变回了数学期望!
(意义:不用穷举所有轨迹了!让模型玩几轮游戏,把括号里的值算出来求个平均,就是我们要的梯度!)
第5步:拆解对数概率,见证无模型(Model-Free)的奇迹现在拆解。根据第1步的乘法公式,取对数后(乘法变加法):
现在,对这个式子求 的梯度。奇迹出现了:
不包含,求导为0。是环境法则,不包含,求导为0。只有中间的策略网络 存活了下来!未知的环境规律被完美消去:
代回第 4 步,得到经典的REINFORCE 策略梯度公式:
第6步:引入值函数和优势函数最基础的 REINFORCE 公式存在两个致命的缺陷:第一是不符合因果律,第二是方差太大。为了解决这两个问题,引入强化学习中最核心的两个值函数 (Value Functions) 的概念:
1、缺陷 1 与因果性:
在计算第 步的动作梯度时,公式里乘的是整局游戏的总得分。但显然,“当前的动作不可能影响过去的得分”。动作的好坏,只能由 时刻之后的累积奖励来决定。为了严谨地表达“从时刻 开始未来的期望奖励”,引入:动作值函数 (Action-Value Function):也称Reward-to-go或者未来的累积奖励。它表示在状态 下,采取了特定动作 之后,遵循当前策略直到游戏结束,期望能获得的累积奖励。用 替换掉原本之前的总得分,梯度的评估就符合了因果性:
2、缺陷 2 与基线 (Baseline):
仅仅使用 依然存在方差过大的问题。比如在某些极其简单的关卡,闭着眼睛玩都能得正分,这意味着所有动作的 值都是正的。如果直接用 值,所有动作的概率都会被拉高,模型很难分辨到底哪个动作才是“真正优秀的”。为了提供一个评判的“及格线”,我们引入基线,而最完美的基线就是:
状态值函数 (State-Value Function):它表示在状态 下,不管当下选什么动作,只要遵循当前策略一直玩下去,平均而言期望获得的累积奖励。它代表了当前状态本身的好坏,也就是该状态的“平均水平”。
3、推导优势函数:
现在,我们将某一个特定动作的期望回报,减去这个状态的平均水平,这就定义了优势函数 (Advantage Function,):
优势函数的直观意义极其强大:
如果:说明在状态 下采取动作 的回报高于平均水平(这是一步妙棋),梯度会鼓励网络增大该动作的发生概率。如果:说明动作 的表现低于平均水平(这是一步臭棋),哪怕它的绝对得分是正的,梯度也会惩罚网络,减小该动作的发生概率。将 最终替换为,并将对单一轨迹的求和化简为对所有时间步 样本的经验平均(),就得到了现代强化学习标准版策略梯度公式:
第7步:替代目标函数 (Surrogate Objective)在实际写代码(PyTorch/TensorFlow)时,由于框架自带自动微分 (AutoGrad),我们不需要手写复杂的导数推导。我们只需要告诉 PyTorch 一个标量 Loss(即目标函数),然后调用loss.backward() 即可。
为了让 PyTorch 自动求导出的结果,刚好等于我们在第6步千辛万苦推出来的理论梯度,我们要怎么写 Loss 呢?
很简单,把梯度符号 拿掉,并且告诉 PyTorch 优势函数 是一个不需要求导的常数(detach),我们得到 PPO 原始策略梯度目标函数:
至此完成策略梯度的推导!
大语言模型 (LLM) 中的映射在RLHF(基于人类反馈的强化学习)中,则可以把这套符号完全无缝平移给 LLM:
状态 = LLM 当前看到的 Prompt 以及之前生成的所有字(Tokens)。动作 = LLM 预测生成的下一个字(Token)。策略 = 大模型的概率输出层。优势函数 = 奖励模型(Reward Model)对这句话打的分数减去基线。因为 PG 的数据利用效率太低了(采样一次用完就得扔),才逼着大神 Schulman 等人在这个 的基础上,引入了新老策略概率比(Importance Sampling),进而发明了划时代的PPO 算法(下一篇详细讲解)!