強化學習(六)時序差分在線控制算法SARSA

    在強化學習(五)用時序差分法(TD)求解中,咱們討論了用時序差分來求解強化學習預測問題的方法,可是對控制算法的求解過程沒有深刻,本文咱們就對時序差分的在線控制算法SARSA作詳細的討論。html

    SARSA這一篇對應Sutton書的第六章部分和UCL強化學習課程的第五講部分。git

1. SARSA算法的引入

    SARSA算法是一種使用時序差分求解強化學習控制問題的方法,回顧下此時咱們的控制問題能夠表示爲:給定強化學習的5個要素:狀態集$S$, 動做集$A$, 即時獎勵$R$,衰減因子$\gamma$, 探索率$\epsilon$, 求解最優的動做價值函數$q_{*}$和最優策略$\pi_{*}$。github

    這一類強化學習的問題求解不須要環境的狀態轉化模型,是不基於模型的強化學習問題求解方法。對於它的控制問題求解,和蒙特卡羅法相似,都是價值迭代,即經過價值函數的更新,來更新當前的策略,再經過新的策略,來產生新的狀態和即時獎勵,進而更新價值函數。一直進行下去,直到價值函數和策略都收斂。算法

    再回顧下時序差分法的控制問題,能夠分爲兩類,一類是在線控制,即一直使用一個策略來更新價值函數和選擇新的動做。而另外一類是離線控制,會使用兩個控制策略,一個策略用於選擇新的動做,另外一個策略用於更新價值函數。dom

    咱們的SARSA算法,屬於在線控制這一類,即一直使用一個策略來更新價值函數和選擇新的動做,而這個策略是$\epsilon-$貪婪法,在強化學習(四)用蒙特卡羅法(MC)求解中,咱們對於$\epsilon-$貪婪法有詳細講解,即經過設置一個較小的$\epsilon$值,使用$1−\epsilon$的機率貪婪地選擇目前認爲是最大行爲價值的行爲,而用$\epsilon$的機率隨機的從全部m個可選行爲中選擇行爲。用公式能夠表示爲:$$\pi(a|s)= \begin{cases} \epsilon/m + 1- \epsilon & {if\; a^{*} = \arg\max_{a \in A}Q(s,a)}\\ \epsilon/m & {else} \end{cases}$$函數

2. SARSA算法概述

    做爲SARSA算法的名字自己來講,它其實是由S,A,R,S,A幾個字母組成的。而S,A,R分別表明狀態(State),動做(Action),獎勵(Reward),這也是咱們前面一直在使用的符號。這個流程體如今下圖:post

    在迭代的時候,咱們首先基於$\epsilon-$貪婪法在當前狀態$S$選擇一個動做$A$,這樣系統會轉到一個新的狀態$S'$, 同時給咱們一個即時獎勵$R$, 在新的狀態$S'$,咱們會基於$\epsilon-$貪婪法在狀態$S‘’$選擇一個動做$A'$,可是注意這時候咱們並不執行這個動做$A'$,只是用來更新的咱們的價值函數,價值函數的更新公式是:$$Q(S,A) = Q(S,A) + \alpha(R+\gamma Q(S',A') - Q(S,A))$$學習

    其中,$\gamma$是衰減因子,$\alpha$是迭代步長。這裏和蒙特卡羅法求解在線控制問題的迭代公式的區別主要是,收穫$G_t$的表達式不一樣,對於時序差分,收穫$G_t$的表達式是$R+\gamma Q(S',A')$。這個價值函數更新的貝爾曼公式咱們在強化學習(五)用時序差分法(TD)求解第2節有詳細講到。url

    除了收穫$G_t$的表達式不一樣,SARSA算法和蒙特卡羅在線控制算法基本相似。spa

3. SARSA算法流程

    下面咱們總結下SARSA算法的流程。

    算法輸入:迭代輪數$T$,狀態集$S$, 動做集$A$, 步長$\alpha$,衰減因子$\gamma$, 探索率$\epsilon$,

    輸出:全部的狀態和動做對應的價值$Q$

    1. 隨機初始化全部的狀態和動做對應的價值$Q$. 對於終止狀態其$Q$值初始化爲0.

    2. for i from 1 to T,進行迭代。

      a) 初始化S爲當前狀態序列的第一個狀態。設置$A$爲$\epsilon-$貪婪法在當前狀態$S$選擇的動做。

      b) 在狀態$S$執行當前動做$A$,獲得新狀態$S'$和獎勵$R$

      c) 用$\epsilon-$貪婪法在狀態$S'$選擇新的動做$A'$

      d) 更新價值函數$Q(S,A)$:$$Q(S,A) = Q(S,A) + \alpha(R+\gamma Q(S',A') - Q(S,A))$$

      e) $S=S', A=A'$

      f) 若是$S'$是終止狀態,當前輪迭代完畢,不然轉到步驟b)

    這裏有一個要注意的是,步長$\alpha$通常須要隨着迭代的進行逐漸變小,這樣才能保證動做價值函數$Q$能夠收斂。當$Q$收斂時,咱們的策略$\epsilon-$貪婪法也就收斂了。

4. SARSA算法實例:Windy GridWorld

    下面咱們用一個著名的實例Windy GridWorld來研究SARSA算法。

    以下圖一個10×7的長方形格子世界,標記有一個起始位置 S 和一個終止目標位置 G,格子下方的數字表示對應的列中必定強度的風。當個體進入該列的某個格子時,會按圖中箭頭所示的方向自動移動數字表示的格數,藉此來模擬世界中風的做用。一樣格子世界是有邊界的,個體任意時刻只能處在世界內部的一個格子中。個體並不清楚這個世界的構造以及有風,也就是說它不知道格子是長方形的,也不知道邊界在哪裏,也不知道本身在裏面移動移步後下一個格子與以前格子的相對位置關係,固然它也不清楚起始位置、終止目標的具體位置。可是個體會記住曾經通過的格子,下次在進入這個格子時,它能準確的辨認出這個格子曾經何時來過。格子能夠執行的行爲是朝上、下、左、右移動一步,每移動一步只要不是進入目標位置都給予一個 -1 的懲罰,直至進入目標位置後得到獎勵 0 同時永久停留在該位置。如今要求解的問題是個體應該遵循怎樣的策略才能儘快的從起始位置到達目標位置。

    邏輯並不複雜,完整的代碼在個人github。這裏我主要看一下關鍵部分的代碼。

    算法中第2步步驟a,初始化$S$,使用$\epsilon-$貪婪法在當前狀態$S$選擇的動做的過程:

    # initialize state
    state = START

    # choose an action based on epsilon-greedy algorithm
    if np.random.binomial(1, EPSILON) == 1:
        action = np.random.choice(ACTIONS)
    else:
        values_ = q_value[state[0], state[1], :]
        action = np.random.choice([action_ for action_, value_ in enumerate(values_) if value_ == np.max(values_)])

    算法中第2步步驟b,在狀態$S$執行當前動做$A$,獲得新狀態$S'$的過程,因爲獎勵不是終止就是-1,不須要單獨計算:

def step(state, action):
    i, j = state
    if action == ACTION_UP:
        return [max(i - 1 - WIND[j], 0), j]
    elif action == ACTION_DOWN:
        return [max(min(i + 1 - WIND[j], WORLD_HEIGHT - 1), 0), j]
    elif action == ACTION_LEFT:
        return [max(i - WIND[j], 0), max(j - 1, 0)]
    elif action == ACTION_RIGHT:
        return [max(i - WIND[j], 0), min(j + 1, WORLD_WIDTH - 1)]
    else:
        assert False

    算法中第2步步驟c,用$\epsilon-$貪婪法在狀態$S‘$選擇新的動做$A'$的過程:

        next_state = step(state, action)
        if np.random.binomial(1, EPSILON) == 1:
            next_action = np.random.choice(ACTIONS)
        else:
            values_ = q_value[next_state[0], next_state[1], :]
            next_action = np.random.choice([action_ for action_, value_ in enumerate(values_) if value_ == np.max(values_)])

    算法中第2步步驟d,e, 更新價值函數$Q(S,A)$以及更新當前狀態動做的過程:

        # Sarsa update
        q_value[state[0], state[1], action] += \
            ALPHA * (REWARD + q_value[next_state[0], next_state[1], next_action] -
                     q_value[state[0], state[1], action])
        state = next_state
        action = next_action

    代碼很簡單,相信你們對照算法,跑跑代碼,能夠很容易獲得這個問題的最優解,進而搞清楚SARSA算法的整個流程。

5. SARSA($\lambda$)

    在強化學習(五)用時序差分法(TD)求解中咱們講到了多步時序差分$TD(\lambda)$的價值函數迭代方法,那麼一樣的,對應的多步時序差分在線控制算法,就是咱們的$SARSA(\lambda)$。

    $TD(\lambda)$有前向和後向兩種價值函數迭代方式,固然它們是等價的。在控制問題的求解時,基於反向認識的 $SARSA(\lambda)$算法將能夠有效地在線學習,數據學習完便可丟棄。所以 $SARSA(\lambda)$算法默認都是基於反向來進行價值函數迭代。

    在上一篇咱們講到了$TD(\lambda)$狀態價值函數的反向迭代,即:$$\delta_t = R_{t+1} + \gamma V(S_{t+1}) -V(S_t)$$$$V(S_t) = V(S_t)  + \alpha\delta_tE_t(S)$$

    對應的動做價值函數的迭代公式能夠找樣寫出,即:$$\delta_t = R_{t+1} + \gamma Q(S_{t+1},A_{t+1}) -Q(S_t, A_t)$$$$Q(S_t, A_t) = Q(S_t, A_t)  + \alpha\delta_tE_t(S,A)$$

    除了狀態價值函數$ Q(S,A) $的更新方式,多步參數$\lambda$以及反向認識引入的效用跡$E(S,A)$,其他算法思想和SARSA相似。這裏咱們總結下$SARSA(\lambda)$的算法流程。   

    算法輸入:迭代輪數$T$,狀態集$S$, 動做集$A$, 步長$\alpha$,衰減因子$\gamma$, 探索率$\epsilon$, 多步參數$\lambda$

    輸出:全部的狀態和動做對應的價值$Q$

    1. 隨機初始化全部的狀態和動做對應的價值$Q$. 對於終止狀態其$Q$值初始化爲0.

    2. for i from 1 to T,進行迭代。

      a) 初始化全部狀態動做的效用跡$E$爲0,初始化S爲當前狀態序列的第一個狀態。設置$A$爲$\epsilon-$貪婪法在當前狀態$S$選擇的動做。

      b) 在狀態$S$執行當前動做$A$,獲得新狀態$S'$和獎勵$R$

      c) 用$\epsilon-$貪婪法在狀態$S'$選擇新的動做$A'$

      d) 更新效用跡函數$E(S,A) $和TD偏差$\delta$: $$E(S,A) = E(S,A)+1$$$$\delta= R_{t+1} + \gamma Q(S_{t+1},A_{t+1}) -Q(S_t, A_t)$$

      e) 對當前序列全部出現的狀態s和對應動做a, 更新價值函數$Q(s,a)$和效用跡函數$E(s,a) $:$$Q(s,a) = Q(s,a) + \alpha\delta E(s,a)$$$$E(s,a) = \gamma\lambda E(s,a)$$

      f) $S=S', A=A'$

      g) 若是$S'$是終止狀態,當前輪迭代完畢,不然轉到步驟b)

      對於步長$\alpha$,和SARSA同樣,通常也須要隨着迭代的進行逐漸變小才能保證動做價值函數$Q$收斂。

6. SARSA小結

    SARSA算法和動態規劃法比起來,不須要環境的狀態轉換模型,和蒙特卡羅法比起來,不須要完整的狀態序列,所以比較靈活。在傳統的強化學習方法中使用比較普遍。

    可是SARSA算法也有一個傳統強化學習方法共有的問題,就是沒法求解太複雜的問題。在 SARSA 算法中,$Q(S,A)$ 的值使用一張大表來存儲的,若是咱們的狀態和動做都達到百萬乃至千萬級,須要在內存裏保存的這張大表會超級大,甚至溢出,所以不是很適合解決規模很大的問題。固然,對於不是特別複雜的問題,使用SARSA仍是很不錯的一種強化學習問題求解方法。

    下一篇咱們討論SARSA的姊妹算法,時序差分離線控制算法Q-Learning。

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章
相關標籤/搜索