一、强化学习基础概念

        假设你已经具备机器学习和深度学习的基础知识,但是没有接触过强化学习。通过这个博客学习PPO算法所必须的强化学习的知识,目的是让你以最短的时间了解PPO算法背后的思想以及实现细节。首先我们来了解一下强化学习里的基础概念。以大家比较熟悉的超级玛丽游戏为例,第一个概念是environment,环境运行中的超级玛丽。包括你看到的游戏画面以及你看不到的游戏后台的程序就是environment。它负责产生游戏画面,根据你的动作切换游戏画面,生成敌人奖励,决定游戏什么时候结束等等。我们不了解environment的实现细节,只能通过他设计的规则和它进行交互。

        第二个概念是agent,可以翻译为智能体,它观察环境,根据自己的策略做出动作,争取获得尽可能多的游戏得分。当然在玩游戏时,这个策略是由玩游戏的你给出的强化学习就是让程序学出一个策略来尽可能多的获得环境给的奖励。第三个概念是state,state是游戏当前的状态,agent根据当前的状态来做出决策。还有一个概念叫observation,observation是state的一部分。因为在有的游戏里,agent的视野并不是全视野,他只能看到整个游戏状态的一部分。但是在超级玛丽这个游戏里,我们认为state就等于observation,后面我们都用state。

        第四个概念是action,action就是agent做出的动作。比如在超级玛丽这个游戏里,agent根据当前的state以及自己的策略来决定做什么动作,动作只能是向左向右以及跳三个动作。第五个概念是reward,reward是当agent做出一个动作后,环境给agent的奖励或者惩罚。比如当玛丽吃到一个金币给十分,吃到一个蘑菇给20分,被怪物打死得-100分,通关得100分。Reward的值你可以参考游戏里的实际的值,也可以完全由你自己定义。最终agent会尽可能让得到的reward之和最大。你reward定义的好坏很大程度上会影响模型的训练。

        下一个概念是action space,也就是动作的选择空间。超级玛丽的动作空间就为left,right,up。policy策略函数,它的输入是state,输出是action的概率分布一般用π来表示policy,比如给定状态st策略派给出向左的概率是0.1向上的概率是0.2,向右的概率是0.7。在进行强化学习、训练和推理时,一般并不是执行策略最高的策略,而是根据概率分布进行采样。

        原因有两点,一、训练的时候让模型要探索各种动作的可能性,这样才能学到更好的策略。2、推理时让输出多样性也是非常有价值的,比如剪刀石头布,你不能每次都是同样的动作。还比如在大模型聊天时,同一个问题,每次大模型回答都是一样的,也有些无趣。

        下一个概念是trajectory轨迹,一般用τ(tau)来表示,它表示一连串的状态和动作的序列,也被叫做episode或rule out。比如游戏的初始状态为S0,agent做出动作,A0,状态切换到S1,然后agent做出动作a1,以此类推,一直到游戏结束trajectory里面的下一个状态st加1,跟上一个状态st和动作at有关。有的状态转移是确定的,在给定的和at的情况下得到确定的加一。比如大语言模型生成时,它的状态就是已经生成的token序列。当前的动作是生成下一个token。当前token生成后,已生成的序列就加上新生成的token成为下一个状态。也有的状态转移是不确定的,比如你在游戏里面开宝箱,下一个游戏状态宝箱里的宝物是随机的。

        最后一个概念return回报,它是从当前时间点到游戏结束的reward的累积和。return很重要,因为我们希望在每一个状态st,agent做出的action不是追求当前部的reward最大,而是追求return最大,要有长远考虑。

二、强化学习训练策略

        下边我们复习一下统计里面期望的定义。比如老师告诉你小明考试有20%的概率考80分,有80%的概率考90分。那么你对小明考试得分的期望是多少呢?那么你肯定会说等于0.2乘以80加上0.8乘以90等于88分。当然还有另一种办法,就是你让小明再考N次试,然后你统计平均成绩即可。

        下面我们再来复习一下期望的准确定义,每个可能的结果的概率与其结果值的乘积之和。下面的公式表示X的期望EX,其中X从分布P,等于每个可能的X与X对应的概率乘积的累加。它也约等于从P中采样X采样N次,然后统计平均值,这里是约等于,因为只有当采样N趋于无穷大时才是真的相等。

        那么强化学习的目的是什么呢?就是训练一个policy神经网络π,在所有状态S下给出相应的action,让得到的return的期望最大。换一种说法就是训练一个policy神经网络π,在所有可能的trajectory中得到的return的期望最大。下边我们就用数学来表示这个期望,trajectory=τ服从分布Pθ,θ是我们要训练的策略网络里面的参数,游戏的trajectory是由我们决策网络决定的。我们期望在神经网络参数θ的作用下,τ获得的return的期望尽可能的大。按照期望的定义,它等于所有的τ获得的return乘以τ的概率的累加。

        怎么让这个期望尽可能的大呢?可以用梯度上升的办法,我们先计算梯度,我们只能改变神经网络的参数,不能改变环境给的reward。所以我们对θ求梯度。接下来我们进行一个数学变化,乘以Pθ(τ)套再除以Pθ(τ)。然后我们比我们把Pθ(τ)提出来,我们发现这样就有一个数学期望的表示形式了。Pθ(τ)是概率,后边的是X,这样我们就可以把期望形式约等于采样N份求平均值的形式,从而去掉概率值的部分。然后再根据log函数的求导公式,我们可以化简为这样的形式。

        下边我们看一下每个trajectory,τ的概率应该怎么表示。这里我们认为下一个状态是完全由当前状态和当前动作决定的。那么一个trajectory的概率就是在这个trajectory里面所有state和这个state下给出的action的概率的连乘。Log内的连乘等于log的连加。整理后最终的表达式如下,这个表达式的意思是对所有可能的trajectory期望最大的梯度。

        用这个梯度乘以学习率去更新神经网络里面的参数,就是policy gradient梯度策略算法。我们去掉对梯度的求导,看看整理后的表达式,也就是让这个表达式尽可能大的θ就是我们要求的神经网络的参数。

        我们看一下这个表达式,它的意义也很直观,它由两部分构成。第一部分是一个trajectory得到的return,第二部分是每一步根据当前的state做出action的概率,然后求对数。因为我们的log底数为1,它是单调递增的。也就是说这个表达式的直观意义是,如果如果一个trajectory得到的return是大于零的,那么就增大这个trajectory里面所有状态下采取当前action的概率。如果一个trajectory得到的return是小于0,那么就减小这个try里面所有状态下采取当前action的概率。

        那么实际我们应该怎么训练一个policy network呢?首先我们定义loss函数,在需要最大化的目标函数前面加上负号来让优化器最小化它。我们定义一个卷积神经网络,输入就是当前的游戏画面,也就是然后经过卷积神经网络的处理,最后输出层里面有三个神经元,经过softmax后代表三个动作的概率,这里的概率值就是loss函数里面红色的部分,然后我们让这个神经网络连续玩N场游戏,得到N个trajectory和N场最后的return值,这里return值就是loss公式里面蓝色的部分。注意,我们之前说过,我们对每一步的action都是按照概率进行采样的,不是选取最大值的。这样我们就得到loss函数里面所有的值了。

        可以进行一个batch的训练来更新我们policy神经网络了。更新网络,然后再玩N场游戏采集数据,然后再训练一个batch,这样往复循环。这种更新策略叫做on policy,也就是我们采集数据用的policy和我们训练的policy是同一个。这样有个问题就是我们大部分时间都在采集数据,训练非常慢,这也是PPO算法要解决的问题。

        我们说到这个表达式的直观意义是,如果一个trajectory得到的return是大于零的,那么就增加这个trajectory里面所有状态下采取当前action的概率。如果一个trajectory得到的return是小于零的,那么就减小这个trajectory里面所有状态下采取当前action的概率。

        但这明显有改进的空间。第一点就是我们是否增大或者减少在状态S下做动作A的概率。应该看做了这个动作之后到游戏结束累计的reward,而不是应该是整个trajectory累计的reward。因为一个动作只能影响它后面的reward,不能影响他之前的。

        第二点是对第一点的一点修正。一个动作是可以对接下来的reward产生影响,但是他有可能只影响接下来的几步,而且影响会逐步衰减。后面的reword更多的是由他当时的动作影响的。

        针对这两点我们修改公式。首先对reward的求和不是对整个trajectory的reward进行求和,而是从当前部T到trajectory结束的reward进行求和。第二个是引入衰减因子伽马,伽马小于1,距离当前步数T越远,当前动作对水位的影响越小,呈指数衰减。下一步的reward乘以伽马,下下步的reward的就乘以伽马的平方,以此类推。也就是说距离当前越远的reward受当前步动作影响越小。修改后的return我们用Rtn来表示,总的思想是我们想让Rtn尽可能的表现当前动作对整个trajectory  return的影响,去掉其他因素。

        还有一种情况会影响我们算法的稳定性,那就是在好的局势下和坏的局势下的情况。比如在好的局势下,不论你做什么动作都能得到正的reward。相反在坏的局势下,不论你做什么动作都会得到负的reward。以好的局势为例,所有的动作都能得到正的reward,那么算法就会增加所有动作的概率,得到reward大的动作概率会增加的大一些,但是这样会让训练很慢,最好是能让相对好的动作概率增加,相对差的动作概率减小,这样训练就会加快很多。那有什么办法呢?就是给所有动作的reward都减去一个baseline,这样就能反映这个动作相对其他动作的价值了。对于坏的局势也一样,如果我们的baseline选择合适,就让即使在好的局势和坏的局势下,也让动作得到的return有正有负了。所以我们给公式这里再减去一个baseline。

        这个baseline怎么确定呢?后面我们会讲。它也需要用神经网络来估算,这就是actor critic算法,用来做动作的神经网络就是actor,它负责做动作,就像对体操运动员的动作进行打分的裁判就是critic网络,它用来评估action动作的好坏。

三、强化学习核心概念

        接下来我们还要讲几个概念,强化学习里面的概念真的很多。第一个概念是action value function。之前我们讲的每一步的action的return都是累加他后面的reward,并且逐步衰减。但是这也是通过具体的采样得到的值。具体的采样有个问题,就是需要无限多次才能准确反映当前action的好坏。如果只采样一个,它的方差很大,训练很不稳定。

        那能不能有个函数帮我们估计一下这个action可以得到的return的期望呢?这就是action value function的作用。它具体的定义就是在state s下做出action a得到的回报的期望,它反映了一个动作的价值,所以叫做动作价值函数,用Qθ(s, a)表示。

        下一个概念是state value function,它表示的是在状态S下不论做任何动作得到的return的期望值,它表示这个状态的价值,用Vθ(s)表示。

        最后一个概念,advantage function优势函数。它表示在state s下做出action a比其他动作能带来多少优势。它的公式就是动作价值函数减去状态价值函数,Aθ(s, a) = Qθ(s, a) - Vθ(s)。这个也很好理解,就是做出某一个具体动作得到的回报比这个状态的期望的回报的差值,就表示了这个动作相对其他动作的优势。

        原来我们公式里是当前动作带来的return减去baseline,实际上就是想表达优势函数的意思。现在我们有了优势函数的定义,就进一步替换我们之前公式里面的下一步,就需要看怎么计算优势函数了。我们再看一下优势函数的定义,它是动作价值函数减去状态价值函数。

        那么动作价值函数和状态价值函数有什么关系呢?我们看下边这个等式实际上也很好理解,对于St时刻做出动作,A期望得到的return的值就等于这一步得到的reward Rt加上衰减系数伽马乘以下一个状态,St+1的状态价值函数。然后我们把这个等式带入优势函数,发现优势函数里就只有状态价值函数了。这样我们就由原来需要训练两个神经网络拟合动作价值函数和状态价值函数,变成只需要训练一个代表状态价值的函数就可以了。

        上边我们是对reward进行一步采样。因为在动作价值函数里,状态和动作都是固定的,得到的reward也是固定的。所以我们上面的公式推导都是等号。

        下面我们想对状态价值函数也进行action和reward的采样。对trajectory下一步的action和reward进行采样,St+1的状态价值函数就约等于reward Rt+1加上衰减因子γ乘以St+2的状态价值函数。

        以此类推,我们可以对优势函数进行一步action和reward采样,也可以进行两步、三步或者全部进行采样。我们知道采样的步数越多,方差越大,但是偏差越小。采样的步数越少,越多部分的return是由状态价值函数估算,越能反映return的期望,它的方差越小,但是系统偏差越大。

        为了让式子表示简洁,我们定义一个中间变量sigma T的表示为。它表示在第t步执行特定动作带来的优势。那么θt+1的表示就为它表示在t+1步采取特定动作带来的优势。

        把优势函数的一步采样、两步采样、三步采样的公式用sigma表达式代入后,就变成了下面简洁的形式。那么我们在进行优势函数计算时,我们应该采样几步呢?

        GAE优势函数的答案是小孩子才做选择,我全都要它。通过给优势函数进行一步采样、两步采样、三步采样,分配不同的权重,然后将他们的加和来表示最终的GAE优势函数。比如这里lambda为0.9的话,则一步采样的优势函数的权重为0.1,两步采样的权重为0.09,三步采样的权重为0.081。我们带入把signal a表示带入GAE优势函数的表达式,然后对sigma表达式进行整理。我们发现其中有等比数列,然后用等比数列求和公式最后整理得到这样的GAE优势函数的表达式,它表示在状态st时做动作A的优势,并且平衡了采样不同步带来的方差和偏差的问题。

        最后再来看一下我们来之不易的几个公式。第一个是sigma表达式,第二个是JAE优势函数的表达式,第三个是我们策略梯度的优化目标函数目的是让这个函数的值越大越好。

        这里的状态价值函数我们用一个神经网络来拟合,一般它可以和策略函数共用网络参数,只是最后一层不同,状态价值函数的最后一层,只要输出一个单一的值来代表当前状态的价值即可。那么怎么训练价值网络呢?那就是统计当前部到这个trajectory结束所有的reward的衰减加和作为label,衰减系数通过gamma来控制,让价值网络去拟合这个return值即可。有了上边的这些知识准备,我们就可以来学习PPO算法了。

四、PPO算法推导

        我们之前讲过on policy训练的模式,采集数据用的策略和训练的策略是同一个。这样带来的问题是采集的数据只能用一次,就需要丢弃重新采集数据,然后再进行训练,所以训练的速度非常慢。如果我们训练的模型和采集数据的模型不是同一个,并且采集的数据可以被用来多次训练,那就可以大大提高训练的速度。

        我们先来看一个例子,老师针对小明的表现表扬或批评小明。如果老师表扬小明,小明就加强老师表扬的行为。如果批评小明,就减少老师批评的行为。这就是一个on policy的训练过程。因为老师表扬和批评的,以及小明调整的都是小明自己言行的policy。那对于其他同学呢,能根据老师表扬或者批评小明的言行来调整自己言行的policy吗?当然是可以的。同学们可以参考老师对小明的批评或者表扬调整自己言行的policy,这就是off policy。如果老师批评小明上课玩手机,如果你上课玩手机的概率比小明还多,那你应该调整你上课玩手机的行为比小明还要多一些。如果你上课玩手机的概率比小明少,那么你调整你上课玩手机的行为就比小明少一些。

        我们来看一下重要性采样,我们想要求FX期望X服从分布P,根据期望公式等于对每一个可能的X,求FX乘以PX,然后累加,乘以X在分布Q下的概率QX然后除以QX等式不变,然后转化为下面这个表达式。

        它的含义是对任意X,QX和这个表达式的乘积的累加。按照数学期望的定义,它就是求这个表达式的期望X服从分布Q,这样我们就可以在Q分布下采样计算FX乘以PX除以QX的期望。它的结果就等于在P分布下采样X计算FX的期望,再进一步转化后的期望约等于在X服从Q分布下采样N条记录,然后求均值。

        我们用重要性采样来更新我们的目标函数的梯度公式。这样我们就可以把on policy的训练替换成off policy的训练。我们用一个参考的策略θ一撇来采样计算参考策略θ一撇的优势函数,然后用它来更新我们的训练策略西塔只需要给公式里加上重要性采样的系数,Pθ除以Pθ一撇,这个公式也很符合直觉。

        拿刚才老师教育学生的例子来理解,θ一瞥就是小明的策略,θ是你的策略。θ一撇的优势函数就是老师对小明的批评或者表扬。你不能直接用老师对小明言行的批评或者表扬来更新你自己的言行准则。比如小明上课玩手机,老师批评小明,小明上课玩手机的概率是10%,你上课玩手机的概率是20%,那么你在更新自己玩手机这个行为时,强度应该是小明的二倍才对。

        接着我们再根据log函数的求导公式代入我们的表达式,约去Pθ,整理后就成为这样的表达式。这个公式是梯度公式,我们去掉求梯度,在前面加上负号就变成了PPO算法的loss函数。可以看到它是用参考的策略θ一撇来进行数据采样计算优势函数,然后用训练的策略西塔做某个动作的概率除以参考策略θ一撇做某个动作的概率来调整优势函数。这样我们就可以用参考策略来进行数据采样,并且采样的数据可以多次用来训练我们的policy网络,这样就解决了on policy训练效率太低的问题。但是有一点限制,就是这个参考的策略不能和训练的策略在同一情况下给出各种动作概率分布的差别太大。

        还是拿老师教育学生为例,老师对和你差不多的学生的教育和批评,对你是最有价值的。如果你是一个优秀的学生,老师对一个坏学生的批评对你的意义就不大。比如一个坏学生每次考试都交白卷,老师批评他考试不应该交白卷,这个批评对你没有参考意义,因为你在考试时交白卷的概率为零,已经没有什么可以调整的了。老师表扬这个差学生,这节课上虽然没有听课,但是也没有骂老师。这个表扬对你也没有任何参考意义,因为你从来就不骂老师。

        如何给我们的loss函数增加训练的策略,不能和参考的策略分布相相差太大。这个约束就是加上KL散度的约束。KL散度就是描述两个概率分布相似程度的量化指标,两个概率密度分布完全一致,它们的KL散度为零,分布越不一致KL散度值越大。然后通过β来调整KL散度约束的大小。

        PPO算法还有一种实现就是通过截断函数来替代KL散度,防止训练的策略和参考的策略偏差过大。可以看一下,它由两个部分构成,分别是红色和蓝色部分。然后取这两个部分小的那个值,红色部分是原始的公式,蓝色部分是一个截断函数。截断函数里面有三个部分,如果Pθ除以Pθ一撇的值在1-ε和1+ε之间,那么就返回它本身的值。如果它的值小于1-ε,就返回1-ε。如果它的值大于1+ε就返回1+ε,这就限制了Pθ和Pθ一撇的概率值不能相差太大。

        如果ε的值取0.2,假如优势函数的值为正值,那么就应当调整Pθ,使它尽可能的大。但是当Pθ已经调整到足够大,是Pθ一撇的1.2倍了,那就不能再调整了。同样如果优势函数为负值,那么我们就让Pθ尽可能的小,但是当它小到Pθ一撇的0.8倍时,就不能再小了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐