极市导读
调参总翻车?PPO 用“一刀剪”把策略更新锁死在安全区:比率超 ε 直接剪掉,既稳又快,还省掉 TRPO 复杂的二阶优化,RL 落地首选。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
训练老是翻车,调参像在碰运气?多数时候问题出在策略更新的“步子”迈得太大。Policy Gradient 简单直接却极易不稳,TRPO 在稳定性上更有保障,却因复杂实现难以普及。
PPO 则在两者之间找到黄金分割点:它用“一刀剪”锁住策略更新的幅度,多轮复用同一批数据,提高效率,还不需要繁琐的二阶优化。这样的设计,让 PPO 成为学术界和工业界应用最广的强化学习算法之一。
接下来,我们先从 RL 的基本直觉出发,看看它为什么能迅速走红。
01 引言:强化学习的“痛”
什么是强化学习?(快速回顾)
想象一下,你是一个刚刚出生的婴儿,对这个世界一无所知。你饿了会哭,舒服了会笑。你的父母(环境)会根据你的行为(哭/笑)给出反馈(喂奶/爱的抱抱)。通过无数次的尝试和反馈,你慢慢学会了如何与环境互动,如何让自己更舒服,如何获得更多“奖励”(比如糖果,或者父母的赞许)。
这就是强化学习(Reinforcement Learning,RL)的核心思想:一个 智能体(Agent) 在环境(Environment)中通过行动(Action)来最大化累积奖励(Reward)。
智能体根据当前状态(State)选择行动,环境则根据行动给出奖励和新的状态。这个过程周而复始,智能体通过不断试错来学习一个最优的策略(Policy),这个策略就是告诉智能体在任何给定状态下应该采取什么行动的“行为准则”。
策略梯度:直觉与挑战
在强化学习中,我们通常有两种学习策略的方式:
1. 基于价值(Value-based):先学习每个状态或状态-动作对的“价值”(即未来能获得的累积奖励),然后根据价值选择最优动作。比如 Q-learning、DQN。
2. 基于策略(Policy-based):直接学习一个策略函数,这个函数可以直接输出在某个状态下采取每个动作的概率。比如 REINFORCE、A2C。
策略梯度(Policy Gradient)方法就是基于策略学习的典型代表。它的核心思想非常直观:如果某个动作导致了高奖励,我们就增加这个动作在未来被选中的概率;如果导致了低奖励(或者惩罚),就降低它的概率。
数学上,我们希望最大化期望的累积奖励:
其中, 是一个轨迹(状态-动作-奖励序列), 是由参数 定义的策略, 是轨迹的总奖励。
策略梯度定理告诉我们,可以通过梯度上升来更新策略参数 :
这里, 是优势函数 (Advantage Function),它衡量了在状态 下采取动作 比平均水平好多少。如果 ,我们就增加 的值(即增加 的概率);如果 ,就减少它。
听起来很美妙,对吧?直接优化策略,简单粗暴!但现实是骨感的,策略梯度方法有一个致命的问题:不稳定性。
为什么需要PPO?——“步子迈大了,容易扯着蛋”的问题
想象一下,你正在学习骑自行车。你尝试着蹬了一脚,结果车子歪了,你摔了个狗吃屎。按照策略梯度的逻辑,你可能会想:“哦,这一脚蹬得太猛了,下次轻点!”然后你下次真的轻点了,结果车子纹丝不动。你又想:“嗯,看来还是得猛点!”
问题在于,策略梯度方法在更新策略时,步长(学习率)的选择非常关键。如果步长太小,学习会非常慢,效率低下,就好像一个蜗牛在爬珠穆朗玛峰,猴年马月才能到顶啊。
但如果步长太大,策略可能会发生剧烈变化,导致性能急剧下降,甚至“灾难性遗忘”(Catastrophic Forgetting)。这就像你骑自行车,一不小心蹬得太猛,直接冲下悬崖,再也回不来了。
核心问题:如何才能在保证学习效率的同时,又避免策略更新过大导致“翻车”?
这就是 PPO 要解决的核心问题。它就像一个经验丰富的教练,在教你骑自行车时,既鼓励你大胆尝试,又在你快要摔倒时及时扶你一把,确保你始终在安全的范围内学习。
02 PPO解决了什么问题?——“稳健”与“高效”的平衡艺术
在深入讲解 PPO 的之前,我们先来明确它在强化学习的演进中扮演了什么角色,解决了哪些前人留下的“历史遗留问题”。
策略梯度方法的最大问题:不稳定性
我们前面提到了策略梯度方法的不稳定性。这是因为它们通常是在线(On-Policy)学习算法。这意味着它们用当前策略 收集数据,然后用这些数据来更新 。
一旦策略更新了,之前收集的数据就“过期”了,因为它们不再符合新的策略分布。如果新旧策略差异太大,那么用旧数据计算出的梯度方向可能对新策略来说是完全错误的,导致策略朝着错误的方向“狂奔”,最终“崩盘”。
这就像你用一套旧的、过时的地图(旧策略)来规划你的旅行路线(收集数据),然后根据这次旅行的经验(更新策略)来修改地图。如果你的修改幅度太大,地图变得面目全非,那么下次你再用这张新地图去旅行时,很可能发现自己迷失在荒野中,甚至掉进陷阱。
信赖域方法(TRPO)的“救赎”:理论优雅,实现复杂
为了解决策略梯度不稳定性问题,研究者们提出了信赖域策略优化(Trust Region Policy Optimization,TRPO)算法。
TRPO 的核心思想是:每次策略更新,都必须保证新策略与旧策略之间的差异在一个“信赖域”之内。这个差异通常用 KL 散度(Kullback-Leibler Divergence)来衡量,它量化了两个概率分布之间的距离。
TRPO 的目标函数可以概括为:
其中, 是 KL 散度, 是信赖域的半径。
TRPO 的理论非常优雅,它保证了每次更新都能提升策略性能,并且不会出现灾难性的性能下降。
然而,TRPO 有一个致命的缺点:实现起来非常复杂。它需要计算二阶导数(Hessian 矩阵),或者使用共轭梯度法(Conjugate Gradient)来近似求解,这在计算上非常昂贵,而且难以与深度学习框架(如 PyTorch)的自动微分机制完美结合。
PPO的登场:在优雅与实用之间找到“黄金分割点”
就在 TRPO 让大家望而却步的时候,OpenAI 在 2017 年推出了 PPO。PPO 的目标非常明确:在保持 TRPO 稳定性的同时,大大简化其实现难度,使其能够像普通的策略梯度方法一样,使用一阶优化器(如 Adam)进行训练。
PPO 不再需要计算复杂的二阶导数,而是通过一个巧妙的“剪裁(Clipping)”机制,在目标函数中直接限制新旧策略的差异。
PPO 解决了什么问题?
1. 策略梯度方法的不稳定性:通过限制策略更新的幅度,避免了“步子迈太大扯着蛋”的问题。
2. TRPO 的复杂性:用一个简单的一阶优化目标替代了复杂的二阶优化和约束求解,使得算法更容易实现和调优。
3. 在线学习的样本效率问题(部分解决):虽然 PPO 仍然是 On-Policy 算法,但它允许在收集到一批数据后,对这些数据进行多次迭代更新(Multiple Epochs),从而在一定程度上提高了样本利用率,减少了与环境的交互次数。
简而言之,PPO 在算法的稳定性、实现复杂度、以及样本效率之间找到了一个近乎完美的平衡点。它既不像 REINFORCE 那样“鲁莽”,也不像 TRPO 那样“高冷”,而是成为了一个“刚刚好”的算法,因此迅速成为了强化学习领域最受欢迎、应用最广泛的算法之一。
03 PPO用了什么方法?——优雅的策略修剪术
PPO 之所以能成为强化学习的“网红”,离不开它背后一系列巧妙而实用的设计。让我们一层一层地揭开它的神秘面纱。
核心思想:限制策略更新的幅度
PPO 的核心思想非常简单粗暴,但又极其有效:我允许你更新策略,但你不能“跑偏”太多!它不像 TRPO 那样通过 KL 散度来严格约束,而是通过一个更直接的方式——剪裁(Clipping),来限制新旧策略之间的比率。
想象一下,你是一个正在学习画画的学徒。你的老师(PPO)告诉你:“你可以自由发挥,但你的画风不能离我教你的基础风格(旧策略)太远。如果你画得太离谱,我就把你画的这部分‘剪掉’,只保留接近我风格的部分。”
策略比率(Probability Ratio):衡量“新旧”策略的差异
在 PPO 中,我们首先定义一个策略比率(Probability Ratio),用来衡量新策略 在给定状态 下采取动作 的概率,相对于旧策略 的比值:
这里的 是当前正在优化的策略参数,而 是在收集数据时使用的策略参数(通常是上一次迭代的策略参数)。
这个比率 告诉我们,新策略相对于旧策略,在 采取 的可能性是增大了还是减小了,以及增大了多少倍或减小了多少倍。
-
如果 ,说明新策略更倾向于采取 。 -
如果 ,说明新策略更不倾向于采取 。 -
如果 ,说明新旧策略对 的偏好程度一样。
剪裁(Clipping)机制:给策略更新戴上“紧箍咒”
PPO 最核心的创新点就在于这个"剪裁"机制。它修改了传统的策略梯度目标函数,引入了一个剪裁项,确保策略比率 不会超出某个预设的范围 。这里的 是一个超参数,通常取 0.1 或 0.2 。
目标函数:PPO-Clip 的数学表达
PPO 的目标函数(通常称为 PPO-Clip 目标)是这样的:
其中:
-
表示对时间步 的期望,实际上是在一批(batch)数据上求平均。 -
是策略比率。 -
是优势函数,衡量在状态 下采取动作 的"好坏"(稍后会详细解释)。 -
clip( , min_val,max_val)是一个剪裁函数,它将 的值限制在 [min_val,max_val]之间。如果 min_val,则返回 min_val ;如果 max_val,则返回 max_val;否则返回 。
这个目标函数看起来有点复杂,但我们来拆解一下它的含义。它包含两个项,然后取它们的最小值:
1.原始策略梯度项:
-
这基本上就是传统的策略梯度目标,只是用比率 替代了 -
如果 (动作是好的),我们希望 越大越好(即新策略更倾向于这个动作)。 -
如果 (动作是坏的),我们希望 越小越好(即新策略更不倾向于这个动作)。
2.剪裁后的策略梯度项:
-
这一项对策略比率 进行了剪裁。 -
如果 超出了 的范围,它就会被强制拉回到这个范围内。
剪裁的直观理解:为什么 min 函数是关键?
现在,关键来了:为什么我们要取这两个项的最小值(min)?
让我们分两种情况来讨论 的符号:
情况一: (当前动作 是"好"的,值得鼓励)
-
我们希望新策略 更多地采取这个动作,即希望 增大。
-
此时,目标函数是 。
-
由于 ,这个 操作实际上是在限制 的上限。
-
如果 增长得太快,超过了 ,那么 就会把 限制在 。
-
此时,目标函数会选择 。
-
这意味着,即使新策略非常非常想采取这个动作,它的奖励贡献也最多只能是 。 PPO 会"惩罚"那些试图让 超过 的更新,因为这会导致目标函数不再增加。
-
直观理解:当一个动作是好的,PPO 鼓励你增加它的概率,但如果你增加得“太过分”了(超过 倍),PPO 就会说:“停!你已经足够好了,再好我也不会给你更多奖励了。别跑偏了!”这就像一个老师给学生加分,加到满分 100 分后,即使学生表现再好,也不会给他 101 分。
情况二: (当前动作 是"坏"的,应该避免)

