策略梯度方法 学习笔记
本文结合豆包生成
策略梯度方法的核心思想
在强化学习中,策略梯度(Policy Gradient, PG)方法直接对策略本身进行参数化并优化,而不是先学价值函数再间接导出策略。
-
策略:
\[\pi_\theta(a \mid s) \]用参数 \(\theta\)(通常是神经网络)表示在状态 \(s\) 下选择动作 \(a\) 的概率。
-
目标:最大化期望回报
\[J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)] \]其中 \(\tau = (s_0, a_0, s_1, a_1, \dots)\) 是一条轨迹。
策略梯度的关键在于直接对 \(J(\theta)\) 求梯度,并用梯度上升更新策略参数
策略梯度定理
目标函数梯度的可计算形式(附录中有讲这个是怎么来的):
其中:
- \(G_t = \sum_{k=t}^T \gamma^{k-t} r_k\):从时刻 (t) 开始的累计回报
- \(\log \pi_\theta(a_t \mid s_t)\):对数似然
- \(\gamma\):折扣因子
策略梯度定理的伟大之处在于:
它将一个无法直接计算的梯度(因为目标函数的期望依赖于参数\(\theta\)本身),转化为了一个可以通过采样估计的期望。
这意味着我们只需要:
- 用当前策略\(\pi_\theta\)采样若干条完整轨迹
- 对每条轨迹计算\(\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot G_t\)
- 取所有轨迹的平均值作为梯度的无偏估计
- 用梯度上升更新参数\(\theta\)
这正是REINFORCE算法的核心逻辑。
期望怎么求?引入REINFORCE 算法
策略梯度定理的等价形式
上面给出的是"累计回报形式",还有一种是优势函数形式(引入baseline \(V(s_t)\)后):
其中 \(A_t = G_t - V(s_t)\) 是优势函数,表示"在状态 \(s_t\) 下选择动作 \(a_t\) 比平均水平好多少"。这一形式是PPO、A2C等现代算法的基础。
REINFORCE 算法
REINFORCE 是最基础、最经典的 Monte Carlo 策略梯度算法,由 Williams(1992)提出。
它直接使用完整轨迹的采样回报来估计梯度:
梯度上升更新:
为了减少方差,通常引入baseline(在不改变梯度期望的前提下,尽可能减小梯度估计的方差,例如上文\(V(s_t)\))
优点
- 无偏估计(unbiased)
- 概念简单,适合理论分析
- 可直接用于连续动作空间
缺点
- 方差极大
- 需要完整 episode(Monte Carlo)
- 样本效率低
重要性采样(Importance Sampling, IS)
在很多场景中:
- 当前策略是 (\(\pi_\theta\))
- 但数据来自旧策略 (\(\pi_{\theta'}\))
即 off-policy 学习问题。
此时直接用旧数据估计新策略的期望是错误的,需要用到重要性采样。
重要性采样的基本公式
对任意函数 \(f(\tau)\):
轨迹级重要性权重:
带重要性采样的策略梯度
注意\(w(\tau)\)是修正了轨迹出现的概率,所以其他的部分是不变的。
但直接使用轨迹级权重:
- 方差极高(\(w(\tau)\)分子可能极小)
- 数值极不稳定
常见改进:使用每步重要性采样、PPO等
每步重要性采样
上文介绍的轨迹级重要性采样实际中几乎不使用。现代Off-Policy策略梯度算法(如PPO、DDPG)普遍采用每步重要性采样,即对每一步单独计算权重:
对应的梯度公式为:
每步权重的方差远小于轨迹级权重,数值稳定性大幅提升。
附录
目标函数梯度的可计算形式怎么来的?
基础的定义:
- 策略:\(\pi_\theta(a \mid s)\),参数\(\theta\)
- 轨迹:\(\tau = (s_0, a_0, s_1, a_1, \dots, s_T, a_T)\)
- 轨迹在策略\(\pi_\theta\)下的发生概率:\[p_\theta(\tau) = p(s_0) \prod_{t=0}^T \pi_\theta(a_t \mid s_t) p(s_{t+1} \mid s_t, a_t) \]其中\(p(s_0)\)是初始状态分布,\(p(s_{t+1} \mid s_t, a_t)\)是环境转移概率(与\(\theta\)无关)
- 目标函数(最大化期望总折扣回报):\[J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}[R(\tau)] = \mathbb{E}_{\tau \sim \pi_\theta}\left[ \sum_{t=0}^T \gamma^t r_t \right] \]
- 从时刻\(t\)开始的折扣累计回报:\[G_t = \sum_{k=t}^T \gamma^{k-t} r_k \]
步骤1:将目标函数展开为积分形式
期望本质上是对所有可能轨迹的加权积分,权重是轨迹的发生概率:
步骤2:对参数\(\theta\)求梯度
我们的目标是求\(\nabla_\theta J(\theta)\)。根据莱布尼茨积分法则:
步骤3:使用对数导数技巧
这是概率统计中处理分布梯度的标准技巧,利用恒等式:
证明:对\(\log p_\theta(\tau)\)求导得\(\frac{\nabla_\theta p_\theta(\tau)}{p_\theta(\tau)}\),两边同乘\(p_\theta(\tau)\)即得。
代入梯度表达式:
这正好是期望的定义,因此可以改写为:
步骤4:化简\(\nabla_\theta \log p_\theta(\tau)\)
将轨迹概率\(p_\theta(\tau)\)代入对数:
对\(\theta\)求梯度时,只有\(\pi_\theta(a_t \mid s_t)\)与\(\theta\)有关,初始状态分布\(p(s_0)\)和环境转移概率\(p(s_{t+1} \mid s_t, a_t)\)的梯度均为0。因此:
步骤5:代入并展开期望
将上式代入梯度表达式:
根据期望的线性性:
步骤6:去掉无关的历史回报项
总回报\(R(\tau) = \sum_{k=0}^T \gamma^k r_k\)可以拆分为两部分:
对于第一部分(历史回报),我们有一个重要性质:
对任意与动作\(a_t\)无关的随机变量\(X\),有:
\[\mathbb{E}_{a_t \sim \pi_\theta(\cdot \mid s_t)}\left[ \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot X \mid s_t \right] = 0 \]
证明:
因此,历史回报项与\(\nabla \log \pi(a_t \mid s_t)\)乘积的期望为0,可以直接去掉。
步骤7:整理得到最终形式
剩下的只有时刻\(t\)及以后的回报:
代入梯度表达式:
原文中的公式:
省略了\(\gamma^t\)项:
- \(\gamma^t\)是一个正的标量乘数,不改变梯度的方向(梯度上升的优化方向不变)
- 在实际实现中,\(\gamma^t\)的影响可以通过调整学习率\(\alpha\)来补偿

浙公网安备 33010602011771号