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

1. DQN的目标Q值计算问题

    在DDQN之前,基本上所有的目标Q值都是通过贪婪法直接得到的,无论是Q-Learning, DQN(NIPS 2013)还是 Nature DQN,都是如此。比如对于Nature DQN,虽然用了两个Q网络并使用目标Q网络计算Q值,其第j个样本的目标Q值的计算还是贪婪法得到的,计算入下式:

    使用max虽然可以快速让Q值向可能的优化目标靠拢,但是很容易过犹不及,导致过度估计(Over Estimation),所谓过度估计就是最终我们得到的算法模型有很大的偏差(bias)。为了解决这个问题, DDQN通过解耦目标Q值动作的选择和目标Q值的计算这两步,来达到消除过度估计的问题。

2. DDQN的算法建模

    DDQN和Nature DQN一样,也有一样的两个Q网络结构。在Nature DQN的基础上,通过解耦目标Q值动作的选择和目标Q值的计算这两步,来消除过度估计的问题。

    在上一节里,Nature DQN对于非终止状态,其目标Q值的计算式子是:

    在DDQN这里,不再是直接在目标Q网络里面找各个动作中最大Q值,而是先在当前Q网络中先找出最大Q值对应的动作,即

    然后利用这个选择出来的动作amax(S′j,w)在目标网络里面去计算目标Q值。即:

    综合起来写就是:

    除了目标Q值的计算方式以外,DDQN算法和Nature DQN的算法流程完全相同。

3. DDQN算法流程

    这里我们总结下DDQN的算法流程,和Nature DQN的区别仅仅在步骤2.f中目标Q值的计算。

    算法输入:迭代轮数T,状态特征维度n, 动作集A, 步长α,衰减因子γ, 探索率ϵ, 当前Q网络Q,目标Q网络Q′, 批量梯度下降的样本数m,目标Q网络参数更新频率C。

    输出:Q网络参数

    1. 随机初始化所有的状态和动作对应的价值Q.  随机初始化当前Q网络的所有参数w,初始化目标Q网络Q′的参数w′=w。清空经验回放的集合D。

    2. for i from 1 to T,进行迭代。

      a) 初始化S为当前状态序列的第一个状态, 拿到其特征向量ϕ(S)

      b) 在Q网络中使用ϕ(S)作为输入,得到Q网络的所有动作对应的Q值输出。用ϵ−贪婪法在当前Q值输出中选择对应的动作A

      c) 在状态S执行当前动作A,得到新状态S′对应的特征向量ϕ(S′)和奖励R$,是否终止状态is_end

      d) 将{ϕ(S),A,R,ϕ(S′),is_end}这个五元组存入经验回放集合D

      e) S=S′

      f)  从经验回放集合D中采样m个样本{ϕ(Sj),Aj,Rj,ϕ(S′j),is_endj},j=1,2.,,,m,计算当前目标Q值yj:

      g)  使用均方差损失函数,通过神经网络的梯度反向传播来更新Q网络的所有参数w

      h) 如果T%C=1,则更新目标Q网络参数w′=w

      i) 如果S′是终止状态,当前轮迭代完毕,否则转到步骤b)

      注意,上述第二步的f步和g步的Q值计算也都需要通过Q网络计算得到。另外,实际应用中,为了算法较好的收敛,探索率ϵ需要随着迭代的进行而变小。

4. DDQN算法实例 

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

    完整的代码参见我的github: https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/ddqn.py

    这里我们重点关注DDQN和上一节的Nature DQN的代码的不同之处。代码只有一个地方不一样,就是计算目标Q值的时候,如下:

    # Step 2: calculate yy_batch = []current_Q_batch = self.Q_value.eval(feed_dict={self.state_input: next_state_batch})max_action_next = np.argmax(current_Q_batch, axis=1)target_Q_batch = self.target_Q_value.eval(feed_dict={self.state_input: next_state_batch})for i in range(0,BATCH_SIZE):done = minibatch[i][4]if done:y_batch.append(reward_batch[i])else :target_Q_value = target_Q_batch[i, max_action_next[i]]y_batch.append(reward_batch[i] + GAMMA * target_Q_value)

    而之前的Nature  DQN这里的目标Q值计算是如下这样的:

 # Step 2: calculate yy_batch = []Q_value_batch = self.target_Q_value.eval(feed_dict={self.state_input:next_state_batch})for i in range(0,BATCH_SIZE):done = minibatch[i][4]if done:y_batch.append(reward_batch[i])else :y_batch.append(reward_batch[i] + GAMMA * np.max(Q_value_batch[i]))

    除了上面这部分的区别,两个算法的代码完全相同。

5. DDQN小结

    DDQN算法出来以后,取得了比较好的效果,因此得到了比较广泛的应用。不过我们的DQN仍然有其他可以优化的点,如上一篇最后讲到的: 随机采样的方法好吗?按道理经验回放里不同样本的重要性是不一样的,TD误差大的样本重要程度应该高。针对这个问题,我们在下一节的Prioritised Replay DQN中讨论。

系统学习深度学习(三十二)--Double DQN (DDQN)相关推荐

  1. 深度学习入门(三十二)卷积神经网络——BN批量归一化

    深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...

  2. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  3. 32.深度解密三十二:详解影响QQ群整体排名的那些秘密

    网络营销推广技术.技巧深度解密(三十二)指南: 1.本文档适合零基础以及互联网营销推广人员,主要讲解营销QQ群排名的一些问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律 ...

  4. 【OS学习笔记】三十二 保护模式九:分页机制对应的汇编代码之---内核代码

    本片文章是以下两篇文章: [OS学习笔记]三十 保护模式九:段页式内存管理机制概述 [OS学习笔记]三十一 保护模式九:页目录.页表和页三者的关系详解 对应的内核汇编代码. ;代码清单16-1;文件名 ...

  5. jquery设置宽_JavaScript学习笔记(三十二) jQuery(中)

    jQuery 昨天讲了 jQuery 的基本选择器筛选器和属性操作 今天来说一些 jQuery 别的东西 元素操作 创建一个元素 var div = $(') 内部插入元素 // 向 div 元素中插 ...

  6. 强化学习(十)Double DQN (DDQN)

    在强化学习(九)Deep Q-Learning进阶之Nature DQN中,我们讨论了Nature DQN的算法流程,它通过使用两个相同的神经网络,以解决数据样本和网络训练之前的相关性.但是还是有其他 ...

  7. 【C语言进阶深度学习记录】三十 二维数组与二维指针

    文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...

  8. 系统学习NLP(三十二)--BERT、XLNet、RoBERTa、ALBERT及知识蒸馏

    参考:https://zhuanlan.zhihu.com/p/84559048 一.BERT BERT是一种基于Transformer Encoder来构建的一种模型,它整个的架构其实是基于DAE( ...

  9. 深度学习自学(三十二):半监督焦点人物检测

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

  10. 【C语言进阶深度学习记录】三十二 函数指针与使用函数指针实现回调函数

    回调函数是非常重要的概念 文章目录 1 函数的类型 2 函数指针 2.1 函数指针的使用 2.2 使用函数指针实现回调函数 3 总结 1 函数的类型 跟以前学数组的时候是一样的,C语言中的数组是有自己 ...

最新文章

  1. 原 ng-include用法分析以及多标签页面的简单实现方式
  2. 使用COE脚本绑定SQL Profile
  3. 搜索推荐炼丹笔记:点击位置偏差的经验比较
  4. 20135223何伟钦—信息安全系统设计基础第七周学习总结
  5. 安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己
  6. Python网络爬虫之图片懒加载技术、selenium和PhantomJS
  7. php 伪静态 获取当前页面路径_织梦移动适配PHP获取当前页面URL地址方法
  8. 难度炸裂!DeepChange:一个新的超大规模的换衣行人再识别数据集
  9. 蔚来ES8正式交付售价46.8万元起 与Model系相比扛打吗?
  10. 清华成北京赛赢家,旷视唐文斌分享本质创业 | 联想高校AI精英挑战赛
  11. Docker教程小白实操入门(9)--基于export导出容器与基于import导入一个镜像
  12. svn代码统计工具使用说明
  13. python三大器物---装饰器
  14. 深度学习:淘气3000问
  15. 【华人学者风采】林达华 香港中文大学
  16. 将您重定向的次数过多什么意思_【linux二三轶事】重定向是啥?文件描述符是啥?...
  17. NCBI数据下载-sra
  18. JAVA17安装体验JFX17抢先体验
  19. H5调用摄像头拍照,录音及选择文件
  20. 4399曹政:中国互联网

热门文章

  1. wpf之默认窗口模板研究
  2. 电源-主动式PFC介绍
  3. jupyterlab nb_conda 增加 删除_Jupyter lab
  4. Android移动应用基础教程【使用内容提供者共享数据】
  5. JAVA抽象类和接口类的区别
  6. 动画会震一下css,csshake.css强大的CSS3元素抖动动画库
  7. 车牌识别算法_易泊车牌识别算法助力智慧城市交通
  8. eos操作系统_【EOS币资讯】EOS币与以太坊有什么不同?
  9. mysql实时写入查询_MySQL实时写入表
  10. matlab论坛真不活跃,MATLAB中文论坛常见问题归纳