Double-DQN算法

Double-DQN算法的原理简介、与DQN对比等。
参考深度Q网络进阶技巧

1. 原理简介

在DQN算法中,虽然有target_net和eval_net,但还是容易出现Q值高估的情况,原因在于训练时用通过target_net选取最优动作
a ⋆ = argmax ⁡ a Q ( s t + 1 , a ; w − ) a^{\star}=\underset{a}{\operatorname{argmax}} Q\left(s_{t+1}, a ; \mathbf{w}^{-}\right) a=aargmaxQ(st+1,a;w)
并得到其Q值后,再根据
y t = r t + γ ⋅ Q ( s t + 1 , a ⋆ ; w − ) y_{t}=r_{t}+\gamma \cdot Q\left(s_{t+1}, a^{\star} ; \mathbf{w}^{-}\right) yt=rt+γQ(st+1,a;w)
算出TD-target,所以一旦高估,就会频繁被选中然后导致目标值持续较大。

而Double-DQN算法则是设计两个Q网络,一个进行动作选取,一个进行Q值计算。即通过eval_net选取最优动作
a ⋆ 2 = argmax ⁡ a Q ( s t + 1 , a ; w ) a^{\star2}=\underset{a}{\operatorname{argmax}} Q\left(s_{t+1}, a ; \mathrm{w}\right) a2=aargmaxQ(st+1,a;w)
随后再通过target_net计算其Q值得到TD_target目标值
y t = r t + γ ⋅ Q ( s t + 1 , a ⋆ 2 ; w − ) y_{t}=r_{t}+\gamma \cdot Q\left(s_{t+1}, a^{\star2} ; \mathbf{w}^{-}\right) yt=rt+γQ(st+1,a2;w)
毫无疑问, Q ( s t + 1 , a ⋆ 2 ; w − ) ≤ Q ( s t + 1 , a ⋆ ; w − ) Q\left(s_{t+1}, a^{\star2} ; \mathbf{w}^{-}\right) \leq Q\left(s_{t+1}, a^{\star} ; \mathbf{w}^{-}\right) Q(st+1,a2;w)Q(st+1,a;w).

2. 与DQN区别

进行TD算法梯度下降时,DQN算法是直接从target_net中选取最大Q值,而Double-DQN则是eval_net选取最优动作,target_net再选取该动作的Q值。

3. 代码

直接在DQN的代码上进行几行的修改即可,修改类中的learn(update)方法。
代码如下:

class DoubleDQN:
...def learn(self):# target parameter updateif self.learn_step_counter % TARGET_REPLACE_ITER == 0:self.target_net.load_state_dict(self.eval_net.state_dict())self.learn_step_counter += 1# sample batch transitionssample_index = np.random.choice(MEMORY_CAPACITY, BATCH_SIZE)b_memory = self.memory[sample_index, :]b_s = torch.FloatTensor(b_memory[:, :N_STATES])b_a = torch.LongTensor(b_memory[:, N_STATES:N_STATES + 1].astype(int))b_r = torch.FloatTensor(b_memory[:, N_STATES + 1:N_STATES + 2])b_s_ = torch.FloatTensor(b_memory[:, -N_STATES:])######## 就这一点和DQN不一样 ########q_eval = self.eval_net(b_s).gather(1, b_a)  # 相当于Q(s,a)a_next_eval =  self.eval_net(b_s_)          # eval_net估计下一步动作q_next = self.target_net(b_s_).detach()     # target计算 Q(st+1)q_target = b_r + GAMMA * q_next.gather(1, torch.max(a_next_eval, 1)[1].unsqueeze(1))   # 根据eval_net估计的动作的最大值,找出target_net中对应的Q值,得到TD_targetloss = self.loss_func(q_eval, q_target)self.optimizer.zero_grad()  # 梯度重置loss.backward()  # 反向求导self.optimizer.step()  # 更新模型参数
...

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

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

相关文章

51单片机学习(3)-----独立按键控制LED的亮灭状态

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步了。 目录 一. 器件介绍及实验原理 1.独立按键 (1)独…

react 实现路由拦截

简单介绍下项目背景,我这里做了一个demo,前端使用mock数据,然后实现简单的路由拦截,校验session是否包含用户作为已登录的依据,react-router-dom是v6。不像vue可以设置登录拦截beforeenter,react需要我们自…

外包干了3个月,技术退步明显

先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Linux之用户和用户组的深入了解

目录 一、简介 1.1、用户: 1.2、用户组 1.3、UID和GID 1.3、用户账户分类 查看用户类别 超级用户root(0) 程序用户(1~499) 普通用户(500~65535) 二、用户 2.1、添加新的用户账号:useradd 2.2、删除账号:userdel 有-r与没有-r区别…

OSDI 2023: Hyrax Fail-in-Place Server Operation in Cloud Platforms

我们使用以下6个分类标准对本文的研究选题进行分析: 1. 硬件故障类型 DRAM: 此类别涉及研究如何处理内存相关的错误。这包括单比特错误,使用传统 ECC 进行校正,以及需要冗余、修复技术或隔离故障内存区域的更广泛的故障。磁盘: 此处研究将解决存储故障,尤其是 SSD 中的故障…

运维07:堡垒机

什么是跳板机 跳板机就是一台服务器而已,运维人员在使用管理服务器的时候,必须先连接上跳板机,然后才能去操控内网中的服务器,才能登录到目标设备上进行维护和操作 开发小张 ---> 登录跳板机 ---> 再登录开发服务器 测试…

贷齐乐系统最新版SQL注入(无需登录绕过WAF可union select跨表查询)

一、环境 已上传资源(daiqile) 二、代码解释 1.1Request 不管get请求还是post请求都可以接收到 1.2过滤的还挺多 1.3第二个WAF把数据分为两个了一个Key一个value,全是explode的功劳 1.4submit是if进入的前提 很明显走进来了 1.5那我们在这…

学习JAVA的第三天(基础)

目录 流程控制语句 顺序结构 分支结构 循环结构 分类: 练习 跳转控制语句 练习 数组 数组介绍 数组的定义和静态初始化 数组定义 数组的静态初始化 数组元素访问 数组遍历 数组动态初始化 JAVA内存分配 流程控制语句 顺序结构 是Java程序默认的执行流程…

UIKit 在 UICollectionView 中拖放交换 Cell 视图的极简实现

概览 UIKit 中的 UICollectionView 视图是我们显示多列集合数据的不二选择,而丰富多彩的交互操作更是我们选择 UICollectionView 视图的另一个重要原因。 如上图所示:我们实现了在 UICollectionView 中拖放交换任意两个 Cell 子视图的功能,这…

js如何判断一个对象中某一个属性存在并且有值

在JavaScript中,可以使用不同的方法来判断一个对象中某个属性是否存在并且有值。以下是几种常见的方法: 1、使用hasOwnProperty()方法:该方法用于检查对象是否具有指定的属性。可以通过以下方式来判断属性是否存在并且有值: if (…

整理了去年的一些运维面试题一

Ingress的yaml文件需要包含哪些? CICD搭建流程? JAVA程序打包工具? 如何检测Linux端口如何通信? k8s集群之间如何通信的? docker组成部分? 20位掩码有多少主机IP? 在linux中四个T的硬盘使用什…

Zabbix 远程监控主机

目录 1、安装 Zabbix 安装客户端 服务端测试通讯 Web页面添加主机 2、监控 Nginx 自定义脚本监控 Nginx web配置台 3、监控 MySQL 配置模版文件 配置Web界面 1、安装 Zabbix node-12 作为zabbix的被监控端,提供mysql服务器,配置zabbix监控node…

jquery写组件滑动人机验证组件

jquery组件,虽然 jquery 语法古老,但是写好了用起来真的很爽啊,本文用滑动人机验证给大家做个详细教程(直接复制代码就可以用噢o(* ̄▽ ̄*)ブ) 第一步 先看下组件本身 component.js (function() {…

Nginx网络服务三-----(三方模块和内置变量)

1.验证模块 需要输入用户名和密码 我们要用htpasswd这个命令,先安装一下httpd 生成文件和用户 修改文件 访问页面 为什么找不到页面? 对应的路径下,没有这个文件 去创建文件 去虚拟机浏览器查看 有的页面不想被别人看到,可以做…

【UI自动化】使用poco框架进行元素唯一定位

直接选择: 1.poco(text买入).click() 2.poco("android.widget.ImageView").click()相对选择、空间选择: 3.poco(text/name).parent().child()[0].click()正则表达式: 4.listpoco(textMatches".*ETF")今天主要想记录下…

centos 系统盘 放到 win pc 中的异常解决

有一块 2.5 480g sata ssd,之前是笔记本电脑的centos系统盘,后来没用了,打算挂到台式机上当下载盘。台式机pc的主板是华硕 h610m-a。 难点一: 因为台式pc上已经挂了两块3.5 hdd,发现sata的电源线都在3.5hdd附近&#…

利用RBI(Remote Browser Isolation)技术访问ChatGPT

系统组网图 #mermaid-svg-Bza2puvd8MudMbqR {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Bza2puvd8MudMbqR .error-icon{fill:#552222;}#mermaid-svg-Bza2puvd8MudMbqR .error-text{fill:#552222;stroke:#552222;…

300分钟吃透分布式缓存-10讲:MC是怎么定位key的?

我们在进行 Mc 架构剖析时,除了学习 Mc 的系统架构、网络模型、状态机外,还对 Mc 的 slab 分配、Hashtable、LRU 有了简单的了解。本节课,将进一步深入学习这些知识点。 接下来,进入 Memcached 进阶的学习。会讲解 Mc 是如何进行…

QT应用软件【协议篇】周立功CAN接口卡代码示例

文章目录 USBCAN系列CAN接口卡规格参数资料下载QT引用周立功的库安装sdk代码USBCAN系列CAN接口卡 USBCAN系列CAN接口卡兼容USB2.0全速规范,可支持1/2/4/8路CAN接口。采用该接口卡,PC机可通过USB连入CAN网络,进行CAN总线数据采集和处理,主要具备以下几大优势特点: 支持车载…

正交匹配追踪(Orthogonal Matching Pursuit, OMP)的MATLAB实现

压缩感知(Compressed Sensing, CS)是一种利用稀疏信号的先验知识,用远少于奈奎斯特采样定理要求的样本数目恢复整个信号的技术。正交匹配追踪(Orthogonal Matching Pursuit, OMP)是一种常见的贪婪算法(Gree…