PPO算法(二)

上一篇笔记《PPO算法(一)》里,我们推出了PPO的完整损失函数:

其中里那个min,以及里的目标,都是一带而过。这篇笔记就把这两处的原理彻底讲清楚。

一、为什么CLIP之外还需要MIN

先重新写一下目标函数,把两项拆开看:

未裁剪项裁剪项

一个自然的疑问是:既然CLIP已经把的取值范围锁在了 之内,这不就相当于给策略更新加了”物理围栏”吗?为什么还需要再取一次MIN?

答案是:如果只用裁剪项,会有一个漏洞。裁剪项一旦越界,就会变成一个和无关的常数,对求导恒为0——这意味着梯度被无条件锁死。但”锁死梯度”并不总是我们想要的结果,有些情况下锁死反而会让模型没法自我纠错。MIN的作用,正是在四种可能的组合里,把这种”错误的锁死”排除掉。

1. 先建立统一的判据

只有当落在信任域之外(即 )时,未裁剪项和裁剪项才会不同,MIN才有实际作用;在信任域内两项相等,讨论MIN没有意义。所以只需要分析这两种越界情形。

情形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的作用可以概括为:只在对策略更新有利的方向上限速,在需要纠错的方向上放行。这样一来,本质上变成了原始未裁剪目标的一个悲观下界(pessimistic lower bound)——无论策略怎么变化,这个代理目标都不会高估真实的策略提升量。这和TRPO用KL散度做硬约束、保证每步更新都在”信任域”内是同一个思路,PPO只是用一种更简单、不需要二阶优化的方式(CLIP+MIN)近似实现了同样的效果。

二、Value Model的训练目标是怎么来的

回顾的定义:

这里有两个问题值得深挖:这个target本质上是什么?以及,为什么target要用而不是当前正在更新的

1. target的本质:-return

把GAE的定义代入展开。回忆 ,其中每一项 。把加回展开后,会发现实际上是一个多步回报的加权和-return),大致形式是:

其中是”用n步真实奖励、第n步之后用做估计”得到的n步回报。这和上一篇笔记里GAE那部分的结论是完全一致的: 时退化为单步TD、 时退化为蒙特卡洛。这不是巧合——Critic的训练目标和Actor所用的优势估计,用的是同一套加权机制,这样设计是为了让Actor和Critic对”什么是好的回报估计”保持一致,不产生割裂。

2. 为什么target用旧Critic ,而不是当前的

这一点最容易被忽略,但恰恰是工程实现里的关键。PPO在一个batch数据上要做多个epoch的梯度更新,不管是Actor还是Critic都是如此。如果每次计算target时都用”当前”的——也就是一边更新参数、一边用更新后的结果去算自己的训练目标——就会出现目标随参数同步漂移的问题,这和普通监督学习里”标签本身也在变”是一回事,训练会变得不稳定,甚至发散。

解决方式和DQN里的target network是同一个思路:先用旧的、固定住的(以及旧策略采样时算好的GAE),把这一整批数据的target一次性计算好并冻结,然后在后续多个epoch里,Critic只是在做一个”目标不变”的标准回归任务,逐步逼近这个固定target。target固定下来,训练才谈得上稳定。

3. 一个常见的补充技巧:Value Clipping

不少实现(虽然不是原论文强制要求)会给Critic也加一层裁剪:

思路和策略侧的CLIP完全一致:防止Critic在同一批数据的多次更新中,输出值相对于变化过大。注意这里用的是max而不是min——因为这是在最小化损失,取更大的那个损失值,相当于对”变化过大”的情况施加更强的惩罚。这和策略侧”取min得到悲观下界,防止目标被高估”在逻辑上是对偶的:一边是防止优势被高估导致更新过猛,一边是防止价值预测被低估(损失被低估)导致约束失效。需要说明的是,后续有实证研究发现这个value clip不一定总带来正面效果,是否加入要结合具体任务判断,并非所有PPO实现都会使用。

4. Critic的准确性为什么重要

回到GAE那部分的逻辑闭环:的质量完全依赖准不准。Critic不准,优势估计就会有偏,偏差会直接污染里的每一项,进而让Actor学到错误的更新方向。所以最终损失里不是可有可无的附加项,而是整个PPO能稳定工作的地基——Actor学得好不好,很大程度上取决于Critic收敛得快不快、准不准。这也是为什么实践中常常给Critic单独设置学习率,或者让Critic网络先”热身”训练一段时间再联合训练。

三、两部分的核心直觉

  • MIN的作用不是单纯”限制范围”,而是只在对策略有利的方向上限速,在需要纠错的方向上放行,从而让代理目标成为一个不会高估真实提升的悲观下界;关键场景是”更新方向与优势符号相悖、且已越过信任域”的两种组合,而不只是”坏动作概率异常升高”这一种。
  • Value Model的训练目标用固定住的旧Critic反推出的-return,本质是为了在多epoch复用同一批数据时保持target稳定;这和策略侧”用重要性采样比率复用旧数据”,是同一套工程哲学的两个体现。