type
status
date
slug
summary
tags
category
icon
password
全文参考:零基础学习强化学习算法:ppo
以超级玛丽为例

1. 基本概念
1. 环境 (Environment)
环境是智能体所处的外部系统,它负责产生当前的状态,接收智能体的动作并返回新的状态和对应的奖励。环境的作用相当于模拟现实中的条件和反应规则,智能体只能通过与环境的交互来了解其动态变化。以超级马里奥游戏为例,环境包括玩家看到的游戏画面和后台程序逻辑。环境控制了游戏进程,例如生成敌人、提供奖励以及决定游戏何时结束。智能体并不知道环境的内部实现细节,只能依靠输入输出规则与环境互动。
2. 智能体 (Agent)
智能体是强化学习中的决策者,它会不断地观察环境的状态,并根据其策略选择动作。智能体的目标是通过选择一系列最优动作,获得尽可能多的累积奖励。
3. 状态 (State)
状态是环境在特定时刻的全面描述。对于智能体而言,状态是决策的基础,它包含了关于当前环境的所有重要信息。
4. 动作 (Action)
动作是智能体对当前状态的反应。基于当前的状态,智能体使用其策略函数来决定下一步要采取的动作。例如,在超级玛丽中,动作可以包括“向左移动”、“向右移动”和“跳跃”。动作可以是离散的(如跳跃或移动的方向选择)或者连续的(如机器手臂在三维空间中的移动角度)。强化学习的核心在于使智能体学会如何在每个状态下选择最优的动作,从而最大化回报。
5. 奖励 (Reward)
奖励是环境对智能体执行动作后给予的反馈。奖励可以是正的(奖励)或者负的(惩罚)。例如,在超级马里奥游戏中,吃到金币可以获得正奖励(例如 +10 分),而碰到敌人会得到负奖励(例如 -100 分)。
6.动作的选择空间 (Action Space)
指智能体在当前状态下可以选择的动作集合。
Example:在超级玛丽中,Action space = {left, up, right}
7.策略函数 (Policy)
策略函数,输入State,输出Action的概率分布。一般用表示
Example: ,,
强化学习训练时一般不会执行策略最高的策略,一般是根据概率分布进行采样
- 要多进行探索,才能学到更好的策略
- 要保证输出的多样性
8. 轨迹 (Trajectory)
轨迹(又称为回合或episode)是指智能体在一次完整的交互过程中经历的一系列状态、动作和奖励的序列。轨迹通常表示为 ,其中 表示第 时刻的状态, 表示智能体在状态 下选择的动作。
目前状态为 ,agent 执行了动作 ,状态变成了
这个 跟 和 有关
但是动作跟状态不一定是确定的,也就是说有两种情况:
- 这是确定的
比如大语言模型生成时,它的状态就是已经生成的token序列。当前的动作是生成下一个token。当前token生成后,已生成的序列就加上新生成的token成为下一个状态。
- 这是随机的
比如游戏里面,动作为开宝箱,开出来的东西是随机的,所以下一个状态也是随机的
9. 回报 (Return Reward)
表示从当前时间步开始直到未来的累积奖励和,通常用符号 表示:。回报的定义是智能体决策的重要依据,因为强化学习的目标是训练一个策略,使得智能体在每个状态下的期望回报最大化。
2. 强化学习的目标
1. 分析优化目标
在强化学习中,目标是训练一个神经网络 ,在所有状态 下,给出相应的 ,得到的 的期望值最大。
⇒ 训练一个神经网络 ,在所有 下,得到的 的期望值最大。
即:
其中:
- :表示在策略 下轨迹 的回报 的期望值。
- :轨迹 的回报,即从起始状态到终止状态获得的所有奖励的总和。
- :表示一条轨迹,即智能体在环境中的状态和动作序列。由神经网络决定
- :在参数 下生成轨迹 的概率,通常由策略或策略网络确定。
- :策略的参数,神经网络的参数,控制着策略 的行为。
所以,我们的目标是找到一个策略 ,使得 最大。那怎么找到这个策略呢?
我们使用梯度上升的办法,即不断地更新策略参数 ,使得 不断增大。
即:
我们只能改变神经网络的参数,不能改变环境给的 reword
上下同乘
期望为每个可能结果的概率与其结果值的乘积之和:
这就变成了一个期望的形式 是概率, 是 (当前概率的结果值)
将期望中概率值的部分替换成 N 次进行得到的结果的平均值(如果N趋于无穷,那么平均值会约等于概率)
⇒ ⇒
这里的转换实际上是基于蒙特卡罗采样方法的一个应用。具体来说:
- 蒙特卡罗采样:由于直接计算所有可能轨迹的概率及其梯度在实际中通常是不可行的(因为可能的轨迹数量极其庞大),我们通过从分布 中抽样有限个轨迹 来近似原公式。
- 又已知
- 其中
继续分析 我们来看一下 Trajectory 的概率 是怎么计算的
这里我们认为下一个状态是完全由当前状态和当前动作决定的,那么一个Trajectory 的概率就等于在这个 Trajectory 里面的所有 State 和这个State 下所有的 Action的概率的连乘
即:
log 内的连乘等于 log 外的连加:
解释上面的公式:对所有可能的 Trajectory 期望最大的梯度,用这个梯度乘学习率去更新神经网络中的参数 ⇒ Policy gradient(梯度策略算法)
省略梯度符号后的形式:
:由两部分构成
- :一个 Trajectory 得到的 Return
- :每一步根据当前的 State 做出 Action 的概率,然后求 log
因为 log 底数为 e , 单调递增函数所以 :

- 如果一个 Trajectory 得到的 Return 是大于 0 的,那么就增大所有 Trajectory 在这个状态下采取当前 Action 的概率。
- 如果一个 Trajectory 得到的 Return 是小于 0 的,那么就减小所有 Trajectory 在这个状态下采取当前 Action 的概率。
2. 强化学习的Loss
那我们应该如何训练一个 Policy 网络呢?受局限我们可以定义loss函数
就是将最大化的优化目标前面加上负号,让optimizer 最小化这个:
还是分析两部分:
- 输入是当前的State,经过卷积得到Action 的概率值

- 让这个神经网络连续玩 n 场游戏,得到 n 个 Trajectory 和 n 场最后的 Return 值

然后更新网络,再玩 n 场游戏,采集数据,再训练一个batch(我们采集数据用到的 Policy 和训练数据的 Policy 是同一个)
大部分时间都在采集数据(玩游戏),训练非常慢

3. 进一步优化
如以上公式所示,如果当前的 Trajectory 的回报 较大,那么我们就会增大这个 Trajectory 下所有 的概率,反之亦然。
这样,我们就可以不断地调整策略,使得回报最大化。
但这明显是存在问题和改进空间的,主要有以下两点:
- 我们是否增大或者减少在状态 s 下,做动作 a 的概率,应该看做了这个动作之后到游戏结束之后累计的 Reward,而不是整个 Trajectory累计的 Reward,因为一个动作只能影响动作后的 Reward,不能影响之前的,但现在的公式为直接计算所有。
- 一个动作是会对后面的Reward 产生影响,但往往只能影响几步,并且成衰减趋势
针对这两点进行改进
- 首先对 reword 求和不是对整个 Trajectory 求和,而是对当前步 t 到结束进行求和,
- 引入衰减因子 ,当前步离着 t 越远,代表当前动作对 Reward 的作用就越小
⇒ 有
目的是让 尽可能的表现当前动作对整个Trajectory Return 的影响,去掉其他因素。
其中:
- :轨迹 的累积回报,这里使用了未来回报的折扣求和来表示。
- :从时间步 开始的未来折扣回报,表示轨迹 在时间步 时的累计回报。
- :对时间步 到 (轨迹结束时刻)之间的所有奖励进行求和。
- :折扣因 子 的幂次,控制未来奖励的权重,。当 越远离当前时刻 ,其贡献越小。
- :在时间步 发生的即时奖励。
还有一个问题,假如当前局势比较好,或者比较糟,做什么动作都会增加 Reward(或减少),Action 无法正确表达 Reward ,该怎么办呢?
我们目前的算法会增加所有动作的概率,得到Reward 大的动作概率会增加的大一些,但是这样会让训练很慢,
最好是让相对好的动作概率增加,相对差的动作概率减小
⇒ 给所有动作的 Reward 减去一个baseline,这样就能反应一个动作相对于其他动作的价值,(坏的局势相同)

⇒
那么 baseline 怎么确定呢,也需要神经网络来估算,这就是我们的 Actor-Critic 网络,其中的 actor 只负责做动作,而 critic 模型只负责做打分,评估 actor 动作的好坏
接下来我们再来解释几个常见的强化学习概念:
- Action-Value Function(动作价值函数)
之前分析过每一步 Action 的 Return 只会加上后面的 Reward 并且逐步衰减,但这也是通过具体的采样得到的值,具体的采样有个问题就是必须要进行无限多次才能准确反映当前 Action 的好坏,如果只采样一个 Trajectory,方差会比较大。
每次都是随机采样,方差很大,训练会导致不稳定,那能不能有一个函数能估计这个Action可以得到的 Return 的期望呢?
这就是 Action-Value Function 的作用
我们可以用 来代替, 表示在状态 下采取动作 得到的 Return 的期望,即从状态 开始,采取动作 后,按照某个策略 执行,最终获得的回报的期望值。可以用来评估在状态 下采取动作 的好坏,从而指导智能体的决策,即动作价值函数。
- State-Value Function(状态价值函数)
表示在状态 下的价值,无论做任何动作,得到的 Return 的期望。即从状态 开始,按照某个策略 执行,最终获得的回报的期望值。 可以用来评估在状态 下的好坏。
- Advantage Function(优势函数)
,表示在状态 下采取动作 ,比其他动作能带来多少优势。优势函数可以用来评估在状态 下采取动作 的优劣。
就是做出某一个具体动作得到的回报比这个状态的期望的差值,表示了这个动作相对其他动作的优势
有了这些概念,我们再回过头来看我们的目标函数:
其中: 其实就是想表达刚才的优势函数的概念,表示在状态 下采取动作 相对于采取期望动作的优势。那我们的目标函数就变成了:最大化优势函数的期望。
我们的 Loss 变成了这样:
那么怎么计算优势函数呢?
我们重新来看一下优势函数的定义:动作价值函数减去状态价值函数
- 表示在状态 下采取动作 的价值,
- 表示在状态 下的价值。
动作价值函数跟状态价值函数有什么关系呢?
我们来看一下下面这个公式:
对于 时刻做出动作 期望得到 Return 的值就等于这一步得到的 Reward 加上衰减系数 乘上下一个状态 的状态价值函数
将这个等式代入优势函数,得到
这样优势函数里就只有状态价值函数了,就只需要一个神经网络去拟合一个函数就可以了
但上面我们是对 Reward 进行一步采样,所以Action 跟 State 都是固定的,得到的 Reward 也是固定的。
现在对Reward进行下一步采样,下面我们对状态价值函数也进行 Action 和 Reward 的下一步采样。
接下里,我们就可以对优势函数进行多步采样,也可以全部采样。
采样的步数越多,方差越大,但是偏差越小
采样的步数越少,越多部分的 Return 是状态价值函数估算,越能反应Return 的期望,所以方差越小,但是系统偏差会大。
为了balance,我们定义一个中间变量 来化简优势函数的多步采样:
:是时间步 的优势函数,代表在 步执行特定动作得到的优势,表示当前时刻 的即时奖励 加上下一个状态的折扣价值 减去当前状态的估计价值 。
:是时间步 的优势函数,代表在 步执行特定动作得到的优势,类似地表示在时刻 获得的即时奖励 加上状态 的折扣价值 减去状态 的价值估计 。
代回到优势函数的多步采样定义中
回到刚才的问题中,为了平衡方差和偏差,那我们究竟要采样几步呢?
介绍一下广义优势估计GAE(Generalized Advantage Estimation),小孩子才做选择,我(GAE)全都要。
通过对优势函数进行一步采样,两步采样,三步采样分配不同的权重 ,将最终的加和来表示最终的 GAE 优势函数:
假如:
将上面定义好的 和 等等代入到GAE优势函数中:
等比数列求和,最终我们可以得到:
=
最后终于可以回归老本行了
⇒ 让这玩意越大越好!

价值函数的神经网络怎么训练呢,label 是啥?
统计当前步到这个 Trajectory 结束所有的 Reward 的衰减加和作为 lable。
🥳有了上面的知识,我们终于能摸到 PPO 的一些门槛了 🥳
3. Proximal Policy Optimization (PPO) 邻近策略优化
1. On Policy vs Off Policy

老师表扬小明(批评)小明,小明就加强(减少)老师表扬(批评)的行为,这是一个On Policy,因为无论是老师表扬还是批评的,还是小明调整的行为,都是小明自己言行的Policy
其他同学会根据老师批评或者表扬小明的言行从而调整自己言行的 Policy 吗?这是 Off Policy, 如果老师批评小明上课玩手机,如果我玩手机比小明还多,那么我调整玩手机的行为会比小名还要多一些,如果少则同理。

采集数据用的策略和训练用的策略是同一个,这样带来的问题是,采集的数据只能用一次就要丢弃,重新采集数据,在训练,训练的速度特别慢
如果我们采集数据的模型和训练数据的模型不是同一个,并且采集的数据可以用来多次训练,就可以大大提升训练速度。
2. Importance Sampling (重要性采样)
通过调整样本权重来估计不同概率分布下期望值的统计方法
将 的分布巧妙地转换为 的分布,其中 成为重要性权重
用重要性采样更新上面推导的目标函数 这样可以吧On policy 的训练替换成 off policy 的训练
其中 为重要性权重
用一个参考的策略 来采样,来计算 的优势函数,用它来更新训练策略 ,
就是小明的策略, 就是你的策略
的优势函数,就是老师对小明的表扬(批评), 是小明玩手机的概率, 是我们玩手机的概率。
如上所说,如果我们玩手机的概率比小明的大,那么我们调整强度的应该更多
根据求导公式 代入目标函数

2. PPO Loss 函数
去掉求梯度,再加上负号,就变成了求 PPO 的 Loss 函数
利用参考的策略 来进行数据采样,来计算优势函数,然后用训练的策略 做某个动作的概率除以参考策略 做某个动作的概率来调整优势函数。
这样就可以利用参考的策略 来进行数据采样,并且采样的数据可以多次训练我们的 Policy 网络,解决 On Policy 训练效率太低的问题
有一个基本限制?
就是参考的策略 和训练的策略 在同一情况下给出各种动作概率分布的差别太大
(老师对跟你差不多的学生的教育和批评对你来说是最有价值的)
如何给我们的 Loss 函数增加 训练的策略不能和参考的策略分布差别太大 这个约束呢?
⇒ 引入KL 散度:(描述两个概率分布相似程度的量化指标,如果两个概率分布完全一致,KL散度等于0)
得到我们最终的 Loss:
通过 调整 KL 散度约束的大小
整个 PPO-KL 损失函数的目的是通过限制新旧策略的差异(使用KL散度项)来优化策略,使其更稳定地朝着优势更高的方向进行更新。
3. PPO截断(PPO-Clipped)(替代KL 散度)
PPO截断(PPO-Clipped)是 PPO 的另一种变体,它通过对比新旧策略的比值,来限制策略更新的幅度,从而保证策略的稳定性。具体来说,PPO-Clipped 的目标函数为:
- :裁剪函数,将概率比裁剪到 区间,防止策略的更新步长过大。这里 是一个超参数,控制裁剪的范围。
- :在未裁剪的概率比项和裁剪后的项之间取最小值。这一操作的目的在于限制策略更新幅度,以防止策略偏离旧策略过远,从而导致不稳定的学习过程。
整个PPO-clip 损失函数的作用是通过裁剪操作约束策略的变化幅度,使策略更新不会过于激进。
这种方式相比于传统策略梯度方法更为稳定,并且在优化过程中能够有效平衡探索和利用。PPO2 的这种裁剪机制是其成功的关键,广泛用于实际的强化学习应用中。
- 作者:SimonSun
- 链接:https://simons-blog-eight.vercel.app//article/llm-6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。