首页 > 其他分享 >使用深度强化学习产生多维动作空间,智能体更新如何处理

使用深度强化学习产生多维动作空间,智能体更新如何处理

时间:2024-08-18 17:27:55浏览次数:8  
标签:adv index self torch 智能 critic 深度 多维 size

在编写客制的深度强化学习环境时,有时候需要使用到智能体多维动作空间的应用。

比如说,我们设计的环境是一个打砖块游戏,这时智能体需要产生一个[左,右,不动]的动作概率分布,智能体动作空间只产生一个维度:[0.2,0.4,0.4]
此时,我们需要设计板来打砖块,而且是一个智能体,这时候智能体产生的动作空间就会变成多维,动作概率如下所示:[[0.2,0.4,0.4],[0.2,0.4,0.4]]

那么这时候,智能体的动作概率分布有何不同,更新时会碰到什么问题呢?

在使用PPO算法更新时,首先使用环境与智能体交互,积累经验,然后进行学习。
更新时,首先利用经验计算优势函数。计算完优势函数,开始进行智能体的抽样训练,具体的写法如下:

点击查看代码
def update(self, replay_buffer, total_steps):
        s, a, a_logprob, r, s_, dw, done = replay_buffer.numpy_to_tensor()  #经验存储池
        adv = []
        gae = 0
        with torch.no_grad():  # adv and v_target have no gradient
            vs = self.critic(s)
            vs_ = self.critic(s_)
            deltas = r + self.gamma * (1.0 - dw) * vs_ - vs
            for delta, d in zip(reversed(deltas.flatten().numpy()), reversed(done.flatten().numpy())):
                gae = delta + self.gamma * self.lamda * gae * (1.0 - d)
                adv.insert(0, gae)
            adv = torch.tensor(adv, dtype=torch.float).view(-1, 1)
            v_target = adv + vs
            if self.use_adv_norm:  # Trick 1:advantage normalization
                adv = ((adv - adv.mean()) / (adv.std() + 1e-5))

        # Optimize policy for K epochs:
        for _ in range(self.K_epochs):
            # Random sampling and no repetition. 'False' indicates that training will continue even if the number of samples in the last time is less than mini_batch_size
            for index in BatchSampler(SubsetRandomSampler(range(self.batch_size)), self.mini_batch_size, False):
                dist_now = Categorical(probs=self.actor(s[index]))
                dist_entropy = dist_now.entropy().view(-1, 1)  # shape(mini_batch_size X 1)
                a_logprob_now = dist_now.log_prob(a[index].squeeze()).view(-1, 1)  # shape(mini_batch_size X 1)

                ratios = torch.exp(a_logprob_now - a_logprob[index])  # 这里的log_now产生的是[128,1]的tensor数据,而log产生的是[64,1]的tensor数据
                surr1 = ratios * adv[index]  # Only calculate the gradient of 'a_logprob_now' in ratios
                surr2 = torch.clamp(ratios, 1 - self.epsilon, 1 + self.epsilon) * adv[index]
                actor_loss = -torch.min(surr1, surr2) - self.entropy_coef * dist_entropy  # shape(mini_batch_size X 1)

                # Update actor
                self.optimizer_actor.zero_grad()
                actor_loss.mean().backward()
                if self.use_grad_clip:  # Trick 7: Gradient clip
                    torch.nn.utils.clip_grad_norm_(self.actor.parameters(), 0.5)
                self.optimizer_actor.step()

                v_s = self.critic(s[index])
                critic_loss = F.mse_loss(v_target[index], v_s)

                # Update critic
                self.optimizer_critic.zero_grad()
                critic_loss.backward()
                if self.use_grad_clip:  # Trick 7: Gradient clip
                    torch.nn.utils.clip_grad_norm_(self.critic.parameters(), 0.5)
                self.optimizer_critic.step()

        if self.use_lr_decay:  # Trick 6:learning rate Decay
            self.lr_decay(total_steps)

涉及到多维动作空间时,智能体更新部分,产生pi的比值时,智能体会将抽取的状态送入策略网络,产生新的策略,存储的策略作为旧策略。
但是此时旧策略的尺寸仅为[batch_size,1](因为提前将经验存储的原因,这里在抽取时大小与batch_size是相同的),而新产生的策略尺寸为[batch_size*2,1],因此会产生以下错误:

点击查看代码
RuntimeError: The size of tensor a (batch_size*2) must match the size of tensor b (batch_size) at non-singleton dimension 0

综上,涉及多维动作空间时,会产生旧策略与新策略尺寸不匹配的问题,此时也不能将新策略强行降为[batch_size,1],否则会产生数据错乱。
所以如何在保持多维动作空间特征的同时,还能保持策略大小匹配,就需要使用到联合分布。
使用联合分布来表示多维动作的空间,将二维的动作转化成一个联合分布的点,可解决上述问题。
在pytorch中,已经内置了联合分布函数:torch.distributions.Independent
在具体操作中,针对上述更新过程,作如下改动:

点击查看代码
    def update(self, replay_buffer, total_steps):
        s, a, a_logprob, r, s_, dw, done = replay_buffer.numpy_to_tensor()  # Get training data
        a_logprob = torch.sum(a_logprob, dim=1, keepdim=True)               #结合动作分布
        # Calculate advantages using GAE
        adv = []
        gae = 0
        with torch.no_grad():
            vs = self.critic(s)
            vs_ = self.critic(s_)
            deltas = r + self.gamma * (1.0 - dw) * vs_ - vs
            for delta, d in zip(reversed(deltas.flatten().numpy()), reversed(done.flatten().numpy())):
                gae = delta + self.gamma * self.lamda * gae * (1.0 - d)
                adv.insert(0, gae)
            adv = torch.tensor(adv, dtype=torch.float).view(-1, 1)
            v_target = adv + vs
            if self.use_adv_norm:  # Trick 1: advantage normalization
                adv = (adv - adv.mean()) / (adv.std() + 1e-5)

        # Optimize policy for K epochs:
        for _ in range(self.K_epochs):
            for index in BatchSampler(SubsetRandomSampler(range(self.batch_size)), self.mini_batch_size, False):
                action_mean_now = self.actor(s[index])
                dist_now = Categorical(probs=action_mean_now)
                independent_dist = Independent(dist_now, reinterpreted_batch_ndims=1) #将产生的多维动作空间联合
                entropy = independent_dist.entropy().mean()                           #计算分布的熵,并取其均值。

                a_logprob_now = independent_dist.log_prob(a[index].squeeze()).view(-1, 1)
                index_tensor = torch.tensor(index, dtype=torch.int64)
                index=torch.clamp(index_tensor,0,a_logprob.shape[0]-1)
                a_logprob = a_logprob[index].view(-1, 1)

                ratios = torch.exp(a_logprob_now - a_logprob)
                surr1 = ratios * adv[index]
                surr2 = torch.clamp(ratios, 1 - self.epsilon, 1 + self.epsilon) * adv[index]
                actor_loss = -torch.min(surr1, surr2) - self.entropy_coef * entropy

                self.optimizer_actor.zero_grad()
                actor_loss.mean().backward()
                if self.use_grad_clip:  # Trick 7: Gradient clip
                    torch.nn.utils.clip_grad_norm_(self.actor.parameters(), 0.5)
                self.optimizer_actor.step()

                v_s = self.critic(s[index])
                critic_loss = F.mse_loss(v_target[index], v_s)

                self.optimizer_critic.zero_grad()
                critic_loss.backward()
                if self.use_grad_clip:  # Trick 7: Gradient clip
                    torch.nn.utils.clip_grad_norm_(self.critic.parameters(), 0.5)
                self.optimizer_critic.step()

        if self.use_lr_decay:  # Trick 6: learning rate Decay
            self.lr_decay(total_steps)

以上操作解决多维动作空间更新时动作概率分布size不匹配的问题。

标签:adv,index,self,torch,智能,critic,深度,多维,size
From: https://www.cnblogs.com/wonx3/p/18365705

相关文章

  • PyTorch深度学习实战(18)—— 可视化工具
    在训练神经网络时,通常希望能够更加直观地了解训练情况,例如损失函数曲线、输入图片、输出图片等信息。这些信息可以帮助读者更好地监督网络的训练过程,并为参数优化提供方向和依据。最简单的办法就是打印输出,这种方式只能打印数值信息,不够直观,同时无法查看分布、图片、声音等......
  • [开题报告]FLASK框架智能化新冠疫苗预约系统o8arb(源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全球新冠疫情的持续蔓延,疫苗接种成为控制疫情传播、恢复社会经济活动的关键措施之一。然而,面对庞大的接种需求,传统的疫苗预约方式往往......
  • 零基础学习人工智能—Python—Pytorch学习(五)
    前言上文有一些文字打错了,已经进行了修正。本文主要介绍训练模型和使用模型预测数据,本文使用了一些numpy与tensor的转换,忘记的可以第二课的基础一起看。线性回归模型训练结合numpy使用首先使用datasets做一个数据X和y,然后结合之前的内容,求出y_predicted。#pipinstallmatp......
  • 维基百科向量搜索;简单易用的GraphRAG实现;友好的人工智能助手;AI的音乐多模态
    ✨1:SemanticSearchonWikipedia维基百科向量搜索为了证明UpstashVector的可扩展性,Upstash在一个数据库中以11种语言(144m向量)索引了整个维基百科◆超过700GB的数据◆快速语义搜索◆与维基百科聊天为您提供了一款可扩展......
  • 人工智能时代,程序员如何保持核心竞争力?
    目录引言AI辅助编程对程序员工作的影响代码生成与优化工具的普及编程效率的提升与挑战对传统编程技能的冲击程序员应重点发展的核心能力算法与数据结构的深入理解系统设计与架构能力人工智能与机器学习基础知识跨领域知识的掌握创新思维与问题解决能力......
  • 智能优化算法之粒子群优化算法
    1介绍粒子群优化算法(ParticleSwarmOptimization,PSO)是一种基于群体智能的优化算法,通过模拟鸟群或鱼群等生物群体的行为来解决优化问题。1.1特点简单易实现:粒子群优化算法的代码实现相对简单,容易理解和应用。全局搜索能力强:通过群体中个体的合作与竞争,算法能够在整......
  • SD-WAN视频汇聚网关,帮助企业省去公网服务器费用与流量费用,低成本、高可靠建设视频汇聚
    在介绍方案之前,我们先算一笔账,传统的B端项目大多数的场景是:1、多个分布在不同区域,不同网络的现场需要进行视频设备的统一汇聚管理;2、多种不同类型厂家和型号的设备需要接入;3、需要接入各种设备的实时视频和设备录像,对于关键设备进行备份录像;注意:C端的那种萤石、乐橙、和家亲......
  • 毕业设计:基于SSM的智能家政保洁预约系统【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:SSM数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能用户管理:负责注册用户的信息维护,包括用户资料的增删改查,确保......
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
    【OpenHarmony4.1之U-Boot2024.07源码深度解析】019-RK3568Uboot完整流程梳理一、系统环境初始化:_start入口地址,初始化CPU环境二、系统环境初始化:_main入口,初始化堆栈,初始化gd全局环境变量,初始化CRuntime运行环境,开始执行board_init_f函数三、board_......
  • Excel vba自定义函数公式智能提示
    效果如下第一步下载,智能提示显示xll文件Releases·Excel-DNA/IntelliSense(github.com)xll文件报病毒解决办法默认情况下,Excel正在阻止不受信任的XLL加载项-Microsoft支持 第二步,加载xll文件,xll文件放在excel插件目录:%appdata%\Microsoft\AddIns 第三步编写e......