2016年年初备受瞩目的围棋 “人机大战”,以人类围棋冠军被血虐落下帷幕。这只谷歌DeepMind团队开发的围棋机器人阿法狗不仅赚足了眼球,更是掀起了一波关于人工智能的讨论狂潮。现在好像作报告还是写文章都要把阿法狗提一下才能紧跟时代潮流啊(好像也自黑了一下)。其实人家DeepMind不光是下围棋的,在他们的主页上写着大大的 “Solve Intelligence”。要“Solve Intelligence”光会下围棋可不行,还得能像人一样能干各种各样的事情。究竟有些什么样的技术能够作为支撑,使得他们敢说出这样的话呢?见识了阿法狗之后,可能很多人记住了深度学习,还有人记住了蒙特卡洛树。其实还有个叫深度强化学习的东西也是DeepMind一直在重点研究的领域。他们在这个方向上做了很多工作。这篇文章,我们抛开阿法狗,来简单看看DeepMind提出的被他们称之为深度强化学习的东西大概是怎么一回事。
大家一看到深度强化学习,大概会认为现如今深度学习这么火,什么东西都喜欢拿深度学习去套,也是个跟风的产物吧。当然我们可以这么认为。但是在这个套的过程中DeepMind套得恰到好处,大大扩大了强化学习的应用范围。
深度学习大家可能都比较了解,简单说来就是在多层神经网络的结构下,辅以结构设计和各种梯度技术,能够对比如图像分类之类的问题有很好的效果。它的优点在于不仅能够提供端到端的解决方案,而且能够提取出远比人工特征有效得特征向量。
而强化学习,大家可能就比较陌生了。但是要是说起波士顿动力,大家可能就又知道了,前段时间被刷屏的机器人,凭借出色的平衡性给大家留下了深刻的印象。像机器人控制这类领域就大量的使用了强化学习技术。除此之外,游戏领域,比如棋类游戏,甚至用户个性化比如推荐等领域都有应用。
什么是强化学习?
强化学习其实也是机器学习的一个分支,但是它与我们常见的机器学习(比如监督学习supervised learning)不太一样。它讲究在一系列的情景之下,通过多步恰当的决策来达到一个目标,是一种序列多步决策的问题。举一个周志华老师在《机器学习》【8】中种西瓜的例子来帮助大家理解。种瓜有很多步骤,要经过选种,定期浇水,施肥,除草,杀虫这么多操作之后最终才能收获西瓜。但是,我们往往要到最后收获西瓜之后,才知道种的瓜好不好,也就是说,我们在种瓜过程中执行的某个操作时,并不能立即获得这个操作能不能获得好瓜,仅能得到一个当前的反馈,比如瓜苗看起来更健壮了。因此我们就需要多次种瓜,不断摸索,才能总结一个好的种瓜策略。以后就用这个策略去种瓜。摸索这个策略的过程,实际上就是强化学习。可以看到强化学习有别于传统的机器学习,我们是不能立即得到标记的,而只能得到一个反馈,也可以说强化学习是一种标记延迟的监督学习。
通过这个种瓜的过程能够看出来,强化学习实际上和我们人类与环境的交互方式类似。是一套非常通用的框架,可以用来解决各种各样的人工智能的问题。
总结起来,强化学习的目标就是要寻找一个能使得我们获得最大累积奖赏的策略。为啥是累积奖赏?你之前不是说种个好瓜就可以了嘛。但是种瓜得浇水施肥啊,比如你在一个资源稀缺的地方,你当然就会希望我少用资源,又能种出好瓜。因此这样的定义适用性更广。
通常呢,累积奖赏表示为
Jt=rt+1+γrt+2+γ2rt+3+⋯ Jt=rt+1+γrt+2+γ2rt+3+⋯
其中 γ(0<=γ<=1) γ(0<=γ<=1)为折扣系数, t t表示第几步。引入折扣系数这个东西,一方面是处于数学证明方便(预知详情可以去读强化学习的教科书),另一方面也是为了拓宽适用性。比如大家做买卖都喜欢现钱,因为夜长梦多,比如钱之后贬值了,那不就相当于少赚了嘛。
策略一般是用 π(s)=a π(s)=a来表示,也就是在状态 s s下,根据 π π策略,我们采取 a a动作。有了策略的定义,我们还得知道一个策略到底好不好?最直接的就是用一个值函数来评估,值越高越好呗。比如可以定义一个值函数 Qπ(s,a) Qπ(s,a),它表示在策略 π π下,从状态 s s出发,执行动作 a a所带来的累积奖赏。
怎么求解强化学习?
这两个基本的概念实际上给我们指了两条可以求解强化学习的明路。一种就是直接去寻找一个好的策略(这不是废话嘛)。另外一种就是能求解一个最优的值函数,这个最优的值函数能够告诉我们在这个状态下,选取哪个动作能得到的期望值最高,不管在什么状态,我们总是能从值函数表那里查表获得应该选取哪个动作。这个表实际上也就可以作为策略了。
我们首先来看看怎么直接寻找策略。前面也提到了策略实际上就是一个从状态到动作的一个映射,那么就可以用个参数 θ θ的模型去近似它(表示为 a=πθ(s) a=πθ(s))。既然目标就是要让累积的奖赏最大,我们只要以这个目标求梯度 ∇θJ ∇θJ,按照梯度不断更新 θ θ值,就可以最终得到期望的策略。
然后再来看看基于值函数的方法。几乎所有的强化学习的模型都是定义在Markov决策过程上的。这个是什么呢?其实就是包含了上面我们说的那些状态,动作,奖赏,以及影响状态转移的概率,在这个模型下,未来的状态只与当前状态有关,与以前的没有关系(即Markov性质)。一个Markov决策过程可以表示为
基于这个假设,很容易得到值函数是满足一个递归式子的。
最优的Bellman Equation指导我们通过不断迭代就能够得到最优的值函数。如图所示,一个实心点就是值函数Q,白圈表示状态。上述的Bellman Equation实际上可以按照Markov决策过程展开成一个树状的结构,我们不断向前看,探索后面的情况,然后将这些得到的奖赏综合起来。然后就能得到一步一步往状态动作值函数里填。熟悉动态规划的同学,对于这种迭代求解的方法应该不会陌生。
如果我们对于这个环境了如指掌,那些状态之间的转移概率我们都清清楚楚,那么所有的转移都可以被展开,如图所示。利用动态规划就可以求得值函数的精确解。 |
但是大自然是伟大的,我们不是上帝,基本上不可能吃透它。转移概率这些东西是无从得知了,因此我们做不到像上面那样对所有的状态和动作进行展开。那怎么来算值函数呢?还是像种瓜一样,一次可能种不好,但是可以多种几次,来总结经验。求取平均的累积奖赏来作为期望累积奖赏的近似就可以估算值函数。
但是注意到这里为了获得轨迹,瓜得全部种好啊。现在21世纪,时间就是金钱啊,哪有这个闲工夫种那么多瓜。话说不是有Markov假设嘛,能不能我种一点总结一点?答案是肯定的。
估计出值函数之后,要得到最优策略,还需要改进策略去达到这个估计出来的最优值函数。说来也简单,我们就在每个状态,枚举一下动作集合,然后选一个能达到最大值函数的动作就可以了
这里简单的放一个算法来描述这个过程,这就是强化学习中非常常用的Q-Learning。通过前面的铺垫,这个算法大家应该不难看懂。
可以看到,到目前为止,我们这个值函数似乎就是一张表啊,状态和动作好像都是离散的。如果状态是连续的怎么办?如果动作也是连续的怎么办?这种情况很常见啊,因为本来世界就是连续的。最简单的可以做离散化。但是连续空间离散出来怕是空间有点大,你这个表更新起来也麻烦,而且泛化性能可能也有问题。
一探深度强化学习
对于连续状态问题,科学家们就说了,可以用函数来近似这个连续空间,比如对于Q函数,可以将其表示为
其中 F(θ) F(θ)表示参数为 θ θ的函数,只要能够求解这个 θ θ就能近似值函数,进而得到策略。我们将上面Q-Learning里的Q函数用这个式子代换即可。这里函数可以是线性的也可以是非线性的,通常线性的函数由于更容易分析理论结果,经常被用在强化学习里面。即 Q(s,a)=θT(s;a) Q(s,a)=θT(s;a)。
当然也可以用一个神经网络去代替值函数(假设网络权值向量 ω ω,那么值函数可以表示为 Q(s,a,ω) Q(s,a,ω)),特别现在深度学习那么强,能够刻画很多高维的(图像)状态,如果换成深度网络能够带来很多好处(这里总算有点深度强化学习的意思了)。如何来确定网络的权值来逼近值函数呢?
可以将更新Q值的目标函数设置为Q-learning中更新的差值的均方差
然后就可以进行使用梯度下降来求解了
参照Q-Learning,它实际上每一步就用了一个样例来更新Q值,在这里计算梯度的时候,可以只用一个样例也可以使用mini-batch的方式来进行更新。
在Q-learning中使用神经网络的做法其实之前就有人想到了,但是效果并不好,因为一方面那时候深度学习的技术还没有现在这么成熟,变成个神经网络也会比其他模型更好。而另一方面也是最关键的问题来源于强化学习的特殊性。这个特殊性体现在两个方面,一个是它的数据是序列产生的,这样子数据之间并不满足机器学习中通常假设的独立同分布的性质,这样我们进行随机梯度下降,其实并不随机。套一个机器学习算法当然效果不好。另一个是,机器人采取什么动作实际上会影响环境的,好比走路,左转是阳关道,右转是独木桥,场景大不相同。这意味着后面产生数据的分布也在变化,训练出来的策略可能非常不稳定,产生震荡的情况。
但是DeepMind提出了简单而有效的技巧解决这两个问题。对于第一个问题,他们用了一个叫Replay Memory的东西记为D,就是字面含义,把产生的数据都往里面扔,然后要计算梯度的时候,就像看回放一样,从D里面随机采样。这样就使得数据之间关联性得到了打破。
对于第二个问题,他们说,先随机设定一个网络权值,并且固定住,即一直为 ω− ω−,慢慢优化,稳定了,再更新,再优化。这样监督信息实际上在很长的时间内是不变的,达到了一种监督学习的感觉。
他们将这一套东西拿来玩Atari游戏机【1】,这是个风靡80年代的游戏机。画面就和马里奥差不多,像素一格一格的,很多经典游戏比如打砖块都是出自这个游戏机。游戏机本身很简单,就是一个摇杆,有18种操作。他们直接让游戏画面作为状态描述,摇杆作为动作集,游戏中的得分作为奖赏,搞了个深度神经网络来学习值函数。
我来给大家画一张图,大家一看就明白了,实际上就是游戏画面通过一个深度网络变成状态,然后按照Q-learning的流程会产生 (st,at,rt,st+1) (st,at,rt,st+1)这样的数据,我们将这些数据扔进Replay Memory中。训练网络时,以Q-learning的中的差作为目标函数,从Replay Memory中进行采样,进行mini-batch的梯度求解。 |
最后效果还不错,在40个游戏中,比传统的强化学习方法都好,有29个达到了人类75%的得分。 我们来看看他们提出的这两个技术到底起了多大的作用。从他们提供的统计表中我们可以看到replay贡献挺高,两个结合起来确实有奇效
到这里好像一副就可以结尾了的样子。然而并没有。
剩下的部分请去原文看吧。