策略梯度入门:从 REINFORCE 到 Actor-Critic
Q-learning 先估计每个动作的价值,再选价值最大的动作;策略梯度则直接调整策略参数,让带来较高回报的动作以后更可能发生,让结果较差的动作概率下降。
这条路线特别适合随机策略和连续动作,但代价是梯度估计噪声很大、数据通常只能使用一次,而且更新过猛时容易破坏已有策略。本文从最小的随机策略开始,逐步解释 REINFORCE、基线、优势函数与 Actor-Critic 的关系。
1. 从动作价值转向参数化策略
设策略为 πθ(a|s),参数 θ 可以是一个表格,也可以是神经网络权重。它接收状态,并输出动作的概率分布。我们的目标是最大化策略产生轨迹的期望回报:
1 | J(θ) = Eτ~πθ [R(τ)] |
一条轨迹包含状态、动作和奖励。策略改变动作分布,动作又改变之后访问到的状态,因此无法像监督学习那样直接为每个动作准备“正确标签”。
策略梯度定理提供了一个可以从采样轨迹估计的方向:
1 | ∇θ J(θ) = E[Σt ∇θ log πθ(at|st) × A(st, at)] |
可以把它读成:动作的对数概率梯度,乘以该动作比基准好多少。
2. 为什么出现 log π
概率分布的期望中含有 πθ。使用恒等式:
1 | ∇θ πθ(a|s) = πθ(a|s) × ∇θ log πθ(a|s) |
就能把对所有动作求和改写成“从当前策略采样后取平均”。这称为对数导数技巧或 score-function estimator。它不要求奖励函数本身可导,只要求策略的对数概率对参数可导。
若某次动作带来正的优势,梯度上升会提高它的概率;若优势为负,则降低它的概率。更新的是概率分布,不是把动作直接推向某个数值标签。
3. REINFORCE:用完整回报加权动作
最基础的 Monte Carlo 策略梯度可以按以下流程工作:
flowchart TD
A[用当前策略采样完整轨迹] --> B[从后向前计算 rewards-to-go]
B --> C[每一步计算 log π 与回报乘积]
C --> D[对整批轨迹求平均梯度]
D --> E[梯度上升更新策略]
E --> A
在时刻 t,过去的奖励已经无法被当前动作改变,因此通常使用从当前时刻开始的 rewards-to-go:
1 | Gt = rt + γ rt+1 + γ² rt+2 + ... |
REINFORCE 用 Gt 加权 ∇ log π(at|st)。它只在一局结束后更新,不需要价值函数,也没有自举偏差;但一条轨迹的偶然性会影响其中许多动作,导致梯度方差很大。
4. 一个最小可运行实验
下面用两动作老虎机展示策略概率如何更新。动作 1 的成功概率为 0.8,动作 0 为 0.2。一个标量 logit 决定选择动作 1 的概率,运行均值作为基线。
1 | import math |
对于 Bernoulli 策略,action - probability_one 正好是动作对数概率关于 logit 的导数。这个例子没有状态和延迟奖励,因此不是完整 REINFORCE 训练器,但它把“高于基线的结果提高动作概率”这件事单独展示出来。
5. 基线为什么能降方差
直接使用 Gt 时,即使一局整体回报很高,也不代表其中每一步都比策略的通常表现更好。可以减去只依赖状态、不依赖当前动作的基线 b(st):
1 | ∇ log π(at|st) × [Gt - b(st)] |
在常见条件下,这不会改变期望梯度,却能显著降低方差。最自然的基线是状态价值 Vπ(st),此时括号中的量是在估计优势:
1 | Aπ(s, a) = Qπ(s, a) - Vπ(s) |
优势为正表示该动作比这个状态下的平均选择更好;为负表示更差。这样,策略更新比较的是相对表现,而不是把所有正回报动作都一律增强。
6. Actor-Critic:用 Critic 提供学习信号
当策略网络充当 Actor,价值网络充当 Critic,就得到 Actor-Critic 框架:
- Actor 决定采取什么动作;
- Critic 估计状态价值或动作价值;
- Critic 的误差为 Actor 提供低方差但可能带偏差的优势估计。
一步时序差分误差可以写成:
1 | δt = rt + γ V(st+1) - V(st) |
它可以作为优势的短期估计。与等到整局结束相比,Actor-Critic 能更早更新;代价是引入自举,Critic 的系统性错误也会误导 Actor。
| 方法 | 策略信号 | 是否等待完整轨迹 | 方差 | 主要风险 |
|---|---|---|---|---|
| REINFORCE | Monte Carlo 回报 | 通常是 | 高 | 样本效率低、更新噪声大 |
| REINFORCE + baseline | 回报减价值基线 | 通常是 | 较低 | 基线拟合不足 |
| Actor-Critic | TD 或多步优势 | 不一定 | 更低 | 自举偏差与双网络耦合 |
7. On-policy 意味着什么
Vanilla Policy Gradient 通常是 on-policy:梯度公式假设数据来自当前策略。更新参数后,旧轨迹由另一个行为分布产生,不能无限次原样复用。
这会带来三个工程后果:
- 每轮更新都需要继续与环境交互;
- 学习率过大时,新旧策略差异过大,估计容易失真;
- 训练日志必须区分采样策略和评估策略。
PPO 通过裁剪目标限制新旧策略概率比的变化,但它仍不是“旧数据可以永久重放”的算法。SAC 等 off-policy 方法则用不同机制复用经验回放数据。
8. 探索来自随机策略,但仍可能过早收缩
策略梯度通过当前随机策略采样动作,自然产生探索。然而,一旦某些动作概率过早接近零,后续几乎采不到它们,局部最优就可能被锁定。
常见做法包括加入熵奖励、限制每次更新幅度、从多个随机种子运行,以及监控动作分布而不只看平均回报。熵很高并不自动等于有效探索:在长时序任务中,随机抖动动作未必能到达真正陌生的状态。
9. 实验与调试清单
- 同时记录训练回报和关闭采样噪声后的评估回报;
- 报告多个随机种子的均值与波动,不只保留最好一次;
- 观察策略熵、动作概率和价值损失是否异常;
- 检查
terminated与truncated,避免错误决定是否自举; - 对优势做标准化时,只使用当前批次并记录实现选择;
- 奖励尺度变化后重新检查学习率与价值损失权重;
- 连续动作策略要监控标准差是否塌缩或无限增大。
10. 建议学习顺序
- 先理解 强化学习入门 中的回报、价值函数与 Bellman 关系;
- 用 探索与利用 理解随机策略为什么需要保留不确定性;
- 手推两动作 Softmax 策略的
∇ log π; - 实现 REINFORCE,并加入状态价值基线;
- 再学习 GAE、PPO 和连续动作分布。
进一步阅读可参考 Sutton 与 Barto《Reinforcement Learning: An Introduction》 以及 OpenAI Spinning Up 的 Vanilla Policy Gradient 说明。后者同时给出了策略梯度公式、on-policy 采样流程、优势估计和价值函数拟合步骤。