核心内容摘要
探索深夜的无限可能:一段关于激情与释放的旅程
策略梯度Policy Gradient直接优化策略的强化学习方法 —— 用 “修课心情” 理解核心逻辑策略梯度Policy Gradient, PG是强化学习中 “直接优化策略” 的核心算法 —— 它不通过 Q 表间接学习而是直接调整策略参数让智能体更倾向于选择能带来高回报的动作。
这种思路就像 “修课选方向”不纠结于 “每门课好不好”类似 Q 值而是直接调整 “选课策略”类似 RL 的策略最终让总 GPA类似累积回报最高直观又高效。
本文将用 “修课心情” 的通俗类比拆解 PG 的核心原理对比 Q-Learning 的差异再通过完整实操代码落地帮你快速掌握这种 “直接优化” 的强化学习思路。
PG 的核心定位为什么需要 “直接优化策略”之前学的 Q-Learning价值型 RL通过学习 “状态 - 动作价值Q 值” 间接推导最优策略但存在两个明显局限仅适用于离散动作空间如上下左右无法处理连续动作如机器人关节角度、自动驾驶车速Q 值估计易受噪声影响当状态 / 动作空间复杂时Q 表或 Q 网络难以准确拟合。
而 PG策略型 RL的核心突破是 “直接优化策略”策略本身是可参数化的模型如神经网络输入状态输出动作或动作概率通过 “梯度上升” 最大化累积回报直接调整策略参数无需中间 Q 值估计天然支持连续动作空间对复杂场景适应性更强。
通俗类比修课心情Q-Learning先打听每门课的 “预期分数”Q 值再选分数最高的课PG不打听单门课分数直接根据 “过去选课的总 GPA”累积回报调整选课偏好比如 “之前选 AI 类课总拿高分以后多选这类课”。
PG 的核心原理用 “梯度上升” 让好动作更易被选中PG 的核心逻辑只有一句话计算策略的梯度沿着梯度方向更新参数让 “能带来高累积回报的动作” 被选中的概率越来越高。
就像修课中若选 “AI 课” 的总回报分数高就调整选课策略下次更倾向于选 AI 课。
通俗理解“加权更新”—— 好动作多选坏动作少选PG 的优化本质是 “加权调整动作概率”若某个动作 A 在状态 S 下带来的累积回报 G 很高好动作就增大 “状态 S 下选 A” 的概率若累积回报 G 很低坏动作就减小该动作的概率权重就是累积回报 G回报越高调整幅度越大。
“修课心情” 深度类比RL 组件修课场景类比核心逻辑策略 π参数 θ选课偏好如 “倾向选 AI 课”状态学期需求→ 动作选课的概率分布动作 A选某一门课如《机器学习》策略输出的可选选项累积回报 G该门课的 “最终总收益”分数 技能提升动作带来的长期价值梯度上升调整选课偏好让 “总收益高的课” 下次更易被选中基线Baseline平均 GPA避免个别极端分数影响让调整更稳定比如若选《机器学习》的总回报90 分 技能提升远高于平均 GPA基线就大幅提升下次选 AI 类课的概率若选《量子力学》的回报60 分 难度大低于基线就降低选这类课的概率。
核心数学原理简化版无需复杂推导记住两个关键公式即可目标函数最大化所有轨迹状态 - 动作 - 回报序列的累积回报期望J(θ)Eτ∼πθ[G(τ)]其中τ是一条轨迹如 “选课→上课→得分” 的完整流程G(τ)是这条轨迹的累积回报。
梯度更新公式沿着梯度方向调整参数 θ梯度上升因为要最大化目标函数∇θJ(θ)≈N1∑i1N∑t0T−1∇θlogπθ(Ai,t∣Si,t)⋅(Gi,t−b)关键部分解释logπθ(A∣S)动作 A 在状态 S 下的对数概率梯度越大调整空间越大(G−b)加权系数b 是基线如平均累积回报正数表示 “好动作”负数表示 “坏动作”核心逻辑用(G−b)加权更新好动作的概率被放大坏动作被缩小。
PG 与 Q-Learning 的核心区别一张表看懂对比维度策略梯度PGQ-Learning价值型优化对象直接优化策略 π参数化模型间接优化通过 Q 值推导策略动作空间支持离散 连续动作仅支持离散动作需离散化连续动作稳定性方差大需基线优化方差小但易受 Q 值估计偏差影响适用场景复杂状态 / 动作空间、连续控制简单离散场景如迷宫、小游戏核心优势无需 Q 值估计直接高效实现简单适合入门
实操用 Policy Gradient 玩转 CartPolePyTorch 实现我们继续用 CartPole 环境小车平衡杆实现 PG对比之前的 Q-Learning感受 “直接优化策略” 的优势。
环境说明同之前 Q-Learning状态 S4 维连续向量小车位置、速度、杆角度、角速度动作 A2 种离散动作0 左移1 右移回报 R每保持平衡 1 步 1 分杆倒下游戏结束。
完整代码分步骤解释python运行# 安装依赖 # pip install gym numpy torch import gym import numpy as np import torch import torch.nn as nn import torch.optim as optim # ----------------------
定义策略网络直接优化的“策略模型” ---------------------- class PolicyNetwork(nn.Module): def __init__(self, state_dim4, action_dim
: super().__init__() # 简单神经网络输入状态4维→ 输出动作概率2维 self.network nn.Sequential( nn.Linear(state_dim,
, nn.ReLU(), nn.Linear(32,
, nn.ReLU(), nn.Linear(16, action_dim), nn.Softmax(dim-
# 输出动作概率分布和为1 ) def forward(self, x): return self.network(x) # 输入状态输出动作概率 def select_action(self, state): # 输入状态→生成动作概率→随机采样动作体现随机性策略 state_tensor torch.tensor(state, dtypetorch.float
.unsqueeze(
action_probs self.forward(state_tensor) action_dist torch.distributions.Categorical(action_probs) # 分类分布 action action_dist.sample() # 随机采样动作 return action.item(), action_dist.log_prob(action) # 返回动作和对数概率 # ----------------------
计算累积回报带折扣基线 ---------------------- def compute_discounted_returns(rewards, gamma
99, baselineTrue): 计算每条轨迹的折扣累积回报并可选减去基线减少方差 discounted_returns [] running_add 0 # 反向计算折扣回报从最后一步往回算 for r in reversed(rewards): running_add r gamma * running_add discounted_returns.insert(0, running_add) # 减去基线所有轨迹的平均回报减少更新方差 if baseline: baseline_val np.mean(discounted_returns) discounted_returns [r - baseline_val for r in discounted_returns] # 标准化回报进一步稳定训练 discounted_returns torch.tensor(discounted_returns, dtypetorch.float
discounted_returns (discounted_returns - discounted_returns.mean()) / (discounted_returns.std() 1e-
return discounted_returns # ----------------------
训练策略网络梯度上升最大化回报 ---------------------- def train_policy_gradient(episodes1000, gamma
99, lr1e-
: env gym.make(CartPole-v
state_dim env.observation_space.shape[0] action_dim env.action_space.n # 初始化策略网络、优化器Adam policy_net PolicyNetwork(state_dim, action_dim) optimizer optim.Adam(policy_net.parameters(), lrlr) for episode in range(episodes): # 存储单条轨迹的对数概率、即时回报 log_probs [] rewards [] state env.reset() done False # 生成一条轨迹玩一局游戏 while not done: # 选动作策略网络输出概率→采样 action, log_prob policy_net.select_action(state) # 执行动作获取环境反馈 next_state, reward, done, _ env.step(action) # 记录对数概率和回报 log_probs.append(log_prob) rewards.append(reward) state next_state # 计算累积回报带基线和标准化 discounted_returns compute_discounted_returns(rewards, gamma) # 计算损失目标是最大化回报→等价于最小化负的“对数概率×回报” loss 0 for log_prob, ret in zip(log_probs, discounted_returns): loss - log_prob * ret # 负号梯度上升→转为梯度下降优化 loss loss / len(log_probs) # 平均损失稳定训练 # 梯度更新标准反向传播 optimizer.zero_grad() loss.backward() optimizer.step() # 打印训练进度 total_reward sum(rewards) if (episode
% 100 0: print(f第{episode1}轮 | 总回报{total_reward:.0f} | 平均损失{loss.item():.4f}) # 测试训练效果可视化 test_env gym.make(CartPole-v1, render_modehuman) state test_env.reset() done False while not done: action, _ policy_net.select_action(state) state, _, done, _ test_env.step(action) test_env.render() test_env.close() return policy_net # 启动训练 if __name__ __main__: trained_policy train_policy_gradient(episodes
1000)
代码核心逻辑对应 PG 原理策略网络直接输出动作概率用 Categorical 分布采样动作体现随机性策略累积回报带基线和标准化减少训练方差让模型更稳定损失计算负的 “对数概率 × 回报”通过梯度下降间接实现梯度上升最大化回报梯度更新每局游戏结束后一条轨迹更新一次参数批量更新更稳定。
预期效果训练 1000 轮后平均总回报≥200杆能长时间保持平衡对比 Q-LearningPG 训练速度更快对连续状态空间的适配性更好。
PG 的关键优化技巧让训练更稳定高效
基线Baseline减少方差核心作用避免个别高回报轨迹导致参数更新波动过大实现用所有轨迹的平均累积回报作为基线将(G−b)作为加权系数让好动作的判断更客观。
折扣回报与标准化折扣回报用γ
9-
99加权未来回报让智能体 “有远见”回报标准化将累积回报归一化均值 0方差 1避免不同轨迹的回报尺度差异导致更新失衡。
策略随机性PG 的策略是随机性的输出动作概率分布天然具备 “探索能力”无需像 Q-Learning 那样设计ϵ-greedy训练后期策略会逐渐收敛到 “近似确定性”最优动作的概率趋近于 1。
学习率调整初始学习率建议 1e-3~1e-4过大易震荡过小训练过慢可使用学习率调度器如 ReduceLROnPlateau根据训练效果动态调整。
六、
总结PG 的核心要点与学习建议核心逻辑直接优化策略通过梯度上升最大化累积回报好动作多选、坏动作少选无需 Q 值估计通俗记忆修课选方向→根据总 GPA 调整选课策略让高分课的选择概率越来越高适用场景连续动作空间、复杂状态 / 动作场景如机器人控制、自动驾驶学习顺序入门用 CartPole 跑通 PG 代码理解 “直接优化策略” 的流程进阶学习 PG 的变体如 A2C、PPO解决 PG 方差大的问题实操尝试连续动作环境如 Pendulum感受 PG 的天然优势。
PG 是强化学习从 “离散动作” 走向 “连续动作” 的关键算法掌握它后你能应对更多实际场景如机器人关节控制、无人机路径规划也是后续学习高级 RL 算法如 PPO、SAC的基础。