转自:https://www.cnblogs.com/pinard/p/9923859.html

1. Dueling DQN的优化点考虑

    在前面讲到的DDQN中,我们通过优化目标Q值的计算来优化算法,在Prioritized Replay DQN中,我们通过优化经验回放池按权重采样来优化算法。而在Dueling DQN中,我们尝试通过优化神经网络的结构来优化算法。

    具体如何优化网络结构呢?Dueling DQN考虑将Q网络分成两部分,第一部分是仅仅与状态S有关,与具体要采用的动作A无关,这部分我们叫做价值函数部分,记做V(S,w,α),第二部分同时与状态状态S和动作A有关,这部分叫做优势函数(Advantage Function)部分,记为A(S,A,w,β),那么最终我们的价值函数可以重新表示为:

    其中,w是公共部分的网络参数,而α是价值函数独有部分的网络参数,而β是优势函数独有部分的网络参数。

2. Dueling DQN网络结构

    由于Q网络的价值函数被分为两部分,因此Dueling DQN的网络结构也和之前的DQN不同。为了简化算法描述,这里不使用原论文的CNN网络结构,而是使用前面文中用到的最简单的三层神经网络来描述。是否使用CNN对Dueling DQN算法本身无影响。

    在前面讲到的DDQN等DQN算法中,我使用了一个简单的三层神经网络:一个输入层,一个隐藏层和一个输出层。如下左图所示:

    而在Dueling DQN中,我们在后面加了两个子网络结构,分别对应上面上到价格函数网络部分和优势函数网络部分。对应上面右图所示。最终Q网络的输出由价格函数网络的输出和优势函数网络的输出线性组合得到。

    我们可以直接使用上一节的价值函数的组合公式得到我们的动作价值,但是这个式子无法辨识最终输出里面V(S,w,α)和A(S,A,w,β)各自的作用,为了可以体现这种可辨识性(identifiability),实际使用的组合公式如下:

    其实就是对优势函数部分做了中心化的处理。以上就是Duel DQN的主要算法思路。由于它仅仅涉及神经网络的中间结构的改进,现有的DQN算法可以在使用Duel DQN网络结构的基础上继续使用现有的算法。由于算法主流程和其他算法没有差异,这里就不单独讲Duel DQN的算法流程了。

3. Dueling DQN实例

    下面我们用一个具体的例子来演示Dueling DQN的应用。仍然使用了OpenAI Gym中的CartPole-v0游戏来作为我们算法应用。CartPole-v0游戏的介绍参见这里。它比较简单,基本要求就是控制下面的cart移动使连接在上面的pole保持垂直不倒。这个任务只有两个离散动作,要么向左用力,要么向右用力。而state状态就是这个cart的位置和速度, pole的角度和角速度,4维的特征。坚持到200分的奖励则为过关。

    这个实例代基于Nature DQN,并将网络结构改为上图中右边的Dueling DQN网络结构,完整的代码参见我的github: https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/duel_dqn.py

    这里我们重点关注Dueling DQN和Nature DQN的代码的不同之处。也就是网络结构定义部分,主要的代码如下,一共有两个相同结构的Q网络,每个Q网络都有状态函数和优势函数的定义,以及组合后的Q网络输出,如代码红色部分:

  def create_Q_network(self):# input layerself.state_input = tf.placeholder("float", [None, self.state_dim])# network weightswith tf.variable_scope('current_net'):W1 = self.weight_variable([self.state_dim,20])b1 = self.bias_variable([20])# hidden layer 1h_layer_1 = tf.nn.relu(tf.matmul(self.state_input,W1) + b1)# hidden layer  for state valuewith tf.variable_scope('Value'):W21= self.weight_variable([20,1])b21 = self.bias_variable([1])self.V = tf.matmul(h_layer_1, W21) + b21# hidden layer  for action valuewith tf.variable_scope('Advantage'):W22 = self.weight_variable([20,self.action_dim])b22 = self.bias_variable([self.action_dim])self.A = tf.matmul(h_layer_1, W22) + b22# Q Value layerself.Q_value = self.V + (self.A - tf.reduce_mean(self.A, axis=1, keep_dims=True))with tf.variable_scope('target_net'):W1t = self.weight_variable([self.state_dim,20])b1t = self.bias_variable([20])# hidden layer 1h_layer_1t = tf.nn.relu(tf.matmul(self.state_input,W1t) + b1t)# hidden layer  for state valuewith tf.variable_scope('Value'):W2v = self.weight_variable([20,1])b2v = self.bias_variable([1])self.VT = tf.matmul(h_layer_1t, W2v) + b2v# hidden layer  for action valuewith tf.variable_scope('Advantage'):W2a = self.weight_variable([20,self.action_dim])b2a = self.bias_variable([self.action_dim])self.AT = tf.matmul(h_layer_1t, W2a) + b2a# Q Value layerself.target_Q_value = self.VT + (self.AT - tf.reduce_mean(self.AT, axis=1, keep_dims=True))

    其余部分代码和Nature DQN基本相同。当然,我们可以也在前面DDQN,Prioritized Replay DQN代码的基础上,把网络结构改成上面的定义,这样Dueling DQN也可以起作用。

4. DQN总结

    DQN系列我花了5篇来讲解,一共5个前后有关联的算法:DQN(NIPS2013), Nature DQN, DDQN, Prioritized Replay DQN和Dueling DQN。目前使用的比较主流的是后面三种算法思路,这三种算法思路也是可以混着一起使用的,相互并不排斥。

    当然DQN家族的算法远远不止这些,还有一些其他的DQN算法我没有详细介绍,比如使用一些较复杂的CNN和RNN网络来提高DQN的表达能力,又比如改进探索状态空间的方法等,主要是在DQN的基础上持续优化。

    DQN算是深度强化学习的中的主流流派,代表了Value-Based这一大类深度强化学习算法。但是它也有自己的一些问题,就是绝大多数DQN只能处理离散的动作集合,不能处理连续的动作集合。虽然NAF DQN可以解决这个问题,但是方法过于复杂了。而深度强化学习的另一个主流流派Policy-Based而可以较好的解决这个问题,从下一篇我们开始讨论Policy-Based深度强化学习。

系统学习深度学习(三十四)--Dueling DQN相关推荐

  1. 【OS学习笔记】三十四 保护模式十:中断和异常区别

    上几篇文章学习了分页机制的一些原理: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异 ...

  2. Linux学习之CentOS(三十四)--配置域主DNS服务器

    在上一篇随笔里 Linux学习之CentOS(三十三)--DNS基础及域名系统架构,讲解了DNS的一些基础知识以及域名系统架构,在本篇随笔里将详细地讲解主DNS服务器的配置... 一.DNS服务器的类 ...

  3. 深度学习自学(三十四):换衣场景下行人重识别

    整理的人脸系列学习经验:包括人脸检测.人脸关键点检测.人脸优选.人脸对齐.人脸特征提取,Re-ID等学习过程总结,有需要的可以参考,仅供学习,请勿盗用.https://blog.csdn.net/Th ...

  4. Kali linux 学习笔记(三十四)无线渗透——WPA攻击(PSK破解、AIROLIB、JTR、cowpatty、pyrit) 2020.3.13

    前言 本节学习对WPA的攻击 主要有PSK攻击和AIROLIB.JTR.cowpatty.pyrit等工具的使用 1.WPA PSK攻击 WPA不存在WEP的弱点 只能基于字典暴力破解 PSK破解过程 ...

  5. 信号完整性(SI)电源完整性(PI)学习笔记(三十四)100条估计信号完整性效应的经验法则

    100条估计信号完整性效应的经验法则 ----内容来自<信号完整性分析与电源完整性分析-第三版> 当快速的得到粗略的结果比以后得到优良的结果更重要,就应该使用经验法则. 当然不能盲目的使用 ...

  6. OpenCV学习笔记(三十四)——OpenCV路在何方

    之前做了haartraining的东西,感觉到OpenCV里面实现的东西还不是很好,这个老版本的haartraining的东西在新版本仍然是用老版本的函数来实现的,让我很不爽.于是好期待下一版本的到来 ...

  7. 学习笔记第三十四节课

    rsync工具介绍 这个是个同步的工具,这个几乎每天都能用到. 类似于cp 和cp不一样.不同机器传输文件,备份, 同台机器,A-B目录传输都可以. 假设有一个A目录 和一个B目录 现在把A拷贝到B下 ...

  8. Vue.js学习系列(三十四)-- Vue.js样式绑定(五)

    2019独角兽企业重金招聘Python工程师标准>>> 2. Vue.js style(内联样式) 我们可以在 v-bind:style 直接设置样式: <!DOCTYPE h ...

  9. pytorch学习笔记(三十四):MiniBatch-SGD

    文章目录 小批量随机梯度下降 1. 读取数据 2. 从零开始实现 3. 简洁实现 小结 小批量随机梯度下降 在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降(bat ...

  10. 学习Vue3 第三十四章(Vue3集成Tailwind CSS)

    Tailwind CSS 是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - 无需离开您的HTML,即可快速建立现代网站. 对于PostC ...

最新文章

  1. 介绍Shell脚本的参数解析工具
  2. 终于将SAP系统完全配置通过了
  3. new 实例化对象是啥意思_前端经典面试题解密:JS的new关键字都干了什么?
  4. 华为做raid5步骤_华为验厂验厂流程如何?主要内容是什么呢?
  5. [Winodows Phone 7控件详解]控件拾遗
  6. 创新 - 王屋村的魔方们
  7. 入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?
  8. 马云:腾讯是阿里的成长伴侣;华为 2 万 CNBG 员工“投奔”余承东;18 岁学生索赔苹果 10 亿美元 | 极客头条...
  9. C语言中的static 具体分析
  10. 使用Spring实现AOP(XML+注解)
  11. [No000023]为何没有更多人从事程序员的工作?程序员常有,优秀程序员不常有!...
  12. 一维无限深势阱定态薛定谔方程
  13. 英国“脱欧”促中国企业调整在欧战略
  14. 腾讯优图计算机招聘视觉大咖(2022届校招+实习)
  15. Spring周期总结
  16. 高德地图-缩放比例尺控件
  17. idea插件,在idea中听云音乐
  18. docker安装nginx和php网页文件显示file not found
  19. 子div相对于父div位置放置
  20. 【Web前端面试】葵花宝典(2022版本)—— CSS篇

热门文章

  1. MediaBuffer使用要点
  2. 写给新入职的毕业生们(二)
  3. Geoserver之切片
  4. activemq之调用问题研究
  5. linux 系统命令总结之ubuntu 系列命令 持续更新中~
  6. matlab录音函数怎么保存在哪里,利用matlab 录音
  7. 14c语言合并两个字符串,C语言的标识符和字符数据、字符串数据.ppt
  8. django2连接mysql_Django2.2 连接mySQL数据库
  9. 传输分析_密西根大学倪军谈信息传输与分析成本:5G的推广让该问题不复存在...
  10. springMVC+hibernate + layui分页