之前在学习大模型的时候学习过 PPO 算法, 但是当时也没有来得及对该算法进行梳理, 因此原理也基本忘了差不多了。 现在在做具身算法, 强化学习还是要重新捡回来, 这里又需要重新捡回该算法, 不想在吃亏忘了, 帮该原理及时整理一下, 方便后面快速回忆。
这次 PPO 算法的学习就没有直接看论文了, 因为网上的博客以及视频是非常多的, 参考了几篇文章以及视频进行整理, 有几个我觉得还是说的蛮好的视频和博客, 我在这里分享下对应链接也是对作者的尊重。
- 零基础学习强化学习算法:ppo
- 不愧是顶会收割机!迪哥精讲强化学习4大主流算法:PPO、Q-learning、DQN、A3C 50集入门到精通!
- 【大白话03】一文理清强化学习RL基本原理 | 原理图解+公式推导
一、 背景介绍
1.1 强化学习基本概念
先看下下面的图
上述图表示的元素有几种分别Agent这里是马里奥,表达的是游戏的主角, State(Observation)环境表达的是是随着游戏的变化整体环境的状态变化,以及环境 Environment给 Agent 的Reward游戏奖励, 以及最后主角需要根据策略做出对应的 action 动作,最终的目的是希望 Agent 获得整体最大的 Reward 值。下面我们看下强化学习主要的几个基本要素:
-
Action Space: 可选择的动作, 比如
向左走
、向右走
、向上跳
等 -
Policy: 策略函数, 输入
State
, 输出Action
概率分布, 一般用表示。如
、
、
, 我们一般希望其具备更丰富的多样性
-
Trajectory: 轨迹用
表示, 一连串状态和动作的序列。
, 其中有的
有的状态转移确定状态,比如大模型每次预测下一个 token。 有的状态转移
随机的, 比如游戏中开宝箱。
-
Return: 表示回报,
从当前时间点到游戏结束的 Reward奖励的累计和, 更多的希望可以从长远的考虑
。
1.2 期望概念
举一个简单例子, 小明考试情况如下, 请计算出小明考试期望结果
- 小明考试 20% 的概率考 80 分
- 小明考试 80% 的概率考 90 分
计算过程:
当然期望也可以表示每个可能结果的概率与其结果的值的乘积之和
, 这里的约等于成立条件在于采样次数在无穷大的情况才成立。
-
目标: 训练一个 Policy神经网络
, 在所有状态
下, 给出相应的 Action, 得到 Return的期望最大。
-
目标:训练一个 Policy 神经网络
, 在所有的 Trajctory 中,得到的期望最大。
1.3 轨迹的期望
如果我们将轨迹期望带入上述公式应该是什么情况呢?
下面将您提供的两部分推导过程整合为一个完整的序列,展示策略梯度的完整推导过程:
首先,我们的目标是最大化期望回报,需要计算期望回报关于参数θ的梯度:
这个最终结果表明,策略梯度可以通过对每个轨迹的每个时间步,将该轨迹的总回报与该时间步动作概率的对数梯度相乘,再取平均值来近似计算, 最终的公式结果如下图所示, 该函数是单调递增的, 所以 :
- 当一个 trajectory 得到的
Return>0
, 则增大这个 trajctory里面所有状态下这个采取当前action的概率 - 当一个 trajectory 得到的
Return<0
, 则减少这个 trajctory里面所有状态下这个采取当前action的概率
Policy gradient
1.4 损失函数设置
首先因为是期望, 我们希望期望越大越好, 因此是一个梯度上升的过程, 所以在损失函数前面要加上负号。其中公式中 使用的是神经网络进行求解, 根据当前状态求解出对应的 action 的值是多少, 如下图所示, 图中红色的部分代表是不同状态下动作的概率:
同时为了查看回报函数, 我们让 Agent 基于该神经网络尝试多次游戏得到 n 个 trajectory 以及对应的 Reward 值, 如下图蓝色的部分,注意这里的每一个 action 是随机采样, 不是选取最大概率值, 这样就到的 loss 函数所有的值, 就可以进行模型训练。不断的采集在训练就是所谓的 On Policy
上述基于 On Policy 会有一个问题, 就是模型在训练的过程中,大部分时间都是在采集数据,训练非常慢, 这也就是 PPO 算法需要解决的问题。
1.5 损失函数的优化
这里有两个改进想法
首先我们的奖励值Reward 希望的是看当前的 action 对整体Reward 的影响,
因此需要考虑的是当前状态做了这个动作之后到结束状态 Reward累计的 Reward, 而不应该考虑整个 trajectory 整体的 Reward, 因为一个动作只能影响之后的Reward
而不能影响之前的。一个动作是可以对接下来产生的 Reward 产生影响, 但是只能
影响接下来几步
, 而且影响会不断衰减
,后面的 Reward 主要还是当前动作的影响。
根据上述的想法我们看下如何来优化我们的损失函数。
可以看到该函数不是对整体的过程求解 Reward 而是从 进行求和, 同时引入衰减因子
,
, 距离当前动作越远, 当前动作对 Reward影响越小, 呈指数衰减
这里我们用替代
, 总的思想是希望用
表示当前动作对trajectory Returned 的影响, 这样我们就可得到下面更新后的损失函数:
- 但是还有一个改进想法, 就是在好的局势下和坏的局势下是不一样的。如下图所示, 比如在好的局势下, 不同动作都能得到正的 Reward, 相反在坏的局势下, 不论做什么动作得到的都是负的 Reward。 以好的局势为例, 所有的动作都能得到正的 Reward, 那么算法就会增加所有动作的概率得到 Reward 大的概率增加的概率大一点,但是模型训练的速度很慢, 我们希望的是
相对
好的动作概率增加,相对
差的动作概率降低,以此来提高训练效率, 就是将所有的动作 Reward 减去 Baseline
, 这样就能反映当前动作相对其他动作的价值,有点类似归一化的思想,因此需要引入相对 Reward
的概念, 就相当于我的 Reward 值有正也有负的概念。
不同局势下的 Reward
再举一个例子, 应该会加深大家的理解
我们可以看下上面的图, 比如上面和
我们希望其移动到金币的地方, 我们可以看到
离金币最近, 所以
(
代表状态价值函数),
这里就可以理解s2比s1 有更好的优势
而对于棋子来说, 向上的回报肯定大于向下的回报所以
(
代表动作价值函数)
所以我们需要对我们的 Loss 函数做进一步修改, 如下所示:
这里的B(我们所谓的 baseline)
其实是用神经网络进行求解的, 来分析当前的优势, 这就是Actor-Critic
算法, 用来做动作的就是 Actor
, 对动作进行打分就是Critc, 用来对 Actor 进行打分。
- 下面介绍几个概念
-
Action-Value Function(动作价值函数)
每次都是一次随机采样, 方差很大, 训练不稳定, 需要无限多次采样, 因此我们通过下面
函数来解决
在 状态
下,做出任何动作
期望的回报, 也就是所谓的
动作价值函数 Action-Value Function
State-Value Function(状态价值函数)
表示在状态
下期望的回报, 即为
状态价值函数State-Value Function
Advantage Function(优势函数)
表示的是在状态
下,做出的动作
比其他动作能带来多少优势。
根据上述公式我们可以进一步对损失函数进行优化即:
为了能进一步看下我们的优势函数里面的值分别如何表达我们拥有以下公式来说明。
首先对于动作价值函数
, 其实就是当前t 时刻获得的 Reward 值
加上衰减系数
乘以t+1时刻的状态价值函数, 把上述等式带入到优势函数中,得到如下的动作价值函数, 可以看到公式
只要状态价值函数
了, 这样模型也只需要预测状态价值函数而不是一开始又要预测状态价值函数以及动作价值函数了。
我们看下其他时间优势函数, 需要注意的是采样的步数越多, 方差越大但是偏差越小
为了表示方便我们用表示
因此最终表示如下:
最终基于 Generalized Adavanced Estimation(GAE)广义优势函数采样所有的步数, 它通过优势函数一步采样、两步采样, 三步采样分配不同的权重, 然后将他们的加和来表示 GAE 优势函数, 函数如下所示 :
其中上述函数为等比数列, 并基于等比数列求和公式进行化简如下:
上述公式表示在状态s_t做动作 a 的优势, 并且平衡了采样不同步带来的方差以及偏差的问题
,广义优势估计(Generalized Advantage Estimation,简称GAE)是强化学习中用于估算策略梯度的一种方法,特别适用于异策性策略优化算法,如PPO(Proximal Policy Optimization)。它通过结合多步回报来改进优势函数的估计,从而在减少方差的同时尽量保持偏差不变。
1.6 重要几个公式总结
,
称为TD(Temporal Difference)误差
,
GAE 广义优势估计, 它通过结合多步回报来改进优势函数的估计,从而在减少方差的同时尽量保持偏差不变, GAE的核心思想在于平衡偏差和方差之间的关系。通常情况下,
单步的优势估计具有较高的方差但较低的偏差`,而使用蒙特卡洛方法计算的多步回报虽然偏差较大但是方差较小。GAE通过引入一个调节参数和
来权衡这两者,得到一个更稳定的估计值。
上述公式中:
1️⃣是时间步 t 时的奖励
2️⃣是折扣因子,决定了未来奖励的重要性
3️⃣是状态价值函数, 代表从状态 s 开始按照当前策略行动获得的期望回报。
4️⃣是GAE的一个超参数,用于控制估计中的偏差和方差之间的权衡。当
时,GAE退化为一步TD误差;当
时,GAE相当于累积了所有的TD误差,接近于蒙特卡洛方法。
我们可以用 “算奖金” 这个生活场景,把 GAE 的 λ 和偏差、方差的权衡讲明白,完全不用复杂公式:
先明确核心问题:GAE 是干嘛的?
假设你是公司老板,要给员工 “预估奖金”—— 这个 “预估奖金”,对应强化学习里的 “状态价值”(就是判断 “现在这个局面好不好、未来能拿到多少收益”)。
但未来是不确定的:你没法精准算到员工年底能赚多少,只能根据 “当前线索” 估算。GAE 的作用,就是用 “逐步修正” 的方式算这个预估奖金,而 λ 就是控制 “修正到多远” 的开关。
- 当 λ=0:只看 “眼前一步”(对应一步 TD 误差)
λ=0 的意思是:只信 “马上能看到的反馈”,后面的都不管。
比如你给员工算奖金:
只看 “这个月员工签了 1 个小单”,就直接按 “1 个小单的提成” 预估全年奖金(比如预估 1 万块)。
至于 “下个月会不会签大单、年底会不会有额外奖励”,你完全不考虑。
特点(偏差 vs 方差):
方差小:因为只看眼前一步,数据很确定(这个月的单是实打实地有),估算结果不会忽高忽低。
偏差大:只看一步太短视了 —— 万一员工下个月签了 10 个大单,实际奖金能有 10 万,你预估的 1 万就差太远了。- 当 λ=1:看 “直到最后”(接近蒙特卡洛方法)
λ=1 的意思是:要等 “所有结果都出来”,再回头算总账,中间的步骤都不提前预估。
还是算奖金:
你不按月预估,而是等到 “年底最后一天”,把员工一整年的所有单子、奖励、扣罚都加起来,算出实际奖金(比如 12 万)。
相当于 “不预估,直接等真实结果”。
特点(偏差 vs 方差):
偏差小:因为用的是 “最终真实结果”,没有预估误差(算出来 12 万就是实际拿 12 万)。
方差大:结果完全看 “运气”—— 比如今年市场好,员工能拿 20 万;明年市场差,可能只拿 5 万,估算结果波动极大。- 当 0<λ<1:“眼前” 和 “未来” 折中(GA 的核心价值)
λ 在 0 到 1 之间时,就是 “既看眼前,也适当考虑未来,但未来看得越远,权重越小”。
比如 λ=0.5(可以理解为 “未来每多一步,信任度打 5 折”):
算奖金时,你会看:这个月的单(100% 信) + 下个月可能的单(信 50%) + 下下个月可能的单(信 25%) + …… 后面的越来越不信,直到忽略。
特点:
通过调 λ,能在 “偏差” 和 “方差” 之间找平衡 ——
想让估算更稳定(方差小),就把 λ 调小一点,多信眼前;
想让估算更准确(偏差小),就把 λ 调大一点,多信未来。
一句话总结
λ 就像 “望远镜的焦距”:
λ=0:只看脚下(准但短视,偏差大、方差小);
λ=1:看无穷远(远但模糊,偏差小、方差大);
0<λ<1:调焦距,既看脚下也看前方,找一个 “看得清又看得远” 的平衡点。
上述的状态价值函数用神经网络去拟合, 一般可以和策略函数(预测 action)共用一个网络参数, 只是最后一层不同只要预测单一的值来代表当前状态的价值即可, 这里的label公式为
整体如下图所示:
二、 PPO(Proximal Policy Optimization)邻近策略优化
基于上述背景的介绍, 我们可以正式进入PPO 算法原理理解。 之前已经说过了 On Policy的模式,问题是采集的数据仅能用一次就需要抛弃, 需要重新采集一次数据才能进行训练, 因此采集的效率很慢。 PPO 算法希望我们进入到 Off Policy 的模式,即采集的模型和训练的模型不是同一个, 且采集的数据可以被用来多次训练,这样可以提高模型训练效率如下所示:
这里关于 Off Policy可以举一个例子
比如老师针对小明的表现表扬或批评小明, 如果表扬小明, 则小明会加强老师表扬的行为, 如果批评小明, 小明就会减少老师批评小明的行为, 这里小明调整的都是小明自己的行为, 所以这里就是 On Policy. 但是如果其他学生基于老师对小明的评价去调整自己的行为就是 Off Policy 的过程
如果老师批评小明上课玩手机,但是你上课玩手机的频率比小明还多, 那你应该调整你上课玩手机的行为比小明还要多一些
。 如果你上课玩手机的频率比小明少, 那你应该调整你上课玩手机的行为比小明还要少一些
.
2.1 重要性采样(Importance Sampling)
上述的公式想表示在 q 的分布下如何的到 q 的期望。上述可以理解为相对重要性,
用于衡量新旧策略的差异, 这个比率表示策略变化程度
。基于上述公式我们可以将目标函数中的期望进行调整, 将 On Policy 转为 Off Policy 。 这里的是小明的策略,
则是你的策略.
就是老师对小明的评价,你不能直接用老师对小明的评价来更新自己的准则, 小明上课玩手机多, 但你上课玩手机少, 所以你修改自己的行为就少点。
得到如下的公式:
可以看到用参考策略
来进行数据采样来计算优势函数,然后用训练策略
做某个动作的概率除以参考策略
做某个动作概率来调整优势函数,这样我们就可以用参考策略做数据采样, 同时采样数据可以用来多次用来训练 Policy网络这样解决 On Policy 训练效率低的问题。
这样需要注意的是这个参考策略和训练策略不能在同一情况下给出各种动作的差别太大。
举一个例子老师对和你差不多学生的评价不能差距太大, 不然你很难学习到对你有用的经验和教训
, 这里通过 KL 散度来进行约束来保证分布尽可能一致(PPO又称PPO-Penalty),当然可以用截断函数表示(PPO2又称 PPO-Clip) , 公式如下所示(PPO 以及 PPO2 的公式):
情况 |
|
|
---|---|---|
|
|
|
|
|
|
两者相等,随便选 | 两者相等,随便选 |
- 详解一下min和clip操作:
A>0很好理解,表示当前动作比平均水平好,告诉策略网络当前的策略学的还不错,可以更新,但不要更新太大,即只clip很大的ratio。
2.2 总损失函数
1. 优化目标损失函数
这一点前面已经提到, 为了限制策略的更新幅度, PPO2 引入了剪辑目标函数, PPO的目标是找到一个折中:在保持改进的同时防止策略变化过大。
2.值函数优化
PPO不仅优化策略,还同时更新值函数,通过最小化均方误差来更新,
该损失函数使得 Critic 能够更准确地估计状态值
:
-
: 当前状态的值函数预测, 用来评估当前游戏的难度
-
(label)
3. 策略正则化
为了鼓励策略的探索
,PPO 引入了熵正则化项:
:策略的熵,表示策略分布的不确定性。增加熵可以防止策略过早收敛到局部最优, 系数控制探索强度。
总损失函数
:权重系数,用于平衡策略优化、值函数更新和熵正则化。该函数中的重要想法:
-
核心目标: 优化策略, 使
的改进在限制范围内
-
限制更新幅度: 通过剪辑函数
, 避免函数更新过大导致不稳定
-
同时优化值函数: 通过
, 提高 Critic 的预测精度
-
探索与稳定性平衡: 通过
, 鼓励策略探索
2.3 PPO算法整体流程
-
采样: 使用当前策略
与环境交互, 收集状态
、动作
、奖励
-
计算优势函数: 评估某个动作
在状态
下相对平均表现的优劣(优势函数
), 利用
引导策略改进
-
计算概率比率
: 比较新策略和旧策略对动作
的选择概率, 这里的概率比例,
用于衡量新旧策略的差异, 这个比率表示策略变化程度
-
: 新策略对动作
的概率
-
: 旧策略对动作
的概率
-
策略更新:如果更新过大(超出剪辑范围
到
, 会被惩罚),
保证更新幅度适中,既不太保守,也不太激进。
-
值函数更新: 用该损失函数优化值函数
- 重复以上步骤: 通过多轮迭代, 使得策略逐步优化, 直到收敛。