共计 2434 个字符,预计需要花费 7 分钟才能阅读完成。
强化学习中的连续控制难题
传统强化学习算法(如 Q -learning)在离散动作空间中表现良好,但当面对机器人控制、自动驾驶等连续动作空间问题时,会遇到两个关键挑战:

- 维度灾难 :连续动作空间需要无限的动作状态对,导致 Q -table 方法完全失效
- 高方差 :Policy Gradient 方法虽然能处理连续动作,但蒙特卡洛采样带来的高方差会严重影响收敛
Actor-Critic 架构通过分离策略评估(Critic)和策略执行(Actor),同时结合值函数方法与策略梯度方法的优势,成为解决这类问题的标准方案。
技术对比:从基础算法到变体演进
与传统方法的比较
- Q-learning 系列
- 优点:离散空间收敛性好,理论保证完善
-
缺点:无法直接处理连续动作,DQN 的 max 操作带来过高估计
-
纯 Policy Gradient
- 优点:天然支持连续动作空间
- 缺点:采样效率低,梯度估计方差大
Actor-Critic 家族变体
- A2C (Advantage Actor-Critic):同步版本,基础实现
- A3C (Asynchronous Advantage Actor-Critic):异步并行,突破数据相关性
- SAC (Soft Actor-Critic):最大熵框架,探索效率更高
PyTorch 实现详解
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
class Actor(nn.Module):
def __init__(self, state_dim, action_dim, max_action):
super(Actor, self).__init__()
self.fc1 = nn.Linear(state_dim, 256)
self.fc2 = nn.Linear(256, 256)
self.mu = nn.Linear(256, action_dim) # 均值输出层
self.sigma = nn.Linear(256, action_dim) # 对数标准差层
self.max_action = max_action
def forward(self, state):
x = F.relu(self.fc1(state))
x = F.relu(self.fc2(x))
mu = self.max_action * torch.tanh(self.mu(x))
sigma = F.softplus(self.sigma(x)) + 1e-5 # 保证正值
return torch.distributions.Normal(mu, sigma)
class Critic(nn.Module):
def __init__(self, state_dim):
super(Critic, self).__init__()
self.fc1 = nn.Linear(state_dim, 256)
self.fc2 = nn.Linear(256, 256)
self.v_out = nn.Linear(256, 1) # 状态价值函数
def forward(self, state):
x = F.relu(self.fc1(state))
x = F.relu(self.fc2(x))
return self.v_out(x)
关键实现细节:
-
优势函数计算
def compute_advantage(rewards, values, dones, gamma=0.99, lam=0.95): advantages = torch.zeros_like(rewards) last_advantage = 0 for t in reversed(range(len(rewards))): delta = rewards[t] + gamma * values[t+1] * (1-dones[t]) - values[t] advantages[t] = delta + gamma * lam * (1-dones[t]) * last_advantage last_advantage = advantages[t] return advantages -
策略更新公式
$$ \nabla_\theta J(\theta) = \mathbb{E}\left[\nabla_\theta \log \pi_\theta(a|s) A^\pi(s,a)\right] $$
实验分析与调优
Gym 环境基准测试
| 环境 | A2C(200k steps) | PPO(200k steps) |
|---|---|---|
| Pendulum-v1 | -150 ± 20 | -130 ± 15 |
| BipedalWalker | 280 ± 30 | 310 ± 25 |
超参数敏感性
- 学习率影响
- Actor 网络:建议 1e- 4 到 3e-4
- Critic 网络:可略高 (3e- 4 到 1e-3)
-
比例失衡会导致策略崩溃
-
折扣因子 γ
- 长期任务:0.99
- 短期任务:0.95
生产环境部署实践
分布式训练策略
- 参数服务器架构 :适用于异构硬件
- Ring-AllReduce:NCCL 后端最佳实践
- 梯度压缩 :1-bit Adam 减少通信量
灾难性遗忘应对
-
经验回放缓冲
class PrioritizedReplayBuffer: def __init__(self, capacity, alpha=0.6): self.alpha = alpha # 优先程度系数 self.capacity = capacity self.buffer = [] self.priorities = np.zeros(capacity) -
弹性权重固化 (EWC)
$$ L(\theta) = L_{new}(\theta) + \lambda \sum_i F_i(\theta_i – \theta_i^*)^2 $$
开放问题讨论
- 如何设计更适合物理仿真的动作空间参数化方法?
- 在多智能体场景下,critic 网络应该如何共享信息?
- 当面对部分可观测环境时,如何改进基础架构?
Actor-Critic 架构已成为现代强化学习的基石,理解其核心思想并掌握工程实现细节,是构建可靠智能控制系统的关键一步。随着 GPU 异构计算和分布式框架的成熟,这一架构在机器人、游戏 AI 等领域的应用前景将更加广阔。
正文完
发表至: 人工智能
近一天内
