on-policy:采集数据的策略和正在被优化的策略是同一个策略
on-policy的缺点:旧策略产生的数据不能用来训练新策略,样本利用率比较低
off-policy:采集数据的策略和正在被优化的策略是不同的策略,比如DQN,这样数据被多次使用,提高了训练效率。举个例子,这就像从别人的错误中学习:数据不是由我的策略采集的,但我仍然希望从数据中学习。但是,我们不能直接照搬旧策略采集到的数据,而是根据当前策略和旧策略在同一状态下选择同一动作的概率差异,对学习信号进行修正。比如说,小明喜欢上课玩手机,而你不喜欢上课玩手机,他上课玩手机被发现了,这对你的警示作用不大。但是如果你比小明更喜欢上课玩手机,那么他玩手机被发现对你的警示作用就很大。
如何进行修正呢?可以采用重要性采样的方法,如果想求x~p(x)的一个期望值,但是采样的x服从x~q(x),可以通过重要性系数p(x)/q(x)进行调节。

使用重要性采样的方法,可以对使用GAE作为优势评估的策略梯度函数采用旧的轨迹概率分布,从
变成
将log的梯度展开,并约去蓝色部分得到


将这个策略梯度函数转换成Loss函数,去掉求梯度,增加负号将求最大值变成求最小值,利用蒙特卡洛方法将期望形式转化成采样求均值的方式,得到
![]()
利用老策略采样的数据计算优势函数,然后用训练策略做某个动作的概率除以老策略做某个动作的概率来调整优势函数的结果。这样就解决了数据利用率低的问题。
但是,就如上面所说,小明喜欢上课玩手机,而你不喜欢上课玩手机,他上课玩手机被发现了,这对你的警示作用不大。但是如果你比小明更喜欢上课玩手机,那么他玩手机被发现对你的警示作用就很大。所以PPO的出发点是老策略和新策略不能相差太大。
如何衡量两个策略的差距呢?可以使用KL散度或者截断函数。
KL散度是描述两个概率分布相似程度的量化指标,两个概率分布越相似,KL散度越接近0。
![]()
PPO-clip则使用了两部分中较小的作为loss,第一部分是原公式,第二部分是截断函数,截断函数将新旧策略的比值(即差异)限制在1-ε和1+ε之间。当优势函数大于0时,意味着当前动作比平均表现更好,从而希望新旧策略的比值尽可能大(1+ε),从而提升整体回报;当优势函数小于0时,意味着当前动作比平均表现更差,从而希望新旧策略的比值尽可能小(1-ε),从而减少损失。

但是PPO只适合新旧策略差距不大的情况,所以只能用几轮相近的数据。因此PPO通常仍然归类为on-policy。
以上部分对应的是PPO的Loss函数中的Actor部分,另外还有两部分Loss,一个是Critic的Loss,一个是Entropy Loss。
Critic网络的核心任务是估计状态价值函数
,其目标是最小化估计价值和真实价值之间的差异
根据优势函数的定义:
,Q是状态st的真实价值目标,在PPO中,用GAE估计的A和旧策略的价值函数计算Q的近似值,得到近似目标为:
![]()
从而得到Critic网络的损失函数为:
![]()
其中:

接下来讲entropy loss,entropy loss解决的问题是在训练早期,动作概率分布会很快变得尖锐,大量概率汇聚在一个固定动作上,探索性不足。而动作概率分布越平均,熵越大。
![]()
最后将三个loss组合起来就得到PPO的Loss
![]()
参考视频:

被折叠的 条评论
为什么被折叠?



