強化學習—— SARSA 和 SARSA lambda 玩 MountainCar 爬坡上山

Image from unsplash.com by Jonatan Pie

上一篇文章我們介紹了用 Q-learning 的算法完成了小車爬坡上山的遊戲,這篇文章我們來講講如何用 SARSA 算法完成同樣挑戰。

1. Q-Learning 和 SARSA 異同

Q - Learning 和 SARSA 有很多相似之處,他們均屬於單步Temporal Difference (時間差分TD(0)算法,其通用的更新公式爲
Q[s, a]+=\text { learning_rate } *\left(\text {td_target}-Q[s, a]\right)
其中 td_target - Q[s,a] 部分又叫做 TD Error.

SARSA算法:
\text { td_target }=R[t+1] + \text {discout_factor}*Q[s',a']
Q-learning:
\text { td_target }=R[t+1] + \text {discout_factor}*max(Q[s'])

不同之處在於,SARSA 是On-policy 的算法,即只有一個策略指揮行動並同時被更新。Q - Learning 是 Off-Policy 的算法, 探索的時候採用max 的策略來更新Policy(Q表),但行動的時候未必會走 max 獎勵的那條路 (epsilon-greedy 策略)。

由於兩者的相似度很高,在代碼中僅需要小小的改動即可實現 SARSA 算法。

同樣的,爲了方便與讀者交流,所有的代碼都放在了這裏:

https://github.com/zht007/tensorflow-practice

3. SARSA 算法實現

Q表的建立,幫助函數等都與Q-Learning 一模一樣,這裏就不贅述了。僅僅在訓練階段有所不同。

首先,在初始化環境(state = env.reset()) 的同時,需要初始化 action (action = take_epilon_greedy_action(state, epsilon))

其次,獲取 next_action (next_action = take_epilon_greedy_action(next_state, epsilon))

然後,依據前面的公式, td_target 中的 max 部分由下一個狀態的 q[next_sate, next_action] 替換。

最後,action = next_action 將本循環中的 next_action 帶入到下一個循環中

完整核心代碼如下

for episode in range(EPISODES):

    state = env.reset()
    action = take_epilon_greedy_action(state, epsilon)
    
    done = False
    while not done:

        next_state, reward, done, _ = env.step(action)

        ep_reward += reward
        
        next_action = take_epilon_greedy_action(next_state, epsilon)

        if not done:

            td_target = reward + DISCOUNT * q_table[get_discrete_state(next_state)][next_action]

            q_table[get_discrete_state(state)][action] += LEARNING_RATE * (td_target - q_table[get_discrete_state(state)][action])

        elif next_state[0] >= 0.5:
            q_table[get_discrete_state(state)][action] = 0


        state = next_state
        action = next_action

Code from Github Repo with MIT license

4. SARSA lambda 算法

Q learning 和 SARSA 都是單步更新(TD(0))的算法。單步跟新的算法缺點就是在沒有到達目標之前的那些『原地打轉』的行動也被記錄在案,每走一步,腳下的Q-表也被更新了,雖然這些行動是毫無意義的。

SARSA Lambda(λ), 即引入 λ 這個衰減係數,來解決這個問題。與γ用來衰減未來預期Q的值一樣,λ是當智能體獲得到達目標之後,在更新Q表的時候,給機器人一個回頭看之前走過的路程的機會。相當於,機器人每走一步就會在地上插一杆旗子,然後機器人每走一步旗子就會變小一點。

於是我們需要另一個表,來記錄每一個 state 的查旗子的狀態(大小),這就需要一個與Q-表相同的eligibility trace 表 (E表)。

LAMBDA = 0.95

e_trace = np.zeros((DISCRETE_OS_SIZE + [env.action_space.n]))

與Q learning 和 SARSA 智能體每走一步僅更新腳下的Q表 (當前狀態的Q(S, A))不同,SARSA lambda 每走一步,整個Q 表(和 E 表)都會被更新。完整算法如下:

Image from [1] by Sutton R.S.

首先,每一個回合均需要將 eligibility trace 表初始化爲0。

其次,用 delta 來表示下一個狀態的Q值和當前狀態Q值的差值,並在當前狀態"插旗"(E(S,A) += 1)。

最後,更新Q表和E表。

完整核心代碼如下:

for episode in range(EPISODES):

    state = env.reset()
    action = take_epilon_greedy_action(state, epsilon)
    
#   reset e_trace IMPORTANT
    e_trace = np.zeros(DISCRETE_OS_SIZE + [env.action_space.n])
    
    done = False
    while not done:

        next_state, reward, done, _ = env.step(action)

        ep_reward += reward
        
        next_action = take_epilon_greedy_action(next_state, epsilon)

        if not done:
            
            delta = reward + DISCOUNT * q_table[get_discrete_state(next_state)][next_action] - q_table[get_discrete_state(state)][action]

            e_trace[get_discrete_state(state)][action] += 1
            
            q_table += LEARNING_RATE * delta * e_trace
            
            e_trace = DISCOUNT * LAMBDA * e_trace
            
        elif next_state[0] >= 0.5:
            q_table[get_discrete_state(state)][action] = 0


        state = next_state
        action = next_action

    # Decaying is being done every episode if episode number is within decaying range
    if END_EPSILON_DECAYING >= episode >= START_EPSILON_DECAYING:
        epsilon -= epsilon_decay_value

Code from Github Repo with MIT license

4. Q-Learning, SARSA, SARSA lambda 對比

爲了方便對比,我們將初始Q表的值均設置爲0,表的長度均爲20,跑10,000個回合, 每200個回合計算一下最小,平均和最大獎勵。結果如下圖所示:

可以看出,三個算法均在4000 個回合開始 Converge。 但是由於是 Off - Policy 的算法,Q-learning 在最小獎勵的表現不如SARSA算法,說明Q-learning 的智能體,更加大膽,勇於探索最大化獎勵,SARSA 算法表現得更加謹慎,時刻遵守Policy的指導,平均獎勵優於Q-learning.


參考資料

[1] Reinforcement Learning: An Introduction (2nd Edition)

[2] David Silver's Reinforcement Learning Course (UCL, 2015)

[3] Github repo: Reinforcement Learning


相關文章

強化學習——MC(蒙特卡洛)玩21點撲克遊戲
強化學習實戰——動態規劃(DP)求最優MDP
強化學習——強化學習的算法分類
強化學習——重拾強化學習的核心概念
AI學習筆記——Sarsa算法
AI學習筆記——Q Learning
AI學習筆記——動態規劃(Dynamic Programming)解決MDP(1)
AI學習筆記——動態規劃(Dynamic Programming)解決MDP(2)
AI學習筆記——MDP(Markov Decision Processes馬可夫決策過程)簡介
AI學習筆記——求解最優MDP


首發steemit

歡迎掃描二維碼關注我的微信公衆號“tensorflow機器學習”,一起學習,共同進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章