dqn系列梳理_系列论文阅读——DQN及其改进

DQN

作为DRL的开山之作,DeepMind的DQN可以说是每一个入坑深度增强学习的同学必了解的第一个算法了吧。先前,将RL和DL结合存在以下挑战:1.deep learning算法需要大量的labeled data,RL学到的reward 大都是稀疏、带噪声并且有延迟的(延迟是指action 和导致的reward之间);2.DL假设样本独立;而RL前后state状态相关;3.DL假设分布固定,而RL在学习新的行为时,数据分布会变化。DQN通过Q-Learning使用reward来构造标签、使用经验池等方法解决了这些问题。

基于Q-learning 确定Loss Function

Q-learning 更新公式为:

DQN 的 loss function:

DQN使用随机梯度下降更新参数,为啥要把targetnet单独拎出来呢,后续会说的。

experience replay

DQN 使用exprience replay解决instablity的问题,把每个时间步agent与环境交互得到的转移样本

存储在buffer中,并被随机抽取。通过这种方式,去除了数据之前的相关性,并且缓和了数据分布的差异。

TargetNet

为了减少

和 目标

之间的相关性,从而提高稳定性.2015年版的DQN加入了另一个网络——

作为targetnet,它和

参数分离,每次参数更新只更新

,而

的参数

保持不变,并且周期性的将

的参数复制给

。此时,loss function变为:

DQN算法伪代码

double DQN

在标准的Q-learning,和DQN中,参数是这么更新的:

max操作使得估计的值函数比值函数的真实值大。如果是均匀的过估计,找到的最优策略是不会变的,不会对我们的目标造成影响。但实际上,过估计的误差在不同的states和actions下是不同的,这就会影响到我们找到最佳策略了。为了减少overestimation,van Hasselt et al.(2016)提出Double DQN(D-DQN)。利用DQN中的target network,将selection 和 evelation 解藕。使用Behavior Network选择出value最大的action,用target network来估计它的值

被更改为:

PS 论文中有对两个数学定理的详细证明,感兴趣的同学可以看哦

Prioritized Experience Replay

在前面的方法中,experience replay都是均匀随机采样,但实际上不同样本的重要性显然是不同的。举个例子,在强化学习初期,replay memory中,除了直接和目标相关的state-action pair 有正值,大部分的value都为0,大量的从zero-value state 到 另一个 zero-value state 的transitions更新导致很低效。Moore & Atkeson, 1993 提出Prioritized Sweeping,优先选择value改变了的state。具体算法如下:

prioritized sweeping

但Prioritized sweeping 主要用在model based planning。Schaul et al. (2016)提出了Prioritized Experience Replay。

Prioritizing TD-Error

用 TD-error来规定优先学习的程度. 如果

越大, 就代表我们的预测精度还有很多上升空间, 那么这个样本就越需要被学习, 也就是优先级越高。通过存储transition,及其每次回放更新得到的最新的TD-error,将TD-error绝对值最大的transition从 memory 中进行回放。然后对该transition进行Q-learning的更新,并根据TD-error,更新其优先级。而对于没有已知TD-error的新进入memory的transition,将其放到最大优先级的行列,以确保所有的经验至少被回放一次。

Stochastic Prioritization

greedy TD-error prioritization有以下问题:1.那些TD-error很小的transition 将很长时间不被replay.2.对noise spikes 敏感。最终算法会集中在一个小子集里面。初始TD-error很高的transitions会经常被重放,缺失多样性会导致over-fitting。作者提出了一种介于均匀随机采样和贪心优先之间的随机采样方法,transition

的采样概率为:

其中,

的优先级。这样,即使是最低优先级的transition被采样到的概率也不为0.

的设定有多种方法。

第一种是成比例优先。

.

用来防止transitions的TD-error为0后不再被回放。具体实现中,使用名为sum-tree的树型数据结构。它的每个叶子节点保存了 transition priorities,父节点存储了孩子节点值之和,这样,头节点的值就是所有叶子结点的总和

。采样一个大小为

的minibatch时,range

被均分为

个ranges,每个ranges均匀采样,这样,各种

的transitions都有被采样到。

第二种是

是transition

根据它的

在replay memory中的rank。这种方法对异常值更加不敏感,因此更为鲁棒。作者最终使用了基于array的二叉堆实现的优先队列来存储transitions。

Importance Sampling

Prioritized replay 改变了分布,因此引入了bias。为了消除bias,作者使用了importance-sampling(IS) weights:

Q-learning更新中的

替换为

,并出于stability的原因,用

将权值正则化。

Prioritized Sweeping

Dueling Network Architectures for Deep Reinforcement Learning

Wang et al. (2016b)在网络结构上做了创新,这种新的网络结构能够更容易的与当前和未来的RL算法相结合。

作者引入了advantage function。

关注的是state的值,

关注的是这个状态下,动作的重要性。

估计的是在这一状态下选择某一动作的价值。因为在某些状态下,无论做什么动作对下一个状态都没有太大影响,而这种方法,可以单独学习状态本身的价值。

dueling network architecture.png

如上图,作者将原来的DQN最后的一条全联接层一分为二,一个用来估计value functions,一个用来估计advantage function。最后将两条流聚合成输出Q function。

相应的Q function变为:

是两个全联接层分支的参数, 那为什么要减去

呢。这是因为给定一个Q,我们无法给出一个唯一的V和A(拥有两个变量的一个方程式,当然有无穷多解)。为了解决这一问题,作者强制让被选择的动作的advantage为0,即

这样,

在实际应用中,作者用均值代替了最大值操作,即:

这样,可以缩小 Q 值的范围,去除多余的自由度,且期望值为0,提高算法稳定性

Distributional value function

强化学习一般是对智体收到的随机return的期望进行建模,但实际上,这些随机return的分布——value distribution是非常有用的。

It’s already evident from our empirical results that the distributional perspective leads to better, more stable reinforcement learning

Bellemare et al. (2017)提出贝尔曼方程的一个变体,实际上可以预测所有可能的结果,而不用对它们进行平均 —— distributional Bellman’s equation

具体算法如下:

categorical algorithm

网络结构上的改变:

传统的DQN最后一层全联接层输出的是

维向量,表示当前状态下,每一个动作的价值的估计。Categorical DQN 输出的是

维,表示的是表示的是 N 个动作在 M 个价值分布的支撑上的概率。

def _network_template(self, state):

"""Builds a convolutional network that outputs Q-value distributions.

Args:

state: `tf.Tensor`, contains the agent's current state.

Returns:

net: _network_type object containing the tensors output by the network.

"""

weights_initializer = slim.variance_scaling_initializer(

factor=1.0 / np.sqrt(3.0), mode='FAN_IN', uniform=True)

net = tf.cast(state, tf.float32)

net = tf.div(net, 255.)

net = slim.conv2d(

net, 32, [8, 8], stride=4, weights_initializer=weights_initializer)

net = slim.conv2d(

net, 64, [4, 4], stride=2, weights_initializer=weights_initializer)

net = slim.conv2d(

net, 64, [3, 3], stride=1, weights_initializer=weights_initializer)

net = slim.flatten(net)

net = slim.fully_connected(

net, 512, weights_initializer=weights_initializer)

net = slim.fully_connected(

net,

self.num_actions * self._num_atoms,

activation_fn=None,

weights_initializer=weights_initializer)

logits = tf.reshape(net, [-1, self.num_actions, self._num_atoms])

probabilities = tf.contrib.layers.softmax(logits)

q_values = tf.reduce_sum(self._support * probabilities, axis=2)

return self._get_network_type()(q_values, logits, probabilities)

orz其实这篇论文我看了代码才懂了算法流程,但是并不能完全理解,有大佬可以解释一哈吗??

未完待续

A3C

asynchronous advantage actor-critic (A3C) [Mnih et al.(2016)] (https://arxiv.org/pdf/1602.01783.pdf)并不属于value-based算法,这里提到它一是因为DeepMind 在投给AAAI 2018的论文Rainbow: Combining Improvements in Deep Reinforcement Learning中使用了A3C中的multi-step learning。

论文中最为出彩的地方在于:在多个环境副本上并行地异步执行多个agent,不同的agent采用不同的策略,经历不同的state,有不同的transition,不但有助于探索,加快速度,而且使得时间上数据的相关性很小,起到稳定学习过程的作用。因此不需要使用又费计算又费资源的experience replay,这样就可以使用on-policy RL 方法。

算法有一个global network,和若干个agent,大概的步骤过程是:

1.agent 将global network的参数pull过来

2.agent与环境互动n-step或遇到terminal state 提前终止

3.agent计算loss,得到梯度

4.把梯度 push 给global network,用梯度更新global network的参数,然后reset自己,回到第一步

A3C, each actor-learner thread, based on Mnih et al. (2016)

Noisy DQN

Fortunato et al. (2018)提出在参数中加入噪声,代替

-greedy,增加模型的探索能力。

Noisynet

举个例子,设神经网络的一个linear layer 为:

那么加入噪声后为:

是均值为0的噪声,

都是可学习的参数。设

有两种噪声产生方法:

a.Independent Gaussian noise:为每一个权值和偏差都设定一个独立噪声。在这种情况下,若输入x是q维、输出y是p维,那么就需要p*q+q个

b. Factorised Gaussian noise:通过将

分解,大大减少了需要的噪声数量,只需要q+p个

即可。

的计算公式为:

这里,作者将

设为

NoisyNet 的loss function 为

梯度为

作者使用蒙特卡洛方法近似上面的梯度,得到

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

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

相关文章

linux进入mongodb数据库命令,MongoDB 常用数据库命令,命令是如何工作的这里

MongoDB 常用数据库命令,命令是如何工作的这里mongoDB提供了广泛的数据库命令,除常用的create,read,update,delete之外所有功能。命令是如何工作的这里有个你比较熟悉的例子:drop,如果从Shell里删除一个collection,我们运行db.test.drop().实际上&#x…

db2 语句包括不必要的列表_DB2的一些常用SQL写法(转)

-- 创建一个自定义单值类型create distinct type var_newtypeas decimal(5,2) with comparisons;-- var_newtype 类型名-- decimal(5,2) 实际的类型-- 删除一个自定义单值类型drop distinct type var_newtype;-- 创建一个自定义结构数据类型create type my_type as(username …

linux常用调试,linux下gdb常用的调试命令

用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法。接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家。linux下gdb常用的调试命令gdb常用:run 启动程序运行ne…

永恒python配合什么主武器好_学点python吧,别再这么累了,让你轻松实现财富自由...

“我真的好累,真的好想辞职啊,可是……”当疫情逐渐褪去,看似一切都在好转,可实际上好多朋友都留言道,被刚刚恢复运转没多久的公司压榨地喘不过气来,每天都忙着同样的事情,却没有任何成就感&…

linux nginx 503,GitLab网页500/502/503错误–Nginx无法启动问题排查

让小汤装个GitLab,折腾了一周了还没弄好,网站一直是50x错误,看了下情况是nginx服务挂了。这里记录一下排查的步骤。首先看看gitlab服务的情况:gitlab-ctl status。。。。run: logrotate: (pid 19388) 838s; run: log: (pid 1746) …

openstack资源使用汇总_OpenStack 如何查看主机已使用的资源啊?

通过 nova hypervisor-stats 命令。[rootstation140 ~(keystone_admin)]# nova hypervisor-stats-----------------------------| Property | Value |-----------------------------| count | 1 || vcpus_used | 0 || local_gb_u…

linux找出重复数字,C语言笔试经典-查找多位数重复数字以及次数

从键盘输入一个多位的整数 用程序判断 这个数里面有没有 重复的数字 有重复的数字就打印 哪个数字重复了 重复了几次例如:输入:1122431打印结果:1重复 出现3次2重复 出现2次,上代码:#include//查找多位数 重复数字 …

padans 判断列是否为空_pandas 如何判断指定列是否(全部)为NaN(空值)

asp.net 页面如何将Eval中的时间显示为“yyyy-MM-dd ” 格式JavaScript Date 对象JavaScript Date 对象 Date 对象 Date 对象用于处理日期与实际. 创建 Date 对象: new Date(). 以上四种方法同样可以创建 Date 对象: var d n ...学习Slim …

linux vg备份还原,Oracle Linux 6.4 误删VG之恢复过程

五、VG恢复思路1、在/etc/lvm/存放着LVM的配置、归档、备份等信息。[rootol64 ~]# ls -l /etc/lvmtotal 52drwx------. 2 root root 4096 Nov 18 08:30 archivedrwx------. 2 root root 4096 Nov 18 08:30 backupdrwx------. 2 root root 4096 Feb 24 2013 cache-rw-r--r--. 1 …

antd radio设置默认选中_单选框radio总结(获取值、设置默认选中值、样式)

单选框 radio 是 否 1.获取值 $("input[name=killOrder]:checked").val(); $(input:radio:checked).val(); $("input[type=radio]:checked").val(); $(":radio[checked]").each(function(radio){alert($(this).val()); 2.设置第一个Radio为选中…

linux cat cd,linux 文件系统命令 cat cd chmod

cd,有时也写作chdir(change directory,改变目录),是在Unix、Windows和DOS操作系统下用于改变工作目录的命令行命令。在Unix的外壳脚本与Windows或DOS的批处理文件中亦可使用。CHDIR()还是Visual Basic改变工作目录的一个函数。目录是文件系统…

python namedtuple默认值_python中namedtuple怎样加默认值?

我们知道很多类的使用上有相似的地方,虽然之前在字段上namedtuple是不能添加的,但是在默认值上和数据类一样,我们可以选择默认值进行添加。当然这需要一些代码上的修改,小伙伴们可以先去了解一下数据类的概念,然后再na…

数据结构c语言版编程软件,数据结构严蔚敏4版PDF下载_数据结构C语言版严蔚敏下载 完整版_当载软件站...

数据结构C语言版严蔚敏 是《data structures and algorithm analysis in c》一书第2版的简体中译本。原书曾被评为20世纪顶尖的30部计算机著作之一,作者mark allen weiss在数据结构和算法分析方面卓有建树,他的数据结构和算法分析的著作尤其畅销&#xf…

opc读取ab的plc数据_C#读写 AB PLC 直接通过节点来读写数据 读写 AllenBradley PLC

本文将使用一个Github开源的组件库技术来读写AB PLC,使用的是基于以太网的实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作本类库绝对是ab最强的通讯库github地址:…

c语言建立动态链表ppt,C语言链表讲解.ppt

第十一章 链表;例:跳马。依下图将每一步跳马之后的位置(x,y)放到一个“结点”里,再用“链子穿起来”,形成一条链,相邻两结点间用一个指针将两者连到一起。;依上图有7个结点;11.7 用指针处理链表;1249;链表中结点的定义;链表的基本…

c 语言new运算符重载,c – 当我们重载new运算符时,是否需要重载放置new运算符?...

通常不会,因为它不经常使用.但它可能是必要的,因为当你在类中重载operator new时,它会隐藏global :: operator new的所有重载.因此,如果您想在该类的对象上使用placement new,请执行;否则不要.同样适用于新的.如果您刚刚更改了分配方案,并且您感到惊讶的是某个地方某人正在使用…

supersocket缓冲区_supersockets接收过滤器(ReceiveFilter)

接收过滤器(ReceiveFilter)用于将接收到的二进制数据转化成请求实例(RequestInfo)。实现一个接收过滤器(ReceiveFilter), 你需要实现接口 IReceiveFilter:public interface IReceiveFilterwhere TRequestInfo : IRequestInfo{/// /// Filters received data of the …

android网络盒子改,有什么办法可以把淘汰下来的安卓手机改造成电视盒子用?...

基本上谁家都会有一两部旧的手机,其实并不是不能用或者坏了,只是配置有些低。我们只需要简单改造一下,就可以将旧手机改造成电视盒子,而且比普通的网络盒子性能更强大。有线方式我们需要准备一根MHL线,大部分的安卓手机…

心电信号越界怎么回事_心电监护仪常见故障分析与排除

心电监护仪常见故障分析与排除心电监护仪是一种连续实时的无创伤监测患者多种生理参数的监护仪器。本文结合EM-6多参数仪(北京康宏兴业科技发展有限公司生产)在临床使用巾经常出现的故障现象以及故障的排除方法予以分析.供大家参考。1屏幕无显示1.1故障现…

android palette组件用法,Android Support Palette使用详解

使用Palette API选择颜色良好的视觉设计是app成功所必不可少的, 而色彩设计体系是设计的基础构成. Palette包是支持包, 能够从图片中解析出突出的颜色, 从而帮助你创建出视觉迷人的应用你能够使用Palette包设计布局主题, 并把自定义色彩应用到可视化元素中. 比如, 你可以根据专…