强化学习之六:Deep Q-Network and Beyond
本文是对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,我们将做以下改进:
- 从单层网络到多层卷积网络。
- 实现经验回放(Experience Replay ),这将使我们的网络能够用来自自身经验中的记忆来训练自己。
- 启用另一个“目标”网络,我们将在更新过程中用它来计算目标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,ϴ),ϴ’))
竞争DQN(Dueling DQN)
上图:常规的单一Q值流动的DQN。下图:竞争DQN,值和优势是分开计算,并在最后一层结合为Q值。
为了解释竞争DQN在架构上做的变化,我们需要首先解释一些额外的强化学习术语。我们到目前一直所讨论的Q值的含义都是:在给定状态下,采取一个行动有多么好。这可以写作Q(s,a)。这个给定状态下的行动实际上可以分解成值的两个方面。第一方面是值函数V(s),它简单地给出在一个给定状态下有多么好。第二个是优势函数A(a),它给出采取某个行动相比其它的行动会有多么更好。我们可以将Q视作V和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必须学习方格之间的空间关系。而事实上,它也确实可以做到。
游戏环境会生成一个84*84*3的彩色图片,并且用尽可能和OpenAI gym相似的方式调用函数。通过这样做,将会比较容易调整代码使其适配到任何OpenAI的atari游戏上。我鼓励有时间和计算资源的小伙伴们一定要试一下让agent玩好Atari游戏。超参数可能要花点功夫调,但是绝对是有可能实现的。好运!
如果这篇博文对你有帮助,你可以考虑捐赠以支持未来更多的相关的教程、文章和实现。对任意的帮助与贡献都表示非常感激!
如果你想跟进我在深度学习、人工智能、感知科学方面的工作,可以在Medium上follow我 @Arthur Juliani,或者推特@awjliani。
用Tensorflow实现简单强化学习的系列教程:
- Part 0 — Q-Learning Agents
- Part 1 — Two-Armed Bandit
- Part 1.5 — Contextual Bandits
- Part 2 — Policy-Based Agents
- Part 3 — Model-Based RL
- Part 4 — Deep Q-Networks and Beyond
- Part 5 — Visualizing an Agent’s Thoughts and Actions
- Part 6 — Partial Observability and Deep Recurrent Q-Networks
- Part 7 — Action-Selection Strategies for Exploration
- Part 8 — Asynchronous Actor-Critic Agents (A3C)
强化学习之六:Deep Q-Network and Beyond的更多相关文章
- 【转】【强化学习】Deep Q Network(DQN)算法详解
原文地址:https://blog.csdn.net/qq_30615903/article/details/80744083 DQN(Deep Q-Learning)是将深度学习deeplearni ...
- 深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird
深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-fu ...
- 强化学习系列之:Deep Q Network (DQN)
文章目录 [隐藏] 1. 强化学习和深度学习结合 2. Deep Q Network (DQN) 算法 3. 后续发展 3.1 Double DQN 3.2 Prioritized Replay 3. ...
- 深度增强学习--Deep Q Network
从这里开始换个游戏演示,cartpole游戏 Deep Q Network 实例代码 import sys import gym import pylab import random import n ...
- AlphaGo的前世今生(一)Deep Q Network and Game Search Tree:Road to AI Revolution
这一个专题将会是有关AlphaGo的前世今生以及其带来的AI革命,总共分成三节.本人水平有限,如有错误还望指正.如需转载,须征得本人同意. Road to AI Revolution(通往AI革命之路 ...
- Deep Q Network(DQN)原理解析
1. 前言 在前面的章节中我们介绍了时序差分算法(TD)和Q-Learning,当状态和动作空间是离散且维数不高时可使用Q-Table储存每个状态动作对的Q值,而当状态和动作空间是高维连续时,使用Q- ...
- 深度强化学习:Deep Q-Learning
在前两篇文章强化学习基础:基本概念和动态规划和强化学习基础:蒙特卡罗和时序差分中介绍的强化学习的三种经典方法(动态规划.蒙特卡罗以及时序差分)适用于有限的状态集合$\mathcal{S}$,以时序差分 ...
- 深度强化学习(Deep Reinforcement Learning)入门:RL base & DQN-DDPG-A3C introduction
转自https://zhuanlan.zhihu.com/p/25239682 过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题.子曰:温故而知新,在进一步深入研究和应 ...
- The categories of Reinforcement Learning 强化学习分类
RL分为三大类: (1)通过行为的价值来选取特定行为的方法,具体 包括使用表格学习的 q learning, sarsa, 使用神经网络学习的 deep q network: (2)直接输出行为的 p ...
随机推荐
- Circles of Waiting
题目传送门 很容易列出期望的方程,高斯消元搞一波但是常规消元复杂度是$O(r^6)$的考虑从左到右从上到下编号然后按编号从小到大消元假设黄点是已经消元的点,那么消下一个点的时候,只有绿点的方程中该项系 ...
- Fragment argument
每个Fragment实例都可以附带一个Bundle对象,该bundle包含键值对,可以像附加extra到Activity的intent中那样使用他们.一个键值对即一个argument. 创建frage ...
- C++走向远洋——49(项目一2、复数类中的运算符重载、类的友元函数)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- 小程序中,设置Sticky定位,距离上面会有一个缝隙
近日,在小程序中使用sticky定位实现吸顶效果,不料入了一个大坑. 定位后,距离有position: relative:的上级元素有个1px大小的缝隙条,透过缝隙,滑动时可看到定位标题下的内容. 此 ...
- 如何看待Java是世界上最好的语言?
Java出现二十多年以来,一直都是主流的开发语言,Java创建于 1995 年,在 20多年的发展历程中,Java 已经证明自己是用于自定义软件开发的顶级通用编程语言. Java 广泛应用于科学教育. ...
- springboot自动装配原理回顾、配置文件分析
配置文件 spring boot官方文档 官方外部配置文件说明参考文档 自动配置原理分析 1. SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfigurat ...
- 前端基础知识之HTML
[1: What does a doctype do?] 1: doctype是html文件的第一行代码,意味着它的前面有注释都不行.所以要要写在<html>标签前面,而且它不属于html ...
- Netty学习(4):NIO网络编程
概述 在 Netty学习(3)中,我们已经学习了 Buffer 和 Channel 的概念, 接下来就让我们通过实现一个 NIO 的多人聊天服务器来深入理解 NIO 的第 3个组件:Selector. ...
- 谈谈集合.Map
本文来谈谈我们平时使用最多的HashMap. 1. 简介 HashMap是我们在开发过程中用的最多的一个集合结构,没有之一.HashMap实现了Map接口,内部存放Key-Value键值对,支持泛型. ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...