从崩溃到稳定:用DDPG攻克Pendulum-v0连续控制难题
你是否曾在训练强化学习智能体时遇到过这样的困境:在Pendulum-v0环境中,钟摆总是左右摇摆,无法稳定在直立位置,奖励值长期徘徊在-1000以下?连续动作空间的控制难题曾让无数开发者望而却步,但深度确定性策略梯度(Deep Deterministic Policy Gradient,DDPG)算法为我们提供了一条清晰的解决路径。本文将带你从环境特性分析入手,逐步掌握DDPG的核心原理与实战技巧,最终实现钟摆的稳定控制。读完本文后,你将能够独立构建DDPG智能体,理解连续控制中的探索-利用平衡,并学会解决训练不稳定性问题。
连续控制的挑战:Pendulum-v0环境解析
Pendulum-v0环境看似简单,实则蕴含着连续控制的典型难题。如图12.1所示,该环境中钟摆的初始位置随机,目标是通过施加连续的力矩(动作范围[-2, 2])使其保持直立。每个时间步的奖励范围为[-16.27, 0],直立时奖励为0,完全下垂时约为-16.27。这种稀疏且连续的奖励信号对传统离散动作算法构成了严峻挑战。
与离散动作空间不同,连续动作无法通过枚举所有可能值来选择最优动作。如图12.2所示,离散动作场景下神经网络可输出每个动作的概率分布,而连续动作需要直接输出具体的实数值。这一差异使得Q学习等基于价值的算法难以直接应用,因为它们需要计算每个可能动作的Q值。
DDPG算法:连续控制的破局之道
DDPG算法创新性地结合了深度神经网络、确定性策略和策略梯度方法,为连续控制问题提供了有效解决方案。如图12.4所示,DDPG的核心特点可从其名称拆解:深度(使用神经网络)、确定性(输出确定动作)、策略梯度(直接优化策略)。
演员-评论员架构
DDPG采用独特的双网络结构——演员网络(Actor)和评论员网络(Critic),如图12.5所示。演员网络直接输出确定性动作:,评论员网络则评估该动作的价值:。这种架构使智能体能够在连续空间中高效探索并学习最优策略。
通俗地说,演员网络扮演表演者的角色,根据当前状态输出动作;评论员网络则像评委,为演员的表现打分。训练过程中,演员试图最大化评论员的打分,而评论员则通过环境反馈不断校准评分标准,如图12.6所示。
关键技术:目标网络与经验回放
为解决连续控制中的训练不稳定性问题,DDPG引入了两项关键技术:
-
目标网络:为演员和评论员各设置一个目标网络,通过软更新()缓慢跟踪主网络参数,有效降低目标Q值的波动性。
-
经验回放:使用回放缓冲区存储 transitions ,并随机采样进行训练,减少样本间的相关性。
DDPG的更新过程可概括为:
- 评论员网络通过最小化均方差损失学习Q值:
- 演员网络通过策略梯度上升最大化Q值:
实战指南:从零实现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)通过三项改进解决了这一问题:
- 截断双Q学习:学习两个Q函数,目标值取两者中的较小值
- 延迟策略更新:降低策略网络的更新频率
- 目标策略平滑:在目标动作中加入噪声,提高鲁棒性
如图12.10所示,这些改进使TD3在多个环境中表现优于DDPG,尤其在训练稳定性方面有显著提升。
总结与展望
DDPG算法通过演员-评论员架构和目标网络技术,成功将深度强化学习扩展到连续动作空间,为机器人控制、自动驾驶等领域提供了强大工具。本文详细介绍了DDPG的原理与实现,通过Pendulum-v0环境展示了从崩溃到稳定的完整训练过程。
然而,连续控制的探索之路并未结束。TD3、SAC等后续算法持续推动着性能边界,而多智能体协作、迁移学习等方向的研究,将进一步拓展DDPG的应用场景。掌握DDPG不仅是解决当前问题的关键,更是探索更复杂强化学习算法的基础。
推荐进一步阅读官方文档第十二章 深度确定性策略梯度 (DDPG) 算法,并尝试实现TD3算法以获得更稳定的训练效果。强化学习的魅力在于不断探索与优化,期待你在连续控制的世界中创造更多可能!
点赞+收藏+关注,获取更多强化学习实战教程。下期预告:基于TD3的机械臂控制任务实现。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00






