PPO算法(二)
在上一篇笔记《PPO算法(一)》里,我们推出了PPO的完整损失函数:
其中min,以及
一、为什么CLIP之外还需要MIN
先重新写一下目标函数,把两项拆开看:
一个自然的疑问是:既然CLIP已经把
答案是:如果只用裁剪项,会有一个漏洞。裁剪项一旦越界,就会变成一个和
1. 先建立统一的判据
只有当
情形A:
因为
- 若
:差为正,未裁剪项更大,MIN选中裁剪项(较小),梯度为0 - 若
:差为负,未裁剪项更小,MIN选中未裁剪项(较小),梯度非0
情形B:
因为
- 若
:差为负,未裁剪项更小,MIN选中未裁剪项(较小),梯度非0 - 若
:差为正,未裁剪项更大,MIN选中裁剪项(较小),梯度为0
2. 四种组合的完整结论
把上面的推导整理成表格,一目了然:
| 组合 | MIN选中 | 梯度 | ||
|---|---|---|---|---|
| 1 | 裁剪项 | 0 | ||
| 2 | 未裁剪项 | 非0 | ||
| 3 | 未裁剪项 | 非0 | ||
| 4 | 裁剪项 | 0 |
对照”如果不用MIN,只用CLIP”(即恒定输出裁剪项)的情况:组合1和组合4,MIN和纯CLIP的结果完全一致,都是梯度为0;组合2和组合3,MIN的结果和纯CLIP不同——纯CLIP会把梯度错误地锁死为0,而MIN把它救了回来,恢复出非零梯度。
3. MIN真正起作用的条件
把上表按”
组合1、4:
越界的方向,和 希望的方向一致——策略已经朝着优势函数指示的正确方向走,只是走过头了(好动作的概率抬得太高,或坏动作的概率压得太低)。这两种情况,纯CLIP本身就能正确地把梯度截断为0,不需要MIN介入,这是常规意义上的”踩刹车、防止步子太大”。组合2、3:
越界的方向,和 希望的方向相反——策略走到了错误的方向上(好动作的概率被异常压低,或坏动作的概率被异常抬高),而且错误的程度已经超出了信任域。这两种情况如果只用CLIP,梯度会被错误地锁死为0,模型完全无法自我纠正;必须靠MIN选中未裁剪项,才能恢复出非零梯度去纠错。
由此可以得到一个准确的结论:MIN真正的必要性,体现在”更新方向与优势符号相悖、且已超出信任域”的场景(组合2和组合3),而不只是”坏动作概率异常升高”这一种情况。组合3(坏动作概率异常升高)确实是后果最严重的一种——如果放任不管,模型会不断强化一个已知的坏动作——所以直觉上最容易被单独拎出来强调;但从MIN机制本身的数学结构看,组合2和组合3是完全对称、同等重要的两种情形,它们共享同一个特征:
4. 更高层的理解:悲观下界
综合以上分析,min的作用可以概括为:只在对策略更新有利的方向上限速,在需要纠错的方向上放行。这样一来,
二、Value Model的训练目标是怎么来的
回顾
这里有两个问题值得深挖:这个target本质上是什么?以及,为什么target要用
1. target的本质: -return
把GAE的定义代入展开。回忆
其中
2. 为什么target用旧Critic ,而不是当前的
这一点最容易被忽略,但恰恰是工程实现里的关键。PPO在一个batch数据上要做多个epoch的梯度更新,不管是Actor还是Critic都是如此。如果每次计算target时都用”当前”的
解决方式和DQN里的target network是同一个思路:先用旧的、固定住的
3. 一个常见的补充技巧:Value Clipping
不少实现(虽然不是原论文强制要求)会给Critic也加一层裁剪:
思路和策略侧的CLIP完全一致:防止Critic在同一批数据的多次更新中,输出值max而不是min——因为这是在最小化损失,取更大的那个损失值,相当于对”变化过大”的情况施加更强的惩罚。这和策略侧”取min得到悲观下界,防止目标被高估”在逻辑上是对偶的:一边是防止优势被高估导致更新过猛,一边是防止价值预测被低估(损失被低估)导致约束失效。需要说明的是,后续有实证研究发现这个value clip不一定总带来正面效果,是否加入要结合具体任务判断,并非所有PPO实现都会使用。
4. Critic的准确性为什么重要
回到GAE那部分的逻辑闭环:
三、两部分的核心直觉
- MIN的作用不是单纯”限制范围”,而是只在对策略有利的方向上限速,在需要纠错的方向上放行,从而让代理目标成为一个不会高估真实提升的悲观下界;关键场景是”更新方向与优势符号相悖、且已越过信任域”的两种组合,而不只是”坏动作概率异常升高”这一种。
- Value Model的训练目标用固定住的旧Critic反推出的
-return,本质是为了在多epoch复用同一批数据时保持target稳定;这和策略侧”用重要性采样比率复用旧数据”,是同一套工程哲学的两个体现。