集智专栏
资源加载中,请稍后...
集智专栏

浅说深度学习(4):增强学习

Simplex

这是本系列第四篇,这一篇中让我们一起深入学习一种让agent在环境中通过动作来最大化奖励的的机器学习方法————增强学习。

增强学习

还记得你是如何学会骑自行车的吗?一般都是大人陪在我们身边鼓励我们第一次迈出步伐,当我们摔倒时帮助我们继续骑。但是这很难解释我们到底是怎么骑的,而且就算再好的解释也没法让没骑过车的人理解这件事。我们只会有一种感觉,一开始试着骑车但总是不断地摔倒,直到突然成功地骑出去个十米开外,这时我们才感觉到学会了骑车。

学习骑车的过程和增强学习很类似学习骑车的过程和增强学习很类似

在这个过程中,有一些反馈信号告诉我们做得怎么样,比如摔倒的疼痛会告诉我们下次别这么做了不然会很疼,骑上车时的爽快感告诉我们接着骑,不要停。

如果把这件事看成一个增强学习问题,我们作为agent就是要最大化从决定中获得的奖励。因此如果一个agent获得了一个最大的奖励,就可以被认为在给定状态时执行了最好的行为。agent在这里的定义是一种抽象的实体并且可以完成一些动作,比如:无人车,机器人,人类,客服聊天机器人,围棋选手。agent的状态指的是在抽象的环境中的位置和状态。比如在一个虚拟的建筑中或者棋盘上的位置,或者是赛道上的位置和速度。

为了简化问题和增强学习问题的解,环境通常被简化到agent只需要知道那些对于作决定重要的细节,其他的都可以被舍弃。比如骑自行车的例子里,增强学习算法只需要两个反馈:疼痛(摔倒了),爽快感(顺利地骑车)。如果我们把疼痛看成是负面信号,整个学习问题关心的就是探索这个环境同时在经历各种状态时最大化奖励直到到达一个好的状态(比如自动驾驶从A到B,赢一场象棋比赛,解决一个客户的问题)。

价值函数

增强学习研究的关于积极和消极奖励同时学会如何选择动作来获得最多的累积奖励。为了找到这些动作,首先得想想在当前环境中最有价值的动作。比如在赛车比赛中,终点线所在的状态肯定是价值最高的,而其他在赛道上的状态肯定比不在赛道上的状态价值要高。

一旦我们决定了哪些状态是有价值的,我们就可以将奖励附加于它们。例如当赛车不在赛道里了,奖励就是负的。当赛车完成了一圈就可以得到一个正的奖励,如果当前完成一圈的时间比之前都好,也算作正的奖励。通过这种方式,我们可以想象出可以构建出一个离散的函数来表示出状态和奖励之间的关系。比方说,把赛场转变成一个方格世界,每一个格子都代表一个一平方米的区域。每一个小格子都可以用一个数字来代表奖励。比如最后的目标位置奖励是10,轨道之外的位置是-2,其他所有位置奖励都是0。如果我们把这个函数在三维的世界中画出来,可以想象最好的行为肯定是在最高的地方。

对于有些作为间接的状态,它们虽然没有直接的奖励,但是对于到达一个奖励来说是非常有必要的铺垫。比如得过第一个弯才能完成一圈,完成了一圈才能更新完成时间。

训练后的的价值函数将部分奖励赋给了间接的状态。价值函数能够帮助agent作出好的决定,使agent在现有状态能够更容易地选择下面要去哪个状态。

价值函数随着迭代不断变化直到某个稳定状态价值函数随着迭代不断变化直到某个稳定状态

从这个这个框架可以看出,某个状态的价值是有其他所有可达到它的状态价值决定的。图1显示了一个方格世界,S代表起始点,G代表目标点,T是陷阱,黑色区域无法到达。目标是从状态S移动到状态G。把这个想象成我们的赛道,每次我们都在创造一个从起始点到终点的“斜坡”,因此我们只需要沿着最陡的方向到达目标。价值函数最主要的目的就是提供一个对每个状态的价值估计,这样我们就能够一步一步地作决定获得奖励。

同一个拐弯处的不同轨迹对应不同的速度,距离和轮胎磨损同一个拐弯处的不同轨迹对应不同的速度,距离和轮胎磨损

价值函数也能够抓住一个问题的微妙之处。比如,在赛道上从边上走会有更少的负面奖励,因为可以避开陷阱,但是路途比较长。但同时从中间走对于达到一个更好的过圈时间也不一定有效率(车过弯的时候速度不能太快)。因此安全和速度之间相互制约,价值函数需要找到既快又稳的道路。最终的解也可以被奖励函数改变。如果更快的过圈速度带来高的奖励,价值函数就会将更高的值赋给那些虽然风险很大但是更快的状态。

折扣因子

虽然价值函数能够处理奖励,但这还不够,还需要一个叫做折扣因子的参数通过限制奖励会对agent的长期影响来定义某个行为的具体价值。每当一个状态改变,我们就可以在局部奖励上乘上一个折扣因子。所以折扣因子为0.5的话,原有的奖励在三个状态改变后就会变成八分之一,这会使agent更家关注于相接近的奖励而不是很远的奖励。因此,折扣因子是一个权重决定着价值函数偏向于谨慎或者贪婪的行为。

举个例子,一辆赛车会在开得很快的时候获得高奖励,把折扣因子设为接近0,贪婪的决定就会让开得越来越快。但是谨慎的agent会了解到如果有很急的弯,一直开得太快就是一个坏的决定,相反在过弯处减速有可能会有一个更好的过圈时间。为了能够获得这种远见,agent需要获得之后能够跑得更快的奖励,因此把折扣因子设为接近1可能更好。

价值函数的折扣因子保证了保证了奖励会随着距离或者步长按比例地减少。因子通常也通常设置为更关注长期的奖励,但也不至于太高(比如每个奖励转换衰减5%)

这个算法学习每个状态具体的局部奖励的方法是一开始将所有状态的奖励函数都设为0,然后搜索所有状态和其下面可能的状态然后评估在下面状态会获得的奖励。如果在下一个状态获得了一个局部奖励,就增加当前状态的奖励。这个过程不断重复知道每个状态的局部奖励都不再改变,这时意味着已经考虑到了所有可能的情况了。图1展示了这个价值迭代算法的过程。

这个算法一开始可能不够有效率,但是通过一些小技巧加上动态规划(dynamic programming)会更加有效。动态规划通过解决子问题来解决更高顺序的问题。比如计算完从状态B到C的奖励后可以用来接着计算状态链A->B->C,D->B->C的奖励。

总结下就是,价值函数和价值迭代提供了一个局部奖励的地图来知道agent到达奖励状态。

策略函数

策略函数代表一种策略,给定价值函数,选择满足长期奖励最高的动作。通常不存在一个明确的选择在所有可能的下一步行为中。比如,agent可以选择进入状态A、B、C、D,分别对应于奖励10、10、5、5。所以A和B是好的直接选择,但从长期来看A可能比B更好,C可能比所有其他选择都好。在训练过程中是值得探索这些选择的,但是同时直接的奖励值也会指导选择。在这其中找到一个平衡就成了一个问题。

一个聪明的方法是根据状态的奖励设定概率比例。在这个例子中,选择A的概率是33%(10/(10+10+5+5)),选择B,C,D的概率分别是33%,16%,16%。随机选择对于学会一个好的策略是很重要的。存在一些有效的策略也许是反常识的但对成功是必要的。

比如训练一辆赛车在赛道上跑得尽可能快,它也许会试图在拐角以高速过弯。但是这个策略在有别的赛车存在的时候就不会是最优的了。这时agent就需要考虑到对手的存在,于是在过弯时会放慢速度不至于产生碰撞。另一种可能场景是高速过弯会更快地磨损轮胎使得赛车得停在维修站,浪费宝贵的时间。

可以发现策略和价值函数彼此相关,给定一个确定的价值函数,不同的策略会导致不同的选择,而给定一个特定的策略,agent会将行为判断为不一样的价值。如果给定一个棋类游戏的策略是赢下比赛,价值函数会将更高的值赋给那些有更高概率获胜的动作(比如牺牲一些棋子为了能够赢的更安全)。但是给定一个策略是一个子都不死地赢或者输,那么策略函数会只学习那些在特定游戏中最大化分数的行为(不会牺牲棋子)。

这只是其中两个简单的例子。我们可以用策略和价值函数来指导agent学习策略来得到具体的输出,这使得增强学习拥有多样性的同时也很强大。

训练策略函数的步骤如下:

  1. 随机初始化,比如让每个状态按价值的比例随机,同时用这些奖励初始化价值函数。
  2. 训练价值函数直到收敛。
  3. 增大会最大化增加奖励的行为的概率。
  4. 从1重复直到策略不再改变

Q 函数

我们已经看到了策略和价值函数是高度相关的,我们的策略很大程度上是由我们重视什么来决定的,我们重视的也决定了我们的行为。因此也许我们可以结合价值和策略函数?没错,这个结合就有了一个叫做Q函数的东西。

Q函数接收现有状态(价值函数)和下个动作(策略函数),返回状态-动作对的局部奖励。对于更复杂的例子,Q函数也许会接收更多的状态来预测下个状态。比如至少需要两个状态的移动方向来预测下个状态,因为不太可能从一张静态图推测出准确方向。我们也可以输入状态到Q函数中来得到每个可能行为的局部奖励值。根据这个我们可以随机选择下一步的行为(探索),也可以直接选择局部奖励值最大的行为(利用)。

不过还有一点需要考虑,比如一辆自动驾驶汽车:有很多状态是不可能创建出一个价值函数来计算它们的,这会消耗很长的时间来计算对于在地球上所有位置和速度的局部奖励值。取而代之的是,Q函数只需要查看所有可能的下一步状态,找出其中最好的可能动作。这样以来对于每一个下个状态,Q函数都可以提前看一步(不是所有状态都可以这样,比如结束状态)。这个提前量可以表示为状态-动作对。举例来说,状态A也许有4个可能动作,所以我们有动作对A->A,A->B,A->C,A->D。这四个动作对每个状态和一个10×10的状态格子都可以表示为四个10×10的矩阵,或者10×10×4的张量。图3对于一个Q函数代表了一个方格世界(可以移动到临近的状态)的解,目标在右下角。

一个包含封闭区域的网格世界中对于不同动作的Q函数一个包含封闭区域的网格世界中对于不同动作的Q函数

在一些例子中我们需要面对的是无穷的状态序列,比如自动驾驶汽车的状态通常表示为一个连续的方程,用神经网络,输入所有状态变量,比如速度和车的位置,为每个动作输出一个Q值。

许多状态之间也是极度相关的,因此同样的动作在两个不同但是相似的状态可能都会成功。比如,赛道上每一个弯都是不一样的,但是从每一个左拐中学到的东西——何时拐弯,速度如何调整之类的都会对下一次左拐产生价值。所以经过一段时间后,一个驾驶汽车的agent会在左拐上越来越好,甚至对于它未曾见过的赛道。

Q-Learning

为了训练Q函数,我们所有状态-动作对为零并且初始话状态的价值为它们给定的奖励。因为agent这时候还不知道怎么获得这些奖励。之后就让agent自己去经历各种状态直到找到一个奖励。我们经常在一个特定训练长度(比如100个动作)后或者达到某个特定状态后结束训练Q函数。这保证了我们不会卡在某个状态中,因为有些状态训练循环在多次可能也没办法得到有价值的奖励。

在网格世界中Q-Learning的过程在网格世界中Q-Learning的过程

训练Q函数是从尾(奖励)到头(初始状态)的。图4描述了图1利用Q函数训练的网格世界。假设目的是以最小的步数到达目标状态G。一开始agent可能只是作随机的移动直到它意外地碰到了陷阱或者目标状态。因为陷阱更靠近开始状态,agent更可能一开始碰到陷阱,但是一旦agent接触到了目标状态,agent在Q函数的激励下会更加愿意到达奖励区域,于是从开始状态到目标状态的局部奖励链能够更快的完成。

深度Q-Learning

自动驾驶也许要考虑许多状态:每个不同的速度和位置组合都是一个不同的状态。但是大部分状态都是类似的。是否有可能结合类似的状态这样它们就能够有类似的Q值?这时我们就需要引入深度学习。

我们可以把现在司机所能看到的景象,一幅图片,输入进卷积神经网络(CNN),训练这个网络来预测接下来可能动作的奖励。因为类似状态的图片也是类似的,它们就会有相似的动作反馈。比如一个神经网络可以从一个赛道的的许多左拐动作中进行归纳,对于没接触过的左拐也能作出合适的动作。就像CNN能够在图片中识别出许多不同的物体,一个神经网络也能够对于每个不同的左转进行速度和位置的调整。

为了能够成功使用深度Q-Learning,之前所说的训练Q函数的简单规则是不够的。如果直接盲目使用Q-learning的规则,神经网络也许能学会不错的左拐,但是会同时忘记如何完成好的右转。这是因为神经网络所有的动作都共享同样的权重,调整对于左拐适用的权重会使其他情况的表现变糟。解决的办法是储存所有的输入图像和输出图像作为“经验”,包括了状态,动作和奖励。

在跑完训练算法之后,我们从经验中随机选择一个同时创建一个神经网络权重的平均更新来最大化在这个经验中采取所有动作的Q值(奖励)。这样我们就可以同时教会我们的神经网络如何左拐和右拐。因为很多早期的驾驶经验是没什么用的,因为那时候agent还没啥经验。我们只需要保持关注最近的几个经验,忘记其余的。这个过程叫做经验重播(termed experience replay)。

经验重播是一个被生物学启发的方法。在大脑中,海马体作为一个增强学习中枢。它储存了所有我们一天内产生的经验,但是它的内存容量是有限的。到了晚上海马体中寄存的记忆就会通过神经活动传递至大脑皮层。大脑皮层相当于电脑的硬盘,几乎所有的记忆都存储在这儿。像手的运动,听到的东西都存储在各自的区域。这种神经活动被称之为睡眠梭状波,虽然现在还没有足够有力的证据证明这一点,许多研究睡眠的学者想想我们的梦帮助海马体将一天中的经验在大脑皮层中集成为更牢固的记忆。

所以可以看出来,存储记忆并且将它们输出不仅仅对于深度增强学习很重要,对于人类学习本身也很重要。生物学上的相关性给了我们一些对于大脑理论的信心,也帮助我们在通向真正的智能上更进了一步。

AlphaGo

AlphaGo是有Google DeepMind开发的,在2016年的打败了人类顶级围棋选手,搞了个大新闻。AlphaGo结合了许多本文中涉及到的元素。根据价值和策略神经网络,AlphaGo可以预测出每一步对于其他步的相对价值,策略函数可以评估出怎么走可以赢得比赛。这些神经网络都是卷积神经网络,将围棋棋盘视为一个19×19的输入图像。

因为我们已经有了许多录好的围棋比赛,用现有的职业选手的比赛数据可以有效地训练策略网络。对于特定的比赛过程,策略网络在这些数据上训练可以预测出获胜者下一步的动作。

当监督训练阶段完成时,就轮到了增强学习。这里AlphaGo与它自己对弈同时不断试图优化自身的策略来选择落子同时评估获胜者。甚至仅仅只训练策略网络也比之前著名的围棋算法,Pachi(利用树搜索和启发式算法)要厉害很多。但AlphaGo还能在价值网络的帮助下不断提升性能。

价值网络试图对整个比赛进行总结,因为棋盘之间是高度相关的,因此网络训练来识别一局比赛而不是识别好的落子。为了解决这个问题,DeepMind通过让AlphaGo自己跟自己下生成了许多数据,然后从每局比赛中选择几个位置来训练价值网络。这与经验重播很类似,不关注独立的动作序列,而是不同的状态和动作的组合。

价值网络展现出和蒙特卡洛搜索树类似的表现,但是AlphaGo将蒙特卡洛搜索用在了深度学习方法的顶层来获得更好的性能。

在蒙特卡洛搜索树中,动作是一条路,节点是不同的比赛状态。例如,在处于某种比赛状态中,会有200个可能的动作 - 也就是说,连接到当前节点的节点有200个,然后选择某个动作(通向节点),生成一个新的树有199个不同的节点。然而,这棵树是按指数级增长的而不能完全扩展,需要花费很长时间才能完全评估,因此在蒙特卡洛树搜索中,我们只沿着树的一条路线到一定的深度,以使评估更有效率。

在rollout政策中,我们观察当前的状态,应用策略网络选择一个动作移动到树中的下一个节点,并重复两个玩家的动作,直到游戏结束,找到获胜者。这提供了另一种快速和贪心的方法来估计动作的价值。这种观察可以用于提高价值网络的准确性。通过更准确的价值函数,我们还可以进一步改进我们的政策函数:更准确地知道动作是好还是坏,让我们根据以前认为是不好的良好举措制定策略。或者换句话说,AlphaGo能够考虑对人类来说无法想象的策略,但实际上它们赢得了游戏。

AlphaGo还使用蒙特卡罗搜索树进行训练训。树包含Q值,访问次数(N)和先前概率(P)三个边,每次都随迭代更新。最初,Q值,访问次数和先验概率为零。在迭代中,根据三个参数(Q,N,P)选择一个动作。例如,为了决定是否是一个很好的举动,在位置E5上落子,这一动作的改变棋盘后的新状态是通过策略网络的组合来评估的,该策略网络设定了该动作的初始先验概率,(2a) 为动作赋值的价值网络,以及(2b)蒙特卡洛rollout,为动作分配另一个值。步骤(2a)和(2b)通过参数加权,并且Q值和访问次数(N)用该路径上的平均评估更新(如果平均动作相对较好则增加Q值,否则减小) 。随着每次迭代,同一举动的值被访问次数略微减少,因此将以更高的概率探索新的移动。这确保了探索和利用的平衡。对于已经完成的动作我们也获得了越来越准确的估计。树将随着时间的推移分配更高的Q值。通过这个训练步骤,AlphaGo学会在每次训练迭代中完成更好的动作,从而了解哪些动作将赢得比赛。从这里,剩下的只是计算能力和时间,直到我们创造一个比职业棋手更好的围棋大师。

结论

在这篇文章中,可以看到,增强学习是训练agent实现复杂行为的一般框架。我们研究增强学习的组成,包括价值和策略函数,并在强化学习的基础上,介绍了深度增强学习。深层次的强化学习具有实现非常广泛的学习过程的希望,它可以以很少的反馈来学习有用的行为。这是一个令人兴奋但又具有挑战性的领域,肯定会成为未来人工智能的重要组成部分。你也可以在OpenAI gym训练你自己的增强学习agent。

您也许喜欢这些文章

集智专栏

一小时建立终身受害的AI创作系统

发表至趣味项目
使用TensorFlow框架,搭建一个简单的LSTM(长短记忆神经元)示例。LSTM是目前自然语言处理领域的核心算法,因为它可以很好地处理序列数据中的前后顺序依赖问题。文末提供了在线开发环境,读者可以自由地尝试修改参数。
集智专栏

老大哥在看着你!我国部署超2000万个AI监控系统

发表至业界新闻
中国安装了2000万目前最先进的智能监控设备,这一应用了人工智能技术的体系,是中国的“天网”系统的一部分,此“天网”是中国为追踪在逃犯罪分子所建立的电子监控网络。日前的NVIDIA GTC上,集智成员也在现场看到了类似设备。
集智专栏

[2018.05.08直播] Python之面向对象

发表至系列教程
2018年5月8日直播配套专栏,介绍Python的面向对象特性,并参照TensorFlow的计算图机制,尝试手动“山寨”一套深度学习框架。

文章评论(2)

瑞纹德尔 发表于 7月前回复
赞!!!!
浮生未半 发表于 1年前回复
虽然是浅谈,相对来说还是很专业的问题。