机器学习系列"/>
李宏毅机器学习系列
李宏毅机器学习系列-深度强化学习介绍
- 深度强化学习
- 强化学习
- 与监督学习的区别
- 训练语音对话机器人
- 更多的应用
- 玩游戏的例子
- 强化学习的难点:
- 强化学习比较新的方法
- 强化学习基于策略的方法
- 总结
深度强化学习
深度强化学习可以理解为深度学习和强化学习的结合体,有个大神说AI=RL+DL,就是这个意思,Deep Mind用这个技术玩游戏,下围棋,一时间引领了AI的潮流。
强化学习
先说说强化学习,简单来说就是你有一个智能体,他会观察环境,然后做出相应的行为,然后环境反馈给他一个奖励,环境随之也会发生变化,然后智能体继续观察环境做出行为,继续这个循环,如果环境反馈的奖励是好的,那智能体就知道刚才的行为是对的,以后要多这样做,如果反馈的奖励是不好的,那就说明刚才的行为不好,以后要少做,举个例子,如果机器看到桌子上有水杯,然后采取了打翻水杯的行为,然后地球爷爷说你这样做不好,浪费水源,于是机器就知道了,刚才的行为是不好的,以后不能做了,于是他下次看到水杯就不会这样了。:
如果他发现地上有水,他采取了拖地的动作,把水拖干净了,然后地球爷爷说他真好,谢谢,于是下次他再看到地上有水,就会去拖地,因此他可能就学会看到地上有水就去拖地了。总结来说就是我们的智能体会希望去得到最大的奖励:
再举个下围棋的例子,机器看到的是棋谱,然后做出下一步棋:
然后人类选手继续走:
大多数情况下其实没有奖励,落子下去什么都没发生,只有当棋下完了,赢或者输才有奖励,这个奖励是很稀疏的,那到底每一步要怎么下棋才算好呢,是个值得讨论的问题,或许我们应该把一局当整体来看:
与监督学习的区别
监督学习来下围棋就是你看到什么情况,下什么棋,但是情况太多了,我们并不能知道所有情况该怎么下棋比较好,这样的下棋就好像有个老师在教你一样,看到什么做什么。
强化学习就不一样了,他下围棋只看整一局最后是输了还是赢了,来决定遇到什么样的情况应该做什么,是自己根据经验来学习的,当然在训练的时候不可能人去陪着下,会训练两个智能体相互下棋。AlphaGo其实是监督学习和强化学习的结合体:
训练语音对话机器人
举一个语音对话的机器人的例子,如果我们用监督学习,那就是让机器看到什么,就说什么,都是有标准答案的。如果是强化学习的话就是跟机器对话,然后根据机器的回答,来告诉他这个回答好不好,好的话就给他正奖励,不好的就负奖励,他为了让奖励越大,会学着用好的回答来进行对话:
当然用人工的方法去跟机器对话来训练他是不太现实的,那得训练多久啊,所以一般都是训练两个代理,让他们相互对话,但是这样可能会出现最后两个人就一直说同一句话的情况,因为双方给相互的奖励都比较大,所以就这么无限循环了:
所以传统的做法就是预先定义一些规则,什么样的是好的,什么样的是不好的对话:
更多的应用
比如交互式搜索的例子,可以用强化学习来训练,比如人说一个词让机器来搜索,如果机器不确定是什么,就会反问人,这样就可以给他低分,如果机器直接把结果给他,他觉得这个结果又多好,就给多高的分:
当然还有其他的应用,比如开直升机,自动驾驶,给谷歌机房节电,文子生成等等:
玩游戏的例子
强化学习最多的应用是在让机器玩游戏,我们知道现在围棋,星际,dota,德扑都已经被机器给玩爆了,我们来看看一般的强化学习是怎么做的,其实OpenAI已经开源了很多强化学习玩游戏的环境和框架,可以用来学习。其实机器玩游戏跟人是一样的,他也是看画面,也就是一堆像素点,然后来学习要用什么动作来获得最高分数:
我们来看这个太空入侵的例子,这个游戏技术的条件就是所有外星人被消灭,或者自己的飞船被外星人消灭,机器看到的跟我们看到的一样,都是这么一副图,左上角的是分数,中间的是外心人,下面的是掩体和自己的飞船:
强化学习的过程应该是这样的,首先机器看到 s 1 s_1 s1这个状态,然后他采取动作 a 1 a_1 a1右移,得到的奖励 r 1 r_1 r1是0,状态变为了 s 2 s_2 s2,然后他采取动作 a 2 a_2 a2射击,得到的奖励 r 2 r_2 r2是5,状态变为了 s 3 s_3 s3,通常游戏也包含很多随机元素,或许你消灭一个外星人得到的分数可能是4,也可能是3:
如此反复下去直到最后一次采取 a T a_T aT,获得的奖励是 r T r_T rT,游戏结束,这个整个过程我们叫做一个episode,也就是一个开始到结束的一个过程。我们希望最大化机器每次游戏的过程的累计奖励:
强化学习的难点:
第一,可能有奖励的延迟,因为我们每次只是射击之后才能会获得奖励,然后会认为射击这个动作是好的,然后可能一直采取射击了,但是其实射击之前的一系列移动对射击是有帮助的。我们希望机器能有一点未来的眼光,有些动作或许现在没奖励,但是对未来的奖励有所帮助。同样在下围棋也是一样,短期的牺牲可能会换来更多长期的奖励。
第二,如果没有进行射击动作而得到奖励,机器可能只会左右移动了,永远都不会去射击,这个就是个问题,我们希望机器能够去探索未知的世界,希望他有有好奇心,那样才可以学到更多的东西。
强化学习比较新的方法
强化学习一般分为基于策略的和基于价值的,具体本篇先介绍下基于策略的,当时比较好的方法是A3C,就是一个分布式结合策略和价值的改进版,听说很厉害:
一些相关文章:
强化学习基于策略的方法
我们说机器学习其实就是在找一个方法,有个输入,有个输出,强化学习也一样,我们要找到一个方法 π \pi π,你把环境当做输入,然后行动当做输出,至于要怎么样的输出才是好的,就看环境给予你的奖励:
我们知道深度学习的基本步骤,我们可以把要找的方法用神经网络来学出来,我们可以记这个方法叫Actor,暂时叫演员吧:
我们可以把所观察的到环境用向量表示,然后输入到一个神经网络,输出希望就是不同动作的概率,然后我们选择概率最大的那个来行动,比如太空入侵的例子,我们可以把看到的像素画面当做一个向量或者矩阵作为输入,经过神经网络训练后输出应该采取的行为的分布,选择可能性最大的那个,我们之用神经网络来训练出这个Actor也是因为神经网络的泛化能力强:
然后我们进行第二步,找出最好的那个方法:
那怎么来衡量一个Actor的好坏呢,我们用目标函数,就像我们在监督学习的时候一样,我们希望输出的分布和真实的分布越接近越好,希望损失越小越好:
我们先用参数 θ \theta θ初始化这个神经网络actor,然后用这个actor去玩游戏,在 s 1 s_1 s1的时候采取了 a 1 a_1 a1获得的奖励reward是 r 1 r_1 r1,环境变成了 s 2 s_2 s2,然后采取 a 2 a_2 a2获得的奖励reward是 r 2 r_2 r2,环境变成了 s 3 s_3 s3,以此类推,直到游戏结束,我们把功总得奖励记作 R θ R_\theta Rθ。因为游戏具有随机性,这个是设计游戏的时候做的,所以或许同样的actor也会得到不同的 R θ R_\theta Rθ,所以我们取 R θ R_\theta Rθ的期望,记作 R ‾ θ \overline R_\theta Rθ,我们可以用 R ‾ θ \overline R_\theta Rθ来衡量actor的好坏,这个很好理解,即游戏中采取的行为直接影响游戏得分好坏:
我们定义每一局游戏即从游戏开始到结束,为 τ = { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s T , a T , r T } \tau=\{s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T\} τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT},也就是一局游戏过程的序列,因为 τ \tau τ是基于参数为 θ \theta θ的神经网络的输出,每个 τ \tau τ出现的概率就是 P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ),所以我们的期望 R ‾ θ \overline R_\theta Rθ就是:
但是我们没办法穷举每一局游戏,我们只能进行采样,我们用actor去玩N局游戏,然后进行采样:
然后我们可以将期望近似为采样的均值,也就是将所有采样到的N局游戏奖励求和再取平均:
接下来我们就是要找出最好的actor:
我们要优化的就是期望,我们希望期望越大越好,我们可以用梯度上升法更新参数,其实原理跟梯度下降类似,只是一个是越大越好,一个是越小越好,具体可以看下图,还是比较好理解的:
我们前面定义了期望:
因为奖励是游戏本身设定的,我们可能是不知道的,所以梯度只作用于概率上那部分上:
因为要log,所以进行变换:
因为我们知道:
所以期望就是:
然后近似于N次采样:
那接下来怎么求这个梯度呢,我们知道 P ( τ ∣ θ ) P(\tau|\theta) P(τ∣θ)是怎么来的:
我们看到跟 θ \theta θ相关的就是中间连乘的那部分,因为你每次在某个时间t状态下采取的行动,是基于你的actor π θ \pi _\theta πθ的,比如下面的例子,某个时刻t的状态下,要开火的概率是0.7:
因为有连乘,所以我们取log,得到:
所以梯度就跟中间累加项有关:
于是:
R ( τ n ) R(\tau^n) R(τn)作用于每一个梯度,所以可以乘进去,得:
我们的梯度上升是这样:
因此我们希望奖励的期望梯度越大越好,当 R ( τ n ) R(\tau^n) R(τn)是正的时候,我们希望提高 p ( a t n ∣ s t n , θ ) p(a_t ^n|s_t ^n,\theta) p(atn∣stn,θ),反之当 R ( τ n ) R(\tau^n) R(τn)是负的时候,我们希望减小 p ( a t n ∣ s t n , θ ) p(a_t ^n|s_t ^n,\theta) p(atn∣stn,θ),这样就才可以使得奖励的期望梯度尽可能的大:
这边为什么是考虑某一局游戏的奖励 R ( τ n ) R(\tau^n) R(τn),而不是某个时间点的奖励呢 τ t n \tau_t ^n τtn,因为如果仅仅考虑某个时间点,比如开火的时候,得到了奖励,那他就越提高开火的概率,训练之后可能会一直乱开火。
我们来看这个式子,为什么最后要是取log,其实我们把他还原回去,可以看到其实是除以了概率:
为什么要做这件事呢,因为加入某个状态在很多局游戏里出现,采取a的奖励是2,采取b的奖励1,但是会采取b的次数多,因为我们的梯度是会进行求和,所以算出来最后可能他会选择b,但是事实a应该是更好的,所以我们要把这个次数的影响给消除点,我们除以概率就可以了,比如下图a出现的概率是1/4,b出现的概率是3/4,把奖励除以对应的概率,最后算出来会提升a的概率从,所以可能选择a的概率大:
其实还有个问题,我们的 R ( τ n ) R(\tau^n) R(τn)一直是正的,理论上好像没问题,比如下图的a,b,c三个概率,如果都是正的,假设a,c的奖励大,b的小,那三个概率都应该增加,但是概率大的其实反而概率是会减少的,因为概率的和是1,其他增加了多少了,增加少的就会减少:
但是实际上你可能没采样的a,然后导致a的概率降低了:
这个其实是有问题的,或许a是更好的选择,那怎么避免这种情况呢,我们可以设定一个门槛,一个基线b,超过他的我们才会把概率提高,这样b,c的概率也就不一定提高,a也不一定降低了:
总结
本篇主要介绍强化学习的基本概念和基于策略的方法,还有一些要注意的地方,其实挺值得我们思考的,也是我们今后可以优化的地方,其他的方法再后面会介绍。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。
更多推荐
李宏毅机器学习系列
发布评论