On-policy Sarsa算法与Off-policy Q learning对比

Sarsa 算法(on-policy)

On-policy Sarsa算法与Off-policy Q learning对比

在s状态时,跟据当前Q网络以及一定的策略(e-greedy)来选取动作a,进而观测到下一状态s',并再次根据当前Q网络及相同的e- greedy策略选择动作a',这样就有了一个<s,a,r,s',a'>序列,成为一个sample。

  • 注意:

1.在状态s'时,就知道了要采取哪个a',并真的采取了这个动作。

2.动作a的选取遵循e-greedy策略,目标Q值的计算也是根据(e-greedy)策略得到的动作a'计算得来,因此为on-policy学习。

接下来,根据公式

On-policy Sarsa算法与Off-policy Q learning对比

更新Q(s,a)


Q learning 算法(off-policy)

On-policy Sarsa算法与Off-policy Q learning对比

在s状态时,跟据当前Q网络以及一定的策略(e-greedy)来选取动作a,进而观测到下一状态s',并再次根据当前Q网络计算出 接下来采取哪个动作会得到最大的Q 值,用这个Q值作为当前状态动作对Q值的target。这样就有了一个<s,a,r,s'>序列,成为一个sample。

  • 注意:

1.在状态s'时,只是计算了 在s'时要采取哪个a'可以得到更大的Q值,并没有真的采取这个动作a'。

2.动作a的选取是根据当前Q网络以及策略(e-greedy),目标Q值的计算是根据Q值最大的动作a'计算得来,因此为off-policy学习。

接下来,根据公式

On-policy Sarsa算法与Off-policy Q learning对比

更新Q(s,a)


两种算法的相同点

  • 如果Q值是用table存储的,则观测到一个序列后,就会对table中的一个状态-动作对进行更新,将 所有的状态动作对都遍历一遍后,table中的所有元素就都更新了一遍。
  • 如果Q是用神经网络估计的,则每观测到一个序列,就相当于 多了一个训练数据,就可以执行一次网络参数的更新,也可以将多个观测序列都存起来。

最后,这里有比较清晰易读的代码:

Sarsa:

https://github.com/pybrain/pybrain/blob/master/pybrain/rl/learners/valuebased/sarsa.py

Q learning:

https://github.com/pybrain/pybrain/blob/master/pybrain/rl/learners/valuebased/q.py