目录

  • 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,输入一个函数,返回一个包裹了该函数的操作,这个操作在第一次被调用的时候创建变量,然后在之后的每一次调用中,重用这些变量,这是实现变量共享的一种方法。

核心数据流图

graph BT
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的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  4. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  5. jQuery2.x源码解析(缓存篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 缓存是jQuery中的又一核心设计,jQuery ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. jQuery2.x源码解析(构建篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 笔者阅读了园友艾伦 Aaron的系列博客< ...

  8. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  9. jQuery2.x源码解析(回调篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 通过艾伦的博客,我们能看出,jQuery的pro ...

随机推荐

  1. Nginx配置转发

    nginx location proxy_pass 后面的url 加与不加/的区别 在nginx中配置proxy_pass时,当在后面的url加上了/,相当于是绝对根路径,则nginx不会把locat ...

  2. document对象常用属性

    转载请注明来源:https://www.cnblogs.com/hookjc/ 注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写    否则会提示你一个错误信息 " ...

  3. NSTimer的使用

    开启定时器 @property (nonatomic, weak) NSTimer *timer; // 返回一个自动开始执行任务的定时器 self.timer = [NSTimer schedule ...

  4. 懒加载--初步理解. by:王朋

    懒加载(LazyLoad),又称为延迟加载. 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要滑动 ...

  5. Ansible之playbook剧本

    Ansible之playbook剧本 目录 Ansible之playbook剧本 1. playbook的组成 2. 剧本示例test1 2.1 剧本制作 2.2 准备http.conf 2.3 运行 ...

  6. 树莓派GPIO开发(三):蜂鸣器-PWM调节

    配置环境 系统:Raspbian11(官方64位) 设备:树莓派CM4 一.写在前面 关于PWM的基本介绍在上一篇博客已经说过了:树莓派GPIO开发(二)RGB模块-PWM调节 在RGB模块中,我们主 ...

  7. [办公软件]Mac安装office 2019官方原版安装包并激活

    office 2019介绍 Office 2019 mac简体中文版已经推出,具体包含Word, Excel, PowerPoint, Outlook, OneNote五大套件,注册登陆用户可以漫游文 ...

  8. k8s中运行busybox

    简介 参考百度百科 BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件. BusyBox 包含了一些简单的工具,例如ls.cat和echo等等,还包含了一些更大.更复杂的工具,例gr ...

  9. cs144 lab0 lab1记录

    这个叫什么?Write Up吗 lab0 lab0要做的事,实现buffer部分的功能,要自己写变量以及实现接口. 成员函数 write()向buffer内写数据,peek_out()  pop_ou ...

  10. [题解]RQNOJ PID87 过河

    链接:http://www.rqnoj.cn/problem/87 思路:动态规划 定义f[i][j]表示到达第 i 块给定石头用了 j 块添加石头的最少步数. 转移方程:f[i][j]=min{f[ ...