08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

LunarLander复现:
07、基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)

08、基于LunarLander登陆器的DDQN强化学习(含PYTHON工程)

0、实践背景

gym的LunarLander是一个用于强化学习的经典环境。在这个环境中,智能体(agent)需要控制一个航天器在月球表面上着陆。航天器的动作包括向上推进、不进行任何操作、向左推进或向右推进。环境的状态包括航天器的位置、速度、方向、是否接触到地面或月球上空等。

智能体的任务是在一定的时间内通过选择正确的动作使航天器安全着陆,并且尽可能地消耗较少的燃料。如果航天器着陆时速度过快或者与地面碰撞,任务就会失败。智能体需要通过不断地尝试和学习来选择最优的动作序列,以完成这个任务。

下面是训练的结果:
在这里插入图片描述

1、DDQN (Double DQN)实现原理

参考:DeepRL系列(8): Double DQN(DDQN)原理与实现

论文地址:https://arxiv.org/pdf/1509.06461.pdf

在Q-learning学习中“过估计”是经常发生的,并且影响实验的性能。具体来讲,Q-learning和DQN算法往往会过高估计Q值。

这个过估计来自于max函数,也就是贝尔曼方程
在这里插入图片描述
基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)中讲到,max(Q(s’,a’))的获取完全依赖与Target Q网络,相当于一家独大,说啥就是啥,因此容易造成Q值的“过估计”。

2010年作者Hasselt就针对过高估计Q值的问题提出了Double Q-learning,他就是尝试通过将选择动作和评估动作分割开来避免过高估计的问题。这意味着我们仍然使用贪心策略去学习估计Q值,而使用第二组权重参数去评估其策略,相当于鸡蛋不放在一个篮子里。

Double DQN就是为了解决DQN的高估问题,采用类似的思想,鸡蛋不放在一个篮子里。具体来讲,高估是因为max函数,也就是max(Q(s’,a’)),这个函数的值全权取决于Target Q网络。然而,在DQN算法中,存在Q网络和Target Q两个网络,我们可以采用Q网络去得到s’状态下各个动作的动作价值函数,从而计算应该采取最优动作a。随后,使用Target Q网络计算Q值,选取依赖于Q网络得到的动作a作为最优动作,而不是直接进行max取最大值。

例如,有三个离散动作,其对应的Target Q网络的输出是[0.2,0.3,0.4],在DQN中,我们max(Q(s’,a’))依赖于Target Q网络,那么max(Q(s’,a’))的值就是第3个动作的值0.4。然而,对于DDQN,假设Target Q网络的输出是[0.2,0.3,0.4],但是当前状态下Q网络的输出是[0.2,0.4,0.3],我们就会知道对于Q网络动作2是最优的,如何就会从Target Q网络的输出中取第二个值作为输出,也就是输出0.3。

2、DDQN 和DQN实现代码对比

基于LunarLander登陆器的DQN强化学习案例(含PYTHON工程)已经给出了DQN的全部实现代码,网络构建方面全部相同,只是在loss计算有所不同:

        # 获取q_valuesq_values = q_network(states)if self.model == 'DQN':# 计算最大的Q^(s,a),reduce_max用于求最大值max_qsa = tf.reduce_max(target_q_network(next_states), axis=-1)# 如果完成,设置y = R,否则设置y = R + γ max Q^(s,a)。y_targets = rewards + (gamma * max_qsa * (1 - done_vals))elif self.model == 'Double_DQN':# 从Q网络得出最优动作的index_Qnext_action = np.argmax(q_values, axis=1)# tf.range(q_values.shape[0]构建0-batch_size的数组,next_action是q_network得出的动作,两者组合成二维数组# 从target_q_network(next_states)输出的batch_size*action dim个数组中取数# 从从target_q_network中取出index_Q(来自Q网络)位置的Q值作为输出Q2 = tf.gather_nd(target_q_network(next_states),tf.stack([tf.range(q_values.shape[0]), tf.cast(next_action, tf.int32)], axis=1))y_targets = rewards + (gamma * Q2 * (1 - done_vals))

全部的Loss计算函数:

    def compute_loss(self, experiences, gamma, q_network, target_q_network):"""计算损失函数。参数:experiences: 一个包含["state", "action", "reward", "next_state", "done"]的namedtuples的元组gamma: (浮点数) 折扣因子。q_network: (tf.keras.Sequential) 用于预测q_values的Keras模型target_q_network: (tf.keras.Sequential) 用于预测目标的Keras模型返回:loss: (TensorFlow Tensor(shape=(0,), dtype=int32)) y目标与Q(s,a)值之间的均方误差。"""# 获取数据states, actions, rewards, next_states, done_vals = experiences# 获取q_valuesq_values = q_network(states)if self.model == 'DQN' or self.model == 'Dueling_DQN':# 计算最大的Q^(s,a),reduce_max用于求最大值max_qsa = tf.reduce_max(target_q_network(next_states), axis=-1)# 如果登录完成,设置y = R,否则设置y = R + γ max Q^(s,a)。y_targets = rewards + (gamma * max_qsa * (1 - done_vals))elif self.model == 'Double_DQN' or self.model == 'Dueling_DDQN':next_action = np.argmax(q_values, axis=1)# tf.range(q_values.shape[0]构建0-batch_size的数组,next_action是q_network得出的动作,两者组合成二维数组# 从target_q_network(next_states)输出的batch_size*action dim个数组中取数Q2 = tf.gather_nd(target_q_network(next_states),tf.stack([tf.range(q_values.shape[0]), tf.cast(next_action, tf.int32)], axis=1))y_targets = rewards + (gamma * Q2 * (1 - done_vals))q_values = tf.gather_nd(q_values, tf.stack([tf.range(q_values.shape[0]),tf.cast(actions, tf.int32)], axis=1))# 计算损失loss = MSE(y_targets, q_values)return loss

3、DDQN 和DQN实现效果对比

在同样的参数下,DDQN的收敛相对更快一点点:
在这里插入图片描述
和现在非常流行的SAC算法比,差了不少嘞:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DTC营销新模式,创新商业引领裂变营销新潮流的玩法!

DTC营销新模式,创新商业引领裂变营销新潮流的玩法! 随着市场竞争的加剧,企业寻求创新的营销模式以突破困境,脱颖而出。其中,DTC(Direct-to-Consumer,直接面向消费者)营销新模式应运…

CentOS 7 制作openssh 9.6 rpm包更新修复安全漏洞 —— 筑梦之路

2023年12月18日 openssh 发布新版9.6p1,详细内容阅读OpenSSH: Release Notes 背景说明 之前也写过多篇制作openssh rpm包的文章,为何要重新来写一篇制作openssh 9.6版本的? openssh 9.6 rpm包制作和之前存在区别,对于CentOS 7来…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

【Python】函数

一、函数介绍 二、函数的定义 三、函数的参数 四、函数的返回值 五、函数说明文档 六、函数的嵌套调用 七、变量的作用域 一、函数介绍 函数的使用 函数的作用 函数 函数:是组织好的,可重复使用的,用来实现特定功能的代码段。 input()、p…

文件批量管理,按单值大小归类保存,提升工作效率与便捷性!

你是否曾经遇到过需要批量管理大量文件,但却因为文件大小不一而感到混乱?你是否希望有一种方法能够将这些文件按照单值大小进行归类保存,以便更方便地管理和查找?现在,我们有一个好消息要告诉你,我们推出了…

Nvm切换nodejs版本

下载地址 Releases coreybutler/nvm-windows GitHub 安装运行 双击安装运行即可 下载速度慢的,可以通过修改配置文件切换国内下载镜像 node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: CNPM Binaries Mirror 打开安装目录,修改se…

easyExcel生成excel并导出自定义样式------添加复杂表头

easyExcel生成excel并导出自定义样式------添加复杂表头 设置合并竖行单元格&#xff0c;表头设置 OutputStream outputStream ExcelUtils.getResponseOutputStream(response, fileName);//根据数据组装需要合并的单元格Map<String, List<String>> strategyMap …

gem5 garnet l1 l2 cache的创建与相连

gem5 garnet l1 l2 cache的创建与相连 主要就是这个图&#xff1a; 细节 我们用的是gem5/configs/deprecated/example/fs.py #fs.py 引入了上两层路径&#xff0c;也就是当前可以看到 gem5/configs/路径。 addToPath("../../")#fs.py引入了gem5/configs/ruby/Ru…

MaBatis使用`ResultMap`标签手动映射详解使用

文章目录 MaBatis使用ResultMap标签手动映射详解使用1、MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系&#xff0c;二者不同时无法自动ORM&#xff0c;如下&#xff1a;2、在SQL中使用 as 为查询字段添加列别名&#xff0c;以匹配属性名&#xff1a;但是如果我…

程序员为什么不接单赚钱?绝对是损失!!!

天气渐寒&#xff0c;2024年步步紧逼。 回望旧的2023年&#xff0c;生活有日益向好吗&#xff1f;身体是否还匹配年龄呢&#xff1f; 再问一个致命的问题&#xff1a;2023年攒的钱够多了吗&#xff1f; 如果差强人意&#xff0c;建议来年再改进。若是一言难尽&#xff0c;同样…

分享一个好看的vs主题

最近发现了一个很好看的vs主题&#xff08;个人认为挺好看的&#xff09;&#xff0c;想要分享给大家。 主题的名字叫NightOwl&#xff0c;和vscode的主题颜色挺像的。操作方法也十分简单&#xff0c;首先我们先在最上面哪一行找到扩展。 然后点击管理扩展&#xff0c;再搜索栏…

ssm基于vue.js的连锁干洗店后台管理系统论文

摘 要 使用旧方法对连锁干洗店后台管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在连锁干洗店后台管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次…

JDBC的使用

目录 JDBC简介 JDBC的使用 JDBC简介 JDBC(Java DataBase Connectivity)是用Java操作数据库的一套API。 sun公司官方定义的一套操作所有关系型数据库的规范&#xff0c;即接口。各个数据库厂商去实现这套接口&#xff0c;提供数据库驱动jar包。我们可以使用这套接口(JDBC)来编…

Bugku- misc-插画-WP

下载得到一个zip&#xff0c;用WinRAR打开时发现有注释 注释&#xff1a; RnJlZV9GaWxlX0NhbW91ZmxhZ2UsIOmimOebruWlveWDjaYraMuumHjeimgeeahOagtWtkC4u 明显是base64&#xff0c;解码得到&#xff1a;Free_File_Camouflage, 题目好像是挺重要的样子… 百度发现这是一款隐写…

leetcode面试经典150题——38 生命游戏

题目&#xff1a;生命游戏 **描述&#xff1a;**根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都…

【LeetCode刷题】--245.最短单词距离III

245.最短单词距离III class Solution {public int shortestWordDistance(String[] wordsDict, String word1, String word2) {int len wordsDict.length;int ans len;if(word1.equals(word2)){int prev -1;for(int i 0;i<len;i){String word wordsDict[i];if(word.equa…

Codeforces Round 916(Div.3) A~G

A.Problemsolving Log(计数) 题意&#xff1a; 有 26 26 26个问题 A ∼ Z A \sim Z A∼Z&#xff0c;分别需要尝试 1 ∼ 26 1 \sim 26 1∼26次才能通过。 给出一个字符串&#xff0c;里面包含的每个字母代表着这道题目的一次尝试&#xff0c;问&#xff1a;总共通过了多少题…

前端已死?探讨人工智能与低代码对前端的影响

文章目录 每日一句正能量前言前端行业究竟是好是坏&#xff1f;数字化转型的当下前端工程师该何去何从&#xff1f; 想要入行前端先认清这三个事实 后记 每日一句正能量 人的结构就是相互支撑&#xff0c;众人的事业需要每个人的参与。 前言 随着人工智能和低代码的崛起&#…

【DOM笔记四】事件高级!(注册/删除事件、DOM事件流、事件对象、事件委托、鼠标 / 键盘事件、相关案例)

文章目录 7 事件高级7.1 注册事件概述7.2 删除事件7.3 DOM事件流7.4 事件对象7.5 事件委托7.6 鼠标事件7.6.1 常用的鼠标事件7.6.2 鼠标事件对象 7.7 键盘事件7.7.1 常用的键盘事件7.7.2 键盘事件对象 7 事件高级 7.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或…