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 策略梯度可以按以下流程工作:

在时刻 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import math
import random


def sigmoid(value):
return 1.0 / (1.0 + math.exp(-value))


rng = random.Random(7)
success_probability = [0.2, 0.8]
logit = 0.0
baseline = 0.0
alpha = 0.05

for step in range(1, 5001):
probability_one = sigmoid(logit)
action = 1 if rng.random() < probability_one else 0
reward = 1.0 if rng.random() < success_probability[action] else 0.0

advantage = reward - baseline
score = action - probability_one
logit += alpha * advantage * score

baseline += (reward - baseline) / step

print("P(action=1):", round(sigmoid(logit), 3))
print("average reward:", round(baseline, 3))

对于 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:梯度公式假设数据来自当前策略。更新参数后,旧轨迹由另一个行为分布产生,不能无限次原样复用。

这会带来三个工程后果:

  1. 每轮更新都需要继续与环境交互;
  2. 学习率过大时,新旧策略差异过大,估计容易失真;
  3. 训练日志必须区分采样策略和评估策略。

PPO 通过裁剪目标限制新旧策略概率比的变化,但它仍不是“旧数据可以永久重放”的算法。SAC 等 off-policy 方法则用不同机制复用经验回放数据。

8. 探索来自随机策略,但仍可能过早收缩

策略梯度通过当前随机策略采样动作,自然产生探索。然而,一旦某些动作概率过早接近零,后续几乎采不到它们,局部最优就可能被锁定。

常见做法包括加入熵奖励、限制每次更新幅度、从多个随机种子运行,以及监控动作分布而不只看平均回报。熵很高并不自动等于有效探索:在长时序任务中,随机抖动动作未必能到达真正陌生的状态。

9. 实验与调试清单

  • 同时记录训练回报和关闭采样噪声后的评估回报;
  • 报告多个随机种子的均值与波动,不只保留最好一次;
  • 观察策略熵、动作概率和价值损失是否异常;
  • 检查 terminatedtruncated,避免错误决定是否自举;
  • 对优势做标准化时,只使用当前批次并记录实现选择;
  • 奖励尺度变化后重新检查学习率与价值损失权重;
  • 连续动作策略要监控标准差是否塌缩或无限增大。

10. 建议学习顺序

  1. 先理解 强化学习入门 中的回报、价值函数与 Bellman 关系;
  2. 探索与利用 理解随机策略为什么需要保留不确定性;
  3. 手推两动作 Softmax 策略的 ∇ log π
  4. 实现 REINFORCE,并加入状态价值基线;
  5. 再学习 GAE、PPO 和连续动作分布。

进一步阅读可参考 Sutton 与 Barto《Reinforcement Learning: An Introduction》 以及 OpenAI Spinning Up 的 Vanilla Policy Gradient 说明。后者同时给出了策略梯度公式、on-policy 采样流程、优势估计和价值函数拟合步骤。