手推 Policy Gradient

1. 知识储备

1.1 期望 = 求和 / 积分

随机变量 ​X 的期望就是“按概率加权平均”:

  • 离散: ​\mathbb E[f(X)]=\sum_x p(x)f(x)
  • 连续: ​\mathbb E[f(X)]=\int p(x)f(x)\,dx

所以当我们写

\mathbb E_{\tau\sim p_\theta}[g(\tau)] = \int p_\theta(\tau)\,g(\tau)\,d\tau

只是把“对所有可能轨迹的加权平均”写成了积分形式;若轨迹是离散的,就把积分换成求和,本质一样。

1.2 log 求导(链式法则)

最基础的微积分:

\frac{d}{dx}\log x = \frac{1}{x}

对参数 ​\theta 的链式法则(这里关键是:​\theta 求导,不是对 ​x 求导):

\nabla_\theta \log x(\theta)=\frac{1}{x(\theta)}\nabla_\theta x(\theta)

​x(\theta)=p_\theta(\tau) ,得到 log-derivative trick

\nabla_\theta \log p_\theta(\tau) = \frac{1}{p_\theta(\tau)}\nabla_\theta p_\theta(\tau)

一个非常常用的等价写法是:

p_\theta(\tau)\,\nabla_\theta \log p_\theta(\tau)=\nabla_\theta p_\theta(\tau)

1.3 一个“神奇但常用”的恒等式: ​\mathbb E[\nabla\log p]=0

用积分写出来一眼就明白:

\mathbb E_{\tau\sim p_\theta}[\nabla_\theta\log p_\theta(\tau)] = \int p_\theta(\tau)\nabla_\theta\log p_\theta(\tau)\,d\tau = \int \nabla_\theta p_\theta(\tau)\,d\tau = \nabla_\theta \int p_\theta(\tau)\,d\tau = \nabla_\theta 1 = 0

这条等式后面会用来证明 baseline 不引入偏差。

2. 基础 Policy Gradient(REINFORCE)

2.1 目标函数

我们要最大化期望回报:

J(\theta)=\mathbb E_{\tau\sim p_\theta}[R(\tau)]

其中轨迹 ​\tau=(s_1,a_1,\dots,s_T,a_T) ,回报 ​R(\tau) 可以是整条轨迹的总回报 ​\sum_t r_t

2.2 关键一步:对“分布参数化的期望”求导

直接对 ​J(\theta) 求导:

\nabla_\theta J(\theta) = \nabla_\theta \int p_\theta(\tau) R(\tau)\,d\tau

把导数挪进积分(常见光滑条件下成立):

\nabla_\theta J(\theta) = \int \nabla_\theta p_\theta(\tau) R(\tau)\,d\tau

用上面那条 log-derivative trick:

\nabla_\theta p_\theta(\tau) = p_\theta(\tau)\nabla_\theta \log p_\theta(\tau)

代回去:

\nabla_\theta J(\theta) = \int p_\theta(\tau)\nabla_\theta \log p_\theta(\tau) R(\tau)\,d\tau = \mathbb E_{\tau\sim p_\theta}\big[\nabla_\theta \log p_\theta(\tau)\; R(\tau)\big]

这就是策略梯度的基本形式。

2.3 从“轨迹概率”到“逐步策略概率”

轨迹概率可以分解成:

p_\theta(\tau)=p(s_1)\prod_{t=1}^T \pi_\theta(a_t|s_t)\;p(s_{t+1}|s_t,a_t)

​\theta 求导只会影响 ​\pi_\theta (环境转移概率通常不依赖 ​\theta ):

\log p_\theta(\tau)=\text{const} + \sum_{t=1}^T \log \pi_\theta(a_t|s_t)
\nabla_\theta \log p_\theta(\tau)=\sum_{t=1}^T \nabla_\theta \log \pi_\theta(a_t|s_t)

所以:

\nabla_\theta J(\theta) = \mathbb E\left[\sum_{t=1}^T \nabla_\theta \log \pi_\theta(a_t|s_t)\; R(\tau)\right]

通常为了“把信用分配给早期动作”,会把 ​R(\tau) 换成从 ​t 开始的 return:

G_t = \sum_{t'=t}^T r_{t'}

得到常见的 REINFORCE 形式:

\nabla_\theta J(\theta) = \mathbb E\left[\sum_{t=1}^T \nabla_\theta \log \pi_\theta(a_t|s_t)\; G_t\right]

在 RL 里,大家常说的 REINFORCE 通常特指最基础的 Monte Carlo policy gradient(也叫
likelihood-ratio / score-function estimator)
更新: ​\Delta\theta\propto\sum_t\nabla_\theta\log\pi_\theta(a_t|s_t)G_t

2.4 为什么看起来像“最大化似然”?

把梯度写成能由自动微分得到的“代理目标”:

\tilde J(\theta)=\mathbb E\Big[\sum_t G_t \log\pi_\theta(a_t|s_t)\Big]

若把 ​G_t 当作常数权重(实现里 detach),那么

\nabla_\theta \tilde J(\theta) = \mathbb E\Big[\sum_t G_t \nabla_\theta \log\pi_\theta(a_t|s_t)\Big]

这和策略梯度一致。

因此我们可以用 loss 写:

\mathcal L_{\text{actor}} = -\mathbb E\big[\sum_t G_t \log\pi_\theta(a_t|s_t)\big]

这就是“加权 log-likelihood(weighted MLE)”的味道:监督学习是 ​\sum \log \pi ,这里是 ​\sum w\log \pi (权重来自回报/优势)。

  • 离散动作: ​-\log \pi 是交叉熵项 → advantage/return 加权的 cross-entropy
  • 高斯策略: ​-\log \pi 展开后是平方误差 → advantage/return 加权的 squared error

3. 改进版 Baseline(不偏 + 降方差)

REINFORCE 的痛点:方差太大。baseline 是最经典的“控制变量”技巧,它不引入偏差,且降低了方差。

3.1 baseline 为什么不引入偏差(unbiased)

我们把 ​G_t 换成 ​G_t-b

\nabla_\theta J(\theta) = \mathbb E\left[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t)\; (G_t-b)\right]

关键在于证明 baseline 那项的期望为 0:

\mathbb E\Big[\nabla_\theta \log \pi_\theta(a_t|s_t)\; b\Big] = b\;\mathbb E\big[\nabla_\theta \log \pi_\theta(a_t|s_t)\big]=0

因为对固定状态 ​s

\mathbb E_{a\sim\pi(\cdot|s)}[\nabla_\theta \log \pi_\theta(a|s)] = \sum_a \pi_\theta(a|s)\nabla_\theta \log \pi_\theta(a|s) = \sum_a \nabla_\theta \pi_\theta(a|s) = \nabla_\theta \sum_a \pi_\theta(a|s) = \nabla_\theta 1 = 0

所以 baseline 不改变期望梯度,只影响方差。

常见更强版本是 state-dependent baseline​b=b(s_t) 。同样成立,因为 ​b(s_t) 对动作求期望时是常数。

3.2 “何以见得 baseline 降方差?”——不是 ​\mathrm{Var}(G-b) 变小

这个问题非常关键:

\mathrm{Var}(G-b)=\mathrm{Var}(G)

减常数本身不会改变方差。

真正降的是梯度估计器的方差,因为它是乘积:

X := \nabla_\theta \log \pi_\theta(a|s),\quad R:=G

单样本梯度估计:

g(b)=X(R-b)

我们要最小化 ​\mathrm{Var}(g(b)) 。由于 ​\mathbb E[g(b)]​b 无关(unbiased),等价于最小化二阶矩:

\min_b \mathbb E[g(b)^2]=\min_b \mathbb E[X^2(R-b)^2]

展开它:

\mathbb E[X^2(R-b)^2] = \mathbb E[X^2R^2] -2b\mathbb E[X^2R] + b^2\mathbb E[X^2]

这是一个关于 ​b 的二次凸函数(因为 ​\mathbb E[X^2]\ge 0 )。对 ​b 求导并令 0:

\frac{d}{db}\mathbb E[X^2(R-b)^2] =2\big(b\mathbb E[X^2]-\mathbb E[X^2R]\big)=0

得到最优常数 baseline:

b^*=\frac{\mathbb E[X^2R]}{\mathbb E[X^2]}

这说明:存在一个 ​b^* 能让方差最小;实践中用 batch 平均回报或 ​V(s) 去近似它,就能显著降方差。

3.3 从 baseline 到 Advantage: ​A=G-V(s)

最常用的 baseline 是状态值函数:

b(s_t)\approx V^\pi(s_t)=\mathbb E[G_t|s_t]

于是定义优势函数:

A_t = G_t - V(s_t)

策略梯度变成:

\nabla_\theta J(\theta) = \mathbb E\left[\sum_t \nabla_\theta \log \pi_\theta(a_t|s_t)\; A_t\right]

对应 surrogate objective / actor loss:

\mathcal L_{\text{actor}} = -\mathbb E\big[\sum_t A_t\;\log\pi_\theta(a_t|s_t)\big]

这就是“像最大化似然”的那部分:用优势当权重的 log-likelihood

实现时非常重要的一点:优势要 stop-gradient(detach),否则就不再对应这个推导里的策略梯度估计器:

loss_actor = -(adv.detach() * log_prob).mean()

​V(s) 本身用回归去学(比如 MSE):

\mathcal L_{\text{critic}}=\mathbb E[(V_\phi(s_t)-G_t)^2]

这就走向了 advantage actor-critic 的基本形态。

3. 总结

  1. ​\nabla_\theta \mathbb E_{x\sim p_\theta}[f(x)] = \mathbb E[f(x)\nabla_\theta\log p_\theta(x)] (log-derivative trick)
  2. ​\mathbb E[\nabla_\theta\log \pi_\theta(a|s)]=0 (baseline 不偏的根)
  3. ​\min_b \mathbb E[X^2(R-b)^2]\Rightarrow b^*=\frac{\mathbb E[X^2R]}{\mathbb E[X^2]} (baseline 降方差的根)

Comments