[原创] 强化学习里的 on-policy 和 off-policy 的区别

强化学习(Reinforcement Learning,简称RL)是机器学习的一个领域,刚接触的时候,大多数人可能会被它的应用领域领域所吸引,觉得非常有意思,比如用来训练AI玩游戏,用来让机器人学会做某些事情,等等,但是当你越往里看,就会发现跟传统机器学习相比,RL里面的名词简直太多了吧!多到完全可以绕晕人。比如RL里经常会提到的agent,environment,episode(rollout),policy,on-policy,off-policy,state,trajectory,reward,replay buffer,model-based,model-free,MD,TD,PG,AC,等等。强化学习的高手对这些词很熟悉,但对新手来说可能就很痛苦。
在RL领域,on-policy和off-policy是两个非常重要的概念,这两个词,把RL方法分成了两个类别。你可以从网上搜到很多很人提问on-policy的强化学习方法和off-policy的强化学习方法有什么区别,作为一个智商相当平庸的人,鬼知道我当初看了多少教程才认为自己大概搞清楚了它们之间的区别。
所以我在这篇文章里想把自己的肤浅理解分享出来,希望能帮助到少部分人。

由于自己的知识有限,可能会出现错误,请见谅。

  • 中文含义

我见过的 on-policy/off-policy 的中文翻译有:同策略/异策略,在线策略/离线策略,光看这些名字真的会迷惑人,所以不要试图去用中文来理解它们的区别。
文章来源:https://www.codelast.com/

  • 关键区别

这二者之间的区别,不在于选择action的方式,而在于更新网络参数的数据的收集方式。参考Reddit上的这个讨论。
理论上来说,on-policy的算法只能使用当前正在优化的policy生成的数据来进行训练,当你使用一条(state, action, reward, new_state)的数据对policy网络的参数进行了更新之后,这个“正在优化”的policy立即就变了,于是,你就要用它来生成新的一条数据,再继续进行后面的训练,并且你刚才用于训练的那条数据已经“过时”了,不能再使用,需要丢弃掉。
有人会说这种做法是不是太低效了?于是在实践中,经常是每收集了N条数据才会去更新一次,这N条数据是一个batch,并且这N条数据是用同一个policy生成的。
有人还会说,这好像不对啊?!理论上,用当前的policy生成了一条数据,就应该更新一次policy网络的参数,然后policy网络就变了,此时才能再生成第2条数据,依此类推,当生成到第N条数据的时候,policy网络都不知道变成什么鬼样子了,而如果我们用同一个policy连续生成N条数据才去更新一次policy网络的参数,这时的policy网络能跟一条条更新方式相比吗?确实,这两种方式表面上看起来policy相差会很大,但是,有其他的一些技术可以从数学上保证、并且也从实际效果上证明了:每N条数据才更新一次policy网络的方式,和每一条数据就更新一次policy网络的方式,没有多大区别,可行!
正因为这二者没有多大区别,我们仍然可以把每N条数据才更新一次policy网络、看似用“已经过时”的数据来更新policy网络的方法,叫做on-policy的方法——尽管它在实践操作的时候,看上去非常像off-policy的方法。
我用一个不专业的方法来描述一下:纯粹的on-policy的方法,就像是一个在不停跑步的人,他的姿态永远都在根据当前个人的身体状况调整改变,而每N条数据更新一次policy网络的方法,他只是看上去像off-policy的,但它实际上并没有真的“off”(完全落后跟不上),他只是看上去像是反射弧慢了一点,跑几百步就停下来歇一会儿,然后根据个人的身体状况,在接下来的那一段路程里,再用完全一致的姿态继续跑完(在这一段里不改变姿态)。
文章来源:https://www.codelast.com/

  • Behavior Policy 和 Target Policy / Update Policy

在一些介绍 on-policy / off-policy 区别的文章中,会看到用 behavior policy(行为策略)和 target policy(目标策略)的概念来解释 on-policy / off-policy 之间的区别,至于 update policy,提到这个概念的文章并不算多,比如这篇文章,我觉得大家就按 target policy 来理解就好了。
behavior policy 是指与environment互动生成training data的策略,target policy 是指你用training data不断去更新、优化,最终要拿去用的那个策略。为什么要搞出这两个概念?其实对于 on-policy 的算法来说,这两样根本就是一个东西!也就是说,我们用于生成training data的behavior policy,在生成了一条training data之后,马上就会被更新(现在你可以把它叫做target policy了,所处的位置不同,名称也不同),所以在 on-policy 算法中它俩其实是一回事。
文章来源:https://www.codelast.com/

  • 最容易把人搞疯的例子:PPO

PPO(Proximal Policy Optimization,近端策略优化)是当前在强化学习领域内,用于离散动作控制的最知名的算法之一(来自于OpenAI)。这玩意让人费解的地方在于,你会看到无数篇文章,这一篇讲它是on-policy的算法,另一篇讲它是off-policy的算法,而且看似各有各的说法各有各的道理。作为一个知识储备还不够多的人来说,很难判断谁对谁错。
我随便举几个网上搜到的例子:
(1)说PPO是on-policy的文章有:
https://www.zhihu.com/question/321713509
https://github.com/openai/baselines/issues/316
(2)说PPO是off-policy的文章有:
https://blog.csdn.net/qq_30615903/article/details/86308045
https://zhuanlan.zhihu.com/p/39624504(在这篇文章的评论里,有网友提出了质疑,认为PPO是on-policy的)
文章来源:https://www.codelast.com/
这些文章,很多充满了大量的数学公式,非常像样,作为一个初学者,恐怕原来有自己的想法,看了这些文章之后可能也会怀疑人生。
在上面的GitHub链接中,OpenAI的research scientist Matthias Plappert给了一个明确的说法:PPO是一种on-policy的算法。由于PPO就是OpenAI发明的,因此信他没错。

To clarify: PPO is an on-policy algorithm so you are correct that going over the same data multiple times is technically incorrect.
 
However, we found that PPO is actually quite okay with doing this and we still get stable convergence. This is likely due to the proximal trust region constrained that we enforce, which means that the policy cannot change that much anyway when going over the current set of transitions multiple times, making it still approximately on-policy. You can of course get rid of this but then you'll need more samples.
所以PPO算是一种“近似的”on-policy算法。
文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论