)
用PyTorch从零实现DDPG算法以HalfCheetah机器人控制为例在机器人控制领域强化学习正逐渐成为解决复杂连续动作空间问题的利器。Deep Deterministic Policy GradientDDPG作为结合深度学习和确定性策略梯度的算法特别适合需要精细控制力矩的机器人运动任务。本文将以Mujoco环境中的HalfCheetah-v2为案例完整展示如何用PyTorch实现DDPG算法框架并深入解析每个关键模块的设计原理与实现技巧。1. DDPG算法核心架构解析DDPG的核心创新在于将DQN的价值优化与策略梯度方法相结合形成独特的Actor-Critic双网络结构。与传统的离散动作空间算法不同DDPG直接输出连续动作值这使得它在机器人控制任务中表现出色。1.1 Actor-Critic网络设计Actor网络负责生成确定性策略其输出层使用tanh激活函数将动作值约束在[-1,1]范围内。以下是PyTorch实现的核心代码class Actor(nn.Module): def __init__(self, state_dim, action_dim, max_action): super(Actor, self).__init__() self.l1 nn.Linear(state_dim, 256) self.l2 nn.Linear(256, 256) self.l3 nn.Linear(256, action_dim) self.max_action max_action def forward(self, state): a F.relu(self.l1(state)) a F.relu(self.l2(a)) return self.max_action * torch.tanh(self.l3(a))Critic网络则负责评估状态-动作对的价值其输入同时接收状态和动作信息class Critic(nn.Module): def __init__(self, state_dim, action_dim): super(Critic, self).__init__() self.l1 nn.Linear(state_dim action_dim, 256) self.l2 nn.Linear(256, 256) self.l3 nn.Linear(256, 1) def forward(self, state, action): q F.relu(self.l1(torch.cat([state, action], 1))) q F.relu(self.l2(q)) return self.l3(q)注意Critic网络的第一层需要将状态和动作张量在特征维度dim1拼接这是DDPG与普通AC算法的关键区别。1.2 目标网络与软更新机制DDPG引入目标网络来提高训练稳定性其更新采用软更新soft update策略def soft_update(self, local_model, target_model, tau): for target_param, local_param in zip(target_model.parameters(), local_model.parameters()): target_param.data.copy_(tau*local_param.data (1.0-tau)*target_param.data)软更新超参数τtau通常设置为0.005这意味着每次只将主网络参数的0.5%更新到目标网络有效避免了策略突变带来的不稳定。2. HalfCheetah环境特性与状态处理HalfCheetah-v2是Mujoco中模拟猎豹前半身运动的物理环境其动作空间和状态空间具有典型特征维度类型描述状态空间17维包含位置、速度、关节角度和角速度动作空间6维每个关节的扭矩值范围[-1,1]奖励函数标量与前进速度正相关环境初始化与交互的基本流程import gym env gym.make(HalfCheetah-v2) state env.reset() while True: action actor.select_action(state) # 使用Actor网络生成动作 next_state, reward, done, _ env.step(action) replay_buffer.add(state, action, next_state, reward, float(done)) state next_state if done: break3. 经验回放与训练流程DDPG采用经验回放机制打破样本间的相关性其核心组件包括循环缓冲区存储转移元组(s,a,s,r,done)批量采样随机抽取小批量样本用于训练优先级采样可选根据TD误差调整采样概率3.1 关键训练步骤Critic网络更新最小化TD误差target_Q critic_target(next_state, actor_target(next_state)) target_Q reward (1-done) * gamma * target_Q.detach() current_Q critic(state, action) critic_loss F.mse_loss(current_Q, target_Q)Actor网络更新策略梯度上升actor_loss -critic(state, actor(state)).mean()目标网络更新软更新策略soft_update(critic, critic_target, tau) soft_update(actor, actor_target, tau)3.2 超参数设置建议根据HalfCheetah环境特点推荐以下参数组合参数推荐值作用缓冲区大小1e6经验回放容量批量大小256每次更新样本数γ0.99折扣因子τ0.005软更新系数学习率1e-4(Actor)1e-3(Critic)网络更新步长4. 调试技巧与性能优化在实际实现中以下几个技巧能显著提升DDPG在HalfCheetah上的表现探索噪声在训练初期添加Ornstein-Uhlenbeck噪声class OUNoise: def __init__(self, action_dim, mu0, theta0.15, sigma0.2): self.action_dim action_dim self.mu mu self.theta theta self.sigma sigma self.reset() def reset(self): self.state np.ones(self.action_dim) * self.mu def sample(self): dx self.theta * (self.mu - self.state) dx self.sigma * np.random.randn(self.action_dim) self.state dx return self.state梯度裁剪防止Critic网络梯度爆炸torch.nn.utils.clip_grad_norm_(critic.parameters(), 1.0)学习率调度随着训练进程动态调整scheduler torch.optim.lr_scheduler.StepLR(optimizer, step_size10000, gamma0.9)在HalfCheetah环境中经过约1e5步训练后DDPG通常能达到3000以上的平均奖励。相比离散动作算法其优势主要体现在关节控制更加平滑没有离散化带来的抖动能够学习到更精细的力矩调节策略对高维连续动作空间有更好的扩展性