介绍
深度确定性策略梯度(DDPG)是一种用于强化学习的机器学习技术,用于训练智能体的决策过程以优化控制。这种方法使智能体能够从经验中学习并采取行动,以最大化累积得分,从而随着时间的推移在环境中提高性能。该算法在连续控制任务中尤其强大,可应用于机器人操作和自动驾驶等领域。这使得它能够解决更多与必要连续变量(包括但不限于转向和速度)的参数控制相关的实际问题,以确保安全。
DDPG的主要优势在于它将确定性策略与深度神经网络的力量相结合,实现了在高维动作空间中通常所需的平滑控制。这与DDPG执行端到端学习的能力相结合,使该算法能够超越传统的强化学习方法,因为传统方法通常仅限于离散或低维动作,这使得DDPG对于需要精确和连续调整的复杂任务非常有价值。
DDPG 的核心是Actor-Critic框架,其中代理通过基于对其行为的评估的决策过程进行学习。目标网络跟踪主要 Actor 和 Critic 网络并采用“慢速更新”,从而避免价值估计出现剧烈变化,为学习过程提供了额外的稳定性。经验回放 3通过对过去经验进行随机抽样来减少训练样本中的相关性,从而提供了进一步的支撑。最后,应用 Ornstein-Uhlenbeck 噪声来促进连续动作空间中的有效探索,鼓励发现。
OpenAI Gymnasium 创建的经典控制环境已成为强化学习研究的基础资源,凸显了 DDPG 等算法的优势。在诸如 Pendulum 和 Mountain Car Continuous 等环境中,DDPG 使代理能够学习精确的控制策略,包括摆动钟摆或施加力将汽车开上山。这种执行平稳、战略性动作的能力使 DDPG 特别适合机器人技术,它可以实施感官反馈来调整代理的运动,从而可以执行更复杂的任务,例如精确抓握物体。
理论解释
在DDPG算法中,演员网络和评论家网络协同工作以优化决策过程。如前所述,演员提出动作,而评论家则确定该动作的质量,从而引导出估计的状态-动作值函数(Q函数)。
网络框架:
DDPG网络结构可以简化并使用下图来表示。
DDPG通过采用损失函数来确保智能体的神经网络保持优化,这些损失函数能够随时间减少误差并提高策略的有效性。这是通过使用回放缓冲区中计算出的优势来实现的。提供给演员网络和评论家网络的数据是去相关的,并且由于使用了来自过去经验的更广泛样本,因此更加稳定。
演员损失专注于完善智能体的决策过程,通过直接鼓励演员网络选择能够最大化评论家网络预测的Q值的动作。
评论家损失提供了关于动作质量的可靠反馈,并通过减少时间差分误差来帮助评论家更准确地估计Q值。
总结来说,DDPG算法的训练过程如下:
代码演示
首先,初始化环境。从Gym库中导入MountainCarContinuous环境。此代码还设置了视频录制功能,将在训练结束后保存生成的帧并输出。
env = gym.make('MountainCarContinuous-v0', render_mode="rgb_array")'MountainCarContinuous-v0', render_mode="rgb_array")
env = gym.wrappers.RecordVideo(env, "videos")
代码片段展示了为“MountainCarContinuous-v0”环境优化的DDPG智能体的最终超参数。关键参数包括记忆大小、批处理大小、演员网络和评论家网络的学习率,以及用于探索的噪声参数。
折扣因子(gamma)和软更新率(tau)被设置为标准值以确保稳定性,而initial_random_steps参数则确保在训练开始之前有足够的探索数据。智能体被训练了30,000帧,每200步可视化一次性能。这种配置使得DDPG智能体能够在连续动作空间中有效地进行探索和学习。
hyperparameters = {
"seed": 777,
"memory_size": 100000, # Size of the replay buffer
"batch_size": 128, # Number of samples in training batch
"ou_noise_theta": 0.1, # Controls the speed of decay
"ou_noise_sigma": 0.1, # Controls the noise amplitude
"gamma": 0.99, # Discount factor for future rewards
"tau": 5e-3, # Soft update rate for target networks
"initial_random_steps": 10000, # No. actions taken before starting training
"learning_rate_actor": 3e-4,
"learning_rate_critic": 1e-3,
"num_frames": 30000,
"plotting_interval": 200 # Interval for Visualising training progress
}
DDPG Agent类负责设置环境,定义观察空间和动作空间的维度,并配置必要的参数。
class DDPGAgent:
def __init__(self, env: gym.Env, memory_size: int, batch_size: int, ou_noise_theta: float, ou_noise_sigma: float, gamma: float = 0.99, tau: float = 5e-3, initial_random_steps: int = 1e4):
obs_dim = env.observation_space.shape[0]
action_dim = env.action_space.shape[0]
self.env = env
self.memory = ReplayBuffer(obs_dim, memory_size, batch_size)
self.batch_size = batch_size
self.gamma = gamma
self.tau = tau
self.initial_random_steps = initial_random_steps
演员网络根据当前状态选择动作,而评论家网络则通过计算Q值来评估这些动作,并指示演员改进其策略。演员网络输出一个确定性的动作,而评论家网络则估计该动作的质量。
class Actor(nn.Module):
def __init__(self, in_dim: int, out_dim: int, init_w: float = 3e-3):
super(Actor, self).__init__()
self.hidden1 = nn.Linear(in_dim, 128)
self.hidden2 = nn.Linear(128, 128)
self.out = nn.Linear(128, out_dim)
def forward(self, state: torch.Tensor) -> torch.Tensor:
x = F.relu(self.hidden1(state))
x = F.relu(self.hidden2(x))
action = self.out(x).tanh()
return action
class Critic(nn.Module):
def __init__(self, in_dim: int, init_w: float = 3e-3):
super(Critic, self).__init__()
self.hidden1 = nn.Linear(in_dim, 128)
self.hidden2 = nn.Linear(128, 128)
self.out = nn.Linear(128, 1)
def forward(self, state: torch.Tensor, action: torch.Tensor) -> torch.Tensor:
x = torch.cat((state, action), dim=-1)
x = F.relu(self.hidden1(x))
x = F.relu(self.hidden2(x))
value = self.out(x)
return value
在DDPG中,软更新对于确保稳定学习至关重要,它通过逐渐调整目标网络参数来实现。更新机制使用了一个平滑因子τ,它控制着更新的速率。演员目标网络和评论家目标网络的每个参数都更新为其当前值与来自演员网络(或评论家网络,视情况而定)的相应参数的加权和。
def _target_soft_update(self):
tau = self.tau
for t_param, l_param in zip(self.actor_target.parameters(), self.actor.parameters()):
t_param.data.copy_(tau * l_param.data + (1.0 - tau) * t_param.data)
for t_param, l_param in zip(self.critic_target.parameters(), self.critic.parameters()):
t_param.data.copy_(tau * l_param.data + (1.0 - tau) * t_param.data)
结果与可视化
本项目的目标是使用DDPG算法训练一个智能体,使其能够在模拟环境中到达山顶的旗帜位置。我们分别测量了智能体在成功和不成功的训练迭代中的性能指标,包括每个回合的得分、演员损失和评论家损失。
上图和下图展示了未成功的运行情况,其中智能体在50个回合(相当于大约50,000步和60分钟的训练)后未能达到目标。从得分和损失函数的高变异性可以看出训练不稳定且未能取得进步。演员损失中的不规则波动也进一步支持了这一观察结果。为了解决这些问题,我们对超参数和探索策略进行了调整,因为之前的设置被证明是不足够的。
下面的图展示了使用调整后的参数成功运行的情况,智能体在80个回合内达到了目标,但只用了30,000步,即大约30分钟的训练时间。最初,由于可用的能量有限,汽车难以获得足够的动量到达山顶。然而,它开发了一种策略,利用山坡使汽车向后行驶,并控制加速度以获得最初缺乏的额外动量。
这一解决方案来自于探索与动作的精细化调整,使得汽车能够克服具有挑战性的斜坡,最终到达旗帜位置。优化后的方法使得每个回合的得分稳步上升,这表明智能体在逐步学习和提高达成目标的能力。效率的提升通过演员损失的稳步下降和评论家损失的逐渐上升得到了很好的体现,这反映了智能体所遇到状态的价值在不断增加。