PPO算法 基础讲解
馈奖励Reward简称 并进入下一个状态。整个过程的目标是让累计奖励最大化。策略Policy, 策略就是智能体大脑里的“行为准则”。在深度强化学习里策略通常是一个神经网络。输入当前的画面/状态 输出应该采取某个动作 的概率分布。我们用 表示其中 是神经网络的参数。优势函数Advantage Function, 这个概念极其重要它表示在状态 下采取动作比一般水平平均期望要好多少。如果 说明这个动作比平均水平好我们应该鼓励增加以后做这个动作的概率。如果 说明这个动作比较糟糕比乱玩还差我们应该惩罚降低做这个动作的概率。传统策略梯度Vanilla Policy Gradient的致命弱点传统的做法是利用收集到的数据计算梯度直接更新神经网络。痛点神经网络的更新步长Learning Rate极难把握步子迈小了训练比蜗牛还慢。步子迈大了策略一下子更新过头可能从一个“还不错的策略”直接跌入深渊导致彻底崩溃。更惨的是由于后续还要用这个崩溃的坏策略去收集新数据收集来的全都是垃圾数据模型再也恢复不回来了。PPO诞生背景#为了解决策略更新过程中“步长过大导致训练不稳定”的问题学者们先发明了TRPO (Trust Region Policy Optimization, 信任区域策略优化)。TRPO 的核心思想是限制每次策略更新的幅度保证新策略和旧策略不要差得太远。虽然 TRPO 效果很好但它的数学推导极其复杂涉及到复杂的二阶偏导矩阵运算海森矩阵代码写起来简直让人头秃而且计算很慢。于是PPO 诞生了PPO 的目标和 TRPO 一模一样但它使用了一种极其巧妙、简单的一阶数学技巧只用到了简单的min和clip裁剪函数就达到了相同的限制效果。这也是为什么现在大家都用 PPO 而不用 TRPO 的原因。PPO公式推导#在 Spinning Up 的文档中重点讲解了目前最常用的PPO-Clip裁剪版 PPO。1. 定义新旧策略的比率 (Ratio)#首先我们定义一个参数 分子新策略正在训练的策略下在状态 采取动作 的概率。分母旧策略收集这批数据时的老策略下在状态 采取动作 的概率。如果 说明新策略比旧策略更倾向于做这个动作如果 则反之。2. 最原始的目标函数未限制版#如果我们把刚才学到的比率和优势函数结合最原始的优化目标是我们要最大化这很容易理解如果动作好我们要最大化 模型就会疯狂推高 的值如果动作差模型就会努力压低 。 但这又回到了老问题神经网络如果一味地追求最大化就会把新旧策略的差距拉得无限大导致策略崩溃。神经网络的唯一目标就是把 的值变得“越大越好”Maximize。无论是好动作还是烂动作优化器都在拼命地最大化。3. PPO 的神来之笔Clip裁剪机制#为了不让新旧策略差距过大PPO 引入了一个很小的超参数 Spinning Up 中默认通常取 0.2。PPO 会强制把比率 限制在 即 的范围内。请看文档中的最终核心公式这公式为啥要取个min为什么要裁剪我们分两种情况用大白话翻译一下文档里的原理解释情况 A当优势函数 时智能体做了一个好动作我们希望增大新策略做这个动作的概率即 越大越好争取大于 1。但是如果 增大到超过了 比如变成了 1.5clip函数就会把它强行“一刀切断”死死摁在 。因为最外层有个min取最小值所以虽然你原本的项涨到了 但被裁剪的项是 。取两者较小的一个目标函数的值就被锁死在 了。再往上走目标函数也不会增加神经网络也就失去了继续推高概率的动力。大白话结论对于好动作PPO 鼓励你多做但见好就收新策略涨幅超过旧策略 20% 就不再奖励你了。这就防止了策略突变。情况 B当优势函数 时智能体做了一个烂动作我们希望减小做这个动作的概率即 越小越好争取小于 1。此时 是个负数。如果 不断减小跌破了 变成了 0.8 以下比如 0.5clip函数会把它下限锁死在 0.8。同样因为外层有个min注意这里 是负的所以 0.5 * (-10) -5而 0.8 * (-10) -8。取更小的值即 -8。大白话结论对于烂动作PPO 让你以后少做但做动作的概率降幅超过 20% 也就差不多了没必要赶尽杀绝。情况B有些绕我们为什么说-8的降幅反而更小例子假设现在智能体做了一个烂动作优势函数 。概率比率 的原先值是 1.0。为什么因为在刚刚开始更新这批数据时新策略就等于旧策略。所以 新概率旧概率旧概率旧概率。KPI得分目标函数 的原先值是 -10。既然一开始 而这个动作是个烂动作优势 那么一开 始的得分 。记住这个基准点神经网络还没开始发力时它在这个动作上的初始 KPI 是 -10分。它的目标是把这个分数越变越大比如变成 -8-5甚至 0。关于“做动作的概率”从 1.0 降到 0.8概率降了20%降幅小。从 1.0 降到 0.5概率降了50%降幅大。你说得对0.5 的概率降幅确实更大关于“KPI得分”注意分数是越大越好如果概率降到 0.8KPI 从 -10涨到了 -8。如果概率降到 0.5KPI 从 -10涨到了 -5。对于神经网络来说-5 分比 -8 分更高所以如果不加min限制神经网络为了拿到最高的-5 分它会选择把概率降幅搞得非常大降到 0.5。但是教导主任min函数介入了当你把概率降到 0.5 时教导主任不给你 -5 分强行只给你-8 分。既然降 50% 只能拿 -8 分降 20% 也能拿 -8 分神经网络就会“偷懒”只降 20% 就停手了。这就成功实现了“限制策略更新幅度不让降幅太大”的目的。如果不加限制概率往 0 压是不是表示不会探索新的动作了恰恰相反如果烂动作的概率被瞬间压到 0它会去疯狂做别的动作但这会导致一个极其可怕的后果策略崩溃Catastrophic Forgetting。如果 这就意味着在这个特定的状态下神经网络输出做这个动作的新概率变成了 0。那么为什么说“如果新概率变成了 0它会去疯狂做别的动作”这又怎么导致了“策略崩溃”呢1. 为什么新概率变成 0就意味着“疯狂做别的动作”#强化学习中的策略Policy即那个神经网络在任何一个状态下输出的是所有可能动作的概率分布。概率分布有一个铁律所有动作的概率加起来必须等于 1或 100%。假设在状态 下你有 3 个可能的动作动作 A、动作 B、动作 C。一开始旧策略它们被选中的概率是A: 33%B: 33%C: 33%现在你试了动作 A发现是个烂动作优势 。如果你不加 PPO 的限制优化器为了把 KPI目标函数 最大化会瞬间把做动作 A 的新概率压到0即 变成 0。那么剩下的概率那 100%去哪了呢由于所有概率加起来必须是 100%神经网络被迫要把这 100% 的概率分配给剩下的动作 B 和 C。于是新策略的概率可能瞬间变成了A: 0%(之前是 33%)B: 50%(之前是 33%)C: 50%(之前是 33%)你看虽然你只是把 A 压到了 0但作为连锁反应你被迫大幅度提高了做 B 和 C 的概率。这就是我说的“去疯狂做别的动作”。2. 为什么这种“瞬间把某个动作压到 0强抬其他动作”会导致“策略崩溃”#这正是没有 PPO 限制时最致命的问题主要有两点原因致命点一你可能错杀了“好动作”#在强化学习刚开始训练的时候你的价值网络Critic用来评价动作好坏的是极不准确的。你以为动作 A 是个烂动作算出来 但实际上它可能是一个极好的动作只是因为你后续没走好或者你的评价网络还没训练好给了它一个错误的差评。如果没有限制你因为一个错误的评价瞬间把动作 A 压成了 0。一旦概率变成 0智能体在接下来的探索中永远不可能再选到动作 A 了。它永远失去了发现动作 A 真实价值的机会。这就叫“盲目封杀”。如果用 PPO 限制就算评价网络说它是烂动作PPO 的min和clip机制也只允许你把动作 A 的概率最多降 20%比如从 33% 降到 26.4%。它依然有机会被选中如果在未来几轮更新中评价网络变聪明了发现动作 A 其实很好它还有机会把概率涨回来。致命点二神经网络的“牵一发而动全身”灾难性遗忘#这是深度学习神经网络底层的特性。神经网络不是一个一个独立的抽屉它是一个复杂的黑盒参数是高度纠缠的。当你不加限制要求神经网络在这一次更新中发生剧烈变化比如硬生生把某个输出从 33% 掰到 0%这在数学上需要产生极其巨大的梯度参数更新量。这一大脚油门踩下去整个神经网络的参数全乱套了。为了迎合这个“把动作 A 变成 0”的极端要求网络可能会彻底破坏掉它在其他状态下好不容易学到的好策略。这就像是你要修正文章里的一个错别字结果一锤子下去把整台电脑砸烂了。这就叫策略崩溃Policy Collapse或灾难性遗忘Catastrophic Forgetting。注意在绝大多数经典的强化学习场景中动作空间能做什么动作是人类开发者提前定义好的也就是“列出来的”。智能体不能凭空“发明”出你没有定义过的全新动作。例子超级玛丽你能做的动作就是手柄上的按钮组合[上、下、左、右、跳、加速]。 或者更简单点我们就定义 3 个动作A(往左跑)、B(往右跑)、C(原地跳)。