CS 294: Deep Reinforcement Learning Note(1)

CS 294: Deep Reinforcement Learning Note(1)

Berkeley深度强化学习的中文笔记(1):简介+模仿学习

本专题记录了在自学伯克利的深度学习课程时的笔记,主要目的是供个人学习用和同道交流,因此有一些个人的观点和感想。文章主要是对CS 294课程视频的翻译与整理,附加一些相关知识。课程地址:rll.berkeley.edu/deeprl课程视频地址 。(这是我第一次写文章,文章有什么问题请指教。)

预备要求:学过机器学习,深度学习,知道一点优化,知道一点线性代数。会用python。

课程笔记导读:

  1. 简介+模仿学习(Imitation Learning)
  2. 有模型的优化控制(Optimal Control)
  3. 基于模型的强化学习(model-based reinforcement learning)
  4. 对优化控制的模仿学习
  5. MDP,值迭代,策略迭代(model-free RL)
  6. 策略梯度(policy gradient)
  7. Q-learning
  8. DQN
  9. Advanced Policy Gradient - Variance Reduction(GAE)
  10. Advanced Policy Gradient - pathwise derivative(SVG and DPG)
  11. Advanced Policy Gradient:TRPO

注:2-4节为model-based RL,5-10节为model-free RL,两者可以分开看。

一、深度强化学习简介

1.深度强化学习名词简介

深度指的是深度学习(deep learning,DL),通过多层的神经网络而有十分强大的表示能力(representation learning),能接受学习高维的复杂的输入信息,能表示高维复杂函数,在学习之后深度网络能把原始的高维信息转化为有利于学习目标的高层特征,例如cifar10的图像分类任务。

强化学习(RL)的学习任务是机器(agent)学习策略(policy):即对于外界环境给定的观测(observation)或者状态(state)给出理想的动作(action)(对这种“理想的”界定往往通过奖励函数(reward)),在通过学习后可进行复杂的决策过程。而且强化学习是序列性的(sequential),即前一个动作会通过影响后一个状态来影响后一动作的决策,因此在做一步决策时,不光要考虑当前的奖励最大,而且要考虑之后的总奖励累积。

为简化分析,对这样一个过程,常做马尔科夫(Markov)假设,即当前状态仅与前一状态和动作有关,而与更早的状态无关。(这种序列性是强化学习与其他机器学习最大的不同)。例如AlphaGo学习下围棋,每一步不但要考虑这步的收益最大,而且要考虑如何获得后续的收益。

2.深度网络在强化学习中的作用:可用来表征以下三个映射

  1. 策略函数(给出观测,经过神经网络,得到理想的动作)
  2. 值函数(Value functions)(用来衡量状态的好坏,或者状态—动作对的好坏)(可用来选择最优策略)
  3. 动态模型(用来预测下一状态和奖励)

3.深度强化学习与人脑的相像之处:

  1. 两者都能接受不同的复杂的感知信息
  2. 对于不同的感知信息的加工和反应任务都使用同一套学习算法(人类的舌头经过学习之后能“看见”物体)
  3. 人类在做一些任务时会假定一个奖励函数并以此来检验行为或作为目标(大脑中的基底核似乎与奖励机制有关)
  4. 而且无模型的强化学习过程和实验中的动物适应过程有一定一致性(可能会用一些探索——利用的策略之类的)等。

4.强化学习面临的挑战:

  1. 人可以在短时间,少样本的条件下学习得很好,而深度强化学习需要大量的样本和时间。
  2. 人可以利用之前的相关知识和经验,而迁移学习(Transfer learning)在强化学习中还是在研究中的问题。
  3. 时常无法确定一个明确的有利于学习的奖励函数。(有时可以用逆强化学习(Inverse RL):推测奖励函数或目标 或模仿学习(imitation learning))
  4. 人能预测之后会发生什么以此来帮助决策,但是在强化学习中决策时还无法很好利用这种对未来走向的预测(Prediction)。

5.强化学习对其他机器学习任务的作用:

  1. 在图像分类任务中强化学习可以决策图像哪块区域值得注意,然后对该区域更精细地加工,来提升分类效果。
  2. 在机器翻译中,可用强化学习方法来进行序列性的预测,产生目标语言词语。


强化学习术语、记号:

强化学习的结果是机器接受观测或状态,经过一定策略来产生行为的,用数学式表示:

o_t 表示t时刻的观测, x_t 表示t时刻的状态, u_t 表示t时刻机器所采取的动作, \pi_{\theta}(u_t|o_t) 表示带参数的策略(表示在t时刻的观测下采取各种行为的条件概率,而可以是神经网络的参数),若策略为: \pi_{\theta}(o_t) \to a_t ,则是确定型策略。其中 o_tx_t 不同为: o_t 往往表示机器所感知到的信息(如由像素组成的图像),而 x_t 表示外界环境实际所处的状态(如物体运动的速度,物体相对位置等)(不一定能观测到,而且是高维像素的低维内在表示),而且状态是满足马尔科夫性质的,但观测就不一定满足了,但在课程中有时不太需要十分区别两者,都可以作为输入。

我们之后所用的是马尔可夫决策过程(Markov Decision Processes,MDP)即假设当前状态只与上一状态和动作有关,用图表示:

p(x_{t+1}|x_t,u_t) 表示状态转移函数: x_{t+1} 可见仅与 x_t,u_t 有关,而与 x_{t-1},u_{t-1} 条件不相关。


二、模仿学习(Imitation Learning)

想让机器学会某样操作(比如开车),一个很直接的想法是观察人类行为,并且模仿人类,在相应观测下做出人类所做行为。将这个想法实现起来也很简单,只需要收集该任务的一些观测(路面的画面),以及每个观测人类会做出的反应(转动方向盘),然后像监督学习一样训练一个神经网络,以观测为输入,人类行为为标签,其中行为是离散时是分类任务,连续时是回归任务:

然而这简单的监督学习理论上并不可行,一个直观的原因是由于现实的随机性或者复杂性,使得机器所采用的动作和人类的动作有偏差或者动作所产生的结果有偏差,这样在有偏差的下一状态,机器还会做出有偏差的动作,使得之后状态的偏差积累,导致机器遇到监督学习时没有碰到过的状态,那机器就完全不知道该怎么做了。

严格的讲,就是学习时和实际操作时的 o_t 的分布不同,实际操作时的 o_t 的情况由于存在偏差而会比学习时的要糟糕许多。因此我们希望 p_{data}(o_t)=p_{\pi_{\theta}}(o_t) ,这也就是DAgger算法的想法。在

稳定化实际分布

DAgger算法之前,我们先来看看简单的模仿学习在实际中的表现:

有关汽车的自动驾驶的论文:《End to End Learning for Self-Driving Cars》中,在采集数据时,汽车中间和两侧都放有摄像头,将三张图片作为观测,而相应的人类的正常驾驶行为作为标记,将这组数据打乱喂给CNN,监督学习出模仿人类的策略。出人意料的是这种简单的模仿学习实际上能成功。这是因为论文中所用的一个技巧:在标记左边摄像机画面时,它的的标记为人类正常动作加上小量的右转,而汽车右边摄像机图像的标记是人类正常动作加上小量的左转。这样机器行为在产生的向左偏差时,机器所接受到的画面就和正常情况下的左边摄像机的画面相似,而汽车左边摄像机图像的标记是人类正常动作加上小量的右转,因此机器进行有小量的右转。这样能在偏差时,检测到偏差并作出修复,也就是对的实际分布 o_t 起了稳定的作用。

对于这种想法的拓展,就是希望 o_t 的实际分布能相对学习时的分布稳定,一种方法是,学习用的数据不光是某种条件下的一条人类所走的路径,而是希望正确的路径有一个明确的概率分布(其中路径分布是指) p(\tau)=p(x_1,a_1...x_T,a_T) ,然后在这个概率分布中取正确的路径,作为模仿学习的数据。因为实在正确路径的概率分布中取路径,因此其包含了许多偏差路径修正的例子作为学习数据,可从下图看出:

这样实际操作中,机器由于学习了许多面对偏差的修正行为,能让实际路径分布相对学习时的分布稳定。而正确路径的概率分布的生成可以用下一节会讲的iLQR方法。

DAgger方法

为了让 p_{data}(o_t)=p_{\pi_{\theta}}(o_t) ,我们从数据来源出发,想让数据来源和实际操作的分布相似,那么很直接的一个想法是直接从 p_{\pi_{\theta}}(o_t) 采样学习数据,做法就是实际运行策略 \pi_{\theta} ,但是需要对策略 \pi_{\theta} 的运行结果做标记,使其成为训练数据,然后更新策略 \pi_{\theta} ,以此循环:

但DAgger方法的主要问题在第三步,即需要人来对策略 \pi_{\theta} 的运行结果做上标记,这是十分耗费人力的事情。

总结

总而言之,直接用人类数据做监督学习,来让机器模仿学习会遇到训练数据和实际操作时的分布不匹配的问题,因此不可行。

但是用一些方法能让模仿学习学的不错:

  1. 和学习任务相关的技巧(如汽车自动驾驶时在两边装摄像头)
  2. 生成训练数据的分布,然后大量采样,使实际分布稳定(需要另外的学习算法)
  3. 直接从 p_{\pi_{\theta}}(o_t) 采样学习数据(DAgger)

但即使用了一些方法,模仿学习始终有这些问题:

  1. 需要人类提供的大量数据(尤其是深度学习,然而常常没有多人类数据)
  2. 人类对一些任务也做的不太好,对于一些复杂任务,人类能做出的动作有限(比如操作无人直升机)
  3. 我们希望机器能自动学习,即能不断地在错误中自我完善,而不需要人类的指导。

作业指导

关于课程的第一次作业,需要从专家数据中模仿学习,以及用DAgger方法。

完整的tensorflow代码已经上交到我的Github上了:github.com/futurebelong

仅做参考。

编辑于 2017-09-22