白话强化学习之Sarsa与Sarsa-lambda

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了白话强化学习之Sarsa与Sarsa-lambda相关的知识,希望对你有一定的参考价值。

参考技术A Sarsa的学习过程和Q-Learning基本一样,不同的地方是Q-Learning在走下一步的时候是先看下一步应该走哪,但是最后不一定走,而Sarsa是决定完要走的步之后一定会去走那一步。换句话说,Q-Learning在更新当前位置的Q值的时候会参考表中收益最大的那个值,但下一步不一定会走到那个位置,而Sarsa是先选取下一步要走的位置的Q值来更新当前位置的Q值,当然,选完它下一步一定会去走那一步。
Sarsa虽然说是说到做到,但是由于它选取下一步的位置是严格按照已有学习到的经验来选择,所以它探索未知位置的能力就会很差,相对于说了不一定算的Q-Learning来说,反而Q-Learning更勇敢一些,由于跟Q-Learning很像,就不详细介绍了,主要介绍Sarsa-lambda的学习步骤。

Sarsa lambda在Sarsa的基础上增加了一个概念,就是它到终点后会再反过来看一下自己曾经走过的路。

整体来说还是Sarsa的框框,只是增加一个指标,只是这样可以使学习效率变高,能更快速的达到目的Q表。
这个指标就是在获取到最终奖励时,也可以说是到达最终目的地时,各个位置的 不可或缺性 。表示方法:
先定义一个E表,用来记录经过的位置(State),每走一步,如果这个点不在E表中,则添加这个点到E表中,并将这个E(s,a)的值改为+1(还可以优化,下面说),如果表中存在这个位置,则直接更新这个位置的值,然后在走下一步之前对E表进行整体衰减。也就是说每走一步,就要对E表的当前位置的值进行刷新,然后再进行衰减。衰减的意义就在于如果一旦到达终点,就可以体现出来E表中各个位置对到达终点的 不可或缺性 。如果衰减比例为0,也就是每次都给E表里的值乘0,就意味着表里最后就剩下一个离终点最近的位置了,如果为1呢,则E表里的重复的越多的位置收益越大(so,这不合理,需要优化),所以,衰减比例应该取一个0~1之间的数比较合理。
E表的用法就是在Sarsa的基础上,每次更新的时候加上这个E表里对应位置的值就可以了。这就是传说中的Sarsa lambda了,是不是没这么吓人。下面说一下如何优化:
前面我们说每次经过这个某个位置,都把E表里对应值+1,这样对有些位置会很不公平,可能会出现离终点最近的那个位置的E值比中间的某个点的E值还要低,这很不科学。优化办法就是给E里的值定个上限,比如就是1,每次走到这个位置,就把他重新定为1,然后从1开始衰减,这样就不会出现上述的bug了。ok,再盗一张图来形象说一下优化的路子:

强化学习笔记:Sarsa 与 Sarsa(lambda)

1.Sarsa 算法

上篇文章中介绍了Q-Learning算法, 而Sarsa 和 Q-Learning是非常类似的,二者在决策环节都是基于Q表,挑选值较大的动作值施加在环境中来换取回报。但是区别在于 Sarsa 的更新方式不一样。

下面以强化学习笔记(1)中老鼠走迷宫为例,对Sarsa算法流程进行说明(Sarsa 和 Q-Learning的不同之处用粗体标出):

  • 首先初始化决策表 Q Q ,令Q=0
  • For each episode: F o r   e a c h   e p i s o d e :
    • 初始化状态s 为迷宫入口位置。
    • 在当前状态s的所有可能动作中选取一个动作a:即以 ε ε 的概率选择Q表中评分最高的动作,以 1ε 1 − ε 的概率随机选择动作。
    • 若当前状态s 不等于迷宫出口,则重复执行以下步骤:
      • 执行动作a并获得下一个状态s’ 和回报r(当老鼠拿到奶酪时,r为1,其余情况均为0)。
      • 在当前状态s’ 的所有可能动作中选取一个动作a’
      • 更新Q表: Q(s,a)=Q(s,a)+α[r+γQ(s,a)Q(s,a)] Q ( s , a ) = Q ( s , a ) + α [ r + γ ⋅ Q ( s ′ , a ′ ) − Q ( s , a ) ]
      • 更新状态和动作: s=sa=a s = s ′ , a = a ′

进一步给出Q-Learning和Sarsa算法的对比:

当Sarsa 和 Q-Learning处在状态s时,均选择可带来最大回报的动作a,这样可到达状态s’。而在下一步,如果使用Q-Learning, 则会观察在s’上哪个动作会带来最大回报(不会真正执行该动作,仅用来更新Q表),在s’上做决定时, 再基于更新后的Q表选择动作。而 Sarsa 是实践派,在s’ 这一步估算的动作也是接下来要执行的动作,所以 Q(s, a) 的现实值也会稍稍改动,去掉maxQ,取而代之的是在s’ 上实实在在选取的a’ 的Q值,最后像Q-Learning一样求出现实和估计的差距并更新Q表里的Q(s, a)。

因为 Sarsa 是说到做到型,所以称它为 on-policy(在线学习),即边做边学;而Q-Learning是说到但并不一定做到,其可以通过观察别人的经历来学习,所以它也叫作 Off-policy(离线学习)。

另外,Q-Learning因为有了 maxQ,所以也是一个特别勇敢的算法,原因在于它永远都会选择最近的一条通往成功的道路,不管这条路会有多危险。而 Sarsa 则是相当保守,它会选择离危险远远的,这就是使用Sarsa方法的不同之处。

2. Sarsa(lambda)算法

Sarsa(lambda)算法是Sarsa 的改进版,二者的主要区别在于:

  • 在每次take action获得reward后,Sarsa只对前一步Q(s,a)进行更新,Sarsa(lambda) 则会对获得reward之前的步进行更新。

Sarsa(lambda)算法的流程如下:

从上图可以看出,和Sarsa相比,Sarsa(lambda)算法中多了一个矩阵E (eligibility trace),它是用来保存在路径中所经历的每一步,因此在每次更新时也会对之前经历的步进行更新。

参数lambda取值范围为[0, 1] ,如果 lambda = 0,Sarsa(lambda) 将退化为Sarsa,即只更新获取到 reward 前经历的最后一步;如果 lambda = 1,Sarsa(lambda) 更新的是获取到 reward 前的所有步。lambda 可理解为脚步的衰变值,即离奶酪越近的步越重要,越远的步则对于获取奶酪不是太重要。

和Sarsa相比,Sarsa(lambda)算法有如下优势:

  • Sarsa虽然会边走边更新,但是在没有获得奶酪之前,当前步的Q值是没有任何变化的,直到获取奶酪后,才会对获取奶酪的前一步更新,而之前为了获取奶酪所走的所有步都被认为和获取奶酪没关系。Sarsa(lambda)则会对获取奶酪所走的步都进行更新,离奶酪越近的步越重要,越远的则越不重要(由参数lambda控制衰减幅度)。因此,Sarsa(lambda) 能够更加快速有效的学到最优的policy。
  • 在算法前几回合,老鼠由于没有头绪, 可能在原地打转了很久,从而形成一些重复的环路,而这些环路对于算法的学习没有太大必要。Sarsa(lambda)则可解决该问题,具体做法是:在E(s,a)←E(s,a)+1这一步之前,可先令E(s)=0,即把状态s对应的行置为0,这样就只保留了最近一次到达状态s时所做的action。

以上是关于白话强化学习之Sarsa与Sarsa-lambda的主要内容,如果未能解决你的问题,请参考以下文章

强化学习中,Q-Learning与Sarsa的差别有多大?

强化学习中,Q-Learning与Sarsa的差别有多大?

SARSA-Lambda 实施中的情节之间的资格跟踪重新初始化

白话强化学习(理论+代码)

强化学习笔记:Sarsa 与 Sarsa(lambda)

强化学习笔记:Sarsa 与 Sarsa(lambda)