概念理解
On-policy(在线策略、同策略):当前策略与环境交互,收集到一些数据。更新网络参数时只用这部分数据(因此无法使用经验回放)
Off-policy(离线策略,异策略):更新网络参数时,可以用到任何经验数据,如储存的过去策略得到的数据,此处“异”即表示 获得数据时所使用的策略 和 目标得到的策略 不同(因此可以用经验回放)
参考强化学习里的 on-policy 和 off-policy 的区别
- 关键区别
这二者之间的区别,不在于选择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的方法。
代码实现
占个坑待补