核心思想
策略梯度算法通过直接优化策略函数(Policy Function)来最大化累积奖励,而非间接优化值函数(如Q-learning)。其核心是梯度上升:计算预期回报对策略参数的梯度,并沿梯度方向更新策略。
关键公式(梯度计算):
其中,θ 是策略参数,τ 是轨迹(Trajectory), 是状态-动作值函数。
一、策略梯度 vs. 值函数方法
维度 | 策略梯度(Policy Gradient) | 值函数方法(Q-learning等) |
---|---|---|
动作空间 | 适用于连续或离散动作 | 通常需离散动作(Q表或函数逼近限制) |
策略类型 | 支持显式随机策略(如概率分布) | 通常为确定性策略(如贪心选择) |
探索方式 | 通过策略的随机性自然探索 | 需手动设计探索策略(如ε-greedy) |
典型算法 | REINFORCE、Actor-Critic、PPO、TRPO | DQN、SARSA、Double DQN |
二、策略梯度算法流程
- 初始化策略参数 θ(如神经网络权重)。
- 生成轨迹:使用当前策略 πθ 与环境交互,收集轨迹数据
。
- 计算梯度:根据轨迹数据计算预期回报对 θ 的梯度。
- 更新策略:沿梯度方向调整参数
。
- 重复步骤2-4,直到策略收敛。
三、策略梯度改进方法
1. 基准(Baseline)减方差
在梯度公式中引入基准函数 ,减少方差而不改变期望:
常用基准:状态值函数 V(s),此时梯度公式变为优势函数。
2. Actor-Critic框架
- Actor:策略函数 πθ(a∣s),负责生成动作。
- Critic:值函数 Vw(s) 或 Qw(s,a),评估状态或动作的价值并提供梯度修正。
- 优势:利用Critic的估计值替代蒙特卡洛回报,降低方差,提升稳定性。
3. 近端策略优化(PPO)
通过限制策略更新的幅度,避免训练崩溃:
其中,ϵ 是裁剪阈值,通常设为0.1~0.3。
四、策略梯度的优缺点
优点 | 缺点 |
---|---|
直接优化策略,避免值函数近似误差 | 高方差(需大量样本或方差缩减技术) |
支持连续动作空间和随机策略 | 训练不稳定(策略可能剧烈波动) |
自然探索(通过策略的随机性) | 样本效率低(需大量环境交互) |
五、代码示例:用PyTorch实现REINFORCE算法
import torch
import torch.nn as nn
import torch.optim as optim
import gym
class PolicyNetwork(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 64),
nn.ReLU(),
nn.Linear(64, action_dim),
nn.Softmax(dim=-1)
)
def forward(self, state):
return self.fc(state)
env = gym.make('CartPole-v1')
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n
policy = PolicyNetwork(state_dim, action_dim)
optimizer = optim.Adam(policy.parameters(), lr=0.01)
def train(num_episodes=1000):
for episode in range(num_episodes):
states, actions, rewards = [], [], []
state = env.reset()
done = False
# 生成轨迹
while not done:
state_tensor = torch.FloatTensor(state)
action_probs = policy(state_tensor)
action = torch.multinomial(action_probs, 1).item()
next_state, reward, done, _ = env.step(action)
states.append(state)
actions.append(action)
rewards.append(reward)
state = next_state
# 计算折扣回报
returns = []
G = 0
for r in reversed(rewards):
G = r + 0.99 * G # 折扣因子γ=0.99
returns.insert(0, G)
# 转换为Tensor
states = torch.FloatTensor(states)
actions = torch.LongTensor(actions)
returns = torch.FloatTensor(returns)
# 计算策略梯度
log_probs = torch.log(policy(states).gather(1, actions.unsqueeze(1)))
loss = -torch.sum(log_probs * returns)
# 更新参数
optimizer.zero_grad()
loss.backward()
optimizer.step()
if episode % 100 == 0:
print(f"Episode {episode}, Total Reward: {sum(rewards)}")
train()
六、实际应用案例
-
机器人控制
- 场景:训练机械臂抓取物体,策略梯度直接优化动作(如关节角度)的概率分布。
- 方法:PPO算法在仿真环境中训练,迁移到真实机器人。
-
游戏AI
案例:AlphaGo的初始版本使用策略梯度优化落子策略,结合蒙特卡洛树搜索(MCTS)。 -
自动驾驶
应用:通过策略网络输出方向盘角度和油门刹车的连续控制信号。
总结
策略梯度算法是强化学习的核心方法之一,尤其适合复杂动作空间和需要随机策略的场景(如机器人控制、游戏AI)。其改进方法(如Actor-Critic、PPO)通过平衡偏差与方差,大幅提升了实用性和稳定性。掌握策略梯度,是解锁深度强化学习应用的关键一步。 🚀