强化学习中 on-policy与off-policy 的理解;如何区分on-policy 与 off-policy;RL更新策略、policy结构总结

目录

  • 基本概念:
  • Q-learning VS Sarsa:
  • DQN VS PPO:
  • 区分on-policy 与 off-policy
  • 一些总结:

基本概念:

  • 如果要学习的 agent和环境互动的 agent同一个的话, 这个叫做on-policy(同策略)。
  • 如果要学习的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做off-policy(异策略)。

有趣的解释:古时候,优秀的皇帝都秉持着“水能载舟 亦能覆舟”的思想,希望能多了解民间百姓的生活。皇帝可以选择通过微服出巡,亲自下凡了解百姓生活(On-policy),虽然眼见为实,但毕竟皇帝本人分身乏术,掌握情况不全;因此也可以派多个官员去了解情况,而皇帝本人则躺在酒池肉林里收听百官情报即可(Off-policy)。

Q-learning VS Sarsa:

Q-learning vs. Sarsa
二者都是基于TD的强化学习策略,但是前者是off-policy(有目标网络和行为网络),后者是on-policy。

  1. 他们的更新方式(贝尔曼方程)是一样的,区别在target计算方式,Q-learning是选择最优action,Sarsa是实际action。因此更新的时候输入是不一样的(有无下一时刻的action)。
  2. Q-learning计算下一状态的预期收益时使用了max操作,直接选择最优动作,而当前policy并不一定能选择到最优动作,因此这里生成样本的policy和学习时的policy不同,为off-policy算法。
  3. SARAS算法,基于当前的policy直接执行一次动作选择,然后用这个样本更新当前的policy,因此生成样本的policy和学习时的policy相同,算法为on-policy算法。
  4. Q-learning更莽撞,Sarsa更胆小。
    强化学习中 on-policy与off-policy 的理解;如何区分on-policy 与 off-policy;RL更新策略、policy结构总结_第1张图片

DQN VS PPO:

on-policy与off-policy区别:更新值函数时是否只使用当前策略所产生的样本.

  1. DQN有两个网络,policy_nettarget_net。因为有两个agent,一个表示当前policy,一个表示目标policy。replay buffer中存储的是很多历史样本,更新Q函数时的target用的样本是从这些样本中采样而来,因此更新时使用的可能是历史样本,所以是off-policy。(memory不会定时清理,只有达到容量上限时,会除掉开始的数据)
  2. PPO也有两个网络,actorcritic。因为学习的 agent 跟和环境互动的 agent是同一个。并且用于更新的样本是当前策略产生的样本,因此是on-policy。也有memory,不过更新一次就会clear。

区分on-policy 与 off-policy

以下是个人总结,不一定正确,如有错误还请各位大佬指出:

  • 法一:目标策略 target policy 和 行为策略 behavior policy是否是同一个策略
  • 法二:更新值函数时是否只使用当前策略所产生的样本. (新价值所使用的方法是沿着既定的策略(on-policy)抑或是新策略(off-policy))
    个人感觉从 behavior policy 与 target policy 角度解释不够准确(探索环境/交互的策略和学习/更新的策略是否为同一个),因为DQN就不能这样看呀!(target_policy固定不变,policy交互、更新参数,之后再同步参数)。

❗❗发现了一个从代码层面分辨的小技巧 -> 对于用到了memory存储数据的算法,观察memory存的数据是怎么变的:
1️⃣ 对于off-policy策略,memory会一直存数据,如果满了就替换前面的。因此每次更新的时候,可能会用到其他策略采样到的数据。
2️⃣ 对于on-policy策略,更新一次参数后memory会被清空。

但是!!!Q-learning和Sarsa不能这样分辨,二者都是单步更新没有用到memory。
Q-learning是传入(state, action, reward, next_state, done)更新,Sarsa是传入(state, action, reward, next_state, next_action,done)进行更新。

为什么前者是off-policy而后者是on-policy呢?

  • 在Sarsa中更新Q函数时用的action就是贪婪策略得出来的,下一回合也用的是这个action去进行step。两个action一定相同就是(同策略)on-policy。
  • 但是在Q_learning中,更新时的action是Q_max得到的,而下一回合的Action是用贪婪策略(在更新后的Qmax基础上有探索)得到的,这时的action和Action就有可能不一样,就是(异策略)off-policy。

一些总结:

  1. 更新策略
    单步更新:DDPG,DQN,Q-learning,Sarsa,PPO,TD3,Actor-Critic
    玩完一轮再更新:MC,PG
  2. policy结构
    Actor-Critic结构:DDPG(双份),PPO,TD3(双份)
    policy_net+target_net:DQN
    Q_table:MC,Q-learning,Sarsa
    MLP:PG
  3. 用到了ReplayBuffer:DDPG,DQN,Actor-Critic
  4. 同策略or异策略
    off-policy:DDPG,DQN,Q-learning,TD3
    on-policy:PG,PPO(更新一次后memory被clear了),Sarsa,MC,A2C,A3C
    A2C 和 A3C 都是 on-policy(同策略)

你可能感兴趣的:(强化学习,学习笔记,深度学习)