首先引经据典一番,在sutton的introduction to reinforcement中,82页(第二版,November 5, 2017)中写道:
On-policy methods attempt to evaluate or improve the policy that is used to make decisions, whereas off-policy methods evaluate or improve a policy different from that used to generate the data.
On-policy 方法试图评估和更新做决定的策略,而off-policy方法所评估和更新的策略是和生成数据的策略不相同的。
简而言之,on-policy(中文翻作同策)就是要更新的策略和与环境交互产生数据的策略是同一个策略,off-policy(中文翻作异策)就是要更新的策略和与环境交互产生数据的策略是不同的策略。
在此并不打算举强化的例子,而是用深度强化学习的例子来说明。
典型的异策算法有:DQN族、DDPG族、SAC等,凡是包含经验回放的,可以说都是异策算法。因为在更新策略的时候,会从经验回放中取出数据来对现在的策略进行更新,而这些数据是先前的策略生成的,也就是说,生成数据的策略和当前要更新的策略是不同的策略,即off-policy。
典型的同策算法有:原始AC、REINFORCE、A3C等,这些算法在更新时都需要用当前策略去获得一个trajectory,然后用这个trajectory数据来更新当前策略,即on-policy。
特别提名一个特殊的异策算法:PPO,有很多人认为PPO算法是同策算法(许多论文中也这么定义),但事实上PPO是用同策算法的套路,行异策更新的实际。看以下PPO的伪代码:
这其中包含两个循环,外循环的策略更新收敛循环,重点在于内循环,内循环是使用策略获得个轨迹长度为的数据,并估计每一个优势函数值。随后,在内循环的下面一句
使用上面获得的数据对策略参数进行了次更新。如果,则产生更新所用数据的策略和被更新的策略就是相同的,此时就是on-policy,而如果,后面被更新的策略就已经发生了变化,与采集数据的策略不再相同,此时将成为off-policy。通常,的取值是10。
由于在PPO目标函数的限制下,策略更新的幅度不会特别大,策略梯度已经被clip掉,因此次更新前后的策略差别就不会太大,某种意义上,认为PPO是同策算法也没问题。