22年底/23年初ChatGPT大火,在写《ChatGPT通俗导论》的过程中,发现ChatGPT背后技术涉及到了RL/RLHF,于是又深入研究RL,研究RL的过程中又发现里面的数学公式相比ML/DL更多,于此激发我一边深入RL,一边重修微积分、概率统计、最优化,前者成就了本篇RL极简入门,后者成就了另两篇数学笔记:概率统计极简入门(23修订版)、一文通透优化算法(23修订版)
如上篇ChatGPT笔记所说,本文最早是作为ChatGPT笔记的第一部分的,但RL细节众多,如果想完全在上篇笔记里全部介绍清楚,最后篇幅将长之又长同时还影响完读率,为了避免因为篇幅限制而导致RL很多细节阐述的不够细致,故把RL相关的部分从上文中抽取出来独立成本文
另,本文有两个特色
总之,大部分写书、写教材、写文章的人过了那个从不懂到懂的过程,所以懂的人写给不懂的人看,处处都是用已懂的思维去写,而不是用怎么从不懂到懂的思维 去写,未来三年 奋笔疾书,不断给更多初学者普及AI和RL技术
强化学习里面的概念、公式,相比ML/DL特别多,初学者刚学RL时,很容易被接连不断的概念、公式给绕晕,而且经常忘记概念与公式符号表达的一一对应。
为此,我建议学习RL的第一步就是一定要扎实关于RL的一些最基本的概念、公式(不要在扎实基础的阶段图快或图囵吞枣,不然后面得花更多的时间、更大的代价去弥补),且把概念与公式的一一对应关系牢记于心,这很重要。当然,为最大限度的提高本文的可读性,我会尽可能的多举例、多配图。
另,RL里面存着大量的数学,考虑到可以为通俗而增加篇幅,但不为了介绍而介绍式的增加篇幅,故
话休絮烦,下面进入正题,且先直接给出强化学习的定义和其流程,然后再逐一拆解、说明。
所谓强化学习(Reinforcement Learning,简称RL),是指基于智能体在复杂、不确定的环境中最大化它能获得的奖励,从而达到自主决策的目的。
经典的强化学习模型可以总结为下图的形式(你可以理解为任何强化学习都包含这几个基本部分:智能体、行为、环境、状态、奖励):
一般的文章在介绍这些概念时很容易一带而过,这里我把每个概念都逐一解释下
总的而言,Agent依据策略决策从而执行动作action,然后通过感知环境Environment从而获取环境的状态state,进而,最后得到奖励reward(以便下次再到相同状态时能采取更优的动作),然后再继续按此流程“依据策略执行动作-感知状态--得到奖励”循环进行。
此外,RL和监督学习(supervised learning)的区别:
进一步,RL为得到最优策略从而获取最大化奖励,有
可能你还有点懵懵懂懂,没关系,毕竟还有不少背景知识还没有交待,比如RL其实是一个马尔可夫决策过程(Markov decision process,MDP),而为说清楚MDP,得先从随机过程、马尔可夫过程(Markov process,简称MP)开始讲起,故为考虑逻辑清晰,我们还是把整个继承/脉络梳理下。
如HMM学习最佳范例中所说,有一类现象是确定性的现象,比如红绿灯系统,红灯之后一定是红黄、接着绿灯、黄灯,最后又红灯,每一个状态之间的变化是确定的
但还有一类现象则不是确定的,比如今天是晴天,谁也没法百分百确定明天一定是晴天还是雨天、阴天(即便有天气预报)
对于这种假设具有个状态的模型
下面的状态转移矩阵显示的是天气例子中可能的状态转移概率:
也就是说,如果昨天是晴天,那么今天是晴天的概率为0.5,是多云的概率为0.375、是雨天的概率为0.125,且这三种天气状态的概率之和必为1。
接下来,我们来抽象建模下。正如概率论的研究对象是静态的随机现象,而随机过程的研究对象是随时间演变的随机现象(比如天气随时间的变化):
在马尔可夫过程的基础上加入奖励函数和折扣因子,就可以得到马尔可夫奖励过程(Markov reward process,MRP)。其中
而一个状态的期望回报就称之为这个状态的价值,所有状态的价值则组成了所谓的价值函数,用公式表达为,展开一下可得
在上式最后一个等式中
从而,综合前后两个部分可得
而这就是所谓的贝尔曼方程(bellman equation)。该公式精准而简洁,其背后浓缩了很多信息,为形象起见,举个例子,比如状态得到的即时奖励为,然后接下来,有
其中折扣因此为,那么因状态而得到的一切奖励为
类似的,因状态得到的一切奖励为
为更加形象起见,再举一个生活中最常见的“吃饭-抽烟/剔牙”例子
比如你吃完饭后你自己的心情愉悦值即奖励+5,然后下一个状态,有
- 0.6的概率是抽烟(抽烟带来的心情愉悦值即奖励+7,要不说 饭后一支烟 赛过活神仙呢)
- 0.4的概率是剔牙(剔牙带来的奖励值+3)
假设折扣因子(上文说过了,就是一个状态对后续状态的贡献程度)为0.5,且假定
- 吃饭的状态定义为,则
- 抽烟的状态定义为,则,且由于抽烟之后无后续状态,所以也是7
- 剔牙的状态定义为,则,且由于剔牙之后无后续状态,所以也是3
从而有:
当从时,
当从时,由于状态和状态没有后续状态,所以和对应的状态值函数分别为
当然,你也可以如此计算(可以很明显的看出,计算量不如上述过程简洁,所以一般优先按上述方式计算)
上述例子的状态比较少所以计算量不大,但当状态一多,则贝尔曼方程的计算量还是比较大的,而求解较大规模的马尔可夫奖励过程中的价值函数时,可以用的方法包括:动态规划、蒙特卡洛方法、时序差分(temporal difference,简称TD)方法
当然,其中细节还是不少的,下文第二部分会详述这三大方法
根据上文我们已经得知,在随机过程的基础上
在马尔可夫决策过程中,(是状态的集合)和(是奖励的集合)的每个可能的值出现的概率只取决于前一个状态和前一个动作(是动作的集合),并且与更早之前的状态和动作完全无关
换言之,当给定当前状态(比如),以及当前采取的动作(比如),那么下一个状态出现的概率,可由状态转移概率矩阵表示如下
考虑到在当前状态和当前动作确定后,那么其对应的即时奖励则也确定了,故sutton的RL一书中,给的状态转移概率矩阵类似为
从而可得奖励函数即为
至于过程中采取什么样的动作就涉及到策略policy,策略函数可以表述为函数(当然,这里的跟圆周率没半毛钱关系)
通过上文,我们已经知道不同状态出现的概率不一样(比如今天是晴天,那明天是晴天,还是雨天、阴天不一定),同一状态下执行不同动作的概率也不一样(比如即便在天气预报预测明天大概率是天晴的情况下,你大概率不会带伞,但依然不排除你可能会防止突然下雨而带伞)
而有了动作这个因素之后,我们重新梳理下价值函数
当有了策略、价值函数和模型3个组成部分后,就形成了一个马尔可夫决策过程(Markov decision process)。如下图所示,这个决策过程可视化了状态之间的转移以及采取的动作。
且通过状态转移概率分布,我们可以揭示状态价值函数和动作价值函数之间的联系了
我猜可能有读者会问怎么来的,简略推导如下『至于如果不清楚从第一个等式到第二个等式怎么来的,待后续详述』
而使用策略时,在状态下采取动作的价值等于当前奖励,加上经过衰减的所有可能的下一个状态的状态转移概率与相应的价值的乘积
针对这个公式 大部分资料都会一带而过,但不排除会有不少读者问怎么来的,考虑到对于数学公式咱们不能想当然靠直觉的自认为,所以还是得一五一十的推导下
其中,倒数第二步依据的是 ,最后一步依据的状态转移概率矩阵的定义
接下来,把上面和的计算结果互相代入,可得马尔可夫决策的贝尔曼方程
上述过程可用下图形象化表示(配图来自文献21)
计算示例和更多细节待补充..
上文简单介绍过动态规划,其核心思想在于复杂问题的最优解划分为多个小问题的最优解的求解问题,就像递归一样,且子问题的最优解会被储存起来重复利用
举个例子,输入两个整数n和sum,从数列1,2,3.......n 中随意取几个数,使其和等于sum,要求将其中所有的可能组合列出来。
注意到取n,和不取n个区别即可,考虑是否取第n个数的策略,可以转化为一个只和前n-1个数相关的问题。
所以其关键代码就是
list1.push_front(n); //典型的01背包问题
SumOfkNumber(sum - n, n - 1); //“放”n,前n-1个数“填满”sum-n
list1.pop_front();
SumOfkNumber(sum, n - 1); //不“放”n,前n-1个数“填满”sum
其实,这是一个典型的0-1背包问题,其具体描述为:有件物品和一个容量为的背包。放入第件物品耗费的费用是(也即占用背包的空间容量),得到的价值是,求解将哪些物品装入背包可使价值总和最大。
简单分析下:这是最基础的背包问题,特点是每种物品仅有一件,可以选择放或不放。用子问题定义状态:即表示前件物品恰放入一个容量为的背包可以获得的最大价值
对于“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只和前件物品相关的问题。即:
- 如果不放第件物品,那么问题就转化为“前件物品放入容量为的背包中”,价值为;
- 如果放第件物品,那么问题就转化为“前件物品放入剩下的容量为的背包中”,此时能获得的最大价值就是再加上通过放入第i件物品获得的价值
则其状态转移方程便是:
通过上述这两个个例子,相信你已经看出一些端倪,具体而言,动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。
动态规划算法一般分为以下4个步骤:
换言之,动态规划方法的最优化问题的俩个要素:最优子结构性质,和子问题重叠性质
更多请参看此文(上面阐述什么是DP的内容就来自此文):通俗理解动态规划:由浅入深DP并解决LCS问题(23年修订版)
如果你之前没接触过RL,你确实可能会认为DL只存在于数据结构与算法里,实际上
下面,我们考虑如何求解最优策略
综合上述两点,可得
另,考虑到
故也可以如sutton的RL一书上,这样写满足贝尔曼最优方程的价值函数
相当于当知道奖励函数和状态转换函数时,便可以根据下一个状态的价值来计算当前状态的价值,意味着可以把计算下一个可能状态的价值当成一个子问题,而把计算当前状态的价值看做当前问题,这不刚好就可以用DP来求解了
于是,sutton的RL一书上给出了DP求解最优策略的算法流程
蒙特卡洛(monte carlo,简称MC)方法,也称为统计模拟方法,就是通过大量的随机样本来估算或近似真实值,比如近似估算圆的面经、近似定积分、近似期望、近似随机梯度
比如先看估算圆的面积,如下图
可以通过这个式子来近似计算:圆的面积/ 正方形的面积 = 圆中点的个数/正方形中点的个数
类似的,我们也可以用蒙特卡洛方法来估计一个策略在一个马尔可夫决策过程中的状态价值。考虑到 一个状态的价值是它的期望回报,那么如果我们用策略在MDP上采样很多条序列,然后计算从这个状态出发的回报再求其期望是否就可以了?好像可行!公式如下:
再看下如何估算定积分的值『如果忘了定积分长啥样的,可以通过RL所需数学基础的其中一篇笔记《概率统计极简入门:通俗理解微积分/期望方差/正态分布前世今生(23修订版)》回顾下,比如积分可以理解为由无数个无穷小的面积组成的面积S』
如上图,我们可以通过随机取4个点,然后类似求矩形面积那样(底x高),从而用4个面积的期望来估算定积分的值,为让对面积的估算更准确,我们可以取更多的点,比如,当时
接下来
则有
跟蒙特卡洛方法关联的还有一个重要性采样,不过,暂不急,在第四部分时用到再讲。
当面对状态价值函数的求解时
上述公式总共三个等式
且DP求解状态的状态值函数时,需要利用所有后续状态
但MC求解状态的状态值函数时,需要等一个完整序列结束
总之,TD结合了DP和MC,与DP一致的点时与MC不一致,与DP不一致的点时恰又与MC一致,某种意义上来说,结合了前两大方法各自的优点,从而使得在实际使用中更灵活,具体而言
既然上文可以用时序差分来估计状态价值函数,那是否可以用类似策略迭代的方法来评估动作价值函数呢?毕竟在无模型的RL问题中,动作价值函数比状态价值函数更容易被评估
接下来,我们来看下TD(0)控制如何寻找最优的动作价值函数,并提取出最优策略
TD(0)控制算法有时也被称作Sarsa(0)算法,可以如下表达
此外,上文说过,“TD每过一个time step就利用奖励和值函数 更新一次(当然,这里所说的one-step TD 方法,也可以两步一更新,三步一更新”,这个所谓的多步一更新我们便称之为N步时序差分法
// 待补充
本节推导的核心内容参考自Easy RL教程等资料(但修正了原教程上部分不太准确的描述,且为让初学者更好懂,补充了大量的解释说明和心得理解,倪老师则帮拆解了部分公式)。
另,都说多一个公式则少一个读者,本文要打破这点,虽然本节推导很多,但每一步推导都有介绍到,不会省略任何一步推导,故不用担心看不懂(对本文任何内容有任何问题,都欢迎随时留言评论)。
策略梯度的核心算法思想是:
比如REINFORCE算法便是常见的策略梯度算法,类似下图所示(下图以及本节大部分配图/公式均来自easy RL教程)
接下来,详细阐述。首先,我们已经知道了策略函数可以如此表示:
其中,可以理解为一个我们所熟知的神经网络
如何评价策略的好坏呢?
假设机器人在策略的决策下,形成如下的运动轨迹(类似你玩三国争霸时,你控制角色在各种不同的游戏画面/场景/状态下作出一系列动作,而当完成了系统布置的某个任务时则会得到系统给的奖励,如此,运动轨迹用 表示,从而表示为一个状态、动作、奖励值不断迁移的过程)
可能有读者注意到了,既然奖励是延后的,/后的奖励怎么用而非呢,事实上,sutton RL书上用表示整条轨迹,其实这样更规范,但考虑到不影响大局和下文的推导,本笔记则暂且不细究了
给定智能体或演员的策略参数,可以计算某一条轨迹发生的概率为『轨迹来源于在特定的环境状态下采取特定动作的序列,而特定的状态、特定的动作又分别采样自智能体的动作概率分布、状态的转换概率分布』
其中,有的资料也会把写成为,但由于毕竟是概率,所以更多资料还是写为
那该策略的评价函数便可以设为(以为参数的策略的条件下,产生一系列实际奖励值,且为客观综合起见,最终取的是多个奖励的平均值,即数学期望)
多说一句,这个策略评价函数为方便理解也可以称之为策略价值函数,就像上文的状态价值函数、动作价值函数,说白了,评估策略(包括状态、动作)的价值,就是看其因此得到的期望奖励。故从某种意义上讲,就是
由于每一个轨迹 都有其对应的发生概率,对所有及其出现的概率进行加权并求和出期望值,可得:
上述整个过程如下图所示
通过上文已经知道,想让奖励越大越好,可以使用梯度上升来最大化期望奖励。而要进行梯度上升,先要计算期望奖励的梯度。
考虑对 做梯度运算(再次提醒,忘了什么是梯度的,可以通过梯度的Wikipedia,或这个页面:直观形象地理解方向导数与梯度复习下)
其中,只有 与 有关。再考虑到,可得
从而进一步转化,可得,表示期望的梯度等于对数概率梯度的期望乘以原始函数。
Em,怎么来的?别急,具体推导是
上述推导 总共4个等式3个步骤,其中,第一步 先分母分子都乘以一个,第二步 把代入计算,第三步 根据期望的定义做个简单转换,此处的就是
然不巧的是,期望值无法计算,按照蒙特卡洛方法的原则,可以用采样的方式采样 个轨迹并计算每一个的值,再把每一个的值加起来,如此得到梯度,即(上标代表第条轨迹,而、则分别代表第条轨迹里时刻的动作、状态)
任何必要的中间推导步骤咱不能省,大部分文章基本都是一笔带过,但本文为照顾初学者甚至更初级的初学者,中间的推导过程还是要尽可能逐一说明下:
完美!我们可以直观地理解的梯度计算公式
有一点值得说明的是...,为了提高可读性,还是举个例子来说明吧。
比如到80/90后上大学时喜欢玩的另一个游戏CF(即cross fire,10多年前我在东华理工的时候也经常玩这个,另一个是DNF),虽然玩的是同一个主题比如沙漠战场,但你每场的发挥是不一样的,即便玩到同一个地方(比如A区埋雷的地方),你也可能会控制角色用不同的策略做出不同的动作,比如
- 在第一场游戏里面,我们在状态采取动作 ,在状态采取动作 。且你在同样的状态下,不是每次都会采取动作的,所以我们要记录,在状态 采取 、在状态 采取 等,整场游戏结束以后,得到的奖励是
- 在第二场游戏里面,在状态采取,在状态 采取 ,采样到的就是,得到的奖励是
这时就可以把采样到的数据用梯度计算公式把梯度算出来
- 也就是把每一个与的对拿进来,计算在某一个状态下采取某一个动作的对数概率,对这个概率取梯度
- 然后在梯度前面乘一个权重,权重就是这场游戏的奖励,这也是和一般分类问题的区别所在
- 计算出梯度后,就可以通过更新模型了
策略梯度有个问题,在于是对策略 采样的轨迹 求期望。一旦更新了参数,从 变成 ,在对应状态s下采取动作的概率 就不对了,之前采样的数据也不能用了。
换言之,策略梯度是一个会花很多时间来采样数据的算法,其大多数时间都在采样数据。智能体与环境交互以后,接下来就要更新参数,我们只能更新参数一次,然后就要重新采样数据, 才能再次更新参数。
这显然是非常花时间的,怎么解决这个问题呢?
首先,先来明确两个概念:
回到策略梯度这个采样到的数据只能使用一次的问题,是否可以把同策略模式转变成异策略模式呢?
这个过程具体的做法就叫重要性采样,即通过使用另外一种分布,来逼近所求分布的一种方法。
为备忘,我把2.2.1节得出的梯度计算的公式再贴一下
基于重要性采样的原则,我们用另外一个策略,它就是另外一个演员,与环境做互动采样数据来训练,从而间接计算
但具体怎么操作呢?为说明怎么变换的问题,再举一个例子。
假设有一个函数,需要从分布中采样,应该如何怎么计算()的期望值呢?
如果分布不能做积分,那么只能从分布尽可能多采样更多的,然后全都代入到,按照蒙特卡洛方法的原则取它的平均值就可以得到近似()的期望值:
当不能在分布中采样数据,而只能从另外一个分布中去采样数据时(可以是任何分布),就需要做些变换。
首先,期望值的另一种写法是,对其进行变换,如下式所示,
整理下可得(左边是分布,右边是分布):
如此,便就可以从里面采样 ,再计算,再取期望值。所以就算我们不能从里面采样数据,但只要能从 里面采样数据,就可以计算从 采样 然后代入 以后的期望值。
类似的,当转用去采样数据训练后,得在
最终加上重要性权重之后,可得
怎么来的?完整推导如下
梯度的计算好像差不多了?但实际在做策略梯度的时候,并不是给整个轨迹都一样的分数,而是每一个状态-动作的对会分开来计算,但通过蒙特卡洛方法进行随机抽样的时候,可能会出问题,比如在采样一条轨迹时可能会出现
对于第一个问题,举个例子,比如在某一一个状态,可以执行的动作有a、b、c,但我们可能只采样到动作b或者只采样到动作c,没有采样到动作a
为了解决奖励总是正的的问题,也为避免方差过大,需要在之前梯度计算的公式基础上加一个基准线『此指的baseline,非上面例子中的b,这个所谓的基准线可以是任意函数,只要不依赖于动作即可』
上面说可以是任意函数,这个“任意”吧,对初学者而言可能跟没说一样,所以到底该如何取值呢
而这个一般被定义为优势函数,再考虑到评估动作的价值,就看其因此得到的期望奖励,故一般有,此举意味着在选择一个动作时,根据该动作相对于特定状态下其他可用动作的执行情况来选择,而不是根据该动作的绝对值(由函数估计)
总之,要估测的是在状态采取动作是好的还是不好的:即如果是正的,就要增加概率;如果是负的,就要减少概率
最终在更新梯度的时候,如下式所示『我们用演员去采样出跟,采样出状态跟动作的对,计算这个状态跟动作对的优势』
由于是演员与环境交互的时候计算出来的,基于重要性采样的原则,当从 换到 的时候,就需要在
基础上, 变换成,一变换便得加个重要性权重(即把、用采样出来的概率除掉 、用采样出来的概率),公式如下『Easy RL纸书第1版上把下面公式中的写成了』
接下来,我们可以拆解和,即
于是可得公式
这里需要做一件事情,假设模型是的时候,我们看到的概率,跟模型是的时候,看到的概率是差不多的,即。
为什么可以这样假设呢?一种直观的解释就是很难算,这一项有一个参数,需要拿去跟环境做互动,算出现的概率。 尤其是如果输入是图片的话,同样的根本就不会出现第二次。我们根本没有办法估这一项,所以就直接无视这个问题。
但是是很好算,我们有这个参数,它就是个网络。我们就把带进去,就是游戏画面。 我们有个策略的网络,输入状态,它会输出每一个的概率。所以,我们只要知道和的参数就可以算。
所以,实际上在更新参数的时候,我们就是按照下式来更新参数:
从而最终可以从梯度来反推目标函数,当使用重要性采样的时候,要去优化的目标函数如下式所示,把它记
终于大功告成!
好巧不巧,看似大功告成了,但重要性采样还是有个问题。具体什么问题呢,为更好的说明这个问题,我们回到上文的那个例子中。
还是那两个分布:、,当不能从里面采样数据,而只能从 里面采样数据时,基于重要性采样的原则,虽然我们可以把 换成任何的 ,但是在实现上,和 的差距不能太大。差距太大,会出问题。
比如,虽然上述公式成立,但如果不是计算期望值,而是计算方差,和 是不一样的。因为两个随机变量的平均值相同,并不代表它们的方差相同
此话怎讲?以下是推导过程:
将 、分别代入方差的公式
则分别可得(且考虑到不排除会有比初级更初级的初学者学习本文,故把第二个公式拆解的相对较细)
上述两个公式前后对比,可以很明显的看出,后者的第一项多乘了,如果差距很大,的方差就会很大。
所以结论就是,如果我们只要对分布采样足够多次,对分布采样足够多次,得到的期望值会是一样的。但是如果采样的次数不够多,会因为它们的方差差距可能是很大的,所以就可能得到差别非常大的结果。
这意味着什么呢,意味着我们目前得到的这个公式里
如果 与 相差太多,即这两个分布相差太多,重要性采样的结果就会不好。怎么避免它们相差太多呢?这就是TRPO算法所要解决的。
2015年John Schulman等人提出了信任区域策略优化(Trust Region Policy Opimization,简称TRPO),表面上,TRPO的出现解决了同时解决了两个问题,一个是解决重要性采样中两个分布差距太大的问题,一个是解决策略梯度算法中步长难以确定的问题
KL散度(KL divergence),也称相对熵,而相对熵 = 交叉熵 - shannon熵,其衡量的是两个数据分布和之间的差异
下图左半边是一组原始输入的概率分布曲线,与之并列的是重构值的概率分布曲线,下图右半边则显示了两条曲线之间的差异
这是1.2.1节,我们已经得到的策略梯度计算、策略梯度更新公式如下(别忘了,学习率 类似步长、距离的含义)分别如下
对这个问题,我们考虑在更新时找到一块信任区域(trust region),在这个区域上更新策略时能够得到安全性保证,这就是TRPO算法的主要思想
本质上,其实这两个问题是同一个问题(简言之,避免两个分布相差大即意味着避免步长过大)。举个例子,比如爬两面都是悬崖的山,左右脚交替往前迈步,无论哪只脚向前迈步都是一次探索
总之,TRPO就是考虑到连续动作空间无法每一个动作都搜索一遍,因此大部分情况下只能靠猜。如果要猜,就最好在信任域内部去猜。而TRPO将每一次对策略的更新都限制了信任域内,从而极大地增强了训练的稳定性。
至此,PG算法的采样效率低下、步长难以确定的问题都被我们通过TRPO给解决了。但TRPO的问题在哪呢?
TRPO的问题在于把 KL 散度约束当作一个额外的约束,没有放在目标里面,导致TRPO很难计算,总之因为信任域的计算量太大了,John Schulman等人于2017年又推出了TRPO的改进算法:PPO
如上所述,PPO算法是针对TRPO计算量的大的问题提出来的,正因为PPO基于TROP的基础上改进,故PPO也解决了策略梯度不好确定学习率Learning rate (或步长Step size) 的问题。毕竟通过上文,我们已经得知
具体做法是,PPO算法有两个主要的变种:近端策略优化惩罚(PPO-penalty)和近端策略优化裁剪(PPO-clip),其中PPO-penalty和TRPO一样也用上了KL散度约束。
近端策略优化惩罚PPO-penalty的流程如下
首先,明确目标函数,通过上节的内容,可知咱们需要优化,让其最大化
接下来,先初始化一个策略的参数,在每一个迭代里面,我们用前一个训练的迭代得到的actor的参数与环境交互,采样到大量状态-动作对, 根据交互的结果,估测
当然,也可以把上述那两个公式合二为一『如此可以更直观的看出,PPO-penalty把KL散度约束作为惩罚项放在了目标函数中(可用梯度上升的方法去最大化它),此举相对TRPO减少了计算量』
上述流程有一个细节并没有讲到,即是怎么取值的呢,事实上,是可以动态调整的,故称之为自适应KL惩罚(adaptive KL penalty),具体而言
总之,近端策略优化惩罚可表示为
如果觉得计算 KL散度很复杂,则还有一个 PPO2算法,即近端策略优化裁剪PPO-clip。近端策略优化裁剪的目标函数里面没有 KL 散度,其要最大化的目标函数为(easy RL上用代替,还有的书用代替,为上下文统一需要,本笔记的文字部分统一用)
整个目标函数在这个大括号里有两部分,最终对比两部分那部分更小,就取哪部分的值,这么做的本质目标就是为了让和可以尽可能接近,不致差距太大。
换言之,这个裁剪算法和KL散度约束所要做的事情本质上是一样的,都是为了让两个分布之间的差距不致过大,但裁剪算法相对好实现,别看看起来复杂,其实代码很好写
// ratios即为重要性权重,exp代表求期望,括号里的old_log_probs代表用于与环境交互的旧策略
ratios = torch.exp(log_probs - old_log_probs)
// 分别用sur_1、sur_2来计算公式的两部分
// 第一部分是重要性权重乘以优势函数
sur_1 = ratios * advs
// 第二部分是具体的裁剪过程
sur_2 = torch.clamp(ratios, 1 - clip_eps, 1 + clip_eps) * advs
// 最终看谁更小则取谁
clip_loss = -torch.min(sur_1,sur_2).mean()
回到公式,公式的第一部分我们已经见过了,好理解,咱们来重点分析公式的第二部分
最后把公式的两个部分综合起来,针对整个目标函数
- 如果大于0且大于
则相当于第二部分是,和第一部分对比
取更小值当然是的截断值:- 如果大于0且小于
则相当于第二部分是,和第一部分对比
取更小值当然是原函数值:反之,如果小于0,则最终目标函数的取值为了更小则和大于0时反过来,毕竟加了个负号自然一切就不同了,为方便初学者一目了然,咱们还是把计算过程列出来,即
- 如果小于0且大于
则相当于第二部分是,和第一部分对比
取更小值当然是原函数的值:- 如果小于0且小于
则相当于第二部分是,和第一部分对比
取更小值当然是的截断值:
的..
1.6日决定只是想写个ChatGPT通俗导论,但为了讲清楚其中的PPO算法,更考虑到之后还会再写一篇强化学习极简入门,故中途花了大半时间去从头彻底搞懂RL,最终把网上关于RL的大部分中英文资料都翻遍之外(详见参考文献与推荐阅读),还专门买了这几本书以系统学习
总之,RL里面的概念和公式很多(相比ML/DL,RL想要机器/程序具备更好的自主决策能力),而
第二种,Sutton强化学习《Reinforcement Learning: An Introduction》第一版中用的
其中 叫做discounted state distribution
第三种,David sliver在2014年的《Deterministic Policy Gradient Algorithm》论文中用的
其中,与上述相同,都是discounted state distribution。
第四种,肖志清《强化学习:原理与Python实现》中用的
第五种,Sutton强化学习在2018年的第二版中用的
其中, 是stationary distribution (undiscounted state distribution)
第六种,Open AI spinning up教程中用的
huggingface的两篇RL教程:An Introduction to Deep Reinforcement Learning、GitHub:The Hugging Face Deep Reinforcement Learning Course
RL里的细节、概念、公式繁多,想完全阐述清楚是不容易的,以下是自从23年1.16日以来的修改、完善记录: