强化学习最小手册
|
|
|
|
|
|
|
|
强化学习越来越受重视,它为什么很重要,用一张图就够了。想像一下我们是人工智能体,我们有强化学习和监督学习可以选择,但干的事情是不一样的。面对一只老虎的时候,如果只有监督学习就会反映出老虎两个字,但如果有强化学习就可以决定逃跑还是战斗,哪一个重要是非常明显的,因为在老虎面前你知道这是老虎是没有意义的,需要决定是不是要逃跑,所以要靠强化学习来决定你的行为。
强化学习有哪些实打实的应用呢?
只要在问题里包含了动态的决策与控制, 都可以用到强化学习
1, 制造业
强化学习之于制药业有一种天然的契合 , 把强化学习翻个牌子换个叫法, 也可以叫做控制论, 学习控制机器手的精确动作, 比如让它自动的做比目前所能及的更复杂的事情, 强化学习在制造业的应用潜力是显然的 。
2, 无人驾驶
这就不用多说了, 开车本质是个控制问题, 自动驾驶不仅需要模拟人类行为, 还需要对前所未遇的情况进行决策, 这需要强化学习。
3, 智能交通
智能交通, 显然这里包含了非常多的决策与控制问题, 就拿目前的共享汽车行业 ,滴滴和uber的派单系统时时都是一个动态的决策, 如何把正确的司机和乘客连接在一起, 如何让车辆调动到需求量最大的地方, 这些都要时时的考虑各种因素调整决策。 我们说这里面既包含了效率的问题, 也包含了乘客的安全。 比如这一次滴滴的事故如果修正强化学习的效用函数, 是有可能避免的。 当然除了派单和调动问题, 在每个十字路口交通灯的控制等, 整个城市里的立体交通网络的协调, 本质都是强化学习问题, 所以强化学习在智能交通大有可为 。
4,金融
金融的核心, 交易, 是一个动态控制问题, 即使你不能完全预测明天股市的涨跌, 你依然需要直到我今天要不要下单,下多少单, 这,就是一个强化学习的决策, 它可以影响明天的股市, 也会在非常长远的时间里让我收益或亏损。机器交易,本质是个强化学习问题。 当然,金融里能够应用强化学习的绝不仅仅这一个。
5, 智能客服
智能客服本质是个强化学习问题, 如果你把它处理成监督学习问题, 那个对话机器人只能照猫画虎, 不能够真正从顾客的好恶的角度出发来发言, 而如果用强化学习, 那么机器人学习的就是如何正确的决策, 每句话都是为了最终讨得顾客欢心。
6, 电商
电商的本事是如何吸引人买更多的东西, 因此我们买了一个东西后它总会在下面给我们推荐其它的东西。 然后我们看到了一个新的东西, 又会点开下一个连接, 这样一步步的就买了一大堆东西, 这样在每一步给你展示不同东西吸引你上钩的过程, 也可以看作是电商系统的动态决策过程, 是一个强化学习问题。
7, 艺术创作
艺术创作领域看起来与强化学习无关, 事实上它可以很灵活的把人类的好恶加在强化学习的过程里,通过强化学习, 机器作曲可以自发的得到取悦于人的风格,也就是范式。
强化学习的基本要素
如果说监督学习的基本框架是函数拟合, 我们常用的语言是特征, 标签, 那么强化学习, 就有另外一套语言, 这套语言的元素包括状态, 行为, 观测, 奖励。
每一个元素都有很多可以说的地方, 首先看状态s, 状态是什么呢? 它指的是智能体(agent)所在的环境里所有和游戏有关的信息, 它起到的角色类似于监督学习里的特征。既然如此,状态的数学表示你可以认为和特征是类似的, 也是类似于一种函数向量的形式, 我们说状态空间, 正如监督学习的特征空间, 是一个维度很高的几何空间。 状态特征有连续和离散之分 ,会影响学习算法的基本性质。 我们可以思考走迷宫和平衡摆的例子来思考状态的可能表示有哪些 。在走迷宫的例子里, agent所在的位置作为一种状态, 而在平衡摆的问题里, 这个状态就是角度。
再看观测, 观测是学习体可以接收到的状态有关的信息, 有的时候行为体可以收到环境的全部信息, 也就是整个状态, 但是大部分时候则只能收到非常局部的信息。观察可以看作状态的一个函数O(s), 这个O(s),正是对应真正的系统输入, 会决定下一步的行为A(action), 为了描述简单,我们不必区分状态和观测。
再来看行为,所谓行为,是指智能体的决策,某种情况下我们可以认为它就是监督学习要求的那个y, 或者预测, 但一个决策与预测不同的是,我们并不能马上取得一个信号告诉我们这个决策对不对, 只有在游戏的最后 ,我们才能从整个游戏的收益反观当时的决策好坏。 另一点是, 它可以间接的影响状态, 环境等因素, 因此, 比起深度学习里的预测更具有“反身性”, 也就是说这个y会影响下一步的x。 这种输入到输出的闭环形式也是强化学习和监督学习的主要区别之一。
决策的数学形式类似于监督学习的分类问题, 每个行为类似监督学习里的类, 这也是容易理解的, 虽然状态可以取无限的数值 ,但我们的行为决策事实上往往只可以取有限的几个值, 比如在走迷宫的例子里它就是上下左右, 东南西北。 因此, 行为的表示往往是有限的离散的数值, 通过类似字典的东西赋值。 决策是一个随机变量, 因为在某个状态下的决策, 很多时候包含随机性, 这个随机性使得这个决策函数变成了条件概率的形式P(a|s), 通常我们给它换个名字叫做pi。
最后看奖励, 奖励是什么呢? 奖励就是在某个行为之下环境给我们返还的一个反馈信号, 这个东西正是智能体在游戏里所追求的 , 奖励和状态有关, 也和决策有关, 比如多臂赌博机问提, 你的奖励直接就是你的行为(选择摇臂)的一个结果。奖励具有随机性, 同样的条件性, 有的时候我们可以得到奖励, 有时候没有, 因此, 它也是一个随机变量, 理解这一点非常重要, 因此才可以理解很多的后面的算法。 奖励可以是正向的,也可以是负向的(惩罚)。
这样我们就有state(observation)- action - reward 这样的一个组合。 或者说环境给你一个state, 然后智能体得到一个action , 这个action改变环境, 并且环境返回智能体一个reward,如此循环, 当然在真实的游戏下我们并没有这样机械的一步步的过程, 而是一个连续的整体, 这种机械的方法是为了让问题可以轻松的被一个程序解决。
这样的思路和图灵最早提出的图灵机智能模型具有异曲同工之妙, 而图灵机被认为是智能产生的基本模型,因此你也可以理解为什么强化学习和强人工智能有关。
从状态到行为action的函数,也就是刚刚提到的那个条件概率, 通常称之为策略, 犹如通常意义上说的战略, 也就是一个行为的指导方案。 当游戏结束的时候, 我们把所有环境给我们的奖励加在一起算分, 越好的策略得到的分数越高, 这就是强化学习的本质。
马尔科夫决策与动态规划
那么如何得到一个好的策略呢? 这就是强化学习的中心问题, 大家以看就知道这本质上还是一个优化问题。 那么整个后面的篇章都围绕这个展开。
如何得到好的策略?如果游戏没有很多步,而是一步就可以拿到奖励, 那么我们只需要写一个函数作为总奖励, 这个函数里自然包含策略函数,然后直接对它取最大即可。 当然, 如果奖励的概率函数未知, 那么就会引发一个探索与收益的问题。此处不再详述。
我们还是展开简化大法, 我们用一个马尔科夫决策的东西, 把这个东西大大的简化。
什么是马尔科夫决策? 你观察到我上面的描述没有,这里面包含的东西大部分是离散的,问题里的大部分元素, 都可以描绘成条件概率的形式。 如果我们假定从state 到 action的那个条件概率P(a|s), 从这一刻state到下一刻state的那个状态是P(s|s,a) 从环境里得到奖励的那个条件概率是P(r|s,a)。 在这个语言系统下,马尔科夫决策就是假定P(s|a,s)与P(r|a,s) 都具有这一步的状态和决策有关,如果是这样, 我们的决策函数P(a|s)也仅仅需要考虑当下的状态, 这使得所有问题的数学形式大大简化。
环境决定的那两个条件概率P(s|a,s)和P(r|a,s)往往不是已知的, 或者说极为的难以求解, 比如在围棋在某个棋局之下你的某一步走子所能引起的对方的变化会十分复杂你根本无法求解。而一旦它是已知的, 整个game将变得十分简单。 由于它们往往不知道到的, 如此才需要引入整个后面的强化学习体系。
有了马尔科夫决策这个框架,我们就可以看看如何推得我的最优策略。 强化学习的优化问题, 本质围绕三大主线, 一个是你要考虑的是未来的收益, 而整个未来的收益是不确定的。 另一个是你要考虑探索和收益, 假定你在游戏里走是选择开一扇门有奖励你就没完没了的开一扇门, 这样就陷入了局部收益最大的陷阱, 而忽略了全局更大的收益, 但是我们的游戏时间又有限, 不可能一直把时间花在探索, 这样就有一个探索和收益的平衡问题。第三是奖励是稀疏, 在游戏里往往是在很少的时刻会收到环境给的奖励, 你确要根据这个信号去学一个非常连续的动作控制流。
我们先来看如果已知前面环境决定的两个条件概率如何求解策略。
首先为了解决当下收益和未来收益的问题, 我们需要一个新的数学函数把当下和未来的收益统一起来,这就引出了另一个中心角色 - value 价值。 这个概念想办法把我们把当下和未来的收益统一在一起, 这个函数的定义方法是把当下的奖励和未来的奖励加在一起, 由于奖励本身就是随机变量且未来是不确定的, 我们要是把奖励都加在一起, 依然得到的是一个随机变量, 你要衡量一个随机变量的大小, 只能对它取期望。 令一点, 你是否觉得当下的奖励和十年后的奖励应该值一样的钱呢? 你是否觉得如果把所有的奖励都加在一起, 如果游戏很长, 这个数字会趋于无限呢? 如何解决这个问题? 我们做一个贴现率, 让未来的收益乘上一个和时间有关的乘子, 这样最后把求和变成等比数列求和, 这个值就收敛了。 。 我们就得到了这个统一当下和未来收益的函数- value 。 它的定义就是现在和奖励和未来的奖励乘以时间的贴现加在一起的期望。 因此得到value的定义
这个期望依然是依赖于一定条件的,它依赖于当下的状态值, 或者说状态初值, 因此, 它具有条件期望的形式。 另一个关于值函数要知道的要点是再整个过程里唯一由智能体确定的是它的策略pi(a|s), 其它都是环境给出的,不同的策略下, 值函数显然是不同的, 因此这个v(s)也是依赖于策略的, 通过我们pi写在v的右下角就是提醒大家注意这一点。
好了, 现在我们的强化学习的优化问题就换了一种说法,我们要优化我们的策略, 最大化我们的这个value函数, 当然是所有状态下的value函数(是一个向量形式V(s))。 假定我们知道环境的动力学: P(s|a,s)和P(r|a,s), 那么我们可以通过直接展开的方法求解这个value, 然后直接在这个基础上做优化。 加入我们的游戏只有一步:
大家可以像对于一个动辄几百个步骤的游戏, 这样展开下去要多繁琐,我们有没有其它方法对付这个问题呢? 这就引出了一个求解强化学习优化的最基本方程 - 贝曼方程,这个方程的内容说的是可以把值函数按照定义展开为当下的奖励, 和下一步的值函数乘上贴现因子的值的和。
如果我们所针对的不是某一个特定的值函数, 而是刚讲到的那个针对所有初始状态的值函数向量, 且我们假定所有的状态只有有限个(在马氏问题里一定成立的)那么这个关系式的左边和右边就同时包含了这个值。
这样我们就得到了一个左右两边都包含v向量的方程, 由于两边的关于环境的两个条件概率都已知, 我们可以通过线性代数的方法求解。
如果我们得到了v的值, 再来看看如果去改变我们的策略使得这个值最大。 我们还是把最优化方程展开为当下的奖励加上贴先后的下一步的值函数的形式:
为什么要做这样得分解? 这里包含了贝尔曼优化的关键思想, 这个公式既包含当下的v值又包含下一刻的v值, 这意味着, 我们我们可以通过把整个优化过程, 展开为一个个的这样的环节, 如果每一步都是最优的, 那么全局就是最优的(通过迭代法传导)。 或者反过来想, 如果我要达到了最优,那么从任状态出发, 我都应该是最优的。 这就包含了所谓动态规划的思想。 也就是你要优化全体, 就要优化每个部分。 对应的方法, 就是一种迭代的方法, 我先来计算每个状态的v值, 然后直接在算式里改变pi的值来最大化v函数(求导!), 当改变了pi值,新策略的v值也必然要重新估算,有了新的v的值我们又可以使之最大的pi值, 由此形成一个螺线结构, 直到收敛到最优解,在这个点上, 我们就达到了一种稳定, 此时无论如何改变pi都不能使v达到最大。
蒙特卡洛抽样 与TD方法
但是大多数条件下, 刚刚说的那个假定是不成立的, 也就是环境的动力学未知, 我们没有那两个有关环境的条件概率, 这个时候我们根本没法按照刚刚的思路求解。 对于未知的环境,我们的解析解行不通, 我们唯一能够借助的手段就是抽样, 通过抽样的方法, 取代掉算式里未知的条件概率。
我们来看这个情况下对v的估值和对策略的迭代是怎么样的。 先来看v, 这个时候的v与其看出成对未来收益的期望, 不如看包含了以往所有历史的信息的对未来期望的估计, 因为你的抽样只能是估算,严格说你需要针对每个状态抽取无限个抽样样本才能完全准确, 但是显然没人等的了, 那么我们能否针对有限的被抽样样本来更新v函数呢, 如何更新呢? 思路有两种, 一个是按照定义来搞, 既然v值是从某个状态出发的总收益的期望, 那么我们就可以从某个状态出来把整个游戏走完来测量这个收益, 从被抽样的状态出来, 走完整个游戏, 最后算出某总奖励作为v值得抽样。由于数据是一个个增加的, 我们用流平均来替代期望,这里也是一样得。 这样的思路我们称为蒙特卡洛, 蒙特卡洛几乎就是随机抽样的代名词。
alpha 越大, 表明我们之前的样本越多。
然而这个方法有着一个致命的弊病 ,那就是你得等到游戏的结束才能更新一次v值,速度太慢了,而且想想有些时候你只能进行一次或几次游戏, 比如人生的游戏你只有一次, 你不能死了再回来, 所以这个方法就不那么给力了。 怎么办呢? 我们还是有办法,这个办法就是不等到游戏结束就更新, 还是利用刚刚说的v函数的迭代展开式, 我们可以在每次得到一个奖励的时候更新这个值, 你想想无论是在游戏里还是人生里其实你每次都到一次胜利或者失败, 你都会对全局的输赢多一点信息,如果你能利用好每次到达的这一点信息来更新你的v值, 就达到了我们不结束游戏就更新的目标。 这个方法所做的就是每次多一个奖励出来时候严格按照v的迭代式定义来更新v函数,这样多步之后v也会趋于正确的值。 这就是大名鼎鼎的TD方法。好比当你在开车的时候, 你险些撞车, 游戏没有终止, 但是足以让你使用这个惊险来更新值函数。 另外一个例子是你打公交车去上班, 每过一个站你看一个时间, 看和你的预计是否有差别, 这每一站的时间, 足以让你不停的调整对最终实现时间的预期。
从另一个角度看它的本质, 这就是之前讲的动态规划的一个抽样版本,我们还是按照贝拉曼方程展开递归公式, 不过这个时候我们去掉了那些不好求的概率, 而是每次出来一个证据, 我就根据这个证据, 来调整我的v。 本质上, TD方法就是根据新增加得方法一点点得调整预期,最终使得我得估计准确得一个方法, 这点让我们想到贝叶斯方法。
零一点关于TD的重要认识是, 它预设了一个状态中间的关联, 因为在每个TD的步骤里, 我们都假定了一个从st到st+1的马尔科夫结构,即t+1时候只和t相关, 所以TD方法在越接近马尔科夫决策结构的时候工作的效率就越高, 反之, 则引入一个偏差。
如何优化策略
我们谈了通过抽样的方法更新值函数, 下一步就看看如何更新策略。 之前的动态规划思路是把全局分解为部分优化, 这里也一样, 每次更新v函数后,都意味着我们可以针对被更新的v值调整一次策略, 但是一个非常棘手的问题是哪几个环境的条件概率不知道,还有, 我们的v值是根据一两个新的数据估算的不准确, 这有两个直接的后果:
1, 我们无法简单的取最大值,
2, 即使我们能够取最大值, 我们也无法确定我们做的是正确的,因为我们不知道真实的v, 根据错误的局限的v做的策略极有可能是局部最优。
对于解决1, 我们玩一个trick, 重新定义一个量
这个量把环境的那两个条件概率完美的包含进去, 如此,我们把刚刚说的TD和蒙特卡洛估计的对象就改成Q函数, 我们立马会看到刚刚得贝拉曼优化方程变成
这时候你用眼睛都可以看出这个东西的解吧, 我们的策略pi只要更新为取最大Q值得函数就可以了, 因为这正是这一关系所能取到得所有pi里最大的那个。 这样我们就解决了第一个问题在环境未知下求最大值
Q 我们称为action value , 是在控制问题里比v更好用的量, 因为它甩掉了那一堆概率关系, 直接了当的告诉你, 你要做好决策, 你就直接搞定那个action value最大的决策就行, 不需要一丝犹豫, 由于它直接忽略其它所有不是最大的选项, 因此给人一种十分贪婪的感觉, 因此它又叫贪婪算法。
然后看第二我呢提, 如果没有第二个问题, 那么我们可以更新了策略之后, 进一步估算新的策略下我们的Q值(同v值更新方法一样),然后再根据贝拉曼方程告诉我们的, 不停重复这个过程,直到整个过程停下来, 我们就达到了最优解。
同学们看看上面的逻辑是否天衣无缝呢 ? 如果没有第二点, 是对的, 但是由于那个刚刚说的那个问题,你对一个不准确的估计做贪婪运算, 极容易陷入局部极小, 我们机油可能仅仅是由于我们非常局限的经验而直接认定了一个选项,放弃了更有机会的选项, 比如你某次和某男生约会很高兴就马上放弃了其它所有男生。 由于视野很局限, 我们就容易落入局部最优解。 那么如何避免这个情况? 我们要加入这样一个因子, 它描述我的不确定性, 虽然我倾向于选择那个Q最大的动作来做, 我还是保持一个随机因子 epsilon。 这个值多大我自己定, 比如我如果选择epsilon 为0.5, 那么也就是有50%的概率我直接选最大的那个Q, 另外50% 随机选一个。 这个随机选项让我们有机会瞧瞧那些其它的选项, 也称为探索。 我们刚讲的探索与收益的矛盾, 正是这个直接选最大值, 与继续探索世界更新我的认知直接的矛盾。 如果我们拥有全部的世界的动力学知识,对世界了如执掌, 我们可以直接最大化, 由于那些是未知的, 而游戏世间是有限的, 就引出了这个探索与收益的矛盾, 也就是epsilon与greedy的矛盾, 如果epsilon设置的过小, 不足以解决局部最优的问题, 如果设计的过大, 则会使得策略的迭代过于缓慢。
既然我们为了效率放弃了计算准确的Q, 我们也要把我们对世界估计的这种不准确以在决策中加入随机性的方式放回去。 这就是epsilon的本质, 它是伴随着对值函数的采样估计产生的。
这个被改进的算法被称为epsilon-greedy, 也就是结合了贪婪和探索的算法, 通常为了缓解探索和收益的矛盾, 我们会按照一定的进程表变化epsilon,开始比较多探索, 后期比较多贪婪, 这个也可想而知, 前期对世界的知识很少, 需要多探索来尝试所有的可能 ,后面反过来,游戏将要结束, 需要利用已经取得的知识最大化的得到成果,这样的一个过程我们通常称之为退火,就好像逐步降低温度一样。
用这样的方法最终得到的最优解一定是一个确定性的解,当退火到0的时候, 我们得到的那个最优是不包含随机性的, 它的涵义就是搞定那个最大的action value 这类方法又称作值函数法, 就是说我最终决策的依据只有action value, 它是确定性的。
这里面有一个没有讲到的非常重要的细节, 刚刚讲到用TD方法来更新我的v值和Q值, 这个v和Q无疑都是针对我现阶段策略的, 一开始时候我说的策略是一个贪婪策略, 后面加入了epsilon, 我们说在智能体训练后的真实使用阶段我们是不含有这个epsilon的,那么这个评估时候针对的策略是要根据我真实使用中的那个贪婪策略, 还是根据我在训练中为了避免局部最优使用的这个epsilon-greedy呢? 答案是这两个都可以. 如果死磕定义, 我当然应该使用epsilon-greedy,因为这才是我在训练中真实采用的策略。 但是你不要忘了, 我真正care的永远是那真正使用的策略, 也就是贪婪的策略, 这个epsilon只是在训练中为了纠错加入的。聪明的同学一定想到了我在评估的那个真正用的策略和我所用的含有探索的训练策略没必要一样, 这个思路就产生了off-line learning 的思想, 翻译出来叫做离线训练, 它说的就是我在训练中使用的策略和我真正学的那个策略可以不一样, 好比在评估阶段我处于离线阶段, 是通过一个与真实训练有区别的进程完成的。
相反的, 如果两者是一致的, 我们称为online-learning。 这样我们的epsilon-greedy算法就衍生出了两个流派, 一个是online-leanring版本的sarsa(state-action-reward-….), 另一个是offline版本的Q-learning。
BoostStrap 方法
刚刚讲到的TD更新方法, 是最常用的方法, 但基本款的TD方法还是略显缓慢, 有一种迅速加速这个方法的手段, 叫做TD-lambda。
我们且一步步的展开这个问题: 1, TD方法每次得到一个环境给的奖励信号, 然后更新上一状态的Q值 2, 那么我们可不可以等两部, 得到两个奖励信号再更新一次, 这样是不是在更新的时候做到更准确. 3, 可不可以等到n步奖励的结果再更新,这样对每次更新更确定? 4, 如果一直到游戏结束才更新我们是不是得到了蒙特卡洛方法? 如此的确很减少了偏差, 但是同时降低了效率 5, 因此n步更新方法是1步TD方法和蒙特卡洛方法的中间状态
6, n该取多少,似乎比较小的n和比较大的n都各自有各自的道理 7 ,不如同时一起做了, 从一步更新到n步更新, 此处引入TD lambda, 我们可以从1步到n步同时更新,然后用一个方法把它们混合起来 8, 能不能倒过来看, 在每一步更新的时候, 我们不仅更新这一步的Q值, 而是把状态轨迹上的所有之前的Q值都更新? 这个方法可以证明就是第7步的TD lambda, 它的效率非常高, 因为它可以通过最后一步得到的奖励, 更新所有的中间状态Q值。 你可以看出来, 这个TD lambda, 更新Q值的效率还是很高的。
把学习的思想引入Q-learning
有了上述这样的方法, 对于任意的问题,我们都可以通过先设定状态- 行为 -奖励, 然后给每个状态,行为的组合设定一个Q (a,s), 再不停的通过TD方法和蒙特卡洛来优化控制流, 然而, 这样的方法确实有着天然的弊端, 一个最典型的问题是, 它本质是在做一张状态-动作组合的表格, 对应每个状态-动作的组合, 我要计算一个收益期望Q,如果状态和动作的组合是可数的, 那么这个问题是可以操作的, 因为这个时候我们要做的无非是一个个的迭代。 然而如果状态非常多, 这个问题就不再那么好做了 ,因为你总会在某个时刻, 到达一个先前从未见过的全新的状态, 这时候该怎么做呢? 终于又到我们回忆监督学习的时候了, 我们说了监督学习的终极目标是通过训练数据最终在没见过的数据集上做预测, 我们通常称之为泛华能力。 你看这不正是我们需要的东西吗? 我们说我们有无穷多的状态动作组合 ,当遇到一组新的组合, 我们不需要慌张, 而是由模型进行预测。 我们的模型是由那些已经由了数据的组合训练出来了, 通过模型所把握的规律, 来在未知的数据上做预测。
这一个思路进来,那么所有监督学习里的模型就都称为了强化学习里的模型, 从线性回归到神经网络, 从树模型到随机森林。 如果所使用的模型是深度学习模型, 我们就不由自主的开启了深度强化学习。
我们先前的状态就如同监督学习里的特征, 而Q(s,a)就是我们学习预测的对象。
那么随机梯度下降这类家常便饭的优化方法也很自然的引入进来。
重新回顾一下, 这一段落得根基其实是泛化二字, 也就是说我们的模型其实能够捕捉某种状态之间的关联。 比如你客户以想象在导航走迷宫的任务里, 从相似的起点出发, 你追随目标的路径其实是相似的, 当然这是一种非常表象的泛华能力, 还有一些更深层的联系, 需要抽象出一些特征才能干掉, 这就是我们深度学习要登场的理由了。
引入策略梯度算法
有了策略梯度算法是不是就足够了呢? 这个Q学习的算法, 虽然体系滴水不漏,但是依然有一个比较严重的弊端, 那就是最终学到的策略只能确定性的, 根据定义 ,这个最优化的策略是每一次选取Q(s,a)里最大的那一个。 可是很多时候, 我们的最优化策略本身就需要包含随机性, 而且这个随机性的大小需要精确的描述, 而不是像epsilon-greedy那样通过随机抽样粗糙的给出。
我们用要一个最微小的例子来说明,还是那个走方格的问题,骷髅就是有危险的意思,我们希望走到有奖励的地方。 我只做一个小的改动将使得之前问题面目全非,之前的马尔科夫决策附加的条件就是当下的状态含有用来决策的所有信息,方格问题里, 这个信息就是位置坐标。而如果我没有位置这个信息, 取之以感知信息, 比如我只能感知我所在方格的周围两个方格有什么(下图中的骷髅或金币)。
注意如果我们处在下图灰色方格的区域(左右各一个),此时相邻的两个方格的情况是完全一致的(白色),也就是说我无法确定我是处于左边还是右边的灰色方格, 这导致无法决策正确的行为(左边和右边的正确决策是相反的! 一个向左一个向右, 但是我无法确定是哪一个!)。
如果此时引入一个随机性的策略, 这个问题影刃而解,我无非子啊左右两个灰色的格子里制定左右各50%的策略, 这时候总是最终客户以达到宝藏,就是时间可能稍微长一点。 这样的随机性的策略, 引入策略函数就可以可以很容易的学出来。
另一个必须使用策略函数的理由还是当agent可以执行的动作很多的时候, 比如机械臂的运动, 它的控制事实上是在一系列连续变化的角度里选择, 这几乎就是无穷多的动作。 这个时候, 那个比较古老的epsilon-greedy就要退出了, 我们可以模仿Q学习里的思路,把整个策略概率函数, 用一个神经网络精确的表达出来, 这样即使可能的动作很多, 你也可以通过设逆境网络的泛化能力达到(也有其它模型, 最常见的就是神经网络)
这个策略概率函数,能够精确的表达即使是无穷个动作, 每个动作被执行的概率。 这样通过模型的泛华能力, 我们很容易对一个未知的状态动作组合被执行的概率做出预测。
有了策略概率函数, 我们如何优化这个函数呢? 注意,之前的值函数方法,事实上我们也有策略优化这一步, 只不过那里直接通过更新v函数, 然后取最大Q绕过了这个步骤。我现在要硬碰硬的干掉它怎么搞呢? 当然是把公式全部展开然后求导 , 然后梯度下降。 我们拿一个最简单的问题开刀, 就是一个一步的游戏(摇臂赌博机),而且奖励的值是确定的, 这个游戏的奖励的总值是
,然后我们对E进行求导,
由于此时我的pi已经是含有w的函数, 因此求导变成这个德行, 对这个公式里的 进行求导是有技巧的, 我们对于类似问题最常用的问题就是把它变成
, 为什么要做这样一个变化呢? 原因在于, 这样可以保持我的期望的形式不变, 因为我会多出一个pi来, 这时候, 我事实上得到的是
, 这里面的 (称之为score function,类比机器学习最大似然函数的梯度)是一个相对容易计算的量, 原因它是在不改变原先条件概率函数下的期望形式! 我们只需要按照之前对Q函数取样的思维, 直接在游戏的进程中对它进行抽样即可, 然后进行随机梯度上升。
刚刚讲述了摇臂赌博机这类只有一步的问题。 如果是多步游戏呢? 这时候我们要改变我们的目标函数, 用q替代刚刚的r, 由于策略梯度完美保持所有其它的概率表达式, 因此我们得到的表达式依然保持期望形式不变
。
有了上面的基础, 你知不知道如何取干掉这个Q呢? 有几种方法? 蒙特卡洛和TD方法,以及TD方法的各种booststrap形式。 采取蒙特卡洛方法在游戏结束时候计算策略梯度的方法通常称作reinforce, 是最基本的方法。 如果采用td方法呢? 这时候我们就来到了当下的今日之星 - actor-critic。
Actor - Critic 算法
Actor - Critic 方法在整个强化学习优化算法的位置里极为特殊的位置, 因为它综合了上述两个方法的优势, 我们在游戏里同时把Q和策略pi用神经网络表达, 在得到新的证据的时候两个网络都会反传一个梯度,策略梯度用来寻找更多的奖励,用于策略网络直接和行为相关, 因此这个神经网络被称为actor 而Q的梯度用来更加准确的对期望收益估值, 由于这种评估的本质, 这个Q网络又被称为批评者critic 。
我们可以通过一段代码理解这个框架.
https://github.com/pytorch/examples/blob/master/reinforcement_learning/actor_critic.py
有模型学习
刚刚讲的方法,通常称为免模型学习,所谓免模型, 就是当环境的动力学(也就是那两个条件概率,想象下棋的例子)不知道的时候, 我们通过直接抽样的方法来更新Q(a,s)和pi来进行控制住.我们知道当环境的动力学规律完全已知, 我们根本不需要抽样, 而是可以效率非常高的使用动态规划求解.在此处,我们可可不可以学习创造一个世界模型, 来提高我们抽样学习的效率呢? 当然可以, 你不是由监督学习吗? 我们可以用类似监督学习的思路来把这个环境的动力学学出来啊!
我们在这里就进入了有模型学习的范畴. 一旦agent开始学习掌握世界模型,并用它影响决策, 这个时候我们就是说agent获得了一个全新的能力planning, 这个能力的获取使得agent 使用环境奖励的效率大大提升.
何谓planning, agent 试图在自己的心理展开世界模型,估计当它做出如何如何行为,会得到如何的奖励, 虽然agent 并没有真正经历那些行为, 就好像经历过了一样, 这样agent 就如同获得了非常多的虚拟数据, 可以更准确的对未知的状态进行估值, 在数据极为稀缺高维诅咒极为明显的强化学习问题里, 这个效果是巨大的.
那么这个有模型学习的范式就变成了我们先利用真实的数据来学习环境的动力学矩阵 P(st+1|st, a)和P(r|st,a),然后用这两个矩阵来进行simulation, 得到很多的模拟数据计算Q(s,a)的过程。
。
为什么是强化学习? 请看下图的技术泡沫爆裂图。 机器学习和深度学习在2017处于关注热度的顶峰, 大家看处在上升期的人工智能技术, 第一当属深度强化学习, 据这张非常表格非常粗糙的估计, 深度强化学习的技术成熟期在未来5-10年, 此时此刻, 正类似于深度学习在2010的状况。
梁 Liang2019-12-08 13:02:39
一年前,这篇文章我是读不懂的。一年后,懂了。感谢混沌巡洋舰! 请问,如果要补充"控制论"的知识,有什么书籍推荐?包括中文或者原版。谢谢。
作者
可以读读 人有人的用处 经典老书
吉祥物龙猫2019-03-20 11:39:31
控制论学过
Big Have2019-01-14 20:40:54
太赞了!!收获很大! 就是前面的两个贝尔曼方程好像笔误有点多,可能会给我这样的菜鸟带来困扰[呲牙]。第一个本期漏乘r,第二个左侧怎么是t+1,右侧下一期里面pi内不带角标以表示本期格式不太统一,v里也该是t+1吧
杨冬平2018-10-12 12:53:05
基本的算法还是BP吗?