深度强化学习实践 Maxim Lapan 章节9:加速强化学习的方法
这一章通过各种各样的方式来加速强化学习的方法
为什么速度很重要
不理解的可以自己跑个模型感受一下出结果的速度,我就不解释了,就是真的很重要。。。。。但是我这一样只是简单的介绍一些方法,大家可以去看原文的具体的内容,我只是总结了最核心的内容
基线
RL的研究过程需要标明FPS的帧数,以及解决问题的时间,这个显而易见的结论
常见的写入到tensorboard的指标包括
- reward 未经折扣的奖励,x轴是片段数
- avg_reward,平均平滑处理
- steps,一个片段的持续的步数(结束的快慢)
- loss,损失值
- avg_loss,平滑损失
- epsilon,当前的epsilon值
- avg_fps,平均交互速度,每秒观察数
计算图
我们其实只有使用net来推理q值的时候,才是我们真的需要进行梯度计算的时候,其他的时候的可以使用no_grad来关闭,例如我们目标网络的用于计算q值,或者我们的在推理的时候使用的net来得到的action都不用计算在我们的backforward的步骤里面
目标网络返回的张量需要显示的调用detach(),减少计算图的会大大大增加我们的运算的额速度
好的模型可能会带来50%的性能提升,简单来说,你需要找到真的需要加入梯度计算的计算,其他的都相关的计算需要通过no_grad封装
多个环境
我们学习ptan库的时候就知道,是可以一次传入多个env的,他们会同时和这些发生交互,也可以同时进行多个网络的action和Q值计算,这样我们可以成倍的进行效率,但是我一直有一个问题,如果在此之前我们的CPU或者GPU的利用率已经就满了,这个时候是否还有提升,其实我是不知道的
结果
我这边使用的情况,换成笔记本电脑了,虽然GPU更强,但是感觉学习的很不稳定,不知道为什么
Episode 400: reward=18.0, steps=1941, speed=310.005 frames/s, elapsed=0:49:23.529984
Episode 401: reward=17.0, steps=1908, speed=299.500 frames/s, elapsed=0:49:27.466517
Episode 402: reward=21.0, steps=1643, speed=298.408 frames/s, elapsed=0:49:31.346737
Episode 403: reward=19.0, steps=1865, speed=286.988 frames/s, elapsed=0:49:42.699667
Episode 404: reward=17.0, steps=1910, speed=301.807 frames/s, elapsed=0:49:47.053150
Episode 405: reward=18.0, steps=1798, speed=307.727 frames/s, elapsed=0:49:49.723819
Episode 406: reward=20.0, steps=1768, speed=300.904 frames/s, elapsed=0:50:00.252537
Episode 407: reward=20.0, steps=1749, speed=297.725 frames/s, elapsed=0:50:04.474587
Episode 408: reward=20.0, steps=1767, speed=290.332 frames/s, elapsed=0:50:07.491560
Episode 409: reward=19.0, steps=1843, speed=307.103 frames/s, elapsed=0:50:18.549662
Episode 410: reward=19.0, steps=1894, speed=309.355 frames/s, elapsed=0:50:23.107999
Episode 411: reward=20.0, steps=1767, speed=301.084 frames/s, elapsed=0:50:24.751620
Game solved in 0:50:24.751620, after 411 episodes and 289372 iterations!
不同的进程中分别交互和训练
这里简单的来说就是使用了一个消费者-生产者队列,将原本的串行 交互-获取-采样-学习的拆开了两个部分,一个专门用于生成动作,一直按照net的输出进行exp的获取,另一个专门用于处理学习到的经验,两个进程分别做exp的生产者和消费者
注意原文中的ExperienceSourceFirstLast的模型中,用到了一个pop_rewards_steps的函数,这个函数会在遇到了eposide结束时候返回一个奖励和步骤的list,如果没有则返回[]
cuda的版本使用的不是python自带的mp库,而是torch的torch.multiprocessing as mp,核心理由是这里会让张量在不同的进程之间共享
结果
原文中的学习的效果是不如直接使用envs=3的情况的,我这边的测试的结果也是一样。
但是其实我在想这里可以不可以同时有多个模型,同时多个envs而且同时使用多进程模型来进行交互。
调整包装器
这个具体的操作和前面学习到的包装器的内容差不多,这里不详细介绍了
CuLE
CUDA版本的Atari的环境,性能是原本的环境的几百倍,但是很不稳定,原文的代码demo写的非常简单,我搭建的环境的使用起来非常的复杂,我没有测试,但是如果以后有机会还是要搭建这个环境,可以几百倍的提升效率,毕竟。