共计 2058 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在强化学习中,处理连续动作空间一直是个棘手的问题。传统的策略梯度方法 (Policy Gradient) 虽然可以直接输出连续动作,但面临两个主要挑战:

- 高方差问题:由于策略梯度依赖蒙特卡洛采样估计回报,导致梯度估计方差大,训练过程不稳定
- 样本效率低:每个策略更新后都需要丢弃之前收集的样本,数据利用率不高
比如在机械臂控制场景中,关节角度的微小变化可能导致完全不同的结果,这种敏感度会加剧策略梯度的不稳定性。
技术对比
| 算法 | 样本效率 | 收敛稳定性 | 适用动作空间 | 实现复杂度 |
|---|---|---|---|---|
| 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 环境中测试:
- 超参数设置:
- 学习率:3e-4(Actor 和 Critic 共用)
- 折扣因子 γ:0.99
-
GAE 参数 λ:0.95
-
训练曲线分析:
- 前 1000 步:智能体随机探索,回报波动大
- 1000-5000 步:Critic 网络逐渐稳定,指导 Actor 改进策略
- 5000 步后:回报稳定在 -200 左右(环境最大奖励为 0)
避坑指南
- 网络学习速度平衡:
- Critic 学习率可略高于 Actor(如 Critic 3e-4,Actor 1e-4)
-
定期检查价值函数是否过度 / 不足估计
-
稀疏奖励处理:
- 使用 n -step returns 增加信号传播
-
添加内在好奇心模块
-
多线程数据采集:
- 每个线程维护独立的环境实例
- 使用队列同步经验数据
- 注意梯度更新的线程安全
扩展思考
- 分布式训练:
- 采用 IMPALA 架构,分离推理和训练
-
使用参数服务器同步模型
-
机器人控制实践:
- 增加动作变化率约束
- 考虑传感器噪声和延迟
- 安全机制:紧急停止、动作限幅
通过这套方法,我们成功将 Pendulum 的平衡时间从最初的几秒提升到永久稳定。Actor-Critic 框架的灵活性也允许我们轻松扩展到更复杂的环境,如机械臂抓取和自动驾驶场景。
正文完
发表至: 人工智能
近一天内
