首页
/ 从崩溃到稳定:用DDPG攻克Pendulum-v0连续控制难题

从崩溃到稳定:用DDPG攻克Pendulum-v0连续控制难题

2026-02-04 04:50:00作者:韦蓉瑛

你是否曾在训练强化学习智能体时遇到过这样的困境:在Pendulum-v0环境中,钟摆总是左右摇摆,无法稳定在直立位置,奖励值长期徘徊在-1000以下?连续动作空间的控制难题曾让无数开发者望而却步,但深度确定性策略梯度(Deep Deterministic Policy Gradient,DDPG)算法为我们提供了一条清晰的解决路径。本文将带你从环境特性分析入手,逐步掌握DDPG的核心原理与实战技巧,最终实现钟摆的稳定控制。读完本文后,你将能够独立构建DDPG智能体,理解连续控制中的探索-利用平衡,并学会解决训练不稳定性问题。

连续控制的挑战:Pendulum-v0环境解析

Pendulum-v0环境看似简单,实则蕴含着连续控制的典型难题。如图12.1所示,该环境中钟摆的初始位置随机,目标是通过施加连续的力矩(动作范围[-2, 2])使其保持直立。每个时间步的奖励范围为[-16.27, 0],直立时奖励为0,完全下垂时约为-16.27。这种稀疏且连续的奖励信号对传统离散动作算法构成了严峻挑战。

Pendulum-v0环境

与离散动作空间不同,连续动作无法通过枚举所有可能值来选择最优动作。如图12.2所示,离散动作场景下神经网络可输出每个动作的概率分布,而连续动作需要直接输出具体的实数值。这一差异使得Q学习等基于价值的算法难以直接应用,因为它们需要计算每个可能动作的Q值。

离散与连续动作的神经网络输出对比

DDPG算法:连续控制的破局之道

DDPG算法创新性地结合了深度神经网络、确定性策略和策略梯度方法,为连续控制问题提供了有效解决方案。如图12.4所示,DDPG的核心特点可从其名称拆解:深度(使用神经网络)、确定性(输出确定动作)、策略梯度(直接优化策略)。

DDPG算法原理

演员-评论员架构

DDPG采用独特的双网络结构——演员网络(Actor)和评论员网络(Critic),如图12.5所示。演员网络直接输出确定性动作:μθ(s)\mu_\theta(s),评论员网络则评估该动作的价值:Qw(s,a)Q_w(s,a)。这种架构使智能体能够在连续空间中高效探索并学习最优策略。

从深度Q网络到DDPG的演进

通俗地说,演员网络扮演表演者的角色,根据当前状态输出动作;评论员网络则像评委,为演员的表现打分。训练过程中,演员试图最大化评论员的打分,而评论员则通过环境反馈不断校准评分标准,如图12.6所示。

演员-评论员结构示意图

关键技术:目标网络与经验回放

为解决连续控制中的训练不稳定性问题,DDPG引入了两项关键技术:

  1. 目标网络:为演员和评论员各设置一个目标网络,通过软更新(τ=0.01\tau=0.01)缓慢跟踪主网络参数,有效降低目标Q值的波动性。

  2. 经验回放:使用回放缓冲区存储 transitions (s,a,r,s,d)(s,a,r,s',d),并随机采样进行训练,减少样本间的相关性。

DDPG的更新过程可概括为:

  • 评论员网络通过最小化均方差损失学习Q值:L=E[(Qw(s,a)(r+γQwˉ(s,μθˉ(s))))2]L = \mathbb{E}[(Q_w(s,a) - (r + \gamma Q_{\bar{w}}(s',\mu_{\bar{\theta}}(s'))))^2]
  • 演员网络通过策略梯度上升最大化Q值:θJ(θ)=E[aQw(s,a)a=μθ(s)θμθ(s)]\nabla_\theta J(\theta) = \mathbb{E}[\nabla_a Q_w(s,a)|_{a=\mu_\theta(s)} \nabla_\theta \mu_\theta(s)]

实战指南:从零实现DDPG智能体

核心网络设计

DDPG的网络结构看似复杂,实则模块化程度高。以下是Pytorch实现的核心代码片段:

class Actor(nn.Module):
    def __init__(self, n_states, n_actions, hidden_dim=256):
        super(Actor, self).__init__()
        self.linear1 = nn.Linear(n_states, hidden_dim)
        self.linear2 = nn.Linear(hidden_dim, hidden_dim)
        self.linear3 = nn.Linear(hidden_dim, n_actions)
        
    def forward(self, x):
        x = F.relu(self.linear1(x))
        x = F.relu(self.linear2(x))
        x = torch.tanh(self.linear3(x))  # 输出范围[-1,1]
        return x

class Critic(nn.Module):
    def __init__(self, n_states, n_actions, hidden_dim=256):
        super(Critic, self).__init__()
        self.linear1 = nn.Linear(n_states + n_actions, hidden_dim)
        self.linear2 = nn.Linear(hidden_dim, hidden_dim)
        self.linear3 = nn.Linear(hidden_dim, 1)
        
    def forward(self, state, action):
        x = torch.cat([state, action], 1)  # 状态和动作拼接
        x = F.relu(self.linear1(x))
        x = F.relu(self.linear2(x))
        x = self.linear3(x)
        return x

注意Critic网络的输入是状态和动作的拼接,这是DDPG能够处理连续动作的关键设计。完整实现可参考DDPG.ipynb

动作探索:OU噪声的应用

确定性策略的一大挑战是探索不足,DDPG通过Ornstein-Uhlenbeck过程生成时序相关的探索噪声:

class OUNoise:
    def __init__(self, action_space, mu=0.0, theta=0.15, max_sigma=0.3, min_sigma=0.3, decay_period=100000):
        self.mu = mu
        self.theta = theta
        self.sigma = max_sigma
        self.max_sigma = max_sigma
        self.min_sigma = min_sigma
        self.decay_period = decay_period
        self.action_dim = action_space.shape[0]
        self.low = action_space.low
        self.high = action_space.high
        self.reset()
        
    def reset(self):
        self.state = np.ones(self.action_dim) * self.mu
        
    def evolve_state(self):
        x = self.state
        dx = self.theta * (self.mu - x) + self.sigma * np.random.randn(self.action_dim)
        self.state = x + dx
        return self.state
    
    def get_action(self, action, t=0):
        ou_state = self.evolve_state()
        self.sigma = self.max_sigma - (self.max_sigma - self.min_sigma) * min(1.0, t / self.decay_period)
        return np.clip(action + ou_state, self.low, self.high)

这种噪声随着训练进程逐渐衰减,平衡了前期探索与后期利用。

训练过程与结果分析

关键超参数设置

在Pendulum-v0环境中,我们采用以下超参数配置(完整参数见DDPG.ipynb):

  • 演员网络学习率:1e-4,评论员网络学习率:1e-3
  • 经验回放缓冲区容量:8000,批大小:128
  • 折扣因子γ:0.99,软更新参数τ:0.01
  • 隐藏层维度:256,训练回合数:300

训练曲线解析

经过300回合训练,DDPG智能体的奖励曲线呈现明显的上升趋势。从训练日志可以看出,奖励从初始的-1500左右逐步提升,最终稳定在-100附近,部分测试回合甚至达到-1.06的优异成绩:

回合:10/300,奖励:-1549.57
回合:100/300,奖励:-1262.05
回合:200/300,奖励:-1000.77
回合:300/300,奖励:-610.10
测试回合:7/20,奖励:-1.06

这种从崩溃到稳定的转变,印证了DDPG处理连续控制问题的能力。训练过程中奖励的波动主要源于探索噪声和Q值估计误差,这也是DDPG算法需要进一步改进的方向。

进阶优化:TD3算法简介

尽管DDPG表现出色,但它对超参数和初始化非常敏感。如图12.9所示,Q函数的过高估计常会导致策略崩溃。双延迟深度确定性策略梯度(TD3)通过三项改进解决了这一问题:

DDPG的Q值高估问题

  1. 截断双Q学习:学习两个Q函数,目标值取两者中的较小值
  2. 延迟策略更新:降低策略网络的更新频率
  3. 目标策略平滑:在目标动作中加入噪声,提高鲁棒性

如图12.10所示,这些改进使TD3在多个环境中表现优于DDPG,尤其在训练稳定性方面有显著提升。

TD3与其他算法性能对比

总结与展望

DDPG算法通过演员-评论员架构和目标网络技术,成功将深度强化学习扩展到连续动作空间,为机器人控制、自动驾驶等领域提供了强大工具。本文详细介绍了DDPG的原理与实现,通过Pendulum-v0环境展示了从崩溃到稳定的完整训练过程。

然而,连续控制的探索之路并未结束。TD3、SAC等后续算法持续推动着性能边界,而多智能体协作、迁移学习等方向的研究,将进一步拓展DDPG的应用场景。掌握DDPG不仅是解决当前问题的关键,更是探索更复杂强化学习算法的基础。

推荐进一步阅读官方文档第十二章 深度确定性策略梯度 (DDPG) 算法,并尝试实现TD3算法以获得更稳定的训练效果。强化学习的魅力在于不断探索与优化,期待你在连续控制的世界中创造更多可能!

点赞+收藏+关注,获取更多强化学习实战教程。下期预告:基于TD3的机械臂控制任务实现。

登录后查看全文
热门项目推荐
相关项目推荐