Actor-Critic强化学习实战:解决连续动作空间下的策略优化难题

1次阅读
没有评论

共计 2058 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

在强化学习中,处理连续动作空间一直是个棘手的问题。传统的策略梯度方法 (Policy Gradient) 虽然可以直接输出连续动作,但面临两个主要挑战:

Actor-Critic 强化学习实战:解决连续动作空间下的策略优化难题

  1. 高方差问题:由于策略梯度依赖蒙特卡洛采样估计回报,导致梯度估计方差大,训练过程不稳定
  2. 样本效率低:每个策略更新后都需要丢弃之前收集的样本,数据利用率不高

比如在机械臂控制场景中,关节角度的微小变化可能导致完全不同的结果,这种敏感度会加剧策略梯度的不稳定性。

技术对比

算法 样本效率 收敛稳定性 适用动作空间 实现复杂度
DQN 离散
PPO 连续 / 离散
Actor-Critic 连续 / 离散

Actor-Critic 结合了值函数方法和策略梯度的优势,特别适合连续动作空间场景。

核心实现

1. 网络架构设计

  • Actor 网络:输入状态,输出动作分布参数(如高斯分布的 μ 和 σ)
  • Critic 网络:输入状态,输出状态价值 V(s)
class Actor(nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        self.fc1 = nn.Linear(state_dim, 64)
        self.fc2 = nn.Linear(64, 32)
        self.mu_head = nn.Linear(32, action_dim)  # 均值
        self.sigma_head = nn.Linear(32, action_dim)  # 标准差

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        mu = torch.tanh(self.mu_head(x)) * 2  # 假设动作范围[-2,2]
        sigma = F.softplus(self.sigma_head(x)) + 1e-5  # 确保正值
        return torch.distributions.Normal(mu, sigma)

2. 优势函数计算

优势函数 $A(s,a) = Q(s,a) – V(s)$ 衡量某个动作相对于平均水平的优势。实践中常用 GAE(Generalized Advantage Estimation)来估计:

$$
A_t^{GAE} = \sum_{l=0}^{\infty}(\gamma\lambda)^l\delta_{t+l}
$$

其中 $\delta_t = r_t + \gamma V(s_{t+1}) – V(s_t)$ 是 TD 误差。

3. 完整训练流程

def train(self, batch):
    states, actions, rewards, next_states, dones = batch

    # 计算优势
    with torch.no_grad():
        values = self.critic(states)
        next_values = self.critic(next_states)
        deltas = rewards + self.gamma * next_values * (1-dones) - values
        advantages = compute_gae(deltas)  # GAE 计算

    # Actor 更新
    dist = self.actor(states)
    log_probs = dist.log_prob(actions).sum(-1)
    actor_loss = -(log_probs * advantages).mean()

    # Critic 更新
    value_loss = F.mse_loss(values, rewards + self.gamma * next_values * (1-dones))

    # 添加熵正则项
    entropy = dist.entropy().mean()
    loss = actor_loss + 0.5 * value_loss - 0.01 * entropy

    self.optimizer.zero_grad()
    loss.backward()
    self.optimizer.step()

实验验证

在 Pendulum-v1 环境中测试:

  1. 超参数设置
  2. 学习率:3e-4(Actor 和 Critic 共用)
  3. 折扣因子 γ:0.99
  4. GAE 参数 λ:0.95

  5. 训练曲线分析

  6. 前 1000 步:智能体随机探索,回报波动大
  7. 1000-5000 步:Critic 网络逐渐稳定,指导 Actor 改进策略
  8. 5000 步后:回报稳定在 -200 左右(环境最大奖励为 0)

避坑指南

  1. 网络学习速度平衡
  2. Critic 学习率可略高于 Actor(如 Critic 3e-4,Actor 1e-4)
  3. 定期检查价值函数是否过度 / 不足估计

  4. 稀疏奖励处理

  5. 使用 n -step returns 增加信号传播
  6. 添加内在好奇心模块

  7. 多线程数据采集

  8. 每个线程维护独立的环境实例
  9. 使用队列同步经验数据
  10. 注意梯度更新的线程安全

扩展思考

  1. 分布式训练
  2. 采用 IMPALA 架构,分离推理和训练
  3. 使用参数服务器同步模型

  4. 机器人控制实践

  5. 增加动作变化率约束
  6. 考虑传感器噪声和延迟
  7. 安全机制:紧急停止、动作限幅

通过这套方法,我们成功将 Pendulum 的平衡时间从最初的几秒提升到永久稳定。Actor-Critic 框架的灵活性也允许我们轻松扩展到更复杂的环境,如机械臂抓取和自动驾驶场景。

正文完
 0
评论(没有评论)