強化學習(七)時序差分離線控制演算法Q-Learning

劉建平Pinard發表於2018-09-19

    在強化學習(六)時序差分線上控制演算法SARSA中我們討論了時序差分的線上控制演算法SARSA,而另一類時序差分的離線控制演算法還沒有討論,因此本文我們關注於時序差分離線控制演算法,主要是經典的Q-Learning演算法。

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

1. Q-Learning演算法的引入    

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

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

    再回顧下時序差分法的控制問題,可以分為兩類,一類是線上控制,即一直使用一個策略來更新價值函式和選擇新的動作,比如我們上一篇講到的SARSA, 而另一類是離線控制,會使用兩個控制策略,一個策略用於選擇新的動作,另一個策略用於更新價值函式。這一類的經典演算法就是Q-Learning。

    對於Q-Learning,我們會使用$\epsilon-$貪婪法來選擇新的動作,這部分和SARSA完全相同。但是對於價值函式的更新,Q-Learning使用的是貪婪法,而不是SARSA的$\epsilon-$貪婪法。這一點就是SARSA和Q-Learning本質的區別。

2. Q-Learning演算法概述

    Q-Learning演算法的拓補圖入下圖所示:

    首先我們基於狀態$S$,用$\epsilon-$貪婪法選擇到動作$A$, 然後執行動作$A$,得到獎勵$R$,並進入狀態$S'$,此時,如果是SARSA,會繼續基於狀態$S'$,用$\epsilon-$貪婪法選擇$A'$,然後來更新價值函式。但是Q-Learning則不同。

    對於Q-Learning,它基於狀態$S'$,沒有使用$\epsilon-$貪婪法選擇$A'$,而是使用貪婪法選擇$A'$,也就是說,選擇使$Q(S',a)$最大的$a$作為$A'$來更新價值函式。用數學公式表示就是:$$Q(S,A) = Q(S,A) + \alpha(R+\gamma \max_aQ(S',a) - Q(S,A))$$

    對應到上圖中就是在圖下方的三個黑圓圈動作中選擇一個使$Q(S',a)$最大的動作作為$A'$。

    此時選擇的動作只會參與價值函式的更新,不會真正的執行。價值函式更新後,新的執行動作需要基於狀態$S'$,用$\epsilon-$貪婪法重新選擇得到。這一點也和SARSA稍有不同。對於SARSA,價值函式更新使用的$A'$會作為下一階段開始時候的執行動作。

    下面我們對Q-Learning演算法做一個總結。

3. Q-Learning演算法流程

    下面我們總結下Q-Learning演算法的流程。

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

    輸出:所有的狀態和動作對應的價值$Q$

    1. 隨機初始化所有的狀態和動作對應的價值$Q$. 對於終止狀態其$Q$值初始化為0.

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

      a) 初始化S為當前狀態序列的第一個狀態。

      b) 用$\epsilon-$貪婪法在當前狀態$S$選擇出動作$A$

      c) 在狀態$S$執行當前動作$A$,得到新狀態$S'$和獎勵$R$

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

      e) $S=S'$

      f) 如果$S'$是終止狀態,當前輪迭代完畢,否則轉到步驟b)

4. Q-Learning演算法例項:Windy GridWorld

    我們還是使用和SARSA一樣的例子來研究Q-Learning。如果對windy gridworld的問題還不熟悉,可以複習強化學習(六)時序差分線上控制演算法SARSA第4節的第二段。

    完整的程式碼參見我的github: https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/q_learning_windy_world.py

    絕大部分程式碼和SARSA是類似的。這裡我們可以重點比較和SARSA不同的部分。區別都在episode這個函式裡面。

    首先是初始化的時候,我們只初始化狀態$S$,把$A$的產生放到了while迴圈裡面, 而回憶下SARSA會同時初始化狀態$S$和動作$A$,再去執行迴圈。下面這段Q-Learning的程式碼對應我們演算法的第二步步驟a和b:

# play for an episode
def episode(q_value):
    # track the total time steps in this episode
    time = 0

    # initialize state
    state = START

    while state != GOAL:
    # 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_)])

    接著我們會去執行動作$A$,得到$S'$, 由於獎勵不是終止就是-1,不需要單獨計算。,這部分和SARSA的程式碼相同。對應我們Q-Learning演算法的第二步步驟c:

        next_state = step(state, action)
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

    後面我們用貪婪法選擇出最大的$Q(S',a)$,並更新價值函式,最後更新當前狀態$S$。對應我們Q-Learning演算法的第二步步驟d,e。注意SARSA這裡是使用$\epsilon-$貪婪法,而不是貪婪法。同時SARSA會同時更新狀態$S$和動作$A$,而Q-Learning只會更新當前狀態$S$。

        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_)])

        # 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

    跑完完整的程式碼,大家可以很容易得到這個問題的最優解,進而得到在每個格子裡的最優貪婪策略。

5. SARSA vs Q-Learning

    現在SARSA和Q-Learning演算法我們都講完了,那麼作為時序差分控制演算法的兩種經典方法嗎,他們都有說明特點,各自適用於什麼樣的場景呢?

    Q-Learning直接學習的是最優策略,而SARSA在學習最優策略的同時還在做探索。這導致我們在學習最優策略的時候,如果用SARSA,為了保證收斂,需要制定一個策略,使$\epsilon-$貪婪法的超引數$\epsilon$在迭代的過程中逐漸變小。Q-Learning沒有這個煩惱。

    另外一個就是Q-Learning直接學習最優策略,但是最優策略會依賴於訓練中產生的一系列資料,所以受樣本資料的影響較大,因此受到訓練資料方差的影響很大,甚至會影響Q函式的收斂。Q-Learning的深度強化學習版Deep Q-Learning也有這個問題。

    在學習過程中,SARSA在收斂的過程中鼓勵探索,這樣學習過程會比較平滑,不至於過於激進,導致出現像Q-Learning可能遇到一些特殊的最優“陷阱”。比如經典的強化學習問題"Cliff Walk"。

    在實際應用中,如果我們是在模擬環境中訓練強化學習模型,推薦使用Q-Learning,如果是線上生產環境中訓練模型,則推薦使用SARSA。

6. Q-Learning結語        

    對於Q-Learning和SARSA這樣的時序差分演算法,對於小型的強化學習問題是非常靈活有效的,但是在大資料時代,異常複雜的狀態和可選動作,使Q-Learning和SARSA要維護的Q表異常的大,甚至遠遠超出記憶體,這限制了時序差分演算法的應用場景。在深度學習興起後,基於深度學習的強化學習開始占主導地位,因此從下一篇開始我們開始討論深度強化學習的建模思路。

 

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

相關文章