1. 首页
  2. 精选文章
  3. 从“手推策略梯度定理”开始:基于公式推导理解RL的创新本质

从“手推策略梯度定理”开始:基于公式推导理解RL的创新本质

  • 发布于 2026-03-05
  • 4 次阅读

作者:无语了ing

https://zhuanlan.zhihu.com/p/2010029640434087295

作为新入门强化学习的小白,由于缺乏相关的基础理论知识,经常会遇到一个很尴尬的问题:硬读PPO/GPRO的论文却被各种公式符号搞得摸不着头脑,只看博客和相关文章但却总感觉对里面所讲述的创新点一知半解。

正好最近有一段比较空闲的时间,因此我从RL最基础的目标函数求解开始,使用最基本的Policy-Gradient方法对着相关文章手推了一遍策略梯度定理的证明过程,在这个过程中逐渐理解了RL中的各种定义,也基本明白了PPO/GRPO的理论创新点。

下面把这个过程总结成文章,感兴趣的同学可以一起学习。因为我的认识还很浅薄,文章很可能有错误的地方,如果发现请一定指出,万分感谢。

强化学习的定义

要求解RL的目标函数,我们首先要搞明白基础的RL的定义是什么。

假设有一个处于未知环境中的智能体,它可以通过与环境交互来获得某些奖励。该智能体的目标是采取行动,以实现累积奖励的最大化。

智能体在环境中执行动作。环境对特定动作的反应方式由一个模型定义,而我们可能了解、也可能不了解这个模型。智能体处于环境的众多状态(states,​s\in\mathcal{S})之一,并可以从众多动作(actions,​a\in \mathcal{A})中选择一个,以从一种状态切换到另一种状态。智能体最终进入哪种状态,是由状态间的转移概率(transition probabilities,​P)决定的。一旦执行了动作,环境就会提供奖励(reward,​r\in \mathcal{R})作为反馈。

智能体的策略(Policy,​\pi)为在特定状态下应采取何种最优动作提供了指导方针,其最终目标是实现总奖励的最大化。每个状态都关联着一个价值函数(Value-Function,​V),用于预测在当前状态下按照相应策略行动所能获得的未来奖励期望值。

换句话说,价值函数量化了一个状态的“好坏”程度。策略和价值函数都是我们在强化学习中试图去学习的核心内容。

智能体与环境之间的交互涉及随时间推移产生的一系列动作和观察到的奖励。在此过程中,智能体不断积累关于环境的知识,学习最优策略,并决策下一步该采取何种行动,以高效地学习到最佳策略。我们将时间步​t的状态、动作和奖励分别记为​S_t, A_t​R_t

因此,交互序列可以由一个回合(Episode,也称为“ ​实验/Trial”或“​轨迹/Trajectory”)完整描述,该序列在终止状态​S_T结束:

S_0,A_0,R_1,S_1,A_1,R_2,\dots,S_{T-1},A_{T-1},R_T,S_T

下面是一些我们在学习强化学习时可能遇到的术语:

  • Model-based: 依赖于环境的模型;要么模型是预先已知的,要么由算法显式地学习得到。
  • Model-free: 在学习过程中不依赖于环境模型。
  • On-policy: 使用来自目标策略的确定性结果或采样数据来训练算法。
  • Off-policy: 在数据的分布上进行训练,这些转移动作(Transitions)或回合(Episodes)是由一个不同的行为策略产生的,而不是由目标策略产生的。

策略梯度(Policy Gradient)方法

要通过强化学习找到一个符合目标的最优解,现有的绝大部分流行方案都是基于策略梯度(Policy-Gradient)方法提出的。

强化学习的目标是为智能体找到一种最优行为策略,以获取最优奖励。策略梯度方法的目标是直接对策略进行建模和优化。策略通常被建模为关于​\theta的参数化函数,即​\pi_\theta(a|s)。奖励(目标)函数的值取决于该策略,随后可以运用各种算法来优化​\theta,从而获得最佳奖励。

奖励函数(Reward function)定义为:

J(\theta) = \sum_{s \in \mathcal{S}} d^\pi(s) V^\pi(s) = \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} \pi_\theta(a|s) Q^\pi(s, a)

其中,​d^\pi(s)是策略​\pi_\theta下马尔可夫链的平稳分布(即策略​\pi下的同策略状态分布)。为了简便起见,当策略出现在其他函数的下标中时,通常会省略参数​\theta;例如,​d^\pi​Q^\pi如果完整写出来应该是​d^{\pi_\theta}​Q^{\pi_\theta}

马尔可夫链的平稳分布:通俗地来解释,在互联网中,无论你从哪个网页开始浏览,只要浏览的时间/网页足够多,那么停留在某个网页的概率其实是会最终趋于稳定的,这个稳定的概率就是平稳分布

奖励函数:在某个策略的指引下(策略与​\theta直接相关),所有状态中达到某个状态的概率乘在这个状态下执行这个策略得到的奖励的总和

计算梯度​\nabla_\theta J(\theta)是件很棘手的事,因为它同时取决于动作选择(由​\pi_\theta直接决定:​\nabla_\theta V^\pi(s))和遵循目标选择行为下的状态平稳分布(由​\pi_\theta间接决定:​\nabla_\theta d^\pi(s))。

考虑到环境通常是未知的,我们很难估算策略更新对状态分布所产生的影响。幸运的是,策略梯度定理横空出世,它提供了一种精妙的目标函数导数改写方式,使其不涉及状态分布​d^\pi(\cdot)的导数,从而极大地简化了梯度​\nabla_\theta J(\theta)的计算过程:

\nabla_\theta J(\theta) = \nabla_\theta \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} Q^\pi(s, a) \pi_\theta(a|s)\$->\$\propto \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} Q^\pi(s, a) \nabla_\theta \pi_\theta(a|s)

上面的公式代表原始公式,我们可以发现​d^\pi(s)​\pi_\theta(a|s)都与​\theta相关,我们对​\theta求导做梯度下降的话,因为一个间接相关一个直接相关,会导致这个式子非常难解。

下面的公式是使用策略梯度定理的式子,我们会发现​d^\pi(s)已经被排除在求​\theta导数之外了,这样只关心​\pi_\theta(a|s)​\theta的梯度下降,式子简单了非常多。

手推策略梯度定理(Policy Gradient Theorem)

首先我们用前导后不导把奖励函数打开:

\nabla_\theta J(\theta) = \nabla_\theta \sum_{s \in \mathcal{S}} d^\pi(s) V^\pi(s) = \sum_{s \in \mathcal{S}} V^\pi(s) \nabla_\theta d^\pi(s) + d^\pi(s) \nabla_\theta V^\pi(s)

我们重点关注​\nabla_\theta V^\pi(s)也就是状态-价值函数的推导

状态-价值函数的递归推导

总的推导步骤如下,我来分步骤进行详细讲解:

step1:

= \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \nabla_\theta Q^\pi(s, a) \right)

经典前导后不导展开,其实我们也可以从这个展开发现,前一部分代表参数变更导致策略变化导致总和奖励变化,后一部分代表参数变化导致策略变化导致价值函数(动作的价值)本身变化导致总和奖励变化

step2:

= \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \nabla_\theta \sum_{s', r} P(s', r | s, a) (r + V^\pi(s')) \right)

使用Bellman方程展开​\nabla_\theta Q^\pi(s, a),这是怎么展开的呢?

首先

Q^{\pi}(s, a) = \mathbb{E}_{a \sim \pi}[G_t | S_t = s, A_t = a]

代表着表示在状态​s采取动作​a后,直到结束所能获得的期望总回报。我们可以通过Bellman方程,把它拆成现在和未来两个状态。

拆成的子项分别有以下含义:

  • ​\sum_{s',r} P(s',r|s,a) 代表对所有可能的结果进行加权平均:
  • ​P(s',r|s,a)(环境响应):当你执行动作 ​a 后,环境有一定概率转移到新状态​s'并给你奖励​r。注意:这个概率由环境模型(Model)决定,通常不随​\theta改变。
  • ​r(即时奖励):本次动作直接获得的反馈数值。
  • ​V^\pi(s')(未来长期价值):进入新状态​s'后,按照策略​\pi继续走下去预期能拿到的所有后续奖励。

我们可以发现,​\sum_{s',r}P(s',r |s,a)​r这两个值都与​\theta没什么关系,分别代表当前状态转移到新状态的可能性以及当前奖励,只有​V^\pi(s')这个值仍然与​\theta相关。

step3:

= \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \sum_{s', r} P(s', r | s, a) \nabla_\theta V^\pi(s') \right)

既然没啥相关的,直接把​\nabla_\theta移到最后面就可以

step4:

= \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \sum_{s'} P(s' | s, a) \nabla_\theta V^\pi(s') \right)

在强化学习的每一步交互中,环境其实会同时抛出两个反馈:下一时刻的状态​s'和即时奖励​r

  • 联合概率​P(s',r|s,a):表示在状态​s采取动作​a后,既到达​s'又获得奖励​r的概率。
  • 边缘概率 ​P(s'|s,a):表示在状态​s采取动作​a后,到达​s'的概率,不管奖励是多少。

我们只需要​P(s'|s,a),因此利用边缘概率公式直接消除掉​P(s',r|s,a)中的​r就可以

推导结果:

最终我们得到了:

\nabla_\theta V^\pi(s) = \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \sum_{s'} P(s' | s, a) \nabla_\theta V^\pi(s') \right)

状态-价值函数的递归展开

发现了吗,这个公式包含着一个非常好的递归性质,我们可以把​V^\pi(s')一直展开

让我们再引入一个访问序列的概念(Visitation-sequence),并将遵循策略​\pi_\theta​k步后从状态​s转移到状态​x的概率标记为​\rho^\pi(s\to x,k)

s \xrightarrow{a \sim \pi_\theta(\cdot|s)} s' \xrightarrow{a \sim \pi_\theta(\cdot|s')} s'' \xrightarrow{a \sim \pi_\theta(\cdot|s'')} \dots
  • ​k = 0时:从​s转移到自身的概率为 1,即​\rho^\pi(s\to s,k=0) =1
  • ​k = 1时:我们扫描所有可能的动作,并将到达目标状态的转移概率求和:
\rho^\pi(s\to s', k=1)=\sum_{a} \pi_\theta(a|s)P(s'|s,a)

想象目标是在遵循策略​\pi_\theta的情况下,经过​k+1步从状态​s到达​x。我们可以先经过​k步从​s到达一个中间点​s'(任何状态都可以是中间点,​s'\in\mathcal{S}),然后在最后一步到达终点​x

通过这种方式,我们可以递归地更新访问概率:

\rho^\pi(s \to x, k+1) = \sum_{s'} \rho^\pi(s \to s', k) \rho^\pi(s' \to x, 1)

下面,我们把之前的公式再进行变化:

记住我们在上文中已经推导出了一个中间结果:

\nabla_\theta V^\pi(s) = \sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \sum_{s'} P(s' | s, a) \nabla_\theta V^\pi(s') \right)

为了方便书写,我们定义一个表示:

\phi(s) = \sum_{a \in \mathcal{A}} \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a)

下面我们接着推导:

step1 - step2:

简单的变换

step3:

由于我们之前关于访问序列的定义

\rho^\pi(s \to s', k=1) = \sum_{a} \pi_\theta(a|s)P(s'|s, a)

我们可以得到:

\nabla_\theta V^\pi(s) = \phi(s) + \sum_{s'} \rho^\pi(s \to s', 1) \nabla_\theta V^\pi(s')

step4:

下面展开​\nabla_\theta V^\pi(s')

\nabla_\theta V^\pi(s) = \phi(s) + \sum_{s'} \rho^\pi(s \to s', 1) \left[ \phi(s') + \sum_{s''} \rho^\pi(s' \to s'', 1) \nabla_\theta V^\pi(s'') \right]

step5:

把最后的中括号打开,注意刚才我们对访问序列的定义​\sum_{s'}\rho^\pi(s\to s', 1)​\sum_{s''}\rho^\pi(s'\to s'', 1)其实就是从​s​s''走两步,也就是​\sum_{s''}\rho^\pi(s\to s'',2),所以我们可以把公式推导为:

\nabla_\theta V^\pi(s) = \phi(s) + \sum_{s'} \rho^\pi(s \to s', 1) \phi(s') + \sum_{s''} \rho^\pi(s \to s'', 2) \nabla_\theta V^\pi(s'')

step6:

\dots = \phi(s) + \rho^\pi(s \to s', 1) \phi(s') + \rho^\pi(s \to s'', 2) \phi(s'') + \rho^\pi(s \to s''', 3) \nabla_\theta V^\pi(s''')

由此,我们把这个公式无限展开,最后可以得到我们想要的结果

step7:

把上面的都和到一起:

\nabla_\theta V^\pi(s) = \sum_{x \in \mathcal{S}} \sum_{k=0}^{\infty} \rho^\pi(s \to x, k) \phi(x)

状态​s的总梯度,等于未来每一个可能访问到的状态​x在每一个可能的时间步​k所产生的即时梯度贡献​\phi(x)的总和。

那么我们推导了这么一大堆,最终的目的是什么呢?

在最初对​\nabla_\theta V^\pi(s)的推导中,我们发现需要对​\nabla_\theta Q^\pi(s,a)​\nabla_\theta \pi_\theta(a|s)都进行求导,如下:

\nabla_\theta V^\pi(s) =\sum_{a \in \mathcal{A}} \left( \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a) + \pi_\theta(a|s) \nabla_\theta Q^\pi(s, a) \right)

在我们一大堆推导过后,​\nabla_\theta V^\pi(s)变形为:

\nabla_\theta V^\pi(s) = \sum_{x \in \mathcal{S}} \sum_{k=0}^{\infty} \rho^\pi(s \to x, k) \phi(x)

其中

\phi(x) = \sum_{a \in \mathcal{A}} \nabla_\theta \pi_\theta(a|s) Q^\pi(s, a)

发现了吗,我们通过推导消掉了​\nabla_\theta Q^\pi(s,a),只需要对​\nabla_\theta\pi_\theta(a|s)进行求导就可以了

策略梯度定理

下面,我们再进一步,推出策略梯度定理:

上面这个推导并没有太多难点,这里就不一步一步推导了,唯一的难点在于如何推导出$d^\pi(s)$

推导如下:

  • 定义访问总量:令​\eta(s)=\sum_{k=0}^{\infty} \rho^\pi(s_0\to s,k),这代表从初始状态出发,在整个生命周期内访问状态 ​s 的总期望次数。
  • 归一化处理:为了把次数变成概率,推导将​\eta(s)除以所有状态访问次数的总和​\sum_s \eta(s)。由于总和是一个常数,它不改变梯度的方向(使用​\propto符号表示正比于)。
  • 达成最终定理:归一化后的项正好就是平稳分布​d^\pi(s)

到这里,我们距离最终的策略梯度定理已经非常接近了,推导如下:

step1:

= \sum_{s \in \mathcal{S}} d^\pi(s) \sum_{a \in \mathcal{A}} \pi_\theta(a|s) Q^\pi(s, a) \frac{\nabla_\theta \pi_\theta(a|s)}{\pi_\theta(a|s)} -> \frac{\nabla_\theta \pi_\theta(a|s)}{\pi_\theta(a|s)} = \nabla_\theta \ln \pi_\theta(a|s)

使用对数导的方式化简等式(工程化)

step2:

= \mathbb{E}_{\pi} [Q^\pi(s, a) \nabla_\theta \ln \pi_\theta(a|s)]

到这里,我们终于得到了最终的版本的目标函数。

策略梯度的逐步创新

REINFORCE

有了基础的策略梯度公式,研究者在其基础上创新了基础的REINFORCE算法,即使用蒙特卡洛算法,将​Q^\pi(s, a)替换为​G_t,也就是全局采样的估计的价值,形成了以全局采样价值为基准更新参数梯度的算法。

但是,因为直接按照全局​G_t更新会造成更新方差极大,所以引入了Advantage的算法,从回报​G_t中减去一个基准值(Baseline)(通常是状态价值​V(s)),即​A=Q-V(TD Residual),这可以显著降低训练中的方差。

但是,REINFORCE的缺点是:

我们通过旧的策略(Policy-Model)生成Trajectory(s/r/a),用旧的V(s)(Value-Model)生成Advantage,但是一旦更新了这些Model,之前的Trajectory和Advantage就没法复用了。这会导致大量的数据浪费。

同样的,此时的Advantage是通过未更新的旧策略计算的​\hat{A}_t = r_t + \gamma V_\phi(s_{t+1}) - V_\phi(s_t)(V即价值函数Value Model,或者Critic Model)。如果我们用旧策略指引梯度的更新,我们需要确保更新的幅度不算太大,不然很可能出现一下子更新太多导致训飞了的情况(更新不稳定)。

TPRO

针对以上的情况,TPRO提出了基于约束的训练方法:

TRPO将优化问题定义为一个带约束的优化问题:

目标函数:

\text{maximize}_\theta \hat{\mathbb{E}}_t \left[ \frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)} \hat{A}_t \right]

约束条件:

\hat{\mathbb{E}}_t [ \text{KL}[\pi_{\theta_{\text{old}}}, \pi_\theta] ] \le \delta

基于目标函数和约束条件,我们将两者结合在一起提出TPRO的惩罚项公式:

可以看到,TPRO利用KL散度约束了旧策略和新策略的更新幅度,确保更新被限制在一个“信任区域”内。

TPRO的思想就是,新旧策略做出相同动作的概率越大越好,KL散度越小越好。

如果新旧策略在KL散度约束的信任区域内,那么我们就可以复用Trajectory,无需再采样一次。

同样的,因为我们的约束条件变了,也很难出现REINFORCE中更新步长太大导致训飞了的情况。

但是,TPRO的问题在于

  • 如果直接使用随机梯度下降求解的话,这个方程太过复杂,耗时太长,需要改进。
  • 同时,TPRO解决数据不能复用的方法比较死板,缺乏灵活性。

PPO

针对以上问题,PPO提出了Clipped Surrogate-Objective(裁剪代理目标函数)来解决问题。

其核心公式是:

L^{CLIP}(\theta) = \hat{\mathbb{E}}_t \left[ \min(r_t(\theta)\hat{A}_t, \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\hat{A}_t) \right]

注意此时​r_t(\theta)是之前TPRO中的

\frac{\pi_\theta(a_t | s_t)}{\pi_{\theta_{\text{old}}}(a_t | s_t)}

如下:

由此,我们能够一眼看明白,PPO提出的这个Clip其实就是在TPRO的基础上,把复杂的KL散度,换成了直接的Clip。

如果​\frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t| s_t)},也就是新旧策略的变化比值大于​\epsilon,通常为0.2,那么我直接clip这份梯度到​\epsilon,这样就避免了过大的梯度变化,而是将其限制到了合理的范围内。

GRPO

在之前PPO的基础上,DeekSeekV3论文中提出了GRPO的RL训练方案,根据公式,我们可以很直观的感受到差别:

  • 损失函数主体仍然是Clip + KL,但多了一个组内平均(1/G),同时KL的计算方式变为组内计算
  • 在计算Advantage时,使用组内reward的平均值和方差进行预估,而非直接使用​V(s)(价值函数或者value model),这样的操作直接省掉了一整个Value Model,可以极大降低资源需求

到这里,我们从理论角度对RL进行了一次从头到尾的分析,相信对RL公式中各种奇怪的符号有了一定的理解,并且可以通过看一眼公式就能对某个RL新方法有什么创新有一定的判断。

然而,相信对RLHF有工程经验的同学可能会好奇,我们在PPO的时候不是有四个Model吗,GRPO时候不是有三个Model吗?为什么理论分析中只提到Policy-Model(Actor)和Value Model(Critic),是不是漏了一些点?其实这是传统RL和RLHF的区别。

参考文献

1.Policy Gradient Algorithms
https://lilianweng.github.io/posts/2018-04-08-policy-gradient/
2.Proximal Policy Optimization Algorithms
https://arxiv.org/pdf/1707.06347
3.DeepSeek-V3 Technical Report 
https://arxiv.org/pdf/2412.1943