首页 >热点 > > 正文

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

DeepHub IMBA 2023-05-10 19:17:39

在本文中,我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂,这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。我们的目标是高精度的到达目标位置,所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep Deterministic Policy Gradient (DDPG) 算法。

现实世界的应用程序

机械臂在制造业、生产设施、空间探索和搜救行动中发挥着关键作用。控制机械臂的高精度和灵活性是非常重要的。通过采用强化学习技术,可以使这些机器人系统实时学习和调整其行为,从而提高性能和灵活性。强化学习的进步不仅有助于我们对人工智能的理解,而且有可能彻底改变行业并对社会产生有意义的影响。


(资料图片)

而Reacher是一种机械臂模拟器,常用于控制算法的开发和测试。它提供了一个虚拟环境,模拟了机械臂的物理特性和运动规律,使得开发者可以在不需要实际硬件的情况下进行控制算法的研究和实验。

Reacher的环境主要由以下几个部分组成:

机械臂:Reacher模拟了一个双关节机械臂,包括一个固定基座和两个可动关节。开发者可以通过控制机械臂的两个关节来改变机械臂的姿态和位置。目标点:在机械臂的运动范围内,Reacher提供了一个目标点,目标点的位置是随机生成的。开发者的任务是控制机械臂,使得机械臂的末端能够接触到目标点。物理引擎:Reacher使用物理引擎来模拟机械臂的物理特性和运动规律。开发者可以通过调整物理引擎的参数来模拟不同的物理环境。视觉界面:Reacher提供了一个可视化的界面,可以显示机械臂和目标点的位置,以及机械臂的姿态和运动轨迹。开发者可以通过视觉界面来调试和优化控制算法。

Reacher模拟器是一个非常实用的工具,可以帮助开发者在不需要实际硬件的情况下,快速测试和优化控制算法。

模拟环境

Reacher 使用 Unity ML-Agents 工具包构建,我们的代理可以控制双关节机械臂。目标是引导手臂朝向目标位置并尽可能长时间地保持其在目标区域内的位置。该环境具有 20 个同步代理,每个代理独立运行,这有助于在训练期间有效地收集经验。

状态和动作空间

了解状态和动作空间对于设计有效的强化学习算法至关重要。在 Reacher 环境中,状态空间由 33 个连续变量组成,这些变量提供有关机械臂的信息,例如其位置、旋转、速度和角速度。动作空间也是连续的,四个变量对应于施加在机械臂两个关节上的扭矩。每个动作变量都是一个介于 -1 和 1 之间的实数。

任务类型和成功标准

Reacher 任务被认为是片段式的,每个片段都包含固定数量的时间步长。代理的目标是在这些步骤中最大化其总奖励。手臂末端执行器保持在目标位置的每一步都会获得 +0.1 的奖励。当代理在连续 100 次操作中的平均得分达到 30 分或以上时,就认为成功。

了解了环境,下面我们将探讨 DDPG 算法、它的实现,以及它如何有效地解决这种环境中的连续控制问题。

连续控制的算法选择:DDPG

当涉及到像Reacher问题这样的连续控制任务时,算法的选择对于实现最佳性能至关重要。在这个项目中,我们选择了DDPG算法,因为这是一种专门设计用于处理连续状态和动作空间的actor-critic方法。

DDPG算法通过结合两个神经网络,结合了基于策略和基于值的方法的优势:行动者网络(Actor network)决定给定当前状态下的最佳行为,批评家网络(Critic network)估计状态-行为值函数(Q-function)。这两种网络都有目标网络,通过在更新过程中提供一个固定的目标来稳定学习过程。

通过使用Critic网络估计q函数,使用Actor网络确定最优行为,DDPG算法有效地融合了策略梯度方法和DQN的优点。这种混合方法允许代理在连续控制环境中有效地学习。

import random from collections import deque import torch import torch.nn as nn import numpy as np  from actor_critic import Actor, Critic  class ReplayBuffer:     def __init__(self, buffer_size, batch_size):         self.memory = deque(maxlen=buffer_size)         self.batch_size = batch_size      def add(self, state, action, reward, next_state, done):         self.memory.append((state, action, reward, next_state, done))      def sample(self):         batch = random.sample(self.memory, self.batch_size)         states, actions, rewards, next_states, dones = zip(*batch)         return states, actions, rewards, next_states, dones      def __len__(self):         return len(self.memory)   class DDPG:     def __init__(self, state_dim, action_dim, hidden_dim, buffer_size, batch_size, actor_lr, critic_lr, tau, gamma):         self.actor = Actor(state_dim, hidden_dim, action_dim, actor_lr)         self.actor_target = Actor(state_dim, hidden_dim, action_dim, actor_lr)         self.critic = Critic(state_dim, action_dim, hidden_dim, critic_lr)         self.critic_target = Critic(state_dim, action_dim, hidden_dim, critic_lr)          self.memory = ReplayBuffer(buffer_size, batch_size)         self.batch_size = batch_size         self.tau = tau         self.gamma = gamma          self._update_target_networks(tau=1)  # initialize target networks      def act(self, state, noise=0.0):         state = torch.tensor(state, dtype=torch.float32).unsqueeze(0)         action = self.actor(state).detach().numpy()[0]         return np.clip(action + noise, -1, 1)      def store_transition(self, state, action, reward, next_state, done):         self.memory.add(state, action, reward, next_state, done)      def learn(self):         if len(self.memory) < self.batch_size:             return          states, actions, rewards, next_states, dones = self.memory.sample()          states = torch.tensor(states, dtype=torch.float32)         actions = torch.tensor(actions, dtype=torch.float32)         rewards = torch.tensor(rewards, dtype=torch.float32).unsqueeze(1)         next_states = torch.tensor(next_states, dtype=torch.float32)         dones = torch.tensor(dones, dtype=torch.float32).unsqueeze(1)          # Update Critic         self.critic.optimizer.zero_grad()          with torch.no_grad():             next_actions = self.actor_target(next_states)             target_q_values = self.critic_target(next_states, next_actions)             target_q_values = rewards + (1 - dones) * self.gamma * target_q_values          current_q_values = self.critic(states, actions)         critic_loss = nn.MSELoss()(current_q_values, target_q_values)          critic_loss.backward()         self.critic.optimizer.step()          # Update Actor         self.actor.optimizer.zero_grad()          actor_loss = -self.critic(states, self.actor(states)).mean()         actor_loss.backward()         self.actor.optimizer.step()          # Update target networks         self._update_target_networks()      def _update_target_networks(self, tau=None):         if tau is None:             tau = self.tau          for target_param, param in zip(self.actor_target.parameters(), self.actor.parameters()):             target_param.data.copy_(tau * param.data + (1 - tau) * target_param.data)          for target_param, param in zip(self.critic_target.parameters(), self.critic.parameters()):             target_param.data.copy_(tau * param.data + (1 - tau) * target_param.data)

上面的代码还使用了Replay Buffer,这可以提高学习效率和稳定性。Replay Buffer本质上是一种存储固定数量的过去经验或过渡的内存数据结构,由状态、动作、奖励、下一状态和完成信息组成。使用它的主要优点是使代理能够打破连续经验之间的相关性,从而减少有害的时间相关性的影响。

通过从缓冲区中抽取随机的小批量经验,代理可以从一组不同的转换中学习,这有助于稳定和概括学习过程。Replay Buffer还可以让代理多次重用过去的经验,从而提高数据效率并促进从与环境的有限交互中更有效地学习。

DDPG算法是一个很好的选择,因为它能够有效地处理连续的动作空间,这是这个环境的一个关键方面。该算法的设计允许有效地利用多个代理收集的并行经验,从而实现更快的学习和更好的收敛。就像上面介绍的Reacher 可以同时运行20个代理,所以我们可以使用这20个代理进行分享经验,集体学习,提高学习速度。

完成了算法,下面我们将介绍、超参数选择和训练过程。

DDPG算法在Reacher 环境中工作

为了更好地理解算法在环境中的有效性,我们需要仔细研究学习过程中涉及的关键组件和步骤。

网络架构

DDPG算法采用两个神经网络,Actor 和Critic。两个网络都包含两个隐藏层,每个隐藏层包含400个节点。隐藏层使用ReLU (Rectified Linear Unit)激活函数,而Actor网络的输出层使用tanh激活函数产生范围为-1到1的动作。Critic网络的输出层没有激活函数,因为它直接估计q函数。

以下是网络的代码:

import numpy as np import torch import torch.nn as nn import torch.optim as optim  class Actor(nn.Module):     def __init__(self, input_dim, hidden_dim, output_dim, learning_rate=1e-4):         super(Actor, self).__init__()          self.fc1 = nn.Linear(input_dim, hidden_dim)         self.fc2 = nn.Linear(hidden_dim, hidden_dim)         self.fc3 = nn.Linear(hidden_dim, output_dim)          self.tanh = nn.Tanh()          self.optimizer = optim.Adam(self.parameters(), lr=learning_rate)      def forward(self, state):         x = torch.relu(self.fc1(state))         x = torch.relu(self.fc2(x))         x = self.tanh(self.fc3(x))         return x  class Critic(nn.Module):     def __init__(self, state_dim, action_dim, hidden_dim, learning_rate=1e-4):         super(Critic, self).__init__()          self.fc1 = nn.Linear(state_dim, hidden_dim)         self.fc2 = nn.Linear(hidden_dim + action_dim, hidden_dim)         self.fc3 = nn.Linear(hidden_dim, 1)          self.optimizer = optim.Adam(self.parameters(), lr=learning_rate)      def forward(self, state, action):         x = torch.relu(self.fc1(state))         x = torch.relu(self.fc2(torch.cat([x, action], dim=1)))         x = self.fc3(x)         return x
超参数选择

选择的超参数对于高效学习至关重要。在这个项目中,我们的Replay Buffer大小为200,000,批大小为256。演员Actor的学习率为5e-4,Critic的学习率为1e-3,soft update参数(tau)为5e-3,gamma为0.995。最后还加入了动作噪声,初始噪声标度为0.5,噪声衰减率为0.998。

训练过程

训练过程涉及两个网络之间的持续交互,并且20个平行代理共享相同的网络,模型会从所有代理收集的经验中集体学习。这种设置加快了学习过程,提高了效率。

from collections import deque import numpy as np import torch  from ddpg import DDPG  def train_ddpg(env, agent, episodes, max_steps, num_agents, noise_scale=0.1, noise_decay=0.99):     scores_window = deque(maxlen=100)     scores = []      for episode in range(1, episodes + 1):         env_info = env.reset(train_mode=True)[brain_name]         states = env_info.vector_observations         agent_scores = np.zeros(num_agents)          for step in range(max_steps):             actions = agent.act(states, noise_scale)             env_info = env.step(actions)[brain_name]             next_states = env_info.vector_observations             rewards = env_info.rewards             dones = env_info.local_done              for i in range(num_agents):                 agent.store_transition(states[i], actions[i], rewards[i], next_states[i], dones[i])             agent.learn()              states = next_states             agent_scores += rewards             noise_scale *= noise_decay              if np.any(dones):                 break          avg_score = np.mean(agent_scores)         scores_window.append(avg_score)         scores.append(avg_score)          if episode % 10 == 0:             print(f"Episode: {episode}, Score: {avg_score:.2f}, Avg Score: {np.mean(scores_window):.2f}")          # Saving trained Networks         torch.save(agent.actor.state_dict(), "actor_final.pth")         torch.save(agent.critic.state_dict(), "critic_final.pth")      return scores  if __name__ == "__main__":     env = UnityEnvironment(file_name="Reacher_20.app")     brain_name = env.brain_names[0]     brain = env.brains[brain_name]      state_dim = 33     action_dim = brain.vector_action_space_size      num_agents = 20          # Hyperparameter suggestions     hidden_dim = 400     batch_size = 256     actor_lr = 5e-4     critic_lr = 1e-3     tau = 5e-3     gamma = 0.995     noise_scale = 0.5     noise_decay = 0.998      agent = DDPG(state_dim, action_dim, hidden_dim=hidden_dim, buffer_size=200000, batch_size=batch_size,                  actor_lr=actor_lr, critic_lr=critic_lr, tau=tau, gamma=gamma)      episodes = 200     max_steps = 1000      scores = train_ddpg(env, agent, episodes, max_steps, num_agents, noise_scale=0.2, noise_decay=0.995)

训练过程中的关键步骤如下所示:

初始化网络:代理使用随机权重初始化共享的 Actor 和 Critic 网络及其各自的目标网络。目标网络在更新期间提供稳定的学习目标。

与环境交互:每个代理使用共享的 Actor 网络,通过根据其当前状态选择动作来与环境交互。为了鼓励探索,在训练的初始阶段还将噪声项添加到动作中。采取行动后,每个代理都会观察由此产生的奖励和下一个状态。存储经验:每个代理将观察到的经验(状态、动作、奖励、next_state)存储在共享重放缓冲区中。该缓冲区包含固定数量的近期经验,这样每个代理能够从所有代理收集的各种转换中学习。从经验中学习:定期从共享重放缓冲区中抽取一批经验。通过最小化预测 Q 值和目标 Q 值之间的均方误差,使用采样经验来更新共享 Critic 网络。更新 Actor 网络:共享 Actor 网络使用策略梯度进行更新,策略梯度是通过采用共享 Critic 网络关于所选动作的输出梯度来计算的。共享 Actor 网络学习选择最大化预期 Q 值的动作。更新目标网络:共享的 Actor 和 Critic 目标网络使用当前和目标网络权重的混合进行软更新。这确保了稳定的学习过程。结果展示

我们的agent使用DDPG算法成功地学会了在Racher环境下控制双关节机械臂。在整个训练过程中,我们根据所有20个代理的平均得分来监控代理的表现。随着智能体探索环境和收集经验,其预测奖励最大化最佳行为的能力显著提高。

可以看到代理在任务中表现出了显著的熟练程度,平均得分超过了解决环境所需的阈值(30+),虽然代理的表现在整个训练过程中有所不同,但总体趋势呈上升趋势,表明学习过程是成功的。

下图显示了20个代理的平均得分:

可以看到我们实现的DDPG算法,有效地解决了Racher环境的问题。代理能够调整自己的行为,并在任务中达到预期的性能。

下一步工作

本项目中的超参数是根据文献和实证测试的建议组合选择的。还可以通过系统超参数调优的进一步优化可能会带来更好的性能。

多agent并行训练:在这个项目中,我们使用20个agent同时收集经验。使用更多代理对整个学习过程的影响可能会导致更快的收敛或提高性能。

批归一化:为了进一步增强学习过程,在神经网络架构中实现批归一化是值得探索的。通过在训练过程中对每一层的输入特征进行归一化,批归一化可以帮助减少内部协变量移位,加速学习,并潜在地提高泛化。将批处理归一化加入到Actor和Critic网络可能会导致更稳定和有效的训练,但是这个需要进一步测试。

上一篇:视频丨首届盐碱地技术创新大会在东营举行-世界今日报 下一篇:最后一页
x
推荐阅读

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂

2023-05-10

视频丨首届盐碱地技术创新大会在东营举行-世界今日报

2023-05-10

环球速递!东方:积分制+清单制赋能乡村

2023-05-10

天天热门:选择大城市逐梦还是小城市安稳

2023-05-10

全球视点!潘多拉的爱情宝典大结局在线观看,究竟是怎么个情况?

2023-05-10

天天即时看!厘清电子行业发展新趋势,2023年慕尼黑上海电子展十大关键词新鲜出炉!

2023-05-10

员工因工作量被辞退

2023-05-10

我這個台灣人,曾在上海開過公司,上海的經商環境很好,很友善

2023-05-10

收评:两市分化沪指跌超1% 新能源赛道强势反弹-全球微头条

2023-05-10

每日快报!海盗王私服发布网

2023-05-10

观影团丨《银河护卫队 3》热映,IMAX2D 版本邀你一起踏上最终探险-每日速讯

2023-05-10

民警吃饭遇顾客吵架,关键时刻他露出警服,瞬间“止战!”

2023-05-10

天天快讯:怎么除水垢_有什么去除水垢的技巧

2023-05-10

电池故障、虚假宣传…… 中消协发布汽车消费四大问题

2023-05-10

鬼马神仙车!坐电动车出行,AI说了算?|时快讯

2023-05-10

关于吃水果对身体有好处的说说_吃水果的好处谚语

2023-05-10

教育板块表现强势 机构:看好AI在教育的应用落地

2023-05-10

天天日报丨科大讯飞、美亚柏科大涨,央企改革ETF(512950)关注央企数字化转型

2023-05-10

美国限制对华投资不得人心 巴菲特搭档连说三遍“愚蠢”_全球动态

2023-05-10

虚拟账号交易乱象调查:租售支付账号风险大-世界实时

2023-05-10

天天播报:妈祖故乡向全球征集文创作品 促妈祖文化创新发展

2023-05-10

全球看点:地下车库告别“水漫金山”

2023-05-10

苏宁环球:确保房地产主营业务同时,持续加大对医美产业投入力度

2023-05-10

AI投资不可忽视的风险和机遇:数码视讯、北信源等优质企业数据安全值得关注! 环球快资讯

2023-05-10

4月17日有104只债券缴款|世界消息

2023-05-10

全球观察:海贼王电脑壁纸_海贼王522

2023-05-10

思辰这个名字的含义是什么_思辰什么意思 动态

2023-05-10

地产广告不要再自嗨了|全球微动态

2023-05-10

山药一起吃有什么好处

2023-05-10

专业测试1考什么_专业测试1是什么意思

2023-05-09

每日信息:保时捷与英特尔旗下Mobileye达成战略合作

2023-05-09

重钢建房的优缺点_重钢

2023-05-09

招商公路(001965.SZ):未来期望通过REITs项目,打通公司高速公路项目的“募、投、管、退”的全流程通道 环球热推荐

2023-05-09

国家软实力的重要性_国家软实力|当前热文

2023-05-09

明光市举办抺山庙会民俗文化节

2023-05-09

广州地铁通报“手机NFC卡显示异常”:联系乘客进一步分析|环球观速讯

2023-05-09

2022年全国规上企业就业人员年平均工资92492元

2023-05-09

川煤华荣能源渡市选煤发电厂多举措打好安全管理“组合拳”_每日观察

2023-05-09

因项目基本售罄 栖霞建设拟对南京子公司减资11.5亿 环球快播报

2023-05-09

汉王科技今日涨7.53% 4家机构净买入9587.53万元

2023-05-09

播报:小微企业关爱行动即将启幕,畅捷通联合生态伙伴加速数智进阶

2023-05-09

查尔斯三世加冕礼落幕:雨中的庆典和逐渐降温的民众热情|全球资讯

2023-05-09

每日热闻!盐田区应急安全短视频挑战赛来啦,邀你show出精彩!

2023-05-09

最新生日祝自己文案搞笑(六篇)

2023-05-09

江苏省省长许昆林调研正泰新能盐城基地

2023-05-09

谷歌将在开发者大会上发布PaLM 2

2023-05-09

每日视讯:中国名人排行榜2017_中国名人排行榜

2023-05-09

四川乐山:预计今年底晶硅光伏产业产值突破1000亿元

2023-05-09

kingtis精铁时是哪个国家的品牌_什么档次怎么样

2023-05-09

微软再次在Windows11和10上略微改进了Windows更新

2023-05-09

优刻得: 公司战略、优势及业务情况,请关注定期报告 全球播报

2023-05-09

港金管局拟于本月推出数码港元第二轨道先导计划

2023-05-09

立交桥的回忆

2023-05-09

速读:2023年补助地方公共文化服务资金下达

2023-05-09

法国总统马克龙将于7月初对德国进行国事访问

2023-05-09

世界热消息:厦大教务系统推出“举报同学逃课”功能?小程序开发方:系公司失误,已向校方道歉

2023-05-09

全球信息:和燕路迈皋桥周边道路周末恢复交通

2023-05-09

香港女星浙江吃路边摊!体重270斤引担忧,39岁仍单身上海3栋豪宅_当前热文

2023-05-09

彼得萨斯加德加盟《蝙蝠侠》出演双面人一角

2023-05-09

电池型号怎么认_电池型号怎么看

2023-05-09

世界今头条!从拉丝不锈钢表面去除锈

2023-05-09

快穿之请把我带走

2023-05-09

灊山集_关于灊山集介绍

2023-05-09

天天关注:湖南台最近的连续剧(湖南台最近的电视剧)

2023-05-09

比前任更狠?足协疑似“选择性执法”,遭记者炮轰,回放有些可笑_当前消息

2023-05-08

热门:内行人的预测要成真?我国41.5%的家庭可能会面临三大困境?

2023-05-08

基辅市长:基辅受到俄对乌发起特别军事行动以来“最大规模”袭击 天天百事通

2023-05-08

环球今头条!天地无瑕毛不易mp3下载_毛不易mp3下载

2023-05-08

首轮亚运集训结束,LPL已有一位冠军ad落选?跟jkl的说辞完全相反 全球微资讯

2023-05-08

全球快报:2021最火的昵称霸气,2021抖音最旺最好的名字

2023-05-08

男士休闲西装搭配_男士休闲西装搭配方法_天天热推荐

2023-05-08

房地产开发板块跌0.67% *ST泛海涨5.56%居首 时快讯

2023-05-08

湘佳股份:4月活禽销售收入7285.92万元 同比上涨20.39%|快资讯

2023-05-08

封面有数丨新一线城市成咖啡货运主流目的地,成都位列热门城市前五-今日热搜

2023-05-08

上海周大福现在黄金价格多少钱一克(2023年5月8日)

2023-05-08

环球焦点!马龙:细节将决定这轮系列赛的成败 盼带着3比2的比分再来凤凰城

2023-05-08

天天微动态丨132批选162套!光明润曜府公示意向登记人名册

2023-05-08

快看:杭州西湖博物馆第二展厅是什么内容?

2023-05-08

韩国继续对涉华PET薄膜征收为期五年的反倾销税 当前动态

2023-05-08

民间专利转化为何这么难?

2023-05-08

天天滚动:邻苯二甲酸二丁酯商品报价动态(2023-05-08)

2023-05-08

鸟鸣涧的思想感情及重点注释_鸟鸣涧的思想感情 天天快播

2023-05-08

世界新资讯:邯郸中诺口腔医院怎么样

2023-05-08

每日视讯:生化危机4重制版第七章攻略_fgo第七章攻略

2023-05-08

天天讯息:最近很火的幼儿园歌曲

2023-05-08

仲裁请求可以确认解除劳动关系吗?劳动仲裁一定要解除劳动合同吗?

2023-05-08

本地生活牌桌,快手“慢半拍”_天天热讯

2023-05-08

《西游记》改编热:时光在雕刻经典

2023-05-08

2023年5月8日广东省粳米批发价格行情

2023-05-08

天天热资讯!方头明是什么梗

2023-05-08

吉电股份拟在吉林四平建绿氢项目_热消息

2023-05-08

世界新资讯:保护利用发展并重 传统村落焕发生机(金台视线·关注传统村落保护⑤)

2023-05-08

天天观焦点:中信建投:白鸡景气有望维持 黄鸡价格或逐步回暖

2023-05-08

液晶电视面板连续涨价 面板厂业绩迎边际改善;

2023-05-08

焕新而来的不只是车 从全新CX-50看长安马自达的宏图之志-焦点日报

2023-05-08

每日关注!【风口解读】科美诊断两名IPO前股东拟再减持不超3%,一季度净利降逾10%

2023-05-08

全球观察:濮阳市食文化研究会_关于濮阳市食文化研究会介绍

2023-05-08

曹操割发代首的故事_曹操割发代首

2023-05-07

笔笔攒的危害_笔笔攒

2023-05-07

当前快看:你的样子真美作文500字_你的样子真美作文

2023-05-07