# 策略梯度算法
# 基本概念
策略梯度(Policy Gradient)是一类直接优化策略的强化学习算法。与基于值函数的方法不同,策略梯度直接参数化策略并通过梯度上升来最大化期望回报。
# 数学原理
# 1. 策略表示
策略通常用参数化的概率分布表示:
其中:
- 是由参数确定的策略
- 是状态
- 是动作
# 2. 目标函数
优化目标是最大化期望回报:
其中:
- 是轨迹
- 是折扣因子
- 是即时奖励
# 3. 策略梯度定理
策略梯度的计算公式:
其中:
- 是动作值函数
- 是对数似然的梯度
# 算法变体
# 1. REINFORCE
最基本的策略梯度算法:
其中:
- 是第i条轨迹在时间t的回报
- 是采样的轨迹数量
# 2. 基线方法
引入基线减少方差:
其中:
- 是状态相关的基线函数
# 算法步骤
初始化
- 创建策略网络
- 设定超参数
- 初始化优化器
采样轨迹
- 使用当前策略采样动作
- 与环境交互
- 收集状态、动作、奖励
计算回报
- 计算折扣回报
- 可选:计算优势函数
更新策略
- 计算策略梯度
- 应用梯度上升
- 更新网络参数
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
class PolicyNet(nn.Module):
def __init__(self, state_dim, action_dim):
super(PolicyNet, self).__init__()
self.network = nn.Sequential(
nn.Linear(state_dim, 128),
nn.ReLU(),
nn.Linear(128, action_dim),
nn.Softmax(dim=-1)
)
def forward(self, x):
return self.network(x)
class REINFORCE:
def __init__(self, state_dim, action_dim, learning_rate=0.01, gamma=0.99):
self.policy = PolicyNet(state_dim, action_dim)
self.optimizer = optim.Adam(self.policy.parameters(), lr=learning_rate)
self.gamma = gamma
def select_action(self, state):
state = torch.FloatTensor(state)
probs = self.policy(state)
action = torch.multinomial(probs, 1)
return action.item(), probs
def update(self, rewards, log_probs):
# 计算折扣回报
returns = []
G = 0
for r in reversed(rewards):
G = r + self.gamma * G
returns.insert(0, G)
returns = torch.FloatTensor(returns)
# 标准化回报
returns = (returns - returns.mean()) / (returns.std() + 1e-8)
# 计算策略损失
policy_loss = []
for log_prob, R in zip(log_probs, returns):
policy_loss.append(-log_prob * R)
policy_loss = torch.cat(policy_loss).sum()
# 更新策略
self.optimizer.zero_grad()
policy_loss.backward()
self.optimizer.step()
# 优势特点
# 1. 直接优化
- 直接学习策略
- 避免值函数近似
- 适合连续动作空间
# 2. 概率输出
- 自然处理随机性
- 支持探索
- 适合多模态策略
# 3. 收敛性质
- 局部最优保证
- 梯度估计无偏
- 理论基础扎实
# 应用场景
机器人控制
- 运动规划
- 操作控制
- 步态优化
游戏AI
- 策略游戏
- 多智能体博弈
- 实时控制
自然语言处理
- 对话生成
- 文本生成
- 序列决策
计算机视觉
- 注意力机制
- 目标检测
- 图像生成
# 优缺点
# 优点
- 直接优化策略
- 适合连续动作
- 天然处理随机性
- 收敛性有保证
# 缺点
- 样本效率低
- 方差较大
- 容易陷入局部最优
- 训练不稳定
# 实践建议
# 1. 方差减少
- 使用基线
- 标准化回报
- 适当批量大小
# 2. 探索策略
- 熵正则化
- 噪声注入
- 参数空间探索
# 3. 网络设计
- 合适的网络结构
- 激活函数选择
- 初始化方法
# 4. 训练技巧
- 学习率调整
- 梯度裁剪
- 早停策略
# 进阶优化
自然策略梯度
- Fisher信息矩阵
- 二阶优化
- 参数空间度量
信任域策略优化
- 约束更新步长
- 单调改进
- 稳定训练
确定性策略梯度
- 连续动作空间
- 更高效的学习
- 更好的探索
异步策略梯度
- 并行采样
- 分布式训练
- 加速收敛
← DQN算法 Actor-Critic算法 →