外观
策略梯度与价值函数基础
强化学习的优化范式追溯
监督学习需要输入对应的目标标签;序贯决策中,逐步给出“正确动作”往往比给出成功、失败或任务得分更困难。强化学习(Reinforcement Learning, RL)使用交互产生的奖励信号评价整段行为,再据此调整策略。

图 3.3-1:PPO 学到的人形策略连续转向并奔向目标,展示策略梯度最终优化的是可观察行为。 出处:John Schulman et al.,Proximal Policy Optimization Algorithms(2017),Figure 5。
Williams 给出了用采样回报更新随机策略参数的 REINFORCE 算法 [Williams, 1992]。Sutton 等人随后给出策略梯度定理,并讨论结合函数近似价值函数的 actor–critic 形式 [Sutton et al., 1999]。本节从概率论推导策略梯度,并说明价值基线如何降低梯度估计方差;这两篇引用分别对应算法估计器与定理。

图 3.3-2:DDPG 在摆杆、机械臂、跑步与驾驶任务上的画面展示确定性策略梯度的连续控制范围。 出处:Timothy P. Lillicrap et al.,Continuous Control with Deep Reinforcement Learning(2016),Figure 1。
策略与轨迹的数学描述
先在有限时域马尔可夫决策过程(MDP)中定义策略、轨迹和回报。时间步为
策略函数的定义
策略(Policy)是在给定状态
这里的
轨迹与期望回报
智能体在环境中从初始状态
轨迹发生的联合概率由策略和环境共同决定。利用概率论中的链式法则(乘法公式),我们可以将轨迹
其中
一条轨迹的总回报(Return)是沿着该轨迹收集到的所有奖励之和。为了保证序列收敛(特别是在无限期任务中),我们引入折扣因子(Discount Factor)
目标函数与对数导数技巧
目标是寻找使期望回报尽可能大的参数
如果是离散动作空间,这里的积分号就替换为对所有可能轨迹的求和。 为了最大化
其中
对数导数技巧(Log-Derivative Trick)
在高中数学中,我们知道复合函数求导的链式法则。特别地,对于自然对数函数
将其稍微移项,我们得到:
把这个恒等式代回目标函数梯度:
这样便把对轨迹概率的求导改写为一个可采样的期望。实际训练不必枚举所有轨迹,而是运行策略收集轨迹,用蒙特卡洛平均估计梯度。
拆解轨迹概率的对数梯度
接着,我们需要计算
若环境动力学和初始状态分布不依赖策略参数

图 3.3-3:轨迹连乘取对数后变成逐时刻求和;只有策略因子含 θ,因此初始分布和环境转移项在求导时消失。
代回目标梯度,可得经典的 REINFORCE 估计式:
注意
这个估计式不要求写出或求导环境转移概率,因此可用于 model-free 场景。
因果性与奖励截断
这个估计式的方差通常较高。项
从基本的逻辑因果律(Causality)出发:在时刻
在标准因果假设下,动作发生前的奖励与当前动作的 score 项期望为零。因此可把整条轨迹回报替换为从时刻

图 3.3-4:因果连线形成下三角支持区域;a_t 只能影响未来奖励,所以策略梯度用 G_t 而不是整条轨迹的总回报。
由于
在梯度上升中,正的
价值函数的引入与基线技巧
尽管因果性截断降低了一部分方差,但蒙特卡洛采样的本质决定了

图 3.3-5:A3C 在多款 Atari 游戏上的分数散点把 actor–critic 的策略更新与经验性能联系起来。 出处:Volodymyr Mnih et al.,Asynchronous Methods for Deep Reinforcement Learning(2016),Figure 2。
状态价值与动作价值
状态价值函数
动作价值函数
两者的关系非常直接:处于状态
引入基线(Baseline)
在该公式中,我们用
若某个状态下所有动作通常都能得到约 100 分,那么一次 101 分的结果只是略好于常态。减去该状态的平均水平后,更新权重由 101 变为约 1,更直接地表示这次动作的相对表现。
在数学上,我们可以证明,在策略梯度的计算式中减去任意一个不依赖于具体动作

图 3.3-6:同一个 b(s) 被所有动作分支共享,可移出动作求和;剩余 score 的期望等于归一化概率总和 1 的梯度,因此为零。本文根据上述基线性质绘制
最自然、最合理的基线选择,正是状态价值函数

图 3.3-7:三种 3D 人形控制任务的学习曲线显示带价值估计的策略优化如何随训练提升。 出处:John Schulman et al.,Proximal Policy Optimization Algorithms(2017),Figure 4。
我们定义优势函数(Advantage Function) 为动作价值与状态价值之差:
若使用真实优势函数,策略梯度可写为:
在实际代码实现中,如果我们只使用纯粹的 REINFORCE 算法,往往只会减去一个基于蒙特卡洛采样的基线。下面,我们将通过具体的代码来实现带有基线的 REINFORCE 算法。
代码实现:带基线的 REINFORCE
以下代码展示了如何使用深度学习框架实现带基线的策略梯度优化。我们假设环境提供了一维离散动作空间,并使用多层感知机(MLP)作为策略网络。
python
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.distributions import Categorical
class PolicyNetwork(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.fc1 = nn.Linear(state_dim, 128)
self.fc2 = nn.Linear(128, action_dim)
def forward(self, x):
# 经过线性层和ReLU激活
x = F.relu(self.fc1(x))
# 输出动作的对数概率前馈,使用softmax转换为离散概率分布
action_probs = F.softmax(self.fc2(x), dim=-1)
return action_probs
def compute_returns(rewards, gamma=0.99):
# 计算从后向前的未来累积回报 G_t
returns = []
R = 0
for r in reversed(rewards):
R = r + gamma * R
returns.insert(0, R)
returns = torch.tensor(returns)
# 批内标准化回报:常见的数值稳定技巧,不等同于学习到的状态价值基线
returns = (returns - returns.mean()) / (returns.std() + 1e-8)
return returns
def reinforce_update(policy_net, optimizer, saved_log_probs, rewards, gamma=0.99):
# 计算并标准化 G_t
returns = compute_returns(rewards, gamma)
policy_loss = []
# 遍历轨迹中的每一步,计算对数梯度与回报的乘积
for t, (log_prob, G) in enumerate(zip(saved_log_probs, returns)):
# 策略梯度的实现:我们希望最大化目标函数 J,即最小化 -J
# 由于 PyTorch 的优化器执行的是梯度下降(Gradient Descent)
# 因此我们在前向附加一个负号
policy_loss.append(-(gamma ** t) * log_prob * G)
# 对时间步求和,反向传播
policy_loss = torch.stack(policy_loss).sum()
optimizer.zero_grad()
policy_loss.backward()
optimizer.step()代码保留了与起点折扣目标一致的外层
小结
在本节中,我们详细拆解了强化学习中的策略梯度定理:
- 从马尔可夫决策过程的轨迹分布出发,我们定义了由策略网络参数化的目标期望函数。
- 通过引入复合函数求导中经典的对数导数技巧,我们将目标函数的梯度转化为可以从环境中采样的期望形式,克服了无法获知环境状态转移概率分布的难题。
- 遵循严格的因果时间序律,我们使用未来累积回报取代了轨迹总回报。
- 为了抑制蒙特卡洛采样带来的巨大方差,我们引入了状态价值、动作价值的严格定义,并通过推导优势函数,引入了用于修正权重的**基线(Baseline)**概念。
轨迹概率、score-function 估计、return-to-go 和基线是理解 PPO、TRPO 等策略优化方法的共同基础。SAC 还引入熵正则和 off-policy 价值学习,不能只由本节公式直接得到。

