本文是对Arthur Juliani在Medium平台发布的强化学习系列教程的个人中文翻译,该翻译是基于个人分享知识的目的进行的,欢迎交流!(This article is my personal translation for the tutorial written and posted by Arthur Juliani on Medium.com. And my work is completely based on aim of sharing knowledges and welcome communicating!)

原文地址(URL for original article)


一个聪明的agent会学会避免地面上的危险坑洞。

欢迎来到我的强化学习系列教程的最新部分,我们将经历一次创造一个深度Q网络的全过程。它将基于Part 0中我们已经创造过的简单单层Q网络,所以如果你对于强化学习还很陌生,强烈建议你先读一下之前的章节。虽然在相同的简单游戏环境中,我们普通的Q网络比较勉强地才能达到和Q表一样的效果,但是深度Q网络就强大多了。为了把普通的Q网络转换成一个DQN,我们将做以下改进:

  1. 从单层网络到多层卷积网络。
  2. 实现经验回放(Experience Replay ),这将使我们的网络能够用来自自身经验中的记忆来训练自己。
  3. 启用另一个“目标”网络,我们将在更新过程中用它来计算目标Q值。

就是这三个改进使得Google DeepMind团队能够在几十个Atari游戏中用它们的agent实现超人的表现。我们将逐一看这每条改进,并向你展示如何实现它。然而我们也不会止步于此。深度学习研究的进步速度非常快,2014年的DQN技术早就不是最先进的agent类型了。我将介绍两个简单的额外DQN架构改进方法,双子DQN(Double DQN)竞争DQN(Dueling DQN),它们可以达到更好的表现,稳定性和更快的训练时间。最后,我们将获得一个可以搞定一系列具有挑战性的Atari游戏的网络,并且我们将阐释如何训练DQN去学习一个基本的导航任务。

从Q网络到深度Q网络(Getting from Q-Network to Deep Q-Network)

改进1:卷积层(Addition 1: Convolutional Layers)

既然我们的agent将要学习玩电脑游戏,它就需要能够理解游戏在屏幕上的输出,而且至少应该以和人类或者其它智能动物相近的方式来做到。相比于独立考虑每个像素,卷积层使我们能够考虑一个图片的某个区域范围,并且在我们把信息传输到网络更后面的层时,也能维持图像中的物体在空间上的联系。通过这种方式,它们能表现得和人类相近。确实有一些研究表明卷积神经网络学习到了和原始视觉皮层相似的表征。如此,卷积神经网络就有理由成为我们网络最开始的构成元素之一。

在Tensorflow里面,我们可以用tf.contrib.layers.convolution2d函数来轻松地构造一个卷积层,调用方法如下:

convolution_layer = tf.contrib.layers.convolution2d(inputs,num_outputs,kernel_size,stride,padding)

这里的num_outs指的是要对前一层使用多少过滤器(filters)。kernel_size指的是我们要用多大的窗口来在前一层上进行滑动。stride指的是每一次我们在层上滑动窗口时跳过多少个像素。最后,padding指定的是我们是否让我们的窗口只在底层(“VALID”)进行滑动,还是在周围加上“衬垫(padding)”以保证卷积层和之前的层有相同的维度。更多信息请参照Tensorflow文档

改进2:经验回放(Addition 2: Experience Replay)

第二个让DQN能够运行起来的主要改进是经验回放。这个做法的基本思想是:通过存储agent的经验,并随机从中提取一部分(batches)来训练网络,我们可以学到如何更稳健地在解决任务。通过存储经验,我们避免了网络只学习到它当前在这个环境中正在做的相关知识,并使得它能从各种各样的过去经验中也学习一些东西出来(所谓“温故而知新”)。这些经验都在

改进3:分离目标网络(Addition 3: Separate Target Network)

第三个使得DQN独一无二的改进是对于训练过程中的第二个网络的启用。这个网络用来生成目标Q值,这个目标Q值将用来在在训练过程中,针对每个行动计算相应的损失。为什么不只用一个网络来进行两种估计呢(状态对应当前Q值的估计和目标Q值的估计)?问题关键在于在训练的每一步,Q网络的值都在变,如果我们用一直在保持变化的一系列值来调整我们的网络值,那么值估计很有可能轻易失去控制。网络可能无法工作,因为它掉进了目标Q值和估计Q值之间的反馈循环。为了消除这个风险,目标网络的权重是固定的,只会周期性地或者很慢地对主要Q网络的值进行更新。训练得此能够以更稳定的方式进行。

相比于周期性且一次性地更新目标网络,我们将更频繁地更新它,但是是比较慢地。这种技术在今年伊始的DeepMind一篇论文中提到,论文中谈到发现这样可以使训练过程更稳定。

超越DQN(Going Beyond DQN)

有了以上的改进,我们已经具备了重现2014年的DQN所需要的一切。但是世界总是日新月异的,早就有一堆针对DQN的改进被DeepMind提出,使得DQN的性能与稳定性越来越强。在你最喜欢的Atari游戏上训练你的DQN之前,我会建议先看一下更新的一些已经公布的改进。我将给你简单介绍一下其中两种改进成果:双子DQN与竞争DQN。这两个都很容易实现,并且如果结合这两种技术,我们可以在更快的训练基础上,实现更强的性能。

双子DQN(Double DQN)

双子DQN的主要直觉是:一般的DQN总是高估了在给定状态下采取潜在行动的Q值,而如果所有的行动都被同等级别地高估,这也不算什么问题,但是事实并不是这样。你可以很容易想象到如果某个次优的行动总是比最优的行动被给予更高的Q值,agent将很难学习到理想的策略。为了纠正这个问题,DDQN论文的作者提出了一个简单的技巧:相比于为了训练的每一步都计算目标Q值时都选择最大值,我们用我们的主要网络来选择一个行动,而我们的目标网络来生成那个行动对应的Q值。通过分离行动选择与目标Q值生成,我们得以相当程度上减弱过度估计的问题,并且使训练更快更可信。下面是新的DDQN更新目标值时所用的方程。

Q−Target=r+γQ(s′,argmax(Q(s′,a,θ),θ′))" role="presentation">Q−Target=r+γQ(s′,argmax(Q(s′,a,θ),θ′))Q−Target=r+γQ(s′,argmax(Q(s′,a,θ),θ′))

Q-Target = r + γQ(s’,argmax(Q(s’,a,ϴ),ϴ’))

竞争DQN(Dueling DQN)

上图:常规的单一Q值流动的DQN。下图:竞争DQN,优势是分开计算,并在最后一层结合为Q值。

为了解释竞争DQN在架构上做的变化,我们需要首先解释一些额外的强化学习术语。我们到目前一直所讨论的Q值的含义都是:在给定状态下,采取一个行动有多么好。这可以写作Q(s,a)。这个给定状态下的行动实际上可以分解成值的两个方面。第一方面是值函数V(s),它简单地给出在一个给定状态下有多么好。第二个是优势函数A(a),它给出采取某个行动相比其它的行动会有多么更好。我们可以将Q视作V和A的结合。更标准化来表示:

Q(s,a)=V(s)+A(a)" role="presentation">Q(s,a)=V(s)+A(a)Q(s,a)=V(s)+A(a)

竞争DQN的目标是让一个网络分离地计算优势函数和值函数,并只在最后一层将两者结合。乍看起来,这样做貌似没什么意义。为什么要把一个我们之后要组装起来的函数分离呢?关键是认识到这样做的好处是:能够认识到我们的强化学习agent可能不需要在任何时候同同时关注值和优势。比如说,想想在一个户外公园里坐着看日落。日落很美,坐在这里感觉很享受,回报很大。不需要采取任何行动,基于任何你所在的环境状态以外的东西去考虑你坐在那里的价值看起来也没什么意义。我们可以完成更稳健的状态值估计,只要把它和与特定行动绑定的必要性分离就行。

全部组装(Putting it all together)

简单的方块世界环境,目标是移动蓝色方块到绿色方块的位置,过程中不能碰到红色方块。

现在我们已经知道了所有创造DQN所需的技巧,让我们在一个游戏环境中来实际尝试一下!我们在上面描述的DQN可以在训练足够时间后玩Atari游戏,让网络能够在那些游戏上表现不错需要在一个性能好的机器上训练至少一天。为了教学目的,我已经建立了一个简单的游戏环境,在这个环境中,我们的DQN在一个中等强劲性能的机器上(GTX970)训练几个小时。在环境当中,agent控制蓝色方块,它的目标是去向绿色方块(回报+1)并避免红色方块(回报-1)。在每一轮开始的时候,agent被随机放入5*5的网格世界里。agent只能再50步内尝试实现最大化的汇报。因为是随机放置,agent需要做的不只仅仅学习一个简单的固定路线(在Tutorial 0的FrozenLake环境中,就这么简单)。相反,agent必须学习方格之间的空间关系。而事实上,它也确实可以做到。

Github代码链接

游戏环境会生成一个84*84*3的彩色图片,并且用尽可能和OpenAI gym相似的方式调用函数。通过这样做,将会比较容易调整代码使其适配到任何OpenAI的atari游戏上。我鼓励有时间和计算资源的小伙伴们一定要试一下让agent玩好Atari游戏。超参数可能要花点功夫调,但是绝对是有可能实现的。好运!


如果这篇博文对你有帮助,你可以考虑捐赠以支持未来更多的相关的教程、文章和实现。对任意的帮助与贡献都表示非常感激!

如果你想跟进我在深度学习、人工智能、感知科学方面的工作,可以在Medium上follow我 @Arthur Juliani,或者推特@awjliani。

用Tensorflow实现简单强化学习的系列教程:

  1. Part 0 — Q-Learning Agents
  2. Part 1 — Two-Armed Bandit
  3. Part 1.5 — Contextual Bandits
  4. Part 2 — Policy-Based Agents
  5. Part 3 — Model-Based RL
  6. Part 4 — Deep Q-Networks and Beyond
  7. Part 5 — Visualizing an Agent’s Thoughts and Actions
  8. Part 6 — Partial Observability and Deep Recurrent Q-Networks
  9. Part 7 — Action-Selection Strategies for Exploration
  10. Part 8 — Asynchronous Actor-Critic Agents (A3C)

强化学习之六:Deep Q-Network and Beyond的更多相关文章

  1. 【转】【强化学习】Deep Q Network(DQN)算法详解

    原文地址:https://blog.csdn.net/qq_30615903/article/details/80744083 DQN(Deep Q-Learning)是将深度学习deeplearni ...

  2. 深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird

    深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-fu ...

  3. 强化学习系列之:Deep Q Network (DQN)

    文章目录 [隐藏] 1. 强化学习和深度学习结合 2. Deep Q Network (DQN) 算法 3. 后续发展 3.1 Double DQN 3.2 Prioritized Replay 3. ...

  4. 深度增强学习--Deep Q Network

    从这里开始换个游戏演示,cartpole游戏 Deep Q Network 实例代码 import sys import gym import pylab import random import n ...

  5. AlphaGo的前世今生(一)Deep Q Network and Game Search Tree:Road to AI Revolution

    这一个专题将会是有关AlphaGo的前世今生以及其带来的AI革命,总共分成三节.本人水平有限,如有错误还望指正.如需转载,须征得本人同意. Road to AI Revolution(通往AI革命之路 ...

  6. Deep Q Network(DQN)原理解析

    1. 前言 在前面的章节中我们介绍了时序差分算法(TD)和Q-Learning,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,使用Q- ...

  7. 深度强化学习:Deep Q-Learning

    在前两篇文章强化学习基础:基本概念和动态规划和强化学习基础:蒙特卡罗和时序差分中介绍的强化学习的三种经典方法(动态规划.蒙特卡罗以及时序差分)适用于有限的状态集合$\mathcal{S}$,以时序差分 ...

  8. 深度强化学习(Deep Reinforcement Learning)入门:RL base & DQN-DDPG-A3C introduction

    转自https://zhuanlan.zhihu.com/p/25239682 过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题.子曰:温故而知新,在进一步深入研究和应 ...

  9. The categories of Reinforcement Learning 强化学习分类

    RL分为三大类: (1)通过行为的价值来选取特定行为的方法,具体 包括使用表格学习的 q learning, sarsa, 使用神经网络学习的 deep q network: (2)直接输出行为的 p ...

随机推荐

  1. 模拟HTTP请求超时时间设置

    HTTP请求有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间(请求资源超时时间). 使用curl命令行 连接超时时间用 --connect-timeout 参数来指定 数据传输的最大 ...

  2. 记 MySQL优化 20条

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  3. flask 参数校验

    校验参数是否存在,不存在返回400 @app.route('/check',methods=['POST']) def check(): values = request.get_json() req ...

  4. Windows 10 右键 在此处打开 CMD

    1. 打开注册表 # 1. 使用快捷键打开 “运行” # win + r # 2. 在 “运行” 中输入 # regedit # 3. 回车 2. 创建与设置 OpenCMDHere # 1. 切换到 ...

  5. Go-数据类型以及变量,常量,函数,包的使用

    Go-数据类型以及变量,常量,函数,包的使用 一.数据类型 1.字符串类型 string -双引号包裹的:"xxx" -反引号包裹,可以换行, 注意: 区别于python,是没有单 ...

  6. HttpClientFactory的套路,你知多少?

    背景 ASP.NET Core 在 2.1 之后推出了具有弹性 HTTP 请求能力的 HttpClient 工厂类 HttpClientFactory. 替换的初衷还是简单摆一下: ① using(v ...

  7. idea通过maven打jar包不成功或无法加载主类或打成功也找不到jar包

    这个问题纠结了我一天,在网上也搜了一些方法,现在把我自己的处理过程记录一下,以方便遇到此类问题的小伙伴参考: 第一步:查看idea的jdk版本与Windows安装的jdk是不是同一个版本,如下图 第二 ...

  8. 【WPF学习】第五十四章 关键帧动画

    到目前为止,看到的所有动画都使用线性插值从起点到终点.但如果需要创建具有多个分段的动画和不规则移动的动画.例如,可能希望创建一个动画,快速地将一个元素滑入到视图中,然后慢慢地将它移到正确位置.可通过创 ...

  9. Python 解密JWT验证苹果登录

    验证苹果登录,官方提供两种验证方法,一种是token,另一个种是code.这里使用的是token 登录流程: 苹果客户端调用苹果API,获取到用户的信息,包括: user_id 昵称 identity ...

  10. 群ping

    找出单位内所有电脑手机 通常情况下,ping只能ping一个IP地址.一个网络值班只有255台电脑,除非是大的网络断,把子网掩码改了,可以扩充更多电脑.如: 如果我们要一次性检查内网所有机器,则可以输 ...