# 策略梯度算法

# 基本概念

策略梯度(Policy Gradient)是一类直接优化策略的强化学习算法。与基于值函数的方法不同,策略梯度直接参数化策略并通过梯度上升来最大化期望回报。

# 数学原理

# 1. 策略表示

策略通常用参数化的概率分布表示:

πθ(as)=P(as;θ)\pi_\theta(a|s) = P(a|s;\theta)

其中:

  • πθ\pi_\theta 是由参数θ\theta确定的策略
  • ss 是状态
  • aa 是动作

# 2. 目标函数

优化目标是最大化期望回报:

J(θ)=Eτπθ[t=0Tγtrt]J(\theta) = E_{\tau\sim\pi_\theta}[\sum_{t=0}^T \gamma^t r_t]

其中:

  • τ\tau 是轨迹
  • γ\gamma 是折扣因子
  • rtr_t 是即时奖励

# 3. 策略梯度定理

策略梯度的计算公式:

θJ(θ)=Eτπθ[t=0Tθlogπθ(atst)Qπθ(st,at)]\nabla_\theta J(\theta) = E_{\tau\sim\pi_\theta}[\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) Q^{\pi_\theta}(s_t,a_t)]

其中:

  • Qπθ(st,at)Q^{\pi_\theta}(s_t,a_t) 是动作值函数
  • θlogπθ(atst)\nabla_\theta \log \pi_\theta(a_t|s_t) 是对数似然的梯度

# 算法变体

# 1. REINFORCE

最基本的策略梯度算法:

θJ(θ)1Ni=1N[t=0Tθlogπθ(atisti)Gti]\nabla_\theta J(\theta) \approx \frac{1}{N}\sum_{i=1}^N[\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t^i|s_t^i) G_t^i]

其中:

  • GtiG_t^i 是第i条轨迹在时间t的回报
  • NN 是采样的轨迹数量

# 2. 基线方法

引入基线减少方差:

θJ(θ)=Eτπθ[t=0Tθlogπθ(atst)(Qπθ(st,at)b(st))]\nabla_\theta J(\theta) = E_{\tau\sim\pi_\theta}[\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t|s_t) (Q^{\pi_\theta}(s_t,a_t) - b(s_t))]

其中:

  • b(st)b(s_t) 是状态相关的基线函数

# 算法步骤

  1. 初始化

    • 创建策略网络
    • 设定超参数
    • 初始化优化器
  2. 采样轨迹

    • 使用当前策略采样动作
    • 与环境交互
    • 收集状态、动作、奖励
  3. 计算回报

    • 计算折扣回报
    • 可选:计算优势函数
  4. 更新策略

    • 计算策略梯度
    • 应用梯度上升
    • 更新网络参数
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. 收敛性质

  • 局部最优保证
  • 梯度估计无偏
  • 理论基础扎实

# 应用场景

  1. 机器人控制

    • 运动规划
    • 操作控制
    • 步态优化
  2. 游戏AI

    • 策略游戏
    • 多智能体博弈
    • 实时控制
  3. 自然语言处理

    • 对话生成
    • 文本生成
    • 序列决策
  4. 计算机视觉

    • 注意力机制
    • 目标检测
    • 图像生成

# 优缺点

# 优点

  1. 直接优化策略
  2. 适合连续动作
  3. 天然处理随机性
  4. 收敛性有保证

# 缺点

  1. 样本效率低
  2. 方差较大
  3. 容易陷入局部最优
  4. 训练不稳定

# 实践建议

# 1. 方差减少

  • 使用基线
  • 标准化回报
  • 适当批量大小

# 2. 探索策略

  • 熵正则化
  • 噪声注入
  • 参数空间探索

# 3. 网络设计

  • 合适的网络结构
  • 激活函数选择
  • 初始化方法

# 4. 训练技巧

  • 学习率调整
  • 梯度裁剪
  • 早停策略

# 进阶优化

  1. 自然策略梯度

    • Fisher信息矩阵
    • 二阶优化
    • 参数空间度量
  2. 信任域策略优化

    • 约束更新步长
    • 单调改进
    • 稳定训练
  3. 确定性策略梯度

    • 连续动作空间
    • 更高效的学习
    • 更好的探索
  4. 异步策略梯度

    • 并行采样
    • 分布式训练
    • 加速收敛