共计 1647 个字符,预计需要花费 5 分钟才能阅读完成。
在连续动作空间的控制问题中(如机器人控制、自动驾驶),传统 DQN 需要离散化动作空间导致维度爆炸,而 AC 网络直接输出连续动作值,这种天然优势使其成为复杂决策场景的首选方案。DQN 的局限性在于:

- 只能处理离散动作空间,对连续控制需人工离散化
- 单一价值网络难以同时评估状态价值和动作优势
- 高方差导致训练不稳定
双网络架构设计
AC 网络的核心是分离的 Actor-Critic 结构:
-
Actor 网络(策略网络):输入状态,输出动作概率分布
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, action_dim) def forward(self, state): x = F.relu(self.fc1(state)) return torch.tanh(self.fc2(x)) # 输出 [-1,1] 范围 -
Critic 网络(价值网络):评估状态价值 V(s)
class Critic(nn.Module): def __init__(self, state_dim): super().__init__() self.fc1 = nn.Linear(state_dim, 64) self.fc2 = nn.Linear(64, 1) def forward(self, state): x = F.relu(self.fc1(state)) return self.fc2(x) # 输出标量价值
优势函数推导
策略梯度定理中引入优势函数 A(s,a)降低方差:
$$\nabla_\theta J(\theta) = \mathbb{E}\left[\nabla_\theta \log \pi_\theta(a|s) A(s,a)\right]$$
采用 TD 误差估计优势:
$$A(s_t,a_t) = r_t + \gamma V(s_{t+1}) – V(s_t)$$
实际实现时添加 GAE(λ)平衡偏差与方差:
$$ A^{GAE}(s_t,a_t) = \sum_{l=0}^{\infty}(\gamma\lambda)^l \delta_{t+l} $$
关键实现技巧
策略梯度更新
def update_actor(states, actions, advantages):
mu = actor(states)
log_probs = dist.log_prob(actions) # 假设使用高斯分布
actor_loss = -(log_probs * advantages).mean()
optimizer_actor.zero_grad()
actor_loss.backward()
nn.utils.clip_grad_norm_(actor.parameters(), 0.5) # 梯度裁剪
optimizer_actor.step()
并行环境采样
使用 SubprocVecEnv 加速数据收集:
envs = [lambda: gym.make('Pendulum-v0') for _ in range(4)]
envs = SubprocVecEnv(envs)
states = envs.reset() # 返回 shape=(4, state_dim)
典型问题解决方案
策略网络饱和
当 tanh 输出接近±1 时梯度消失:
– 在损失函数中添加熵正则项:
$$ \mathcal{L} += \beta \mathbb{H}(\pi(\cdot|s)) $$
– 初始化最后一层权重为小随机值
稀疏奖励场景
- 设计基于状态的中间奖励
- 采用 Curiosity-driven 探索机制
优化实验数据
| 学习率策略 | 最终得分 | 收敛步数 |
|---|---|---|
| 固定 0.001 | 185±12 | 35k |
| 线性衰减 | 210±8 | 28k |
| 余弦退火 | 225±6 | 22k |
扩展思考
在多智能体竞争场景中,单个 AC 网络面临:
1. 非平稳环境问题
2. 信用分配难题
3. 策略协同与对抗的平衡
是否有更优雅的架构可以处理这些挑战?比如 MADDPG 中的集中式训练分布式执行思路或许值得借鉴。
