Sources

之前我们其实讲了5节的内容。这五节的内容包括比如说探索与的应用,包括MDP动态规划值函数的估计,无模型控制和规划与学习。他们所有的范畴接在tabulate enforcement learning的基础上。 Tab loral enforcement earning的意思就是说我所有state所有action都是有限离散。并且这个space far以至于我可以拿一张表去将所有的q function、v function或者是policy直接去兼顾。所以大家可以看到我们之前做的这些事情,无论是基于模型动态规划,直接通过贝尔曼最优迭代式去更新我们的价值函数。 或者说基于策略迭代,我在每一个state之下去去去选择一个动作action,它都是在更新一个表格当中的一个entry。比如说这个策略如果是值函数迭代,我就是在更新VS这张表,这张表的所有entry的数量是state的数量。对于策略而言的话,我其实就是在更新每一个state之下我选择哪个动作,或者是更新我选择动作的概率。我这张表肯定是S这么多行A这么多列这么一个表。在这中间我在不断的去更新entry本身。并且在做无模型强化学习的时候,无论是我们直接去基于数据去用mcmc的方法去更新我的VS或者是用TD的方法去更新我的VS或者Q无论是on policy还是off policy,最终我们更新的实体都是这张表格上的entry。 更新entry有什么意义呢?首先第一点,它非常直接,非常可解释、可视化。我在更新这个entry变大了,于是以后我就对它的估计更加的积极一些,那么以后选择它的概率就变大,非常直接。另外还有一点,我更新这个entry和更新另外旁边一个entry几乎没有任何关系。我如果两个state,即使所谓他们俩比较接近,有在迷宫当中是两个近邻的一个state,或者是说我的这个QSA这两个A其实在当前state下,这两个A的效果接近于一致。但是因为它是两个A所以说我们在更新它的时候都是完全独立的,在这种情况下都会带来低效性。所以在这个时候,我们是可以去考虑将我们的更新方法,把它做成参数化模型的参数更新。这样做的好处,我们就有可能会去解决更大MDP,甚至连续状态和连续动作的这样一些更加实际的问题。 在提这个参数化更新之前的话,我们可以首先去建立一些更加简单的一些思路。首先第一点就是说我们如何去处理大规模的MDP的表格的问题。我们是否还是需要对于每个状态维护一个完全独立的V或者是QSA。比如说是围棋博弈是170次方,往后数170个0,降级也往后数80个0。在这种情况下,我们是对于每个状态分别去建立一个q entry去更新吗? 如果对于连续函数的话,比如说无人驾驶,比如说机器狗,比如说直升机,它的状态就是连续的那你怎么办?你怎么去做所谓的entry呢?没有entry或者说entry是连续统,对吧?你怎么去更新它呢? 所以说一个最简单的方法,就是最直接的,几乎可以说不加思索的方法。我对于状态和动作进行离散化,或者叫做分桶化marketization基于每一个分筒的离散值离散桶ID,我们去构建它的相应的价值函数。基于此去做我们想要的,无论是价值函数学习还是action的选择。 所以说第一种最简单的方法,我们对于马尔可夫决策过程的,比如说最简单的是状态,我们去对它进行一个离散化的操作。在这里我们举一个例子,CES2假如说是两维度的状态,那我们其实对它进行一个相关的离散化。那么其实就是把它分成相关的阁子。对这个格子当中的所有的连续值状态,我们都以这个SER的形式去刻画它。毫无疑问这样做的话是最直接的,但是它会带来相应的问题。问题一就是说我们对于状态本身首先就做了相关的近似化。本来当然我们这一节的这个技术就是所谓的叫做近似化方法proximate methods。 第二个问题就更加严重了,那就是说其实我们做这样一件事情,它仍然会有维度爆炸的问题。在这边大家可以看到其实是两维上面,我们一方面比如说已经分的挺细了。那如果有三维的话,假如说每个维数上去分十个桶的话,那么其实有三维的就是1000个桶,有八维就是一个亿的桶。其实这个已经是很难去界定。 比如说我们直升机或者说一个空间当中一个球,它有一个三维的一个坐标,有三维的速度,还有三维的加速度。这就已经是九维了。九维的实数值九为实数值,那就十的9次方。而且每一维你只有分十个桶,其实已经是非常粗了。在这种情况下你会发现说这个问题其实比我分桶之后的所谓的这个approximation,分桶里面的approximation会来的问题更大。 因为它有维数爆炸的问题,那当然会解决这个问题,我们可以去提一些层次化聚类的方法,这些方法的话是可以使用的。比如说我们把这个空间去做出一些层次化的聚类,或者是说做出层次化的分割,这样来减少一些相应的base。这个方法其实也算是一种比较治标不治本的。但是比较strain forward的方法,在某一些特定的场合这个其实可以用的。 比如说滴滴,他在做出租车派单的时候,他其实是将地球上的每一片区域分成了一个六边形。我问他为什么要分六边形,他说整个地球可以被六边形覆盖,这个六边形他可以把球面覆盖掉。蘸粉的,我看是不是这样好一点。正方形你要把球面覆盖的话,它的这个size就不是一样的。但六边形你是完全可以用一样size的六边形把球整个地球全面覆盖了。它覆盖完了之后怎么做呢?每一个区域它属于这个六边形,在每天其实是按照分钟,一天1440分钟。地球或者上海有多少个六边形,再乘以1440就是它的状态数量还可以,对不对? 其实这就是你做分桶化的一些可操作的优势。比如说我们一个六边形可能是一个大概一公里一平方公里的一个尺寸,这个力度也算还可以在调度车辆等等的时候,它其实最多前后也就是可能一两分钟的这样一个时间时间差也应该还可以。以这种方式的话,其实是可以操作的。但是缺点就是说它其实也许会有一些对于我的价值本身的拟合会有一定的不舒服性。或者叫做它的这种inductive vice是他的这种模型去建模数据的方式,不一定会更好的去拟合到这个数据的。 Python举个例子,比如说右下角这张图大家可以看到,如果说我们是在做像上面这个表格这样的分桶式,就是说我将两个维度就跟决策树一样,我将两个维度以横平竖直的方式切开去做出分桶。于是在这个时候你可以看到,我们明明是一条这种斜着往上的一条线,但是因为我的分桶它就是按照这个来的,它得不断的去建模这种横平竖直的pattern。因为我们是提前按照每一个维度垂直于每一个维度去切割了这个平面。但如果说我们看到的数据长这个样子的话,我们其实很显然可以做一件事情,直接去建模一个线性函数。可能只需要两个参数,我就能够把这条线性函数建模的比较好。但是如果我说我是按照这种分桶的方式的话,我可能得有好多条横平竖直的线去将这样一个轨迹给它,或者将这样一个pattern给他建模出来,而且它还不准。 那在这种情况下的话,我们其实是可以考虑一件事情就是去第二种大类方法,也是现在主流的方法,就是构建出一个参数化的值函数参数。化值函数我们在这个以前都讲过了,它的一个关键点在于优势点在于随着数据量的增大,随着我的数据分布的改变,我们的参数的量是完全不变的。比如一个神经网络,比如说一个线性模型,它的参数是本身的维度,参数量是不变的,我们只需要去改参数本身就可以了。 所以说它在强化学习这样一种agent,不断在学习过程当中,数据分布一直在变,数据量在扩大的这种场景下就特别适合。而相比之下树模型boost in这样的方法就不适合。所以说我们在强化学当中,很多时候都会使用的是参数化函数的方法来去做approximation message的建模。为了解决我们的较大的MDP或者说甚至是连续的环境的话,我们不得不对于我们的无论是价值函数还是策略去做一定的近似化。可以用一些分桶,甚至是这种结构式的,比如说层次化的分桶,或者层次化聚类的方式来解决。 但是这种方式它一定会有它的弊端。首先第一点就是说对于局部的在同样一个桶内的状态,我们一定会是对他去做出了一个相当于是纯average的操作。第二点就是他还是会去遭遇到这种维度爆炸的问题。而我们如果说考虑到的维度,我们的状态维度或者我们的动作维度很高的话。比如说有50维或者说是有100维这种维度其实也很正常。比如说你在玩个游戏的时候,你的维度其实就上100维也很正常的。在这种情况下,你随便你怎么分,你每一维度只分两个桶,你也是不行的,也是差的很远的。所以在这个时候我们不得不去考虑,我们从函数级别就去做相关的近似,而不是说同分统计。 在强化学习当中,我们其实可以去使用我们机器学习当中的模型。对于我们的价值函数也好,对于我们的策略也好。去做出建模。GPC当中大家也知道有两类的模型,一类模型叫做参数化模型parametric models,它的一个好处在于是说我们其实是将我们的空间,我们的假设空间以参数化函数的方式做出了构。以至于我所有的函数,我所有的假设都是有一个参数一一对应的。我们去修改我们的函数,修改我们的模型的时候,其实是对应着修改我们相应的参数。 而参数化模型它有一个特别大的一个好处在于说,我们有了这样一些假设之后,我们对于我们的数据量也好,我们对于我们的数据分布的改变也好,我们的参数量都是不变的。在这种情况下,我们就这么多参数量。比如说1万个参数,比如说100个参数,我们去改它就可以了。 这样做的话对于强化学习而言是极大的好处。原因是因为强化学习它是一个随着智能体不断在学习,数据分布在持续变化的这么一个任务。假如说举例,如果是用数模型,或者说我们用KNN,或者说我们用boosting方法,再去构建我们的价值函数也好,再去构建我们的策略函数也好。你会发现说随着我们的数据越学越多,随着智能体和环境交互的越来越多,这样的模型会越来越大。 原因是因为非参数的模型,它其实你可以认为它参数量正比数据,或者是说当你的数据在不断的以分布的形式在变化的时候,那么你不断的得摒弃掉之前的某一些学出来的数。所以说我们实验室之前也有人考虑过,在强化学当中能不能学树模型。答案是你得学多棵树模型,再把它boost in起来,并且你还得不断的忘记之前很早以前学的数类的一个建模的方式。最后论文也没发出来,这是一方面的事情。 所以说我们还是去尝试去构建参数化模型。第一个data近视的参数,使得我们去不断的更新它就可以了。于是在这个时候,无论是V函数还是Q函数这种价值函数,我们都可以把它用一些这种参数化的模型去做出一个解释。一般来说我们就使用参数化模型,并且这种可薇式的参数模型,这样的话它可以基于梯度的方式来直接进行学习。 于是在这个时候,我们就会考虑说是使用怎样的一个学习目标了。既然我们的函数是一个参数,那么我们只需要去构建它的本身函数目标,对于参数进行求导。那我们就可以对于我们的这个函数,比如价值函数或什么策略进行一个更新了。于是我们要去怎么去构建我们所谓的这个损失函数呢?我们其实可以去看到,比如说我们在做q learning的时候,比如说我们在做其实tempo difference的时候,我们都会去关注说我们的目标其实很简单,就是将我们的拟合值和这个目标值去做出一个回归。所以说我们只不过在过去的基于table的强化学习当中,我们是直接将这个entry本身回归到我们观测到的它的价值目标价值上。 目标价值计算咱可以去首先目前为止我们直接用VPS这样一个代替器作为一个plays holder,去把它放在这个位置作为的学习目标。具体的目标值的代替,我们可以使用MC的方法,用TD的方法将这个目标值计算出来。但是计算出来之后,我们对于我们的这样一个学习值去做更新的时候,我们基于cabral r的方法是直接将这个entry值直接进行更新。 现在的话我们就是要知道我们更新的实体是在这个参数级别,我们对应的去构建出我们的损失函数值。损失函数也就是在policy和环境交互的数据分布之下。智能体比如它能访问到的状态,它有一个真实的状态价值。还有一个我们当前V西塔这样一个参数化的值函数,预测出来它的价值之间的一个means square area。以这种方式我们去构建出基于当前参数下的这个损失函数。然后目标我们当然就是去降低当前的这样一个损失函数。于是也就是在当前的这样一个数据分布之下,我们基于这个损失函数对于CR进行求导,那么就会有V排S减去VCRS与VCRS里面用链式法则进去去求相应的导数。 就在这个时候,我们后面其实更多关注的点就在于这个所谓的VPS这样一个placeholder,它应该装什么样的价值进去。这个就是我们可以去做出一些具体实现的过程。而对于单次采样的话,我们当然就是对于一次observation。像SGD1样,我们有一个目标算出来有一个estimation。那么我们目标减去estimation,然后再对相应的参数在这个S这个状态进行求导就可以了,对吧? 一个最简单的例子,比如说我们刚刚其实提到了一个三维的一个实体在空间当中进行飞行。比如说直升机,它就会有相应的特征表示。比如说3D的速度、3D的位置、3D的加速度。这个总共有九个实数值来表示它的这样一个状态,速度和加速度。基于这个我们其实是将S这个状态,把它以特征的形式表现出来。它不再是一个格子,它不再是一个ID了,它是一个特征函数或者特征向量。基于这个特征向量,我们以参数化的模型去对于这个特征向量去做出相关的价值估计。 具体的价值函数学习的方法,我们可以举这样一个例子。最简单的方式就是线性的模型。所有的只要是这个参数化模型当中,我们可以其实第一点想到的就是线性模型。 线性模型是最简单的参数化模型。比如说我们对于我们当前的这个状态抽取出了它相关的特征向量XS那么当然就是linear transports?Linda的data transport XS直接回归出它相关的这样一个价值的值,那么就是VCS基于这个的话,我们对于这个西塔去做出损失函数的构建,对于SATA去求gradient。我当前的估计就是SATA transports XS和这个正的VPS这个目标值。那具体放什么我们后面再讲。去做了这个误差之后,它再对于C塔求grant,那当然就是XS因为我们的这个线性函数对C要求gent就是数据向量本身的这就是一个最直接的一个计算方式。 于是在这个时候我们会考虑说,我们的目标值这个VPS应该填入什么样的值呢?和我们之前的这个模型参数化估计的方法一样,我们可以去选择这个最简单的蒙特卡罗的方法,MC的方法去做相关的一个值的替代。比如说我站在一条条件基础之上,它经过了某些state,我就可以计算它接下来会得到的return是多少。就比如说S1G1、C2、G2这样子,那么这条create它背后的之后的return是多少,可以直接算得。之后我就拿这个G作为目标值去更新,以各种方式去更新当前的参数。西塔对吧?这就是一个最简单的基于参数化函数的方式去做MC的一个更新,是函数更新。 MC的方法的话,因为它其实在这个ata space之下,我们其实因为MC的采样是unbiased的。虽然它会有various,但是所有的采样是on bias。就像你要去计算一个分布的平均值,它的variance再大,只要你访问到了足够多的次数,你的这个variance,你的这个均值也会无限收敛于它真实的期望值。所以说在线性函数的space当中,它会存在着最优解。这个最优解决它它应该是概率一的形式,最终收敛到全局最优解。因为它本身它在线性函数的space下是一个可收敛的一个思路,是这是比较直接的一个方法。 于是我们还可以用temple difference,因为有MC就有TD,我们去算一个目标值的。我们当然也可以去使用一步的这种reward加上一步的state transition之后,接下来的date的value值作为目标值来代替当前的这样一个一派,去做出一个对于参数西塔的一个更新。于是一样的计算方式,只是说我们将这个红色的这个VPS的这个位置带入的value,就是reward加上伽马乘三下一个状态的这么一个值函数的值就可以了。具体的那就是比如说我们的brilliant最后如果是线性的话,那它就背后是乘上的是数据向量本身去更新我当前的参数值就可以了。其实我们除了V派S以外的话,我们对于Q派SA也是一样的进行更新。这里几乎是完全一样的,所以说也不过多的去做赘述。 对于这个也是一个place holder放在这个位置,我可以用MC的方法,也可以拿TE的方法去填充这样一个价值位置。然后最后的QAC的形式去拟合这个填充的值。那么它对于这个CA grade也是一样的,通过链式法则的方式传进去就可以了。这正是因为这种方式,我们可以发现,我们如果是参数化的可微的函数的话,它可以更加方便的通过定义相关的损失函数,就能够直接导出它参数的跟进的方程。相应的如果说我们是比如说决策树等等的话,他往往得是使用比如说梯度上升决策树那个方式,沿着梯度的方向找一颗决策树出来。这个我们在比如说ad boost这个上这机器学习的课程当中,其实是涉及到相关的这方面的内容的。 如果我们进入到的是这个线性的Q函数的话,那么它更新的公式也是非常直接的。在这个位置我们是带入了data transports x的形式。那么gradient就是X本身只是说我抽的feature,它可以。是一个S和A的pair去联合在一起抽一个相应的feature。那这个时候你可能抽的feature就会更加的以这种payer的形式去抽。比如说你可能抽到一个feature是直升机当前飞得很高,并且它的速度又很快。在这种情况下你可能会以这个pair的形式抽出来feature。 如果你单独的以S或者A的形式去抽的话,你就不会去抽到这种铁的feature。比如说它飞的又很高,但是又很快。于是在这个时候,我们如果是使用的是TE的方法的话,那也一样的在一步的reward基础之上,我们也看到了接下来的state。 如果说我们是follow了一个比如说on policy的方法,飒飒比如说这样一种方法的话,我们其实得到了接下来在SDIE的这个位置,当前智能体选择的action AT加1。在这个位置我们就得到了几个新的QPISA的形式。如果是纯MC的,但直接去看SH之后才能得到所有的对称之和,就能直接得到这个小的机体,就对它进行更新。于是在这个时候大家可能会问,我这个AT加一是怎么去寻找呢?如果是纯萨沙的方法,也就是说你的policy可以在环境在交互的过程当中直接采到五元组。那咱就直接把它带进去,去做更新就可以了。 如果说咱是一个off policy更新,是从一个behavior policy缪当中去采样。出了历史轨迹的话,那不好意思,咱如果不想用porton品的话,你就得采四元组,然后站在当前新的ST的这个位置去采一个ATAT加1,除就是说STAT、RTT加1,这是BO采出来的那站在这个位置,我们可以去follow当前的,比如说follow当前的q function去采的一个属于当前a policy的一个AT加1Price。AT加1Price是当前policy才出来的。基于这样一个新的五元组,我们就可以follow当前grade的方式去更新当前policy pata就是这样一个点值就可以进行更新。所以在这时候大家可以看到,我们仍然是以一种像是寻找策略提升,然后沿着策略提升点去做相关的策略更新的这种方式。 首先第一点,我们在当前的这个位置有了某一个q function的一个参数。基于当前q function参数,我们是可以对我的策略去做出grade的更新或者更新或者是soft max的更新,都是follow了这个梯度提升定理,对它进行一个保证的。而当我的策略进行一定的更新之后,我毫无疑问又可以去follow当前策略,去更新我当前的参数data。使得当前的这个Q西塔的这样一个价值函数,它可以更加的虚拟和更新之后的pad的函数。 那么这个位置我们为什么不把它画到底呢?原因是在于一我们的QC ta的建模方式是对于函数有一定假设的。所以说它是不可能大概率不可能是真正的囊括进我们真正的Q函数在里面的,这是第一点。第二点就是说我们的更新并不一定是要收敛的,不可能就更新一两步,那我们走到了一个新的Q函数的位置就可以了。基于这种没有收敛到的这种Q函数,它只要encode进了相关跟新的方向,我们再去做基于当前拟合出来的这种approximates t的Q函数做策略提升。我们也可以去提升我们策略的一个相应的性能。比如说以ipsum grade的方式,要比之前提升之前的epson的策略要来的更加好一些。于是在这个时候,大家可以看到,我们其实上一节课后面的部分讲到了多步时序差分的方法。 最简单的这个都是时序差分叫TD00,就是兰姆达等于0的时候,你只看第一步更新,只看一步的实力差分,你不看两步三步或者无重复的时域差分。在这个时候,我们可以看到这边有一个用红色的来写目标值的方式,它本身是真正的目标值是写在这个V排ST的这个位置。只不过我们用TD的方法,用以值拷贝的方式去替代了这个V派ST。那Q派也是一样的,用值拷贝的方式去替代了QPS a所以说在这个时候,如果大家直接看这个公式的话,就会有一个问题。甚至大家在写代码的时候也会有专门就会有这样一个问题。 因为大家现在写代码都用python t去写,它是直接对于参数自动求导。所以说当你这个函数如果写成这个样子的时候,你会发现这边有两个西塔。如果你不管它,你就直接求导了。直接求导的话,这一项和这一项它都会对于西塔直接求导。那么我们会对它直接求导吗?这其实是在所有时序查分当中,他都会碰到这样的问题。我们在这里只是因为大家好像现在使用的是自动求角器,会反而更加认识这个问题。 但是大家其实在这之前做tabulate reinforce learning的时候,有没有注意到咱们更新的时候,只更新当前这一步state的value function,从来不会跟下一步作为目标值的state function在TD里面我也不会这么做。原因是什么?原因就是我们推导这个TD的过程,在这个位置我们的目标值其实是真正的价值函数,价值的那个值是多少?我们只不过是使用了一部TD的方式去用值赋能的方式去把这个价值拿到而已。我们完全可以用的方法去拿MC方法上已经没有这种所谓的梯度的问题了。因为所有的都是纯数据,我们只是为了去estimate这个VPST使用了一步再加上下一步BS的形式去拿,这是第一点。 第二点就是说如果说我们要去做agent的话,你基本上看看这个公式,你就知道这grant它带来的意义是什么呢?就是说使得我前面这样一个S价值,我take grade更新完我的西塔之后,我是使得VS去往后面去靠近对吧?是往reward加上下一步的价值函数去靠近。 这是我们强化学习更新的一个基本的顺序。就是说我站在当前state,我对当前state本身要去做更新,是因为我看到了未来额外的信息之后,我会去更新我当前的estimation。从来没有一种情况是我看到了我当前的estimation之后,我去让未来去拟合我现在的estimation。因为在这个过程当中有一个信息量的区别,因为我我对于未来我是VST加一加上reward去做相应的更新。相当于我看到了额外的信息量,我才去做相关的更新。而绝对不是说是我未来的信息量。因为我这一步的reward再加上这一步的装价值,去更新我未来的这样一个相应的data。 当然另外一点就是说毫无疑问,这个一方面是我们对它的原理上的理解,另外一方面是大家也可以去尝试一下。如果说真的是配grant在ST加一的这个位置,它会发生什么现象?使得你的学习的不稳定性会有极大的提升。因为你其实这个ST加一你走到这个位置,它其实更多的是关注它接下来应该看到怎样的一个return,是这样做更新。它的定义是接下来我要看到怎样的return,而不是说因为前面你会看到你前面的mention看到怎样的return。所以说你现在会看到什么样的return,这是一个表达一个理解上的一个做一些简单的案例。 这个DQN是我们深度强化学习当中的第一篇论文。它的impressive的地方就在于它是直接输入的连续四帧的图片像素。对于每一个action,其实也就是按键的action去做出Q价值的估计。最终它能够去在原版的算法名字3分之2左右的一个游戏任务上能够打败人类。这个是一个在当时来看是非常impressive的一个效果。 那么使用深度神经网络去表示Q函数的好处在什么地方呢?我可以让深度神经网络去自动的去挖掘出我们相关的输入像素之间的这种关系。深度神经网络它其实有一个问题在于说,因为它的计算的复杂度比较高,比较深入,所以说我们的输入不再是QSA的SA pair,而是说输入的就是S对于S本身的理解,其实你对他的所有action来说都接近于一样。 我们只需要在最后这一步的时候,对于每一个既定好的action去直接吐出它相关的SA就可以了。比如说它是一个S输进去吐出,比如说在这边可能有18个QSA,就是说有18个头吐出18个value值的这么一个架构。这样的话只需要过一遍当前状态就可以了。 于是在这个时候,我们就可以去构建说它相关的一个等式函数。也就是我们基于一个replay buffer当中,我们uniform的去采样相关的数据,然后去构建出我们的目标的Q值,也就是reward加上站在SPME的基础之上,我们去选择一个最好的action a pre得到的Q值去做出它的目标Q值。然后再对于当前的要预测的QSA的Q值去做出相关的一个更新。那么更新的值是什么呢?就更新的是当前这个round下的ta I就是当前的塔。而这个所谓的西塔I减,其实你可以认为是西塔I减1,就是说锁住了的不变的上一轮的西塔。 这样做的好处在于说,我们在更新一个西塔函数的时候,大家可以发现我但凡更新一步,其实它的所有函数全更新了。以前不是这样,我们做tabulate enforcement更新这个entry的时候,其他entry是不变的你相当于是做了一个局部更新。但是在这边你一旦更新了一个参数,那就是所有space下的所有输出全部更新。所以说在这个时候你会发现说有的值。如果说我们在这个时候,在有的mini batch之下,我们就更新了这个参数西塔的话。那么在下一个命令标记的时候,这个新的参数将会出现在目标值的位置上,它都还没有更新完一轮的时候,它就出现在目标位置上的话,它会影响接下来的那另外一点就是说神经网络本身它是特别容易拟合在局部数据之上的。所以说我们在做有监督学习的深度学习的时候,往往都是将数据去做一个suffer,做出一个均匀性打乱,然后对它进行更新。使得我们每一次明星办起在做采样的时候,我们的数据本身都是可以说是uniform的,或者说是均匀的从我们想要的数据分布当中去采样得到的。 但是对于q learning而言,第一点它本来就是of policy,它本身就是理解其他策略采样出来的数据。另外一点,我们在做学习的时候,本身这个智能体它也在为我们的replay buffer累计更多的数据。但是智能起家也知道它走在不同的位置上,它数据本身就不是uniformally从row pie当中踩出来的。所以说在这个时候我们就需要对于我们的reply buffer进行一个shaffer。其实也就是对它进行一个均匀的数据抽样,而不再是比如说按照一个顺序去抽样。这样子的话拟合到神经网络一定会去拟合到最近我抽取出来的数据分布上。这样的话在其他远处的数据份上,它就起到了一个out of distribution。完全靠自身inductive bias去做出泛化,就会有这种风险。 以上就是关于这个价值函数去做出参数化定义函数的构建,去学习参数本身的这么一些相应的方法。它其实非常strain forward。我们无论是MC也好还是TD也好,我们只是需要去算得一个它的目标值。然后对于目标值去做出mean square error的这样一个回归的损失函数。再通过链式法则的方式,我们就可以去对于我们的大致函数当中的参数去做出梯度更新。这就是基本上整条思路,对不对于是接下来我们就会讲另外一个部分。既然我们的价值函数这个模块是可以使用参数化的函数对它进行建模的这样子我们建完模之后,我们的价值函数就变成了一个你无论是输入是连续的状态,还是连续状态,动作还是非常大space的,我们都可以去统一的对它进行建模,对它进行更新的。 另外一点就是那那策略是也是一样的。因为如果说我策略仍然是一个tabler的格子的话,你的价值函数就算建模出来了,那么你的策略本身仍然是一个问题,所以在这个时候,我们可以考虑策略本身它本质上是一个什么东西?它本质上就是一函数,也可以是一个conditional的,就条件概率分布。无论说它是一个函数,函数的意思就是说我基于当前状态,我一定只输出一个action,非常确定的deterministic这么一个mapping对吧?还有另一种情况就是说它是一个stop casting,它是一个conditional probability。在这种情况下,无论是哪一种,我们都可以以参数化的函数的形式对它进行一个建模。但是它就是一个连续可导的函数,一对一的输出。 还是说它是一个我们可以对于它的分布本身以参数化的形式去做出建模。比如说它的分布是一个高斯分布,它的均值和协方差矩阵可以用参数西塔的形式计算出来。这样我们都是以更新参数的形式在更新这个策略本身。 以这样的情况我们就可以去更新我们相应的策略了,关键点是在于如何进行更新,好的,这个时候我们就不得不说一点,就是说我们在强化学当中有两个最核心的模块。一个模块是价值函数模块,另外一个模块是我们的策略模块。价值函数模块负责评估,去评估什么是好的,什么是坏的,哪些state是好的,哪些action是好的。是真正最后落实的时候是策略。策略是直接给出我在当前状态下我应该去选择怎么样的动作的这样一个map?所以强化学习本身,我们学习价值它是一个非常重要的部分。它的作用其实就是找到所谓的策略提升点,最终我们要蒸出来的我们就争这个词,我用的就是这蒸馏的争,最后蒸馏出来的是我们想要的策略本身。 就是说我们最后我们再去建模,基于策略的强化学,就是policy base的时候,我们往往是在做什么事儿呢?就是说它其实是在做更本质的事情。在这个时候在做建模的时候,它其实都是在做我们的j function。 以前在做价值函数的时候,往往是在做价值函数去拟合它的目标值的。但是如果说我们是在做policy的时候,我们在做一件什么事呢?我们其实是在算这个policy自己通过和环境进行交互,他能取得什么样的价值。所以说如果是value function,value message, 我们其实用它去做建模的时候,其实建模的是在policy和环境交互的数据分布之下。我们的所谓的比如说VPS和我们的真正的VS之间的军方误差的形成。这是一个我们希望能够去建模价值函数拟合的准和不准的这么一个问题。 但是如果是policy本身的话,我们建模的是什么?我们同样去使用借的这么一个函数形式,仍然是使用的是参数化的这种方式去构建这个policy和环境交互的过程当中,它能够取得的数据分布之下,我们simply要去建模的就policy它能够去取得的奖励值是多少,这个是一个核心的区别。第一个区别大家可以看到我在建模的是一个纯分布下的拟合问题,去拟合一个目标值。第二个问题是什么呢?就是说这个分布首先第一点就是这个分布它其实怎么认为呢?就是说其实它是不变的。因为我的价值函数在这个位置,在这次拟合当中,它其实分布已经不变。 但是在策略优化当中,我们可以看到,其实在这一步上面,我们一旦是策略本身的话,我们马上修改的就是这个数据分布的变化。数据分布本身就会马上就发生相应的变化。但其实我们最终使用的时候,使用是什么?其实最终强化学习最后吐出来的就是一个我们用的是这个东西。如果说我们最终吐出来的是V的话,我们一样还要再经历一步操作,把这个V打包rap成一个policy,最终是这个智能体policy,再和这个环境进行交互。 那么策略本身它到底应该如何去学习呢?我们首先要从一个角度,就是说直觉性的角度去思考。就好比说我们在学习价值函数的时候,我们知道说价值函数学习的目标是拟合真实的价值函数。于是它是一个拟合过程,它是一个预测是否更加精准的过程。 那么策略在做什么事?我们在学习策略的时候,其实是在maximum它的一个目标值。那这目标值是什么呢?就是说如果我们站在当前一个状态下选择了一个动作,这个动作带来了积极的后果,比如说得到了一个很棒的正向的奖励值,那么我们就应该更新我们相应参数。以后见到这样的状态多都采用当前的选择的这个动作。如果说我们选择的动作是一个带来了负向奖励的动作,那我们就应该弱化在当前状态下选择这个动作概率,这才是真正的谈话学习。大家有没有注意到所谓强学的意思就是你选择这个动作来碰巧它好的,于是你以后就强化这样的选择。相反的,如果这动作差,你就弱化以后这样的选择,你获得了相应的教训。 比如说我们初始化一个策略,它使得他在这样一个action space下,在当前状态下它的五个action都是0.2的概率。他选择了一个A2的动作。比如说直接采用了A2动作,观察到了正向的奖励值,那么于是他就应该修改它相应的参数,使得以后见到当前的这种状态下,它A二的这个概率就会提升。那么相应的A1、A3、A4、A5就会相应的下降,因为它是一个Normal less的distribution。那如果以后又采取了一个动作,碰巧踩到了A三这个动作,观察到了负向的奖励的话,那负向的奖励以后就弱化在当前的这个状态下去彩A三的这个概率,选A三的这个概率占的比较低。那么其他四个数字会稍微的提升一些,以这种方式以强化或者弱化的方式来learning from feedback。 接下来的问题就在于我们如何对它进行一个学习。这个学习过程我们以定金的形式给他进行一个表述。那如何以定量的形式来进行表述呢? 在强化学当中其实有一个非常动态性的东西,就是state transition。我们可以想象看,如果没有这个state tradition,那么整个mark决策过程就是一个状态。每次从一个static的distribution tion当中就是采样出一个状态。这个状态有了之后,策略基于当前状态选择一个动作,然后获得一个奖励。这个APP or直接结束,结束之后下一个APP store,咱再从一个static的distribution当中采样一个状态。这个状态就已经跟我们上一个action没有关系了,因为它是完全新的every four。 在这种情况下,我们其实就更好的可以去分析说我的策略的价值是多少,我应该如何对它进行一个优化。在这个时候我们就定义策略的价值,它相应的期望其实就是每一步他获得的奖励的期望值。这个时候我们这个状态肯定是DS采样出来的这样一个概率值。在基于这个DS采样出来的概率的状态,我们x policy选择一个动作A获得了相应的RSC的这样一个奖励。我们再对A去做一个求和。也就是在当前这个环境D的分布之下,在policy派的分布之下,我们得到的奖励值。的期望是多少? 这是一步的MDP很显然这里面有一些带参数西塔的项,我们就可以接接ta在SATA这个点上去。对c ent那很显然就是这个DS跟它没关系,就直接加和了。这个过程当中我们就可以对派塔A跟S等于西塔进行求导,求完导之后,后面这个RAC跟西塔其实没有关系,它就是跟SA有关系,我们就可以对它进行一个计算。 那计算的过程是什么样的呢?我们其实使用了一个数学当中的一个恒等变化,叫做live code ratio似然比。这个变化什么意思呢?我们要去做一个变化,就是在这之前我们首先去讲likelihood racial这个trick是怎样做的。就对于任何一个函数,我对于参数C要进行求导。这个派其实在这个时候就是一个函数,它不是一个所谓的分布。因为我的A都会给定了出A的概率派,SATA a conditional s就是出A的概率值是多少。 比如说0.35,它就是一个函数本身,这函数本身对参数进行求导,它可以前面乘上这个函数,后面再除上这个函数,再乘上这个倒数。但是后面这一项我们就可以把它merge起来,变成是前面这个是乘上的拍本身。后面这一项的话大家可以看到就是log拍对于参数CR去求导。 我去做这件事情的原因是什么呢?就因为前面我想再凑一个派出来,为什么要凑一个派出来?大家可以看到我对于J这个函数J的定义就是原来的这个定义。我对于这要对于参数C的求导的话,DS以及照写后面就是这个派,这个红色的派对于CR的求导。 对CR求导的话,我们按照上面的这个式子派对于CR求导,前面可以凑出来一个派,后面的变成是log派。对于CR的求导就是前面凑出来这个派之后,后面变成log派。对于CR进球的后面再乘上的RAC前面的这个加和,我又可以像上面这样子又收回去,变成是拍的期望。在派的期望下,只是里面我从求导之后,本来原来是RAC是目标值,求导的时候,里边变成了log派,腾上了log派。 对于西塔的求导再乘上RAC那么我们这样做的原因是什么呢?大家可以看到前面的这个数据分布,咱就可以直接去写了。这个数据分布是啥?是这个策略和环境交互得到的数据分布,得到了SA的分布。 得到SA分布之后,我就可以对它进行采样,对不对?我虽然对SA分布本身写不出来,但是也可以写得出来。因为它是DS乘上派SA的形式。但是我可以采样了这个策略和这个环境的交互,采样了比如说100个点,那100个点100个RAC,那么我都可以去计算在100个是RAC之上,每一个RAC这个log派它吐出来的值是多少。对take grade再乘上具体的RSA的这个标量的奖励值,我们就可以直接算的。对于梯度的这么一个矢量方向,我们就可以沿着这个梯度方向去更新我们的参数。 西塔。这就是一个在一步的mdb之下,我们对于我们的策略的参数去做出学习的一个具体的公式。这个公式之下其实大家可以想象就是它到底代表了什么。其实策略它的价值,它仍然是一个关于参数西塔的一个函数值。只不过他碰巧是写在了求期望的那个distribution里面。 强调其实我们讲了很多节课了,其实我们其实并没有直接告诉大家在这里面怎么对比,在期望这里面,在这个下标下的参数需求gradient的需求学习方法。只是我们非常熟悉的是在这个中括号里面,如果有这个参数的话,我们怎么对待two grade的去做学习。这次是第一次移步马尔可夫决策过程的问题,我们对于参数data在期望下标里面去做出grain方式。这个其实likelihood RAAIO这个trick其实是我们在任何的这种求期望下标的当中,参数不一定的时候都可以去使用的一个trick。也就是在里面加上了一个logo的形式就可以。 我们再稍微分析一下到底是什么意思,就是这个gradient它到底是什么意思?我们再写一遍,这西塔grant等于的是数据分布下log派西塔a condition s这个东西,log派degraded这个事情我们好像是在哪见过呢?在有监督学习当中见过,尤其是在这个分类问题上,我们见过怎么做呢?分类问题上其实是一个log LOD的这么一个东西。这个log l od是什么呢?其实是和外的pair 3 from数据的分布。在这个分布之下,我要去对它去做gradient的,其实是log probability什么的。我们的函数这里就是probability data。 我出外的likely od比如说我是一个dic regression,那Y是一和0,那么除一的出具体外的这样一个概率,take great of thea, 这后面是什么是一,为什么是一呢?因为这个数据本身它其实就是纯训练数据,它是从我们的训练数据集当中采样出来的。所以说是这样一个写法,这是分类问题当中的写法。只不过这个分类问题我们按照likely hold的写法去写的话,我们都是希望能够去朝着他往上涨的方向去找。在这个时候大家可以看到这是什么问题?这也是有监督学习的训练方式,这是强化学习的策略梯度的方式。 它之间区别在什么地方?有两项区别。第一项区别是数据分布,一个是给好的,你只需要去监督就行了。这是什么东西?这在强化学当中叫做专家数据,我已经给你给好了。你根据当前的这个你的函数预测器,西塔它到底是什么也不用管,跟这个数据分布没有变化,这个数据分布就运输专家给你的,永远去拟合它就可以了。 第二点就是说这个位置这是R,一个是A一对不对?因为我告诉你这是专家数据,所以它的永远的reward就是那个r max,就是一对不对?在这个数据就是一竖,所有数据的这个weight是一样的。而在这边你的数据是由你的这个策略当前采出来的,当然有好有坏。所以我们对它进行一个数据相当于加权,对不对?他如果采取的reward的,他得到reward高,那咱就加权,就拟合这个action,拟合的进度要快一点。如果这个reward是小的甚至是负的,我们其实在拟合的这个过程当中就拟合的慢,或者是说甚至是往反方向去拟合。使得我降低对他的action,对这个action的概率的一个学习的对一个猜出来的概率。 所以大家可以看到,其实这就是强化学有监督学习和RO间的最核心的区别也好,或者说connection也好。我们会考虑就是说如果我们之前讲到的这个智力是one step m里边一步的NDP对吧?推广的多步,那其实就是stage addition,它其实建模起来会稍微的困难一点。其实你会发现什么呢?一步我其实关注的就是一步的reward,对不对?那多步我关注的什么?其实就是价值,也就是QSA我选择这是我接下来会获得怎样的一个价值,未来的return是多少?我基于这个未来的return,我也一样的可以去做出策略提升。其实我们就可以发现这个gradient在多步的情况下,它很简洁的可以被写成是把这个reward直接simply改成Q函数就可以了,RSA改成QSA就可以了。 当然这个是需要相应的证明的,这个是一个定理,叫做策略梯度定理。维奇萨姆提出来的,也所以说他为什么是强化学习的鼻祖?他的Q也是他提的,这个对梯度定理是他提的,有很多最关键的强化学习技术的第一版本是他提的。而且我的目标值无论是以第一个以初始状态为价值的开始计算的方式,还是以接average r就是说average return,我这个策略和环境进行交互,我average每一步获得了return,或者是说average reward,或者average value。 就是说我在每一步我去计算价值函数,我去对于我每次遭遇到的data去做average,最后的graden都是一样的,都就是当前的great,即以Q作为这个价值函数,作为一个对于当前的这个c pair的一个加权值,去加权我对于A的拟合,现在S的位置,对于A出A的这个likelihood拟合。大家可以想象看,在这个时候,如果说我的Q值比较大,那我得到的结果,但一定是我以后站在S这个位置,更likely的去出当前的这个A了。不过我当前的这个Q值比较小,即使它是正数,它只要小于average的Q值,它涨的速度就慢,对不对?那么average一下或者是Normal s一下之后,他以后他take action a的概率就是小了。当然如果Q值是负数,那那马上就往往反方向学习,对不对?他以后就直接变小了,吧?这就是强化学习的本质,我强化能够给我带来甜头的X决策,我弱化给我带来苦头的决策。 这就是基督定理它给我们的一个诠释,它背后的多步的推导。因为我们现在是多步的全球性,不再是一步的MDP了。它背后推导我们都会放在这个slide的附录当中,以及放在我们课程的第一讲提供的这辅助证明材料当中,大家可以去相应的去阅读,去看看它推导的过程。 基于这样一个速度提升定理的话,我们可以发现这边有一项叫做QAA。这个QAC它其实定义的是说在当前policy之下。我在SA上能够去取得怎样的一个?很显然我们就可以去使用MC的方法,将这样一个价值通过采样的方式,在求average的方式直接拿到它。这个QSC咱就直接在这个位置改成GT的形式。也就是说我站在这个位置是之后,能够去获得怎样的一个return,那这个方法就叫做reinforce这个方法。 Reinforce这个方法大家不要注意,不是一个单词,它是一个缩写。具体的缩写我已经忘记了,大家可以去查阅它的reference。它其实是一个缩写,它它写的很好,就是要强化的这个形式。它的一个坏处毫无疑问就是它vis很大。因为机器的,但它好处在于它是一个非常直接的计算的方式,它也是往往它也能学出效果的一种策略梯度的方法。下节课我们再讲act critic相关的框架,我们这节课就讲到这里。

Podcast Editor
Podcast.json
Preview
Audio