策略梯度方法 学习笔记

本文结合豆包生成

策略梯度方法的核心思想

在强化学习中,策略梯度(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)\) 求梯度,并用梯度上升更新策略参数

策略梯度定理

目标函数梯度的可计算形式(附录中有讲这个是怎么来的):

\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot G_t \right] \]

其中:

  • \(G_t = \sum_{k=t}^T \gamma^{k-t} r_k\):从时刻 (t) 开始的累计回报
  • \(\log \pi_\theta(a_t \mid s_t)\):对数似然
  • \(\gamma\):折扣因子

策略梯度定理的伟大之处在于:

它将一个无法直接计算的梯度(因为目标函数的期望依赖于参数\(\theta\)本身),转化为了一个可以通过采样估计的期望。

这意味着我们只需要:

  1. 用当前策略\(\pi_\theta\)采样若干条完整轨迹
  2. 对每条轨迹计算\(\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot G_t\)
  3. 取所有轨迹的平均值作为梯度的无偏估计
  4. 用梯度上升更新参数\(\theta\)

这正是REINFORCE算法的核心逻辑。

期望怎么求?引入REINFORCE 算法

策略梯度定理的等价形式

上面给出的是"累计回报形式",还有一种是优势函数形式(引入baseline \(V(s_t)\)后):

\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta} \left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot A_t \right] \]

其中 \(A_t = G_t - V(s_t)\) 是优势函数,表示"在状态 \(s_t\) 下选择动作 \(a_t\) 比平均水平好多少"。这一形式是PPO、A2C等现代算法的基础。

REINFORCE 算法

REINFORCE 是最基础、最经典的 Monte Carlo 策略梯度算法,由 Williams(1992)提出。

它直接使用完整轨迹的采样回报来估计梯度:

\[\nabla_\theta J(\theta) \approx \sum_{t} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot G_t \]

梯度上升更新:

\[\theta \leftarrow \theta + \alpha \sum_t \nabla_\theta \log \pi_\theta(a_t \mid s_t) G_t \]

为了减少方差,通常引入baseline(在不改变梯度期望的前提下,尽可能减小梯度估计的方差,例如上文\(V(s_t)\)

优点

  • 无偏估计(unbiased)
  • 概念简单,适合理论分析
  • 可直接用于连续动作空间

缺点

  • 方差极大
  • 需要完整 episode(Monte Carlo)
  • 样本效率低

重要性采样(Importance Sampling, IS)

在很多场景中:

  • 当前策略是 (\(\pi_\theta\))
  • 但数据来自旧策略 (\(\pi_{\theta'}\))

即 off-policy 学习问题。

此时直接用旧数据估计新策略的期望是错误的,需要用到重要性采样。

重要性采样的基本公式

对任意函数 \(f(\tau)\)

\[\mathbb{E}_{\tau \sim \pi_\theta}[f(\tau)] = \mathbb{E}_{\tau \sim \pi_{\theta'}} \left[ \frac{p_\theta(\tau)}{p_{\theta'}(\tau)} f(\tau) \right] \]

轨迹级重要性权重:

\[w(\tau) = \prod_t \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta'}(a_t \mid s_t)} \]

带重要性采样的策略梯度

\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_{\theta'}} \left[ w(\tau) \sum_t \nabla_\theta \log \pi_\theta(a_t \mid s_t) G_t \right] \]

注意\(w(\tau)\)是修正了轨迹出现的概率,所以其他的部分是不变的。

但直接使用轨迹级权重:

  • 方差极高(\(w(\tau)\)分子可能极小)
  • 数值极不稳定

常见改进:使用每步重要性采样、PPO等

每步重要性采样

上文介绍的轨迹级重要性采样实际中几乎不使用。现代Off-Policy策略梯度算法(如PPO、DDPG)普遍采用每步重要性采样,即对每一步单独计算权重:

\[w_t = \frac{\pi_\theta(a_t \mid s_t)}{\pi_{\theta'}(a_t \mid s_t)} \]

对应的梯度公式为:

\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_{\theta'}} \left[ \sum_{t=0}^{T} w_t \cdot \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot A_t \right] \]

每步权重的方差远小于轨迹级权重,数值稳定性大幅提升。


附录

目标函数梯度的可计算形式怎么来的?

基础的定义:

  • 策略:\(\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:将目标函数展开为积分形式

期望本质上是对所有可能轨迹的加权积分,权重是轨迹的发生概率:

\[J(\theta) = \int_\tau p_\theta(\tau) R(\tau) d\tau \]

步骤2:对参数\(\theta\)求梯度

我们的目标是求\(\nabla_\theta J(\theta)\)。根据莱布尼茨积分法则

\[\nabla_\theta J(\theta) = \int_\tau \nabla_\theta p_\theta(\tau) \cdot R(\tau) d\tau \]

步骤3:使用对数导数技巧

这是概率统计中处理分布梯度的标准技巧,利用恒等式:

\[\nabla_\theta p_\theta(\tau) = p_\theta(\tau) \cdot \nabla_\theta \log p_\theta(\tau) \]

证明:对\(\log p_\theta(\tau)\)求导得\(\frac{\nabla_\theta p_\theta(\tau)}{p_\theta(\tau)}\),两边同乘\(p_\theta(\tau)\)即得。

代入梯度表达式:

\[\nabla_\theta J(\theta) = \int_\tau p_\theta(\tau) \cdot \nabla_\theta \log p_\theta(\tau) \cdot R(\tau) d\tau \]

这正好是期望的定义,因此可以改写为:

\[\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[ \nabla_\theta \log p_\theta(\tau) \cdot R(\tau) \right] \]

步骤4:化简\(\nabla_\theta \log p_\theta(\tau)\)

将轨迹概率\(p_\theta(\tau)\)代入对数:

\[\log p_\theta(\tau) = \log p(s_0) + \sum_{t=0}^T \left[ \log \pi_\theta(a_t \mid s_t) + \log p(s_{t+1} \mid s_t, a_t) \right] \]

\(\theta\)求梯度时,只有\(\pi_\theta(a_t \mid s_t)\)\(\theta\)有关,初始状态分布\(p(s_0)\)和环境转移概率\(p(s_{t+1} \mid s_t, a_t)\)的梯度均为0。因此:

\[\nabla_\theta \log p_\theta(\tau) = \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \]

步骤5:代入并展开期望

将上式代入梯度表达式:

\[\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[ \left( \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \right) \cdot R(\tau) \right] \]

根据期望的线性性:

\[\nabla_\theta J(\theta) = \sum_{t=0}^T \mathbb{E}_{\tau \sim \pi_\theta}\left[ \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot R(\tau) \right] \]

步骤6:去掉无关的历史回报项

总回报\(R(\tau) = \sum_{k=0}^T \gamma^k r_k\)可以拆分为两部分:

\[R(\tau) = \underbrace{\sum_{k=0}^{t-1} \gamma^k r_k}_{\text{时刻t之前的回报,与}a_t\text{无关}} + \underbrace{\sum_{k=t}^T \gamma^k r_k}_{\text{时刻t及以后的回报,与}a_t\text{有关}} \]

对于第一部分(历史回报),我们有一个重要性质:

对任意与动作\(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 \]

证明

\[\begin{align*} \mathbb{E}_{a_t \sim \pi_\theta}\left[ \nabla \log \pi(a_t \mid s_t) \mid s_t \right] &= \sum_{a_t} \pi(a_t \mid s_t) \cdot \nabla \log \pi(a_t \mid s_t) \\ &= \sum_{a_t} \nabla \pi(a_t \mid s_t) \\ &= \nabla \sum_{a_t} \pi(a_t \mid s_t) \\ &= \nabla 1 = 0 \end{align*} \]

因此,历史回报项与\(\nabla \log \pi(a_t \mid s_t)\)乘积的期望为0,可以直接去掉。

步骤7:整理得到最终形式

剩下的只有时刻\(t\)及以后的回报:

\[\sum_{k=t}^T \gamma^k r_k = \gamma^t \cdot \sum_{k=t}^T \gamma^{k-t} r_k = \gamma^t G_t \]

代入梯度表达式:

\[\nabla_\theta J(\theta) = \mathbb{E}_{\tau \sim \pi_\theta}\left[ \sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot \gamma^t G_t \right] \]

原文中的公式:

\[\nabla_\theta J(\theta) = \mathbb{E}_{\pi_\theta}\left[ \sum_{t=0}^{T} \nabla_\theta \log \pi_\theta(a_t \mid s_t) \cdot G_t \right] \]

省略了\(\gamma^t\)项:

  1. \(\gamma^t\)是一个正的标量乘数,不改变梯度的方向(梯度上升的优化方向不变)
  2. 在实际实现中,\(\gamma^t\)的影响可以通过调整学习率\(\alpha\)来补偿
posted @ 2026-02-06 20:16  wljss  阅读(185)  评论(0)    收藏  举报