1. 策略梯度方法的核心直觉
第一次接触策略梯度(Policy Gradient)时,最让我困惑的是:为什么直接对策略函数进行梯度上升就能优化智能体的表现?传统监督学习中我们优化的是损失函数,而强化学习里这个"直觉"从何而来?通过CS285课程和实际项目验证,我发现理解这个问题的关键在于三个视角:
-
轨迹概率视角:在强化学习中,策略π决定了状态-动作轨迹τ的概率分布P(τ|π)。当我们调整策略参数θ时,实际上是在调整整个轨迹空间的概率质量分布。高回报的轨迹应该获得更高的出现概率,这个直观想法直接引出了策略梯度定理。
-
采样期望视角:策略梯度方法本质上是利用蒙特卡洛采样来估计期望回报的梯度。与值函数方法不同,它直接操作策略参数空间,避免了值函数近似带来的偏差问题。我在机器人控制项目中实测发现,这种直接优化方式在连续动作空间中特别有效。
-
得分函数技巧:策略梯度定理的数学基础其实是概率论中的得分函数(Score Function)概念。策略函数对参数的梯度∇logπ(a|s)就像一个"探索方向指示器",告诉我们如何调整参数才能增加某个动作的选择概率。
关键理解:策略梯度不是凭空发明的数学技巧,而是对"如何通过参数调整获得更高回报"这个核心问题的自然解答。它的美妙之处在于将复杂的强化学习问题转化为可计算的梯度上升过程。
2. 从直观理解到数学推导
2.1 目标函数的定义
强化学习的根本目标是最大化期望回报:
code复制J(θ) = E_{τ∼π_θ}[R(τ)] = ∫ P(τ|θ)R(τ)dτ
其中R(τ)表示轨迹τ的总回报。这个积分在实际中无法直接计算,因为:
- 状态-动作空间通常是高维连续空间
- 环境动态P(s'|s,a)可能未知
- 策略π_θ引入了复杂的依赖关系
我在无人机控制项目中就遇到过这个问题——直接计算期望回报的解析解根本不可能。策略梯度方法的突破点在于:我们不需要计算J(θ)本身,只需要它的梯度∇J(θ)!
2.2 策略梯度定理的推导
通过一系列数学变换(详细推导建议参考CS285 Lecture Notes),我们可以得到:
code复制∇J(θ) = E_{τ∼π_θ}[∇logP(τ|θ)R(τ)]
这个形式已经可以用于计算了,但还可以进一步分解。由于轨迹概率P(τ|θ)可以表示为:
code复制P(τ|θ) = P(s_0)∏π_θ(a_t|s_t)P(s_{t+1}|s_t,a_t)
取对数后环境动态P(s_{t+1}|s_t,a_t)项会消失(因为与θ无关),最终得到策略梯度的经典形式:
code复制∇J(θ) = E_{τ∼π_θ}[∑∇logπ_θ(a_t|s_t)(∑r_t')]
其中内部求和是从t时刻到episode结束的累计回报。
推导技巧:这个过程中最关键的步骤是使用对数导数技巧将梯度操作转移到概率分布上。我在首次推导时忽略了P(s_0)项的影响,导致结果错误——提醒大家注意初始状态分布的处理。
3. REINFORCE算法实现细节
3.1 基础算法流程
REINFORCE是最朴素的策略梯度算法,其伪代码如下:
python复制for episode in range(EPISODES):
states, actions, rewards = run_episode(env, policy)
discounted_rewards = compute_discounted_rewards(rewards)
policy_gradient = 0
for t in range(len(actions)):
log_prob = policy.get_log_prob(states[t], actions[t])
policy_gradient += -log_prob * discounted_rewards[t] # 负号因为PyTorch默认最小化
optimizer.zero_grad()
policy_gradient.backward()
optimizer.step()
实际实现时有几个关键点需要特别注意:
- 奖励归一化:不同episode的回报尺度可能差异很大,建议对每个batch的回报进行减均值除标准差处理
- 梯度累积:在PyTorch中需要手动累加各步的梯度项,而不是直接求和log概率
- 并行采样:使用多个环境实例并行采样可以显著提高数据效率
3.2 方差削减技术
原始REINFORCE的梯度估计方差很大,我在Atari游戏训练中就遇到过训练不稳定的问题。常用改进方法包括:
-
基线减法(Baseline):
引入不依赖动作的基线函数b(s),通常使用值函数V(s):code复制∇J(θ) ≈ E[∑∇logπ_θ(a_t|s_t)(Q(s_t,a_t)-V(s_t))]这能保持梯度无偏性的同时降低方差。我在实现时发现,简单的移动平均基线也能带来明显改善。
-
回报折扣:
加入折扣因子γ∈[0,1):code复制R_t = ∑_{k=0}^{T-t} γ^k r_{t+k}这降低了远期回报的不确定性影响。γ的选择需要权衡偏差和方差。
-
因果性修正:
当前动作不应影响过去回报,因此使用:code复制∇J(θ) ≈ E[∑∇logπ_θ(a_t|s_t)(∑_{k=t}^T γ^{k-t}r_k)]这个细节在实现时容易被忽略,但对训练稳定性很重要。
4. 策略梯度实践中的挑战与解决方案
4.1 高方差问题
即使使用了基线方法,策略梯度仍然面临高方差挑战。我的实验记录显示,在MuJoCo环境中,相同超参数设置下不同随机种子的结果可能差异巨大。应对策略包括:
-
批量归一化:
python复制rewards = (rewards - rewards.mean()) / (rewards.std() + 1e-8)这个小技巧能防止个别高回报样本主导更新方向。
-
熵正则化:
在目标函数中加入策略熵项:code复制J(θ) = E[R(τ)] + λH(π_θ)系数λ通常取0.01-0.1。这能防止策略过早收敛到次优确定性策略。
-
梯度裁剪:
python复制torch.nn.utils.clip_grad_norm_(policy.parameters(), max_norm=0.5)特别是在使用RNN策略时,这能防止梯度爆炸。
4.2 采样效率问题
策略梯度方法通常需要大量样本。在机械臂控制项目中,我发现以下方法能显著提升采样效率:
-
并行环境采样:
使用SubprocVecEnv创建多个并行环境:python复制envs = SubprocVecEnv([make_env(env_id) for _ in range(8)]) -
经验回放:
虽然标准的REINFORCE不能直接用经验回放,但可以:- 存储完整轨迹而非单步转移
- 使用重要性采样修正分布偏移
-
混合策略更新:
每隔K步收集一批新样本,然后进行多次策略更新。这需要在样本新鲜度和计算效率间权衡。
5. 策略梯度在连续控制中的应用实例
以MuJoCo的HalfCheetah环境为例,分享我的实现细节:
5.1 策略网络设计
python复制class GaussianPolicy(nn.Module):
def __init__(self, obs_dim, act_dim, hidden_size=64):
super().__init__()
self.fc1 = nn.Linear(obs_dim, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.mean = nn.Linear(hidden_size, act_dim)
self.log_std = nn.Parameter(torch.zeros(act_dim))
def forward(self, obs):
x = torch.tanh(self.fc1(obs))
x = torch.tanh(self.fc2(x))
mean = self.mean(x)
std = torch.exp(self.log_std)
return torch.distributions.Normal(mean, std)
关键点:
- 使用tanh激活限制输出范围
- 对数标准差作为可学习参数而非网络输出
- 重参数化技巧(reparameterization)在采样时更稳定
5.2 训练曲线分析
在我的实验中,观察到三个典型阶段:
- 探索期(0-1e5步):回报缓慢上升,策略在探索不同运动模式
- 快速提升期(1e5-3e5步):策略发现有效步态,回报快速增长
- 收敛期(>3e5步):性能在小范围内波动,需要调整学习率
典型超参数设置:
python复制{
"hidden_size": 64,
"learning_rate": 3e-4,
"gamma": 0.99,
"batch_size": 2048,
"max_ep_len": 1000,
"entropy_coef": 0.01
}
6. 策略梯度的局限性与发展
虽然策略梯度方法很强大,但在实际应用中我发现几个根本限制:
- 样本效率低下:相比DQN等值方法,通常需要10-100倍样本量
- 局部最优问题:在高维空间中容易收敛到次优策略
- 超参数敏感:学习率、批量大小等对结果影响巨大
这引出了后续的改进算法:
- 自然策略梯度:使用Fisher信息矩阵约束更新步长
- TRPO/PPO:通过信任域方法稳定训练
- A2C/A3C:结合值函数和策略梯度的优势
在真实机器人部署中,我通常会从REINFORCE开始验证思路,然后迁移到PPO等更稳定的算法。策略梯度作为整个算法家族的基础,其核心思想贯穿了深度强化学习的发展历程。
