最近在学习斯坦福2017年秋季学期的《强化学习》课程,感兴趣的同学可以follow一下,Sergey大神的,有英文字幕,语速有点快,适合有一些基础的入门生。

今天主要总结上午看的有关DQN的一篇论文《Human-level control through deep reinforcement learning》,在Atari 2600 games上用DQN网络训练的,训练结果明,DQN能够比较稳定的收敛到Human-level的游戏水平。

前言

目前,强化学习已经在现实中很多复杂的情形中取得小小胜利,尤其是在可人工构建有效特征、可全观测的低维状态空间等领域。当然也在一些任务场景中碰了不少的壁:智能体必须学会从高维的“感官”输入中,识别并“感知”外界环境的特征表示,并从过去的经验中,学习以及迁移适应新的环境。这对人和动物来说,是与生俱来的能力,是和我们层级的感知系统与自我强化学习的神秘结合有关。

论文摘要

本文提出了一种Deep Q-Network(DQN),借助 端到端(end-to-end) 的强化学习方法能够直接从高维的输入中,学习一种很优的策略(policy)。输入是游戏的实时图像(当前状态S),借助卷积神经网络捕捉局部特征的关联性,输出所有可能采取动作A的概率分布,论文引入了经验回放(Experience Replay)。

思路

Action-Value Function

DQN中,借助了深度神经网络来拟合动作-值函数,即折扣累计回报:

其中π是要采取的策略,即在观察到状态s时,按照策略采取动作a

强化学习过程常常不稳定,而且训练时易于发散(diverge),尤其当神经网络采用非线性函数逼近Q时。主要有以下原因:

  • 在训练时,输入的观察序列(样本)之间具有关联性。比如后个序列样本,是紧着前一个样本的。
  • Q函数小小的更新可能给策略(policy)带来很大的波动(更新前后策略分布明显有别),并进一步改变数据分布(策略影响下一步动作选取)
  • 动作-值函数Q与目标值(target value)的关联性。目标值定义如下:

经验回放

借助深度网络来拟合Q函数这里就不做赘述了,详见下文的网络图。论文作者在模型训练中加入了 经验回放(Expericen Replay),这里解释一下这个非常有用的概念(敲黑板~~):

在训练过程中,会维护一个序列样本池Dt= {e1, ...., et},其中et=(st, at, rt, st+1),et就是在状态st下,采取了动作at,转移到了状态st+1,得到回报rt,这样就形成了一个样本(经验),一般样本池大小有限制(设为N)

回放的意思,就是在训练中,比如让agent玩游戏,并不是把样本按照时间顺序喂给网络,而是在一局游戏未结束之前,把生成的样本(经验)都更新地扔进经验池中,从池中平均采样minBatch个,作为训练样本

这样,通过回放,就可以减少上面提到的因为前后样本存在关联导致的强化学习震荡和发散问题。还有以下好处:

  • 保证了每个样本在权重更新中,都有足够的可能被利用多次,提高样本利用率
  • 直接从连续的样本学习会导致震荡问题,随机从样本池抽取,可以打乱这种关联性
  • 形象化解释是,当agent在上一个样本最后采取的动作是left时,在采样中,可以只从状态为left的样本中进行采样,保证训练的分布更具有有效性

Double Q-network 迭代

因为在逼近Q函数时,由于目标值函数与下个状态的最优动作对应的Q函数有关,而动作选取又依赖于策略π的更新,因此二者相互关联。

在DQN中我们用网络拟合Q(s, a; θ),其中θ是网络中权重参数,Q-learning的迭代更新使用如下的loss函数:

其中θi是第 i 步Q-network参数;θ-是计算第i步的目标值(target value)。 一般θi更新C步,θ-才更新一步。

算法细节

预处理

论文是基于Atari 2600视频帧图像数据,210×160像素,128色,不作处理的话,对计算内存要求太高。

首先,取前后两帧图像的最大值。因为有些闪烁的像素只出现在偶数帧,不出现在奇数帧

然后,从RGB数据中提取亮度作为Y通道值,并将图像缩放到84×84

作者最后也采用最相邻的m(取值为4)帧图像,进行堆叠(stack),生成最后的输入图像。(堆叠??相邻m帧取平均?)

构建模型

1.输入

网络输入是84×84×4的经过预处理后的图像

2.卷积层和全连接层

输入是游戏的视频帧,通过3层卷积层,后接2层全连接层,最后输出当前状态(视频帧)在采取的所有动作的Q值函数。作者在论文中提到,此模型尽可能的少的进行先验假设。

  • 第一层卷积—— 32 filters of 8×8, 步长4,Relu 激活
  • 第二层卷积——64 filters of 4×4,步长2,Relu 激活
  • 第三层卷积——64 filters of 3×3,步长1,Relu 激活
  • 全连接层——512隐藏层单元,Relu 几乎
  • 输出层——与action的数目有关系

训练细节

需要提到的第一点,在训练过程中,作者clipping了rewards。具体操作是:正向回报clip到1,负向回报clip到-1,0表示无回报。

为什么要clip?(黑人问号脸o(╯□╰)o)

以这种方式处理回报值,可以限制误差传导的幅度,更容易保证在不同的游戏之间保持相同的学习率。同时,不clip的话会影响agent的性能,因为不同的量级回报会导致求导问题(不可导??)

实验中采用了RMSProb的梯度优化方法,mini-batch设置为32。在选取贪心策略的参数时,在前1M帧从1.到0.1递减,之后保持0.1不变。

同时,在每个episode训练时,采用k-th跳步法,即每隔k个帧进行样本选择,这样在相同的时间里,可以训练k次。

loss function

最优动作-值函数遵循一个重要的条件:贝尔曼等式

对于状态 s’ 的所有可能动作 a’ ,Q(s’, a’)是最优值,则最优的策略是最大化r+γQ(s’, a’)

因此借助贝尔曼进行Q的迭代更新:

但实际上,这种方式并不可行。因为动作-值函数是对每个序列进行独立评估的,并未涉及任何生成过程。因此,更常用函数逼近方法来估计动作-值函数,比如线性函数逼近,或者借助神经网络进行非线性函数逼近。

在迭代过程中计算均方差:

进一步约化为:

在监督学习中,目标值在训练过程中是确定的。但是在这里,目标值依赖于网络权重,在每一步的梯度优化中,我们固定先前迭代的参数θi-,去优化Loss函数。上式中的最后一项,是目标值方差,一般常忽略不作处理(不依赖与θi)。

对loss函数求导:

训练过程

采用经验回放的Deep Q-learning算法。训练过程如下:

在训练过程中,采用贪心策略,即在网络输出得到的所有动作值函数Q时,并非以直接选取最大值对应的动作,而是采取ξ-greedy policy,即可能以很小的概率选取其他动作,以保证探索空间的多样性。在追踪平均每个episode的得分情况,可以看出Q函数能够稳定的收敛到一定值。

  • model-free——算法直接使用模拟器的样本解决强化学习任务,并没有显式的估计回报和transition dynamics P(r, s’|s, a)
  • off-policy——算法学习的是贪心策略 a=argmaxQ(s,a’;θ),按照行为分布来确保状态空间的足够性探索

小结

  • 在论文中,作者还提到DQN能够学习到相对长期的策略(提到在小霸王里消砖的那款游戏:agent可以通过强化学习学到,优先把一个角打通,然后就会在天花板里来回谈,以获得很高的回报)
  • 盛赞了一下提出的DQN网络以很少的先验知识,简单的网络,相同的模型算法,就能在多样的环境中(多款游戏),仅借助像素信息和游戏得分,得到human-level的agent。
  • Replay算法很好使,减少训练的震荡性
  • 独立的target value网络(其实就是复制了一下Q-network参数,延迟C step 进行更新)

【论文研读】强化学习入门之DQN的更多相关文章

  1. 强化学习入门基础-马尔可夫决策过程(MDP)

    作者:YJLAugus 博客: https://www.cnblogs.com/yjlaugus 项目地址:https://github.com/YJLAugus/Reinforcement-Lear ...

  2. gym强化学习入门demo——随机选取动作 其实有了这些动作和反馈值以后就可以用来训练DNN网络了

    # -*- coding: utf-8 -*- import gym import time env = gym.make('CartPole-v0') observation = env.reset ...

  3. Reinforcement Learning 强化学习入门

    https://www.zhihu.com/question/277325426 https://github.com/jinglescode/reinforcement-learning-tic-t ...

  4. (转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)

    本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA 专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 201 ...

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

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

  6. 李宏毅强化学习完整笔记!开源项目《LeeDeepRL-Notes》发布

    Datawhale开源 核心贡献者:王琦.杨逸远.江季 提起李宏毅老师,熟悉强化学习的读者朋友一定不会陌生.很多人选择的强化学习入门学习材料都是李宏毅老师的台大公开课视频. 现在,强化学习爱好者有更完 ...

  7. Ubuntu下常用强化学习实验环境搭建(MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)

    http://lib.csdn.net/article/aimachinelearning/68113 原文地址:http://blog.csdn.net/jinzhuojun/article/det ...

  8. 告别炼丹,Google Brain提出强化学习助力Neural Architecture Search | ICLR2017

    论文为Google Brain在16年推出的使用强化学习的Neural Architecture Search方法,该方法能够针对数据集搜索构建特定的网络,但需要800卡训练一个月时间.虽然论文的思路 ...

  9. 强化学习(二)马尔科夫决策过程(MDP)

    在强化学习(一)模型基础中,我们讲到了强化学习模型的8个基本要素.但是仅凭这些要素还是无法使用强化学习来帮助我们解决问题的, 在讲到模型训练前,模型的简化也很重要,这一篇主要就是讲如何利用马尔科夫决策 ...

随机推荐

  1. 参加Folding@Home(FAH)项目,为战胜新冠肺炎贡献出自己的一份力量

    鉴于新冠病毒(COVID-19)在全球范围内的大规模传播,PCMR和NVIDIA呼吁全球PC用户加入Folding@home项目贡献自己闲置的GPU计算力,协助抗击新冠状病毒疫情. 目前全球有超过40 ...

  2. HDU-6376 度度熊剪纸条

    链接 http://acm.hdu.edu.cn/showproblem.php?pid=6376 分析 这道题好像不是很难,因为是要拼出前缀1,所以确定剪下每一段1需要的刀数,然后因为有次数限制,所 ...

  3. 从谷歌 GFS 架构设计聊开去

    伟人说:“人多力量大.” 尼古拉斯赵四说:“没有什么事,是一顿饭解决不了的!!!如果有,那就两顿.” 研发说:“需求太多,人手不够.” 专家说:“人手不够,那就协调资源,攒人头.” 释义:一人拾柴火不 ...

  4. JavaScript简单使用

    本文参考廖雪峰老师网站:https://www.liaoxuefeng.com/wiki/1022910821149312 JavaScript是一种运行在浏览器中的解释型的编程语言,在Web世界里, ...

  5. 201771030103-陈正丽 实验一 软件工程准备—<快速浏览 邹欣老师博客—读后感>

    项目 内容 <软件工程> 代祖华老师博客 作业要求 邹欣老师博客 学习目标 具体目标 在大概阅读邹欣老师的博客时,发现老师写了关于很多方面的内容,有基础的也有比较深奥的,这次阅读过程中主要 ...

  6. C# 快速开发框架搭建—环境搭建

    一.新建MVC项目 打开vs2013新建空的解决方案,在解决方案中增加一个MVC项目,如图: 删除不需要的文件,剩下如图所示的文件夹: 首先创建一个MVC5控制器(Login,登入使用),该控制器无需 ...

  7. JAVABEAN的SCOPE属性(转载)

    对于JSP 程序而言,使用JavaBeans  组件不仅可以封装许多信息,而且还可以将一些 数据处理的逻辑隐藏到JavaBeans  的内部,除此之外,我们还可以设定JavaBeans  的Scope ...

  8. tornado自定义实现django include方法

    tornado自定义实现django  include方法 自定义URLmethod模块 from Custom.errors import * def include(base_url, expan ...

  9. linux美化网址

    参考博文地址 https://blog.csdn.net/qq_42527676/article/details/91356154 https://www.opendesktop.org/ Dash ...

  10. 创建堆(python)

    创建最大(小)堆 二叉堆本质上是一种完全二叉树,存储方式并不是链式存储,而是顺序存储 堆操作:插入(叶子节点上调),删除(堆顶元素下沉) 堆创建:非叶子节点下沉(从最后一个非叶子节点开始) 最小堆: ...