李宏毅机器学习系列

编程入门 行业动态 更新时间:2024-10-09 23:15:48

李宏毅<a href=https://www.elefans.com/category/jswz/34/1771242.html style=机器学习系列"/>

李宏毅机器学习系列

李宏毅机器学习系列-深度强化学习介绍

  • 深度强化学习
  • 强化学习
    • 与监督学习的区别
    • 训练语音对话机器人
    • 更多的应用
    • 玩游戏的例子
    • 强化学习的难点:
    • 强化学习比较新的方法
    • 强化学习基于策略的方法
  • 总结

深度强化学习

深度强化学习可以理解为深度学习和强化学习的结合体,有个大神说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也不一定降低了:

总结

本篇主要介绍强化学习的基本概念和基于策略的方法,还有一些要注意的地方,其实挺值得我们思考的,也是我们今后可以优化的地方,其他的方法再后面会介绍。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵,图片来自李宏毅课件,侵删。

更多推荐

李宏毅机器学习系列

本文发布于:2024-03-14 12:36:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1736486.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:机器   系列   李宏毅

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!