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

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

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

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

09、基于LunarLander登陆器的Dueling DQN强化学习(含PYTHON工程)

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

基于TENSORFLOW2.10

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.hqwc.cn/news/293385.html

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

相关文章

网络故障?只需使用这个ChatGPT插件,解决率高达90%

1. 在使用 ChatGPT 时遇到的一些问题 近期,ChatGPT 受到了极大的关注,众多用户纷至沓来。仅用五天,ChatGPT 的用户数量就突破了 1 亿。下图展示了国外 TRT World 媒体统计的各大平台突破 1 亿用户的对比图。 如此迅速的用户增长也带来了一些…

超级逼真人脸生成,Stable Diffusion的3个关键技巧

大家好,你是否曾想过,为什么别人可以使用AI图像生成技术生成如此逼真的人脸,而自己的尝试却充满了错误和瑕疵,让人一眼看出是假的。尝试过调整提示和设置,但似乎仍无法与他人的质量相匹配。 本文将带大家了解使用Stab…

WPF组合控件TreeView+DataGrid之DataGrid封装

(关注博主后,在“粉丝专栏”,可免费阅读此文) wpf的功能非常强大,很多控件都是原生的,但是要使用TreeViewDataGrid的组合,就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

Python---搭建Python自带静态Web服务器

1. 静态Web服务器是什么? 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,页面的数据不会发生变化。 …

教你在Linux上安装Node并用Electron打包deb和rpm包

Windows下无法打linux版本的包,如果你要打linux系统的amd64架构需要找一台linux amd64的系统打包,也可以在amd64下打arm架构的包,但是不能运行,需要放到arm架构的系统里才能运行。 下载linux的node环境 Index of /nodejs-releas…

tomcat和nginx自定义404错误页面

nginx 编辑nginx配置文件 vim /www/server/nginx/nginx.conf server{listen 80;error_page 404 /404.html;location /404.html{root /home/liu/html/error-html;} }在家目录下创建一个html/error-html目录,用于存放错误页面 在error-html目录下创建404.html&a…

虾皮跨境电商的收款方式及选择指南

虾皮(Shopee)作为一家知名的跨境电商平台,为卖家提供了多种收款方式,以满足不同卖家的需求。本文将介绍虾皮跨境电商平台的主要收款方式,并提供选择指南,帮助卖家根据自身需求和目标市场选择最合适的收款方…

Python (十五)pandas(三)

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

详解Java中的异常体系结构(throw,throws,try-catch,finally,自定义异常)

目录 一.异常的概念 二.异常的体系结构 三.异常的处理 异常处理思路 LBYL:Look Before You Leap EAFP: Its Easier to Ask Forgiveness than Permission 异常抛出throw 异常的捕获 提醒声明throws try-catch捕获处理 finally的作用 四.自定义异常类 一.异…

【Netty】编解码器

目录 Java的编解码Netty编解码器概念解码器(Decoder)编码器(Encoder)编码解码器Codec Java的编解码 编码(Encode)称为序列化, 它将对象序列化为字节数组,用于网络传输、数据持久化或者其它用途。 解码(Decode&#x…

漏洞复现-大唐电信AC集中管理平台敏感信息泄漏漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

融资项目——vue之路由实现

通俗来说&#xff0c;路由就是锚点<a>的升级版。下面举一个例子来了解&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"list"><h1…