dopamine源码解析之dqn_agent
目录
- epsilon函数
- DQNAgent构造函数核心参数
- DQNAgent核心函数
- tf.make_template
- 核心数据流图
epsilon函数
linearly_decaying_epsilon,线性的对epsilon进行递减,先保持1.0一段时间(warmup_steps),然后线性递减,最后递减到最小值之后维持这个最小值;
DQNAgent构造函数核心参数
- update_horizon,n-step中的n,后向观察的步数;
- min_replay_history,在智能体进行训练之前,必须经历的step数量,智能体不能一开始就进行训练;
- update_period,当前网络参数更新的周期;
- target_update_period,当前网络参数更新到目标网络参数上的周期;
DQNAgent核心函数
- init,解析构造参数,准备输入的placeholder,构建网络结构,其中输入状态的深度是4,也就是说,输入的不是一张图像,而是4张堆叠的图像;
- _get_network_type,获取网络类型,返回一个collections.namedtuple;
- _network_template,网络模板,三层卷积,两层全连接;
- _build_networks,构造网络结构,设计了online_convnet和target_convnet两种操作,分别用于构建当前和目标网络,使用了tf.make_template函数,对于同样一个操作,不论输入的是什么,都共享同样的网络参数;
- _build_replay_buffer,构建经验重放缓冲;
- _build_target_q_op,为q-learning生成一个目标的操作;
- _build_train_op,训练的操作;
- _build_sync_op,同步的操作;
- begin_episode,开始一段周期,初始化state和action;
- step,选择动作,如果是训练过程,需要记录transition;
- end_episode,如果是训练过程,需要记录transition;
- _select_action,根据模型选择动作;
- _train_step,运行单个训练步骤,需要满足两个条件,第一,在经验缓冲中的帧数已经达到要求,第二,training_steps是update_period的整数倍;
- _record_observation,记录一个观察;
- _store_transition,记录一次转换;
tf.make_template
- tf.make_template,输入一个函数,返回一个包裹了该函数的操作,这个操作在第一次被调用的时候创建变量,然后在之后的每一次调用中,重用这些变量,这是实现变量共享的一种方法。
核心数据流图
state_ph-->|1|online_convnet(online_convnet)
online_convnet-->|1|_net_outputs
_net_outputs-->|1|_q_argmax
_replay.states-->|2|online_convnet
online_convnet-->|2|_replay_net_outputs
_replay.next_states-->|3|target_convnet(target_convnet)
target_convnet-->|3|_replay_next_target_net_outputs
_replay_next_target_net_outputs-->|3|replay_next_qt_max
replay_next_qt_max-->|3|target
_replay_net_outputs-->|2|replay_chosen_q
target-->|3|loss
replay_chosen_q-->|2|loss
online_convnet-->|4|target_convnet
图中的数据流动包含4条线,解释如下:
- 线1,在线动作,根据当前的状态state_ph,以及当前的在线策略模型online_convnet,按照epsilon贪心方式选择最优的动作_q_argmax;
- 线2,训练动作,根据replay buffer中的记忆,以及当前的在线策略模型online_convnet,计算实际选择的动作,注意这里的选择是根据贪心方式,而不是epsilon贪心的方式选择的,这也是q-learning和sarsa算法最大的不同,也是off-policy和on-policy的根本区别;
- 线3,训练动作,根据replay buffer中的记忆,以及当前的目标策略模型target_convnet,计算Q-learning中的目标;
- 线2+线3,训练动作,根据线2计算出实际的Q值,以及线3计算出的目标Q值,进行训练,注意训练时,只有在线策略模型online_convnet会迭代,目标策略模型target_convnet并不迭代;
- 线4,每间隔一定的周期(即target_update_period),就会把当前在线策略模型online_convnet的参数同步给目标策略模型target_convnet,完成对目标模型的更新;
关于线2和线3,再说明一下,还记得Bellman目标是:
Q_t = R_t + gamma^N * Q'_t+1
其中,
Q'_t+1 = argmax_a Q(S_t+1, a) or 0 if S_t is a terminal state
线3计算的就相当于Q_t,是我们希望通过现有的在线策略模型逼近的目标,而线2计算的是当前在线策略模型的输出,因此线2和线3的差距,就是损失,利用这个损失就可以对线2中的在线策略模型中的参数进行训练。
dopamine源码解析之dqn_agent的更多相关文章
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- jQuery2.x源码解析(缓存篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- jQuery2.x源码解析(构建篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...
- jQuery2.x源码解析(设计篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...
- jQuery2.x源码解析(回调篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...
随机推荐
- VUE项目部署到线上生产环境,Loading chunk xxx failed
项目部署到生产环境,路由点击无效,报错 Loading chunk chunk-xxxxx failed.(missing xxxx) 加载失败,错误的路径. 话不多说,直接贴代码: vue.conf ...
- MySQL基本命令语法之select
目录 MySQL基本命令语法之select 查询去重以及常数 空值与着重号 着重号 空值 运算符 算术运算符 比较运算符 符号型 非符号型 逻辑运算符 优先级 排序分页 排序 分页 拓展 多表查询 等 ...
- 帆软报表(finereport)禁用右键
点击模板>模板web属性>(填报,数据分析,分页预览设置),选择为该模板单独设置,在下面的事件设置里面添加一个加载结束事件,完整js代码如下: 这段代码的基本原理是让用户的页面右键点击事件 ...
- 学习Spring5必知必会(1)~未使用spring前的麻烦
一.未使用spring前的麻烦 开闭原则:扩展是开放的,但是对于修改是"封闭的". 1.代码耦合度比较高[不符合开闭原则]: public class EmployeeServic ...
- 基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡
一.板卡概述 板卡采用Xilinx公司的XC7K325T-2FFG900I芯片作为主处理器,可应用于万兆网络.高速数据采集.存储:光纤隔离网闸等领域. 二.功能和技术指标: 板卡功能 参数内容 主处理 ...
- Java基于ClassLoder/ InputStream 配合读取配置文件
阅读java开源框架源码或者自己开发系统时配置文件是一个不能忽略的,在阅读开源代码的过程中尝尝困惑配置文件是如何被读取到内存中的.配置文件本身只是为系统运行提供参数的支持,个人阅读源码时重点不大可能放 ...
- Swagger2简单实用
前后端分离很好用的api <!--swagger--> <dependency> <groupId>io.springfox</groupId> < ...
- [SuperSocket2.0]SuperSocket 2.0从入门到懵逼
SuperSocket 2.0从入门到懵逼 SuperSocket 2.0从入门到懵逼 1 使用SuperSocket 2.0在AspNetCore项目中搭建一个Socket服务器 1.1 引入Sup ...
- 使用PostMan Canary测试受Identity Server 4保护的Web Api
在<Asp.Net Core: Swagger 与 Identity Server 4>一文中介绍了如何生成受保护的Web Api的Swagger文档,本文介绍使用PostMan Cana ...
- java运行原理、静态代理和动态代理区分
1.java的编译和运行原理: ■ 编译:将源文件 .java 文件,通过编译器(javac 命令) 编译成 字节码文件 .class 文件. ■ 运行,通过类加载器(以二进制流形式)把字节码加载进J ...