PPO算法解析

PPO算法解析

Tags
Created
Mar 30, 2023 04:18 AM
Multi-select
深度学习
强化学习
PPO
GAE
TRPO
Author
OpenAI 联合创始人兼研究员 John Schulman认为,ChatGPT成功的秘密武器是人类反馈强化学习(Reinfocement learning with human feedback,RLHF),而在RLHF上取得卓越成效的强化学习算法则是他所发明的PPO算法,并且PPO也是强化学习中极具影响力和SOTA的方法之一,那这篇文章就来探究一下PPO算法的基本原理。

强化学习基本思想和术语

在开始讲PPO之前,我们先来回顾一下强化学习的基本思想,以及一些关键定义。
Reinfocement Learning Agent and Environment interaction loop
Reinfocement Learning Agent and Environment interaction loop
强化学习是通过与环境交互来学习如何做出决策以最大化收益或最小化成本的学习过程。如上图所示,智能体(Agent)不断地从环境(Environment)中接收观测到的状态(State),然后根据策略(Policy)来选择动作(Action)作用于环境,从而得到环境对行动结果所给予的反馈奖励(Reward),它的目标是学习一个最优策略,使得智能体在与环境的长期交互过程中能够获得最大的累积奖励回报(Return)。
为了方便大家理解本文,我列出了其中的一些关键定义,并且整篇文章中,会使用大写字母表示随机变量,而小写字母表示定值:
  • Policy Function:是关于动作a的条件概率密度函数,也是我们学习的目标,当有一个足够好的策略函数时,智能体就能根据当前的状态s,大概率选择出足够好的动作a。
  • Discounted Return:实际中我们会使用折扣累积回报 ,其中, 通过这个折扣系数 来平衡短期利益和长期利益。
  • Action Value Function:动作价值函数 是在给定当前的状态和动作情况下回报的期望,我们用它来评价在状态选择动作的好坏。
  • Optimal Action Value Function: 最优动作价值函数, 它可以用来评价在状态 哪个动作最好,这个函数会用于Value-Based的方法中,因为它让Value替代了Policy来间接决策。
  • State Value Function:状态价值函数 积掉了动作价值函数中的所有动作得到了一个只跟当前状态 有关的函数,因此可以用来评价当前状态的优劣,于此同时 又可以用于评价策略 的优劣。

Reinforce

相对于Value Base的方法,策略梯度(Policy Gradient)方法的优点是显而易见的,它不再需要依赖存储最优动作价值来间接的得到决策动作,而是对策略函数本身进行优化,这样一来智能体不仅可以直接通过策略函数来进行决策,而且这个决策还可以是基于这个条件分布随机的。这不仅天然解决了训练中如何权衡探索(exploration)与利用(exploitation)的问题,还能在零和博弈或者需要更自然的动作的场景中发挥重要作用,更关键的是它可以应对连续动作空间的情况。
于是假如我们用一个参数为的神经网络来模拟策略,那我们要如何优化参数来提升策略的效果呢?不要忘记所有强化学习方法的本质最终都逃不过最大化期望回报 ,因此我们可以定义一个目标函数 ,然后对它求关于 的梯度:
显然,我们可以用蒙特卡洛方法来获得随机梯度来进行梯度更新,其中 是学习率,是完整Episode的动作步数(下文中继续沿用):

Reinfoce with baseline

由于 是每次蒙特卡洛采样一个Episode计算得到的结果,由于随机性,这个值的变化非常大,这也就导致梯度的方差非常大,这很不利于训练,因此我们可以让 减去一个与之接近但又与 无关的baseline从而降低方差:
一般我们取baseline为状态价值函数 :
而这个 我们可以用另一个参数为的神经网络来近似,它接受当前的状态作为输入,并输出当前状态的价值。显然,的目标是与真实的回报 接近,因此我们通过蒙特卡洛近似让去拟合真实的,因此 的可以利用它们之间的误差的L2范数的偏导进行更新,其中是学习率:

Actor Critic

由于Reinforce的方法还是需要采集完整个Episode之后才能计算真实回报,才能对策略参数 进行一次更新,这样就导致学习效率很低,于是我们不妨用一个神经网络来近似 用于替代 ,于是策略梯度就变成了:
右侧的实际就是常用的优势函数(Advantage Function),我们记作。观察这个式子,显而易见的能够体现出当前选择动作的价值相对于当前状态动作价值期望 的优势,当优势大于0,神经网络参数将朝着提升概率的方向更新,反之则朝着降低概率的方向更新。这种通过两个网络,一个用来近似策略网络来根据输入状态来输出动作,我们称之为Actor,另一个用来近似价值网络,用来计算当前状态策略网络选择某个动作的价值以评价决策的好坏,我们称之为Critic,用于指导策略网络的参数更新,这套算法架构我们称之为Actor-Critic方法。
为了便于计算,以及出于连续动作空间的情况下难以用神经网络表示,因此实际应用中一般使用 来近似,此时优势函数就变成了时间差分学习(Temporal-Difference Learning)中的TD error,它既用于价值网络的更新也用于计算策略梯度。

Generalized advantage estimator(GAE)

前面的添加baseline以及各种近似的方法,无疑都是为了降低策略梯度的方差来使神经网络更容易收敛,那么GAE将进一步把方差降下来。既然我们已经把Advantage Function近似成TD Error了,那为何步借鉴一下Multi-Step TD的想法呢?GAE便是这么干的,它实际上就是是Multi-Step TD形式的Advantage的指数加权移动平均。众所周知,再数学上指数加权移动平均可以让数据曲线更加平滑,那自然指数加权移动平均的Advantage也便方差更小,训练更稳定了。
参考Multi-step TD target的思想,并增加一个折扣系数为,于是advantage就变成了: ,那么n-step的advantage就可以这样表示:
但是我们到底选几步的优势是最好的呢?又是否存在这样一个最好的n呢?数值优化算法上有一种很常见的做法,是取附近值的指数加权移动平均,于是GAE便诞生了,我们将加权系数设置为:
时, , 相当于one-step的TD 时,, 相当于Reinforce。 这个权重系数就是用来控制取多少步的,比如, 此时很小,我们可以认为平均了2步,再设大一些就会多取几步,根据环境的实际情况来进行设定。

Trust Region Policy Optimization(TRPO)

尽管上面用了种种方法,极大的降低了策略梯度的方差,也让模型更容易收敛了。但是这些方法总归还是治标不治本的,它们没有解决参数空间的距离与策略空间的距离不一致的根本问题,以至于它们终究还是无法完全适应环境的剧烈变化。直到Shulman博士从问题本质出发,提出了TRPO算法。
TRPO的目标同样是最大化当前策略的状态价值,但它通过在新旧策略之间增加约束,将整个参数空间的变化限制在一个小范围之内,从而避免了错误决策导致Value的剧变,尽可能的保持快速的单调提升。
如果我们用表示参数为的策略函数,那么TRPO的参数更新方式可以表示为:
其中 是上文中策略梯度优化目标 约束下的近似,TRPO实际上就是在策略梯度的基础上,应用了Trust Region的数值优化方法替代随机梯度上升来更新策略参数 ,虽然这样的计算量会增大,但优势就是更新更加稳定,使得模型容易收敛。具体的更新过程如下:
  • 在当前参数的邻域内找到的近似函数
    • 我们首先对原始的做一个变换:
      然后我们通过蒙特卡洛采样真实的轨迹的值来近似上述的期望就得到了:
      然后我们可以通过分布的平均KL散度来增加这个邻域约束。不过要求这个的最大值还是太困难了,于是对做进一步的近似,使用泰勒级数来估计的均值,将展开到一阶,展开到二阶:
  • 在邻域内的最大值
    • 这个近似问题可以⽤拉格朗⽇对偶⽅法解析求解:
      如果我们只使用这个结果,算法将精确计算自然策略梯度。但是这样有一个问题,由于泰勒展开式引入了近似误差,可能会导致不满足KL散度的约束,或者实际提高了相应动作的优势,于是TRPO对这个更新规则增加了一个修改,称之为回溯线搜索:
      其中 是回溯系数, 满足散度约束并产生正向替代优势的最小非负整数。另外,当神经网络有百万以上参数时,计算和存储矩阵的代价是很大的。TRPO通过使⽤共轭梯度算法计算来避免求解 .这样我们就可以只⽤⼀个函数来计算,从而避免直接存储整个矩阵(其实这个方法跟梯度下降有点像)。
  • 重复上述近似和最大化过程

Proximal Polsicy Optimization (PPO)

PPO算法要解决的问题和TRPO是一致的,目标都是让策略能够进行稳定的更新,作为Schulman在TRPO之后的作品,我们可以把PPO看作是TRPO的一阶近似,它的试用范围更广、计算效率更高、更容易实现,并且从OpenAI的经验上来看,至少效果是不比TRPO差的,因此PPO成为了在强化学习领域影响深远的SOTA算法。
PPO主要有两种变体:PPO-Penalty 和 PPO-Clip 。
  • PPO-Penalty修改了KL散度的约束方式,它不再添加硬约束,而是通过在目标函数中加入KL散度的正则项的方式来处理约束问题。
  • PPO-Clip 则删除了约束,直接使用强制剪裁的暴力方式来让 的更新保持在一定范围之内。
实践证明,PPO-Clip这种暴力的方式反而更有效,因此现在主流的PPO用的都是PPO-Clip,因此,本文也就只针对PPO-Clip进行讲解。
在PPO中,我们对目标函数进行了一个剪裁得到了新的目标
我们将记作,可以将这个剪裁目标分为如下图所示的6种情况来理解:
notion image
在满足1和2的情况下,无需剪裁,就是原始的, 显而易见的,如果 ,说明当前的是好的,此时 ,即朝着增大 的方向更新,也就是朝着让大的方向更新,意味着新的策略在状态 选择这个好的动作的概率比就策略更大,这是符合我们的目标的。如果A<0,说明当前的是不好的,此时 ,也就是新策略会降低选择不好的动作的概率,同样符合我们的目标。
 
在满足3的情况下, ,此时无需剪裁,由于 , ,我们增大新策略选择好动作的概率,以在后续产生更多的好数据增加稳定性。
 
在满足4的情况下, ,此时存在剪裁,虽然,但是由于 ,我们不再试图进一步降低选择的概率,以防止极端情况出现,从而增加了稳定性。
 
在满足5的情况下, ,此时存在剪裁,虽然A>0,但是由于 ,我们同样不再增加选择的概率,防止太贪婪导致的不稳定性。
 
在满足6的情况下, ,此时无需剪裁,由于 ,新策略选择的概率却比旧策略高很多,这显然很不合理,我们需要赶快更新参数,把这个概率降下来,以防止采集更多的劣质数据增加稳定性,这也是符合我们的设计目标的。
 
总结一下,Actor Critic架构的PPO的训练步骤是这样的:
  1. 使用神经网络构建一个策略网络,以及一个价值网络,通常这两个网络共享参数
  1. 通过这个策略网络与环境交互,收集到一批{},并利用价值网络计算GAE
  1. 利用这批数据和GAE更新网络参数,这一步会迭代多次
  1. 重复上面
 

参考资料

Loading Comments...