PPO 的重要性

PPO是目前非常流行的增强学习算法,OpenAI把PPO作为目前的baseline算法,也就是说,OpenAI在做尝试的时候,首选PPO。可想而知,PPO可能不是目前最强的,但可能是目前来说适用性最广的一种算法。

PPO是基于AC架构的,也就是说,PPO也有两个网络,分别是Actor和Critic,这是因为AC架构有一个好处。这个好处就是解决了连续动作空间的问题。

连续动作

首先,我们要想办法处理连续动作的输出问题。
离散情况:假设动作空间有只有action1 和 action2,有40%的概率选择action1 ,60%概率选择action2。也就是说在这个状态下的策略分布: pi = [0.4, 0.6]。

在连续型,我们不再用数组表示,而是用函数表示。例如,策略分布函数 : P = (action)代表在策略下,选择某个 action 的概率 P。但这就有个问题,用神经网络预测输出的策略是一个固定的 shape而不是连续的。那又什么办法可以表示连续型的概率呢?

我们先假定策略分布函数服从一个特殊的分布,这个特殊的分布可以用一、两个参数表示它的图像。正态分布就是这样一个分布,他只需要两个参数,就可以表示了。

我们的神经网络可以直接输出mu和sigma,就能获得整个策略的概率密度函数了。
现在我们已经有概率密度函数,那么当我们要按概率选出一个动作时,就只需要按照整个密度函数抽样出来就可以了。

数据问题

但AC还有一个问题。AC产生的数据,只能进行1次更新,更新完就只能丢掉,等待下一次跑游戏的数据。在数据就是生命的时代,这可是天大的浪费呀,尤其在强化学习中,数据更是弥足珍贵呀。
那为什么只能用一次呢,像DQN也可以用经验回放,把以前的数据存起来,更新之后用?AC为什么就不行呢?

我们先从策略说起。两个概念:

  • 行为策略:不是当前策略,用于产出数据
  • 目标策略:会更新的策略,是需要被优化的策略

如果两个策略是同一个策略,那么我们称为 On Policy。
如果不是同一个策略,那么Off Policy。

例如,如果我们在智能体和环境进行互动时产生的数据打上一个标记。标记这是第几版本的策略产生的数据,例如 1, 2…10

现在我们的智能体用的策略 10,需要更新到 11。如果算法只能用 10 版本的产生的数据来更新,那么这个就是在线策略如果算法允许用其他版本的数据来更新,那么就是离线策略

例如 PG,就是一个在线策略。因为PG用于产生数据的策略(行为策略),和需要更新的策略(目标策略)是一致的。

而 DQN 则是一个离线策略。我们会让智能体在环境互动一定次数,获得数据。用这些数据优化策略后,继续跑新的数据。但老版本的数据我们仍然是可以用的。也就是说,我们产生数据的策略,和要更新的目标策略不是同一个策略。所以DQN是一个离线策略。

Q-learning 采取的新动作是通过选择最大值策略(on-policy)更新的;Sarsa 是根据现有 Q 表的贪婪策略(off_policy)更新的。

为什么PG和AC中的Actor更新,就不能像DQN一样,把数据存起来,更新多次呢?
答案是在一定条件下,能,PPO做的工作就是这个。在了解在什么条件下可以的时候,我们需要先了解一下,为什么不能。

在这里的策略,我感觉可以理解为衡量不同动作的价值,即Q表的值。

DQN更新Q值,和策略无关。 在同一个动作出发,可能会通往不同的state,但其中的概率是有环境所决定的,而不是我们的策略所决定的。所以我们产生的数据和策略并没有关系
PG算法会按照TD-error作为权重,更新策略。权重越大,更新幅度越大;权重越小,更新幅度越小。

策略和 TD-error 的分布不一致。

Important-sampling

PPO是怎样做到离线更新策略的呢?答案是Important-sampling,重要性采样技术。
IS:如果我们想用策略B抽样出来的数据,来更新策略P也不是不可以。但我们要把 td-error 乘以一个重要性权重(IW:importance weight)。

重要性权重:IW = P(a)/ B(a)

应用在PPO,就是目标策略出现动作 a 的概率除以行为策略出现 a 的概率

更新谁,谁就是目标策略。PPO应用了importance sampling,使得我们用行为策略获取的数据,能够更新目标策略,把AC从在线策略,变成离线策略。

N步更新的技术:我们把之前的TD叫做TD(0),而n步更新为TD(n)。可以看成TD(0)其实是TD(n)的一种特殊情况。

但实际上P策略和B策略差异并不能太大,为了能处理这个问题,有两个做法,PPO1 和 PPO2 。
相对来说,PPO2更好理解,做法也更简单,性能并不比PPO1差,目前主流的方式也是用PPO2。

DDPG

DDPG也是解决连续控制型问题的的一个算法,不过和PPO不一样,PPO输出的是一个策略,也就是一个概率分布,而DDPG输出的直接是一个动作。

我们知道DQN用magic函数,也就是神经网络解决了Q-learning不能解决的连续状态空间问题。那我们同样的DDPG就是用magic解决DQN不能解决的连续控制型问题就好了。

也就是说,DDPG用一个magic函数,直接替代maxQ(s’,a’)的功能。也就是说,我们期待我们输入状态s,magic函数返回我们动作action的取值,这个取值能够让q值最大。这个就是DDPG中的Actor的功能

当我们把某个 state 输入到 DDPG 的 Actor 中的时候,相当于在这块曲面上做沿着 state 所在的位置剪开,这个时候大家会看到这个边缘是一条曲线。
在某个状态下,选择某个动作值的时候,能获得的 Q 值。
Actor的任务就是在寻找这个曲线的最高点,然后返回能获得这个最高点,也是最大Q值的动作。

所以,DDPG其实并不是 PG,并没有做带权重的梯度更新。而是在梯度上升,在寻找最大值。
这也就解释了,为什么DDPG是一个离线策略,可以多次更新却不用importance sampling。这是因为这个算法就是DQN,和策略没有直接的关系

Critic

  • Critic 网络的作用是预估 Q,虽然它还叫 Critic,但和 AC 中的 Critic 不一样,这里预估的是 Q 不是 V;
  • 注意 Critic 的输入有两个:动作和状态,需要一起输入到Critic中;
  • Critic 网络的 loss 其还是和 AC 一样,用的是 TD-error。(防止正数陷阱)

Actor

  • 和 AC 不同,Actor 输出的是一个动作
  • Actor的功能是,输出一个动作A,这个动作A输入到Crititc后,能够获得最大的Q值。
  • 所以Actor的更新方式和AC不同,不是用带权重梯度更新,而是用梯度上升。

DDPG是源于DQN而不是AC了。
所以,和DQN一样,更新的时候如果更新目标在不断变动,会造成更新困难。所以DDPG和DQN一样,用了固定目标网络技术,就是先冻结住用来求target的网络。在更新之后,再把参数赋值到target网络。

所以在做的时候,我们需要4个网络。actor, critic, actor_target, cirtic_target。

https://github.com/louisnino/RLcode/blob/master/tutorial_DDPG.py

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐