这一章我们来介绍目前深度学习界最火、最为炙手可热的一个领域——强化学习(Reinforcement Learning)。
事实上,强化学习本身是一个和深度学习无关的概念,它是指一类特定问题的形式。在上个世纪中期,人们就已经对强化学习的问题产生了兴趣并进行了研究。诸如控制论等等均可以视作是强化学习的前身。但是,人们使用传统方法研究强化学习的时候,一直没有取得很好的效果,所以这个领域一直没有得到太大的关注。
在近些年,随着深度学习的强势崛起,人们将强化学习运用于深度学习,这才第一次见识到了深度强化学习的威力。2016年,AlphaGO击败人类的围棋冠军李世石,运用的就是强化学习的技术(那是一个监督学习加强化学习的版本)。这一事件也吸引了大众对于强化学习,乃至整个深度学习领域的广泛关注。而去年的AlphaZero则通过完全强化学习的方式,用更短的时间击败了AlphaGo,则再一次让人们开了眼界。
与深度学习其它领域相比,强化学习对于数学的要求更高,其运算表达式也更加繁琐。读者最好对深度学习有足够的了解再来阅读此文。作为一个科普文,我们力图将其表现得更加通俗。本文作为科普文,力求将其运用数学语言与一些通俗的类比使之更加容易理解。鉴于作者水平限制,可能在部分通俗比喻上无法清晰地传递某些问题的真实内涵。如果希望深刻地理解强化学习这部分的研究,还请找相关学术著作及论文阅读。
在某个游戏或者某个特定的任务规则中,有许多种state(简记为s),我们有许多种action(简记为a)可以采取。在某一个回合中,当我们在某一个s上采取了一个a之后,(s,a)就会在(一定概率的意义下/确定意义下)导致我们进入下一个s,并同时获得一个reward(简记为r),循环往复,直到达到某一个done(回合结束的标志)之后,一个回合结束。可以开始下一个回合。
也就是说,我们的训练集应该由很多个回合的数据组成,而每一个回合由s1,a1,r1,s2,a2,r2,s3,a3,r3,s4,a4,r4,…组成。我们要用这样的数据来训练一个agent,使得它在s中能够最好地找出a,使我们获得的r最大。例如,下一盘象棋就可以转换为一回合的数据。(要注意的是,下象棋时我们采取了一个action之后对方也要采取一个action,然后才又轮到我们。所以说(s,a)进入下一个s是有一定随机性的、是取决于对方的政策的。这也就是说(s,a)→s是在一定概率意义下的。)
在象棋中,我们可以将r设定为将死的那一步。则绝大多数的步骤中,r为0。r不为0的情况是很稀有的,所以我们也说强化学习问题中通常r是具有稀疏性的。而相比之下,s总是很多的。a的数量则取决于具体的问题。有的问题中a可能很多,有的问题中a很少,甚至可能只有两个。但是由于s很多,这仍然是一个复杂的问题。在象棋中,一盘棋有几亿个不同的s,有几十种不同的a,但是真正能够分出胜负、拿到r的只有最后一步。所以绝大多数时候,r=0,而我们都在错综复杂的s之间,靠着采取不同的a绕来绕去。
要注意的是,r是可以人为设计的。(例如对于象棋,可以设定只有将死才能拿到一个r,也可以设计吃掉不同的子就拿不同的r,例如吃车拿9,吃炮拿5,吃兵拿1,而将死拿最大的r,比如100)一般而言,更加稠密的r会更加有利于训练,所以可以在符合问题需求的前提下,人为地把r设计得稠密一些。但是,对于下棋而言,真正的目的不是吃子,而是将对方将死。所以这样设计出来的模型有可能会偏离真实的目标,光顾着吃子,而没有足够注意然后将对方将死。
当我们将一个游戏的s、a、r分布是什么定义清楚了,我们就将这个问题转化为了一个强化学习问题,就可以套用强化学习的模型去解决这个问题了。下面,我们将介绍不同的RL的问题。
model-based与 model-free
具体而言,RL问题分为model-based与model-free的。
Model-based可以理解为在现实世界里面玩,可以接受现实世界的反馈,而不用为现实世界建模。比如一个机器人身上安装了一些物理的传感器,它不断测量现实的温度湿度并把这当做是s;Model-free是在一个虚拟的世界里面玩,需要为世界建模。比如电脑自己在下围棋,自己就可以记录下围棋的s。
二者的区别,分为几点。第一,model-based问题中我们一定程度上知道(s,a)→(r,s)的规则,而model-free问题中我们完全不知道这样的规则;第二,model-free是只能依靠训练集的,而model-based拥有训练集以外一些其它的东西,比如利用(s,a)→(r,s)的规则;第三,model-free的训练集有一定成本,所以训练集相对得来不易,而model-based的训练集产生相对没有什么成本,所以有大量训练集。
现在主流学界研究的都是model-free的,也就是说,我们希望通过纯学习的方法得到agent,因为这样更加具有通用性与无敌性;但是,目前只有下棋、游戏AI等等几个少数的领域中model-free的RL模型能够取得成功。在业界有关RL的问题主要还是用model-based的,因为能够通过纯学习就造出有用的agent还是太过理想了,实践中比较困难。
举个具体的例子,我们都希望无人车可以利用纯学习来学会怎么开车。例如建立一个虚拟的环境,将路况设定为s,将加速、减速、拐弯等视为a,将快速到达目的地、艰难到达目的地、轻度撞车、车毁人亡设为不同的r,让无人车自己在虚拟的环境中摸索,自己学会怎么开。但是这样实在学不出安全、有用的无人车。所以人们还是得用一些工程的方法,也就是设定一些规则,例如前方50米有车辆时候必须减速等等。这样人为设计的规则更加能让我们感觉到放心。
由于model-based的RL有较强的工科性质,而机器学习主要研究的是model-free的RL,所以我们就主要介绍model-free的RL。
对agent建立网络的思路
强化学习中,agent是用来针对s选择a的。我们希望这个agent能够得到的“价值”最大。但同时这个“价值”与r的大小和拿到r的时间衰减有关(我们总是希望能够尽早地得到好处)。若第k步之后拿到r,其价值是γkr。一般γ=0.9。我们一般训练的目的是希望agent得到的Q=Σγkrk尽量大。 有两种建立agent的主要思想,一种是“基于价值的”(Q)学习方法,另一种是“基于策略”(Policy)的学习方法。
基于Q的方法是这样的,它试图对任意的s与a给出一个函数Q(s,a),计算在“最佳策略”下,s状态下采取a所带来的价值(其最理想的状态是告诉我们在这个(s,a)之后,我们至多能得到多少Q)。我们可以想象,这个(s,a)对应的Q是一个客观存在的量(假设“最佳策略”是客观存在的),我们训练的过程就是为了让我们的Q(s,a)函数尽量接近这个客观存在的Q的量。当我们把Q(s,a)训练得差不多了,我们就可以用Q(s,a)估计每一步的价值,并且选择价值最大的a来采取。
要注意的是,这个Q代表的价值和r是不一样的。r一般是稀疏的,而Q总是稠密的。举一个例子,你高中三年学习就是为了在高考那一刻获得一个r,真正有r的部分是很少的。但是,你这三年的学习状态、年级排名代表的s,大致可以判断你能获得一个怎样的r。正是由于s对于r有一个判断,所以我们才要选择合理的a(好好学习),以取得更好的s,最终在高考中取得较好的r。
换个比方,在象棋中,即使我们规定每一次吃子才能获得r,这个r仍然是很稀疏的。第一步我们吃子的方法只有炮打马,然而这样的话对方下一步就以车吃炮,还把车开了出来,这种走法对我们是不利的。除了吃炮之外,别的各种走法都不涉及吃子,也就是说,它们的r都是0,那这样就意味着它们都一样吗?显然不是的。不同的走法会进入不同的局势,而这些局势中我们的优势不同,以至于我们在这些局势中以后能够获得的r的预期是不同的。例如在下图中,我们第一步有多种走法,它们的r都是0,但是我们可以判断它们的Q是不同的,有的增加,有的减少。我们应该选择一个a使得我们具有较高的Q(s,a),比如当头炮或者飞象,而不应该选择御驾亲征。
Policy的方法是这样的,它直接给出agent的policy函数,即针对一个s,它直接给出最佳的那个a是什么。policy函数的参数刚刚完成随机初始化后,这个agent可能会玩得很差,而我们训练的过程就是通过修改这个policy函数的参数,使得agent能够越玩越好,即在期望意义下获得更多的Q。对于a连续的情况,它像是一个回归器一样对于s输出a;对于a离散的情况,它像是一个分类器一样对于s输出各个a的概率。下一节我们会详细讲这个。
一般而言,基于Q的方法,比如DQN,它每时每刻对于(s,a)的Q的估计就对应于一种策略(即直接选择使得Q最大的a),故而在不至于混淆的情况下,我们也可以说DQN也对应于一个策略。这种说法会便于我们解释一些问题;但是另一方面,基于policy的方法却没有办法帮我们算出价值。这就是说,基于Q的方法可以对棋局打分,能够根据棋局判断双方的获胜概率,也能够教agent怎么走。而基于policy的方法只能教agent怎么走,却不能对于现在的局势给出一个量化的判断。
连续动作与离散动作
针对不同的问题,可以选择的a有两种情况——离散的(如一共只有上下左右4个动作)与连续的(如用机器手臂用多大的力气)。有一些具体场景决定了a的性质,而对于另外一些具体场景,我们则可以主动选择把问题构造成这两种中的哪一种(例如有的问题中我们可以将连续动作离散化)。
这两种情况(a是连续或是离散)对应的神经网络的结构是十分不同的(相比之下,s是连续还是离散的差别并不大)。所以a是连续还是离散可以作为RL问题最基本的分类之一。我们来分别讲述两种情况下的不同模型的差别。
首先考虑基于价值的网络(Q net):
当a是离散的,即有n个不同a的时候,考虑采用基于Q的学习方法。一般我们构造的神经网络输入是一个s,输出的Q(s)为一个n维向量,代表n个ai对应的Q(s,ai)。我们也可将其记为Q(s,a),代表Q(s)得到的n维向量中对应于a的那个位置的值。
当a是连续的,是一个m维向量的时候,考虑基于Q的学习方法。一般我们构造的网络输入是s和a,输出Q(s,a)是一个标量。要注意的是,它的网络构造和a离散的情况是完全不同的。为了统一,也先将其记为Q(s,a)。
要注意的是,当a是离散的时候,面对s,找出argmax Q(s,a)就是我们的策略,这只需要从n个值中找出最大值。然而当a是连续的时候,单靠Q(s,a)是无法解决问题的(因为Q(s,a)对于a是一个复杂的非凸函数,无法找出极值点)。故而在a连续时候,光训练Q net是不够的(但是它事实上是可以被训练出来的)。
接着考虑Policy net:
当a是离散的,即有n个不同a的时候,考虑基于Policy的学习方法。一般我们构造的神经网络输入是一个s,输出的Q(s)是一个n维向量。将这个n维向量进行softmax之后即得到s处采取n个不同的a的概率。这和神经网络面对分类问题时候的做法是一样的——输出它属于各个类的概率。我们还是将这种情况记为Q(s,a)。 面对这个输出,我们可以采取不同策略,例如让agent采取置信度最大的a,或让它按照这个输出的概率随机采取,甚至也可以让它为输出概率加一个噪音后随机采取。在训练与应用时候,我们可以采用不同策略。
当a是连续的,是一个m维向量的时候,考虑基于Policy的学习方法。具体而言,它又分为两种情况——即随机策略网络(Stochastic Policy Net)与确定策略网络(Deterministic Policy Net)。在Deterministic Policy Gradient(DPG)中,我们输入s,网络直接计算出一个m维向量,即它应该采取的最佳的a是多少;在Stochastic Policy Gradient(SPG)中,我们输入s,网络计算出一些向量,利用这些向量的值确定一个随机变量的分布,然后从这个分布中随机产生一个m维向量做为最佳的a。最常见的SPG采用的是高斯分布,即输出m维的均值与方差,从中产生m维向量a。
基于Policy的方法面对a离散与a连续时候的区别就像用神经网络做分类与做回归的区别。二者的结构是差不多的(输入s,输出向量),但是意义是完全不同的(一个是预测的各个类的概率,一个是直接给出预测值)。我们将前者记为Q(s,a),将后者记为P(s)。 分类及其结构示意图如下:
下面来分别介绍两种问题的训练方法:
在a是离散的时候,我们可以采取几种方法:第一是Deep Q-Learning(DQN),即训练一个Q(s,a),然后在s处根据让Q最大的原则选出a;第二是Policy Gradient(PG),即训练一个P(s,a),然后根据P(s,a)输出来选择a;第三是Actor Critic(AC),即同时训练一个P(s,a)与一个Q(s,a),Q(s,a)辅佐P(s,a)进行巡练,然后根据P(s,a)来选择s处采取的a。这种方法和第二种比较类似,本质上是基于Policy的方法。不过它的好处是训练Q(s,a)能辅佐P(s,a)训练得更快、更好。
在a是连续的时候,我们可以采取几种办法:第一是SPG,即训练一个P(s),用它来输出随机策略;第二是DDPG,即同时训练一个P(s)与一个Q(s,a),然后用P(s)输出确定的a;第三种也是SPG,即同时训练一个P(s)与一个Q(s,a),然后用P(s)输出随机的a。其中Q网络可以帮助P网络训练得更快。要特别注意的是,如果想只训练Policy网络而不训练Q网络,就必须用SPG;如果想训练DPG,则必须同时训练Q网络与Policy网络,让Q网络来辅佐Policy网络训练。在a离散的时候,Q网络可以辅佐P,为的是让P训练得更好。但是其实没有Q,P也可以训练。在SPG中其实也是如此。但是在DPG中,如果没有Q网络的辅佐,P是压根没有办法训练的。所以与AC或者SPG相比,DDPG中的P网络必须对Q网络表达出更加充分的尊敬。
有关具体如何训练,以及为什么一定要这样训练,我们在后面会慢慢讲到。
on-policy与off-policy
训练网络又分为两种方式,on-policy与off-policy。用通俗的意思解释,on-policy就是“边玩边学”,一边产生 si,ai,ri一边从中学习,在基本的基于Q的学习方法中,Q-learning就是一种off-policy的算法。而off-policy就是“玩完了再学”,或是“看着别人玩来学”、“通过别人的经验来学习”。意思大概是当你已经拥有了很多个回合 s1,a1,r1,s2,a2,r2,s3,a3,r3,s4,a4,r4,…,done的数据,然后你再开始学。我们可以想象,on-policy是“摸着石头过河”,自己去闯荡,完全靠着自己的磕磕碰碰来学习;而off-policy则像是生活在社会中一样,可以通过身边人的经验、知识来学习,有身经百战的长者可以给我们传递人生的经验。
上面的解释比较直观,但却又让人不能明确二者在数学意义上的区别。其实从数学上看,二者真正的本质有如下几点:
第一点在于,训练集是不是前后高度关联的。如果你是一边玩一边学,则你每一条用来训练的(s,a,r,s)应该是前后相连的。而在off-policy时,你可以把储存的数据进行一定程度的打乱,使得每一个batch的(s,a,r,s)的逻辑关联性较弱。据说训练集关联性较弱有助于训练;
第二点在于,训练集的P(s|a)分布是否和当前的policy是高度一致的。在on-policy中,你一边用agent产生训练集,一边用训练集来训练,则你得到的训练集的P(s|a)与当前agent的policy是高度一致的。这种一致可能会导致不断地增强agent对于现有policy的自信,而让它无法去学习到其它可能的policy的优越之处;而在off-policy中,由于数据都是过去产生的,是过去时候policy导致的P(s|a)的分布,与当前的policy不太一样,所以其分布是与当前的P(s|a)不同的。在off-policy中,你还可以使用其它agent留下的数据进行训练,则那些数据与你的agent的policy差异就会更大。
这里要说的是,为了达到第二点,其实给训练集引入较大的噪声也可以做到。比如DQN中的explore-exploit权衡,一开始将explore rate调大一些,然后逐渐下降,也可以达到使得训练集的P(s|a)分布与policy有较大不同的目的。在基于policy的网络中,训练时我们也会人为加入一些噪音,使得agent的决策与当前的policy不同,以获得异于policy分布的训练集;从某种意义来说,基于Q的网络中调大explore rate,基于policy的网络中为决策引入噪音,这都可以算是增强了训练过程的off-policy的倾向。
第三点在于,off-policy更加占用内存,因为需要更多空间存储之前的数据。不过与前面两点相比,这一点并不重要。毕竟所有深度学习的模型都需要你准备足够的内存。
如果纯粹使用on-policy,即训练集的P(s|a)分布与policy一样,并且又是前后高度关联的,则很容易就会陷入局部最优——即当你学会了一定的套路后,就不断沿着这个套路走,无法发现更好的策略了。为此,不能使用纯粹的on-policy办法。针对这种on-policy弊端,有不少解决方法,例如DQN利用experience replay,利用explore rate,而policy网络给训练时选action的过程加入了噪声。还有Asynchronous Advantage Actor-Critic(A3C),使用多个local net同时运行产生数据,则每时每刻产生的数据都与global net对应的policy有不同,并且数据关联性也不强(因为各个local net都是在独立地运行),可以说是用on-policy的形式达到了off-policy的优点。
上面,我们已经大致将RL中涉及到的基本概念给介绍了一遍,在下面的两期中,我们就分具体的情况来介绍具体的模型,看看我们如何训练出agent来解决我们的问题。
2018全国百所院校大数据公益巡讲活动
为普及大数据知识、宣传大数据文化,同时进一步推动数据科学的发展和大数据教学资源共享平台建设,北京大数据研究院博雅大数据学院特发起“2018全国百所院校大数据公益巡讲活动”。欢迎全国院校积极申报!
领取专属 10元无门槛券
私享最新 技术干货