本文是对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. 关于android应用程序的入口

    android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码之外生成的Activity,比如a ...

  2. Haproxy 使用block 阻止域名访问到某个子目录报403

    配置教程如下: acl is_https_com hdr_beg(host) www.baidu.com #定义规则域名 acl api_block_url_web url_dir -i /web/ ...

  3. C++中cin的输入分隔符问题及相关

    1.C/C++中的类型转换函数(区分类中的类型转换构造函数): 头文件:C中stdlib.h C++中cstdlib atof(将字符串转换成浮点型数) atoi(将字符串转换成整型数) atol(将 ...

  4. Blind Estimation and Detection of Space-Time Trellis Coded Transmissions over the Rayleigh Fading MIMO Channel

    目录 文章来源 摘要 基本概念 粒子滤波 时间序列模型 系统模型 通信系统 经典状态空间表示 论文所提出的状态空间表示 借鉴之处 文章来源 IEEE TRANSACTIONS ON COMMUNICA ...

  5. python下载神通板砖有声版

    背景 前端时间在喜马拉雅上偶然听到牛大宝说的有声小说神通板砖,说的很是幽默,听的正起劲的时候开始收费了,于是我就在网上找了下看看有没有免费版,一搜果然有,但该网站上广告太多了,于是我就写了个小脚本可以 ...

  6. Django+Nginx+Uwsgi环境配置

    nginx.conf : server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.acces ...

  7. Mybatis-Plus代码生成器使用详解

    首先创建springboot的项目(创建步骤省略) 创建好项目后要配置maven依赖,附上pom.xml: <?xml version="1.0" encoding=&quo ...

  8. How to solve the problem that Github can't visit in China?

    find path C:\Windows\System32\drivers\etc\host open DNS detection and DNS query-Webmaster(DNS查询) too ...

  9. CSS实现响应式布局

    用CSS实现响应式布局 响应式布局感觉很高大上,很难,但实际上只用CSS也能实现响应式布局要用的就是CSS中的没接查询,下面就介绍一下怎么运用: 使用@media 的三种方法 1.直接在CSS文件中使 ...

  10. nodejs通过响应回写的方式渲染页面资源

    我们一般通过node框架提供的api操作页面渲染,如何利用原始回写的方式来实现同样的功能呢下面是通过node 提供的异步地读取一个文件的全部内容api readFile进行操作,代码如下: html ...