Image from unsplash.com by Jonatan Pie
上一篇文章我們介紹了用 Q-learning 的算法完成了小車爬坡上山的遊戲,這篇文章我們來講講如何用 SARSA 算法完成同樣挑戰。
1. Q-Learning 和 SARSA 異同
Q - Learning 和 SARSA 有很多相似之處,他們均屬於單步Temporal Difference (時間差分TD(0)算法,其通用的更新公式爲
其中 td_target - Q[s,a] 部分又叫做 TD Error.
SARSA算法:
Q-learning:
不同之處在於,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機器學習”,一起學習,共同進步