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. 总结
- \nabla_\theta \mathbb E_{x\sim p_\theta}[f(x)] = \mathbb E[f(x)\nabla_\theta\log p_\theta(x)] (log-derivative trick)
- \mathbb E[\nabla_\theta\log \pi_\theta(a|s)]=0 (baseline 不偏的根)
- \min_b \mathbb E[X^2(R-b)^2]\Rightarrow b^*=\frac{\mathbb E[X^2R]}{\mathbb E[X^2]} (baseline 降方差的根)
Comments