【FreeRL】Rainbow_DQN的实现和测试

news2024/9/21 0:48:46

文章目录

  • 前言
    • 环境
    • 1 PER note
    • 2 C51 note
    • 3 Noisy note
    • 4 Rainbow note
    • 其他


前言

具体代码实现见:https://github.com/wild-firefox/FreeRL/blob/main/DQN_file/DQN_with_tricks.py
将其中所有的trick都用上即为Rainbow_DQN。

效果如下:(学习曲线)
在这里插入图片描述
具体实现细节,代码中有较为详细的阐述。


环境

使用离散环境MountainCar-v0为基准来调整参数,以此能收敛为目标了,后发现此参数可以适用大多数其他环境,但不是全部。
使用MountainCar-v0的理由:环境的目标是到达最高的山峰,但环境中还有个次高的山峰,个人认为可以很好拟合出梯度中的次优解。

1 PER note

在 MountainCar-v0 环境下测试了一下 无PER 和有PER
DQN_2 ,DQN_3 为seed10 seed100
DQN_PER_10 ,DQN_PER_100 为seed10 seed100
效果如图所示:结论:不仅时间耗时长,效果也不如无PER,网上也大都如此。(单加PER的情况)
在这里插入图片描述

2 C51 note

一开始参考的代码
dqn_zoo/blob/master/Categorical%20DQN/categorical_dqn.py 有点问题
在代码的L120处的projection_distribution函数 有两处要修改
1.127-129行 在对next_dist 进行*support后 在对next_dist应该变为q值,在后续的133行则混淆了两者,此处问题导致模型不能收敛!
应该改为如下:

next_dist = target_model.forward(next_observation).detach()#.mul(support)  1.modify
q = next_dist.mul(support) # 2.modify
# next_dist: [batch_size, action_dim, atoms_num]
next_action = q.sum(2).max(1)[1] # 3.modify
# next_action: [batch_size]
next_action = next_action.unsqueeze(1).unsqueeze(1).expand(batch_size, 1, atoms_num)
# next_action: [batch_size, 1, atoms_num]
next_dist = next_dist.gather(1, next_action).squeeze(1)
# next_dist: [batch_size, atoms_num]

2.143-144行没有考虑b = 1.时 l=u的情况,会导致模型收敛不稳定
应该改为如下: 149-150行

proj_dist.view(-1).index_add_(0, (offset + l).view(-1), (next_dist * (u.float() +(l=u)- b)).view(-1)) # modify
proj_dist.view(-1).index_add_(0, (offset + u).view(-1), (next_dist * (b - l.float())).view(-1))

效果如下:蓝色为原始参考代码 绿色改1 黑色改1,2
在这里插入图片描述

后面参考的这个代码是对的
https://github.com/XinJingHao/DRL-Pytorch/

3 Noisy note

原始论文 std_init = 0.5
但是对于有些环境不是很有效 比如 MountainCar-v0 好像设置0.1,0.2左右会比较好 在MountainCar-v0环境中 设置的为0.05,才能收敛。

4 Rainbow note

问题1 :出现了增加了一个算法,时间却反而减少的现象,这里c51算法叠加PER算法后,时间反而比单PER减少了,猜测:可能c51算法拟合的q分布天生和error分布契合,导致优势值的更新时间减少。
在这里插入图片描述

结论:
1.在有些环境下单纯累加trick 并不奏效 如MountainCar-v0,需要根据环境特点来选择。
2.或者说,有些算法的鲁棒性不是很好。

测试发现:
1.Double,Dueling,具有鲁棒性:加入后并不会造成算法不收敛。
2.N-step,Categorical,不具有鲁棒性:加入后容易造成算法不收敛。
3.Noisy,对超参数敏感或者说是环境敏感,调整到好的超参数会有很好的效果,反之亦然。
4.PER 单独加入会使训练速度变慢,但是效果并没有增加多少,同时有较多参数需要调整。
4.Categorical ,PER有良好的叠加性:猜测:原因是两者都适用于奖励稀疏型环境。而单独加入PER算法,

补充:rainbow在其他环境,如:LunarLander-v2 效果还是挺好的。(简单环境CartPole-v1下的环境也很好)
在这里插入图片描述

其他

其他环境并未做过多测试,本文并不能断定哪些算法一定是好的,一定是坏的。
且有些情况下,有的trick可能会出现只在学习曲线上的效果好,而在评估时,表现差劲。
比如之前有看过在buffer中随机抽样时,将 replace=False 改为replace=True的小技巧。
replace=True意为允许重复采样

np.random.choice(total_size, batch_size, replace=False) #np.random.choice默认是随机均匀采样

我测试了一下,改为True,确实绘制的学习曲线变好了,但是在其他随机种子的评估环境中,效果却明显不如,可能这种情况是出现过拟合了。

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

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

相关文章

word文档的写入(1)

Word文档的写入 我们手动复制Excel信息,再粘贴进Word,进行文件保存的整个操作。属于机械性的重复劳动,并不能带来太大价值。在Excel和Word的操作内,也没有能很好解决此类问题的方法。如果遇到信息一多,几十上百个文件&…

Win11小技巧之调节音量

无意中发现,鼠标悬停在喇叭🔈处可通过滚轮调节音量,无需每次都点开音量面板,再悬停在音量滚动条处通过滚轮调节!(设计师……怎么不早告诉我……) 不用点开,之前一直都是这么调节音量…

c++—多态【万字】【多态的原理】【重写的深入学习】【各种继承关系下的虚表查看】

目录 C—多态1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的重写2.2.1虚函数重写的两个例外:2.2.1.1协变2.2.1.2析构函数的重写 2.3 c11的override和final2.3.1final2.3.2override 2.4 重载、重写、重定义的对比 3.抽象类3.1抽象类的概念3.2接口继承和…

5款录屏软件电脑版,哪一款更适合你?

身边不少做行政的小伙伴,经常需要制作一些培训视频、会议记录或是演示文稿。这就要求他们必须掌握一款好用的录屏软件。作为一个经常搜索各种办公软件的人,今天,我就来分享一下我使用过的五款录屏软件在录制电脑屏幕时的表现。 1、福昕录屏大…

枚举类题目练习心得

两数之和 题目如下: 一点思路:该题目仅限于数据量少的情况使用枚举,从题目分析来看,需求是给定一个数字,要求在给定数组中找到两个数字并使这两个数字和为给定数字且返回目标数字下标。参考题解思路结合本身思路代码…

Leetcode—环形链表||

题目描述 思路 快慢指针 结论 我们需要用到一个重要的结论:让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 画图解释 1.利用快慢指针找到相遇点 2. 定义两个…

java138-异常处理_java 138错误

//异常 public class test79 { //定义方法声明定义异常,在满足条件时抛出异常对象,程序转向异常处理 public double count(double n,double m)throws Exception { if (m 0) {//如果除数等于0.则抛出异常实例 throw new Ex…

day03 - Java集合和常用类

第一章 Collection集合 1. Collection概述 集合:java中提供的一种容器,可以用来存储多个数据 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的。集合的长度是不固定的。集合可以随时增加元素,其大小也随…

kubeadm方式安装k8s+基础命令的使用

一、安装环境 二、前期准备 1.设置免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.2.77 [rootk8s-master ~]# ssh-copy-id root192.168.2.88 2.yum源配置 3.清空创建缓存 4.主机映射(三台主机都要设置) 5.安装…

vivado中选中bd文件后generate output product是什么用,create HDL wrapper是什么用

vivado中选中bd文件后generate output product是什么用 在Vivado中,“Generate Output Products” 是一个重要的步骤,它用于生成IP核的输出产品,这些产品是将IP核集成到设计中所需的文件。这些输出产品包括: 综合文件&#xff…

多线程下的共享变量访问数据竞争的问题

多线程下对共享变量的写存在数据竞问题可导致数据与预期不一致。最近在研究race conditions漏洞,用以下python 代码记录一下,以此论证,如下: from concurrent.futures import ThreadPoolExecutor globalNum 5 def test():global…

微积分-反函数6.1(反函数)

表1提供了一项实验的数据,其中细菌培养物在有限营养基中以100个细菌开始;在定时记录下细菌数量随时间的变化。细菌数量 N N N 是时间 t t t 的函数: N f ( t ) N f(t) Nf(t)。 然而,假设生物学家改变了她的观点,开…

京东App秒级百G日志传输存储架构设计与实战

本文作者:平台业务研发部-武伟峰,数据与智能部-李阳 背景 在日常工作中,我们通常需要存储一些日志,譬如用户请求的出入参、系统运行时打印的一些info、error之类的日志,从而对系统在运行时出现的问题有排查的依据。 …

作为研发部门的负责人,如何助力产品在市场竞争中胜出?浅谈 CTQ

在激烈的市场竞争中,产品研发团队如何帮助企业的产品脱颖而出?成功的产品往往不仅依赖于强大的功能和技术创新,还需要通过高效的研发效能,包括效率、质量和创新,来提升产品的市场竞争力。在本文中,我们将探…

文档内容识别系统源码分享

文档内容识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

一款源码阅读的插件

文章目录 进度汇报功能预览添加高亮标记高亮风格设置笔记颜色设置数据概览高亮数据详情 结尾 进度汇报 之前提到最近有在开发一个源码阅读的IDEA插件,第一版已经开发完上传插件市场了,等官方审批通过就可以尝鲜了。插件名称:Mark source cod…

基于STM32F407ZGT6——看门狗

独立看门狗 独立看门狗的时钟由独立的RC 振荡器LSI 提供,即使主时钟发生故障它仍然有效,非常独立。 LSI 的频率一般在30~60KHZ 之间,根据温度和工作场合会有一定的漂移, 所以独立看门狗的定时时间并不一定非常精确,只适…

格式化u盘选择FAT还是NTFS U盘和硬盘格式化两者选谁

Mac用户在将U盘或硬盘进行格式化时,选择FAT还是NTFS往往是一个让人纠结的问题。很多用户不知道这两个格式之间有什么区别,更不知道在格式化时如何做出选择。本文将为大家介绍Mac选择FAT还是NTFS,并为大家推荐U盘和硬盘格式化两者选谁。 一、…

36.贪心算法3

1.坏了的计算器(medium) . - 力扣(LeetCode) 题目解析 算法原理 代码 class Solution {public int brokenCalc(int startValue, int target) {// 正难则反 贪⼼int ret 0;while (target > startValue) {if (target % 2 0…

第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等

案例一: Python-文件传输爆破-ftplib 库操作 ftp 协议 开一个ftp 利用ftp正确登录与失败登录都会有不同的回显 使用ftplib库进行测试 from ftplib import FTP # FTP服务器地址 ftp_server 192.168.172.132 # FTP服务器端口(默认为21) ftp_po…