零基础学习PPO

零基础学习PPO

基本概念

强化学习(RL)研究的是一个智能体如何通过与环境不断交互,学会做出好的决策。

核心循环是这样的:

  • 状态(State):智能体观察到的环境状况
  • 动作(Action):智能体根据当前状态选择一个可能的动作
  • 奖励(Reward):环境根据某个动作给出的反馈信号,通常写作表示在状态下采取动作获得的即时反馈
  • 状态转移(Transition):通常表示为,即在状态下采取动作以后,环境跳转到下一个状态的概率分布

这个循环会不断重复,形成一条轨迹:

智能体的目标是最大化长期累积奖励,一般来说累积回报(Return)是这么定义的:

这表示从时间步开始,未来所有奖励的加权和; 表示折扣因子,用来权衡当下的奖励和未来的奖励哪个更重要。

这里有个关键概念:状态转移的概率分布通常是环境决定的,智能体无从得知,智能体能够决定的只有策略(Policy),即:在状态下选择动作的概率分布。以超级玛丽游戏举例,马里奥只能决定在当前状态下选择哪个方向,下一步的游戏页面中出现金币还是障碍他是无法决定的。RL算法的优化目标就是得到一个策略,该策略可以让马里奥获取尽可能多的金币。

Markov Decision Process

马尔可夫决策过程是强化学习的数学模型,它是一个五元组:

其中表示状态集合,表示可能动作的集合,表示状态转移概率,表示奖励函数,表示折扣因子。

这个数学模型有一个重要性质:马尔可夫性质,即下一状态和奖励只依赖于当前状态和当前动作,和之前的历史无关。如果没有马尔可夫性质,问题的建模要复杂的多。以超级玛丽游戏为例,马里奥下一步遇到什么,只取决于此刻的画面和此刻按下的方向键,而不需要记住五分钟前跳过了几个坑。整个决策问题的状态已经包含了所有相关历史信息。

智能体和环境的交互轨迹:在状态时,智能体按照策略选择一个动作,环境根据返回下一个状态和即时奖励,智能体根据新的状态选择新的动作,以此类推,直到环境终止。

是智能体实际走完一条轨迹后拿到的真实回报,但是它在同一状态下由于动作的随机性和状态转移的随机性,每次得到的都可能不同。也就是说未来的每一步都受到策略和环境转移概率的影响,其实是个随机变量,那么一个状态或者动作的“好坏”应该是的期望值。由此引出下面两个定义。

状态价值函数和动作价值函数:

  • 状态价值函数

    状态价值函数是指在状态下,智能体按照策略采取后续动作,拿到的期望累积折扣奖励。这个函数是对局面的评估,跟当下这一刻具体选什么动作无关。

  • 动作价值函数

    动作价值函数是指在状态下,智能体选择动作,后续再按照策略采取行动,拿到的期望累积折扣奖励。这个函数是对“局面-动作”的评估。

按照策略选择动作,本身就是对各个动作的加权求和,按照全概率公式, ;反过来,可以拆成“当前这一步的即时奖励”加上“下一步状态的值的折扣期望”,即

这两组等式构成了MDP的贝尔曼期望方程,也是各种RL算法的基础。有了状态价值函数和动作价值函数,优化策略这件事就可以量化为,找到那个能让最大的策略。

Policy-based

策略网络:也称为Actor,它的输入是状态,输出是动作的概率分布,参数是

优化目标与梯度计算

策略梯度算法的目标是最大化期望累积奖励:

这里的是指一个轨迹,是指一个轨迹的累积奖励。

如果想用梯度上升来优化策略,就需要计算策略梯度,即;但是期望内的是由策略本身决定的,这也就是说参数不仅影响每一步的奖励,它还改变了你遇到的状态、选择哪些动作。因此,不能像普通函数求导那样,简单把梯度符号挪进期望里面,因为期望本身依赖于

根据链式法则,复合函数的导数是,所以 两边同时乘以就可以得到

也就是说,对一个概率分布求梯度,等于这个分布自己,乘以它自己的对数梯度

假设一条轨迹发生的概率为,那么策略梯度可以写成:

此时,策略梯度的计算就变成了一个期望的计算,期望的计算可以通过采样来近似,即:让策略多跑几次,算出每次的,平均一下就是梯度的近似。

轨迹是一个序列,它的概率是由它的每一步的概率相乘得到的,即 ,其中是初始状态的概率,是状态转移概率,是策略网络的输出。对这个分解取对数:

现在对求梯度,初始状态概率和状态转移概率的梯度都是零,只剩下策略的对数概率梯度:

代入刚刚的策略梯度公式,我们得到策略梯度定理的最简形式:

注意,是整个轨迹的总奖励,但是每一项都直接乘了这个总奖励,这会导致方差很大(一个动作的好坏被整个轨迹的总分来评价,噪音太大)。

改进策略梯度计算

每个动作的梯度都乘上了整条轨迹的总奖励,这相当于用一学期所有考试的分数总和,去评价某一次作业的好坏——即使那次作业做的很差,但后来靠其它优秀表现把总分拉高,它仍然可能得到正向强化。这种不合理的“功劳分配”会让梯度的估计极不稳定,导致方差很大。可以做出两点改进:

  1. 用未来折扣回报代替整个轨迹的总奖励,因为时刻的动作只能影响之后的奖励,所以更合理的分配是让乘以从时刻开始的回报;这个改进使得功劳分配更加合理,但是本身的绝对值仍然可能很大,不同的轨迹之间波动也很剧烈,方差问题仍然没有解决。

  2. 为了进一步降低方差,我们需要减小梯度估计中乘数的数值,但是又不能改变梯度的期望方向;减去一个只依赖状态的基线,它只依赖状态,不随动作变化。

于是原来的就变成 ,梯度项变成:

我们可以把梯度估计的期望拆成两个部分:

对于任意一个概率分布, ,我们对求梯度,得到 (回顾一下:对一个概率分布求梯度,等于这个分布自己,乘以它自己的对数梯度)。所以对于第二项,对单个时间步,我们把期望写成先在给定状态下对动作求平均,再对状态求平均:

所以不管是什么,第二项期望都是0,那么减去基线不会引入任何偏差,梯度的期望严格保持不变。

基线可以看成在当前状态下,按当前策略平均能拿到的回报的一个估计,通常取状态价值函数。那么 衡量的就是实际回报比平均水平好多少(或者差多少),称之为优势,它不再是一个量级可能很大的绝对数值,而是一个围绕零上下波动的相对值。乘上梯度项后,估计量的方差自然大幅减小。

将以上两点结合,取基线为状态价值函数,得到改进后的策略梯度:

其中 被称为优势估计,它同时兼具无偏性和低方差。这个巧妙的设计使得策略更新只奖励那些比平均水平更好的动作,惩罚比平均水平更差的动作,训练过程也因此变得更加高效和稳定。

Actor-Critic

蒙特卡洛方法的核心思想:用随机样本的均值来估计期望值。蒙特卡洛采样具备无偏性高方差两个性质。

回想动作价值函数的定义: ,也就是说值是的条件期望,而实际的是这个期望的一次蒙特卡洛采样。所以,当我们写 的时候,实际上是用一个具体的采样值来近似。因此, 就是优势函数 的一个无偏但高方差的估计。此外,用做估计需要完整的轨迹,无法用于在线环境或持续环境。

这促使我们用函数近似来直接学习,从而在任何时刻都能估计优势,而不必等到最后。

引入价值网络:也称为Critic,它的输入是状态,输出是状态价值,参数是。那么优势函数就可以直接定义为 ,这样就不需要再等待真实的,而是用Critic的预测值即时计算优势。

Critic网络使用时序查分误差(TD Error)来帮助估计优势:

这个的期望正好是优势函数的一个无偏估计,因为它只用到了一步真实奖励和Critic的预测,所以方差要比用整条轨迹的低很多。

于是,Actor的梯度更新变成:

这就是最基础的Actor-Critic算法:Actor根据Critic提供的来更新策略,Critic则通过回归 来更新自己的估计。这样就可以用函数近似替代蒙特卡洛采样,大幅降低了方差,且可以在每一步在线学习,不必等轨迹结束。

Proximal Policy Optimization

GAE

单步TD Error的方差小,但是只考虑了一步真实奖励,其余全依赖Critic的估计。如果Critic本身不准确,那么优势估计就会带有较大偏差,导致Actor学到次优策略。相反,纯蒙特卡洛的 是无偏低,但是方差比较大。

广义优势估计(GAE)将两者做了折中,它定义优势估计为未来TD Error的指数加权和

其中, 是控制偏差-方差权衡的参数。

  • 时, ,退化为单步TD Error,偏差最大,方差最小
  • 时, ,退化为蒙特卡洛优势,无偏,方差最大

取中间的就在每一步既用到真实奖励,又逐渐衰减远期估计,巧妙地将偏差和方差平衡在一个合适的水平。因此,GAE可以理解为:不直接采样完整轨迹,也不只看一步,而是有折扣地看多步的真实奖励,越远的奖励越依赖Critic的估计。

同时,我们也需要为Critic网络准备一个正确答案作为更新目标,通常是应该去逼近的回报值,例如:

Actor-Critic框架加上GAE的优势估计,就可以让训练变得稳定且相对准确。不过,我们还面临另一个独立的问题:策略更新的幅度。

PPO

即使有了低方差、偏差可控的优势估计,如果在一次更新中策略变化太大,依然会导致训练崩溃。原因是:

  • 策略梯度更新是一个局部线性近似,只在当前策略附近可信
  • 如果根据优势估计,大步修改策略参数,可能导致新策略完全脱离合理区域,这会引发两个灾难:
    • 策略坍塌:策略变成确定性,不再探索;如果某个碰巧不错的动作其实并非全局最优,智能体就再也学不到更好的了
    • 数据分布撕裂:下一轮采样时,因为策略大变,遇到的状态分布和之前完全不同;Critic网络瞬间过时,导致优势估计完全错误,错误的优势信号指导Actor进一步胡乱更新,陷入恶性循环

既然大步更新会导致策略坍塌和数据分布撕裂,那解决问题的思路就很明确——我们必须给策略更新加一道“安全锁”,让新策略不要离旧策略太远。

但在实际训练中,我们往往不会每轮都丢弃旧数据,而是用同一批数据做多次梯度更新。这就意味着:我们要用旧策略 采集的样本,来更新新策略 。如果直接硬算,梯度估计是有偏的,因为策略梯度定理的期望必须针对当前策略分布。

为了在数学上把期望分布纠正过来,需要引入重要性采样权重

这个比率恰好起到双重作用:

  1. 纠正分布差异:让旧样本能无偏地近似新策略的梯度,实现数据多轮复用;
  2. 充当差异标尺 偏离 1 的程度,直接反映了新旧策略对该动作偏好的变化大小。

于是,“限制策略更新幅度”这件事就可以翻译成:不要让 远离 1。PPO 的精髓,便是把这种约束巧妙地融入目标函数里,通过裁剪自动压制过大的变化:

  • 当优势 时,我们鼓励提升概率比率,但不许它超过
  • 当优势 时,我们要降低概率比率,也不许它跌破
  • 一旦比率超出这个区间,min 函数就会截断梯度,相当于告诉优化器“这一步不能再远了”。

这样,就把策略更新的幅度牢牢锁在了安全范围内,既提升了样本效率,又保持了训练的稳定。

当然,我们也需要考虑Critic网络的更新,通常来说是一个均方误差: ,这里的价值目标是一轮采样后回过头算出来的更准确的价值估计,常见做法是直接用GAE的优势反推: 。同时可以加一个熵正则项鼓励策略保持一定随机性,不要过早确定化。

最终的PPO损失函数定义为:

因为我们要最大化和熵,所以在最小化损失时,它们前面是符号;训练时,用优化器如Adam对这个总损失求导,同时更新策略参数和价值参数