昨天實作 SARSA 演算法,今天要實作 off-policy 的 TD Learning 方法:Q-Learning。由於內容大致上相同,因此今天會著重在與 SARSA 不同之處。
今天要實作的 Q-Learning,一樣分為五個函數處理,分別為
其中只有 SimProc 與 ValueUpdata 的部分與 SARSA 不同,因此以下針對這兩個函數進行說明。一樣可以在 GitHub 查看完整內容。
def SimProc(action_value, reward, trans_mat, steps, gamma, alpha, epsilon):
# initialize setting
record = []
state = np.random.randint(1,15)
for step in range(steps):
# get next infromation
action = GetAction(action_value, epsilon, state)
next_state = np.argmax(trans_mat[:,state,action])
record.append([state, action, reward[next_state], next_state])
# update action value
action_value[state, action] = ValueUpdate(action_value, record[step], alpha, gamma)
# update for next step
state = next_state
if state == 0 or state == 15:
break
return action_value
與 SARSA 方法不同之處主要在於
因此我們在實作上,沒有 next_action 這個變數,在 record 中也不需記錄這個參數。
def ValueUpdate(action_value, record, alpha, gamma):
state = record[0]
action = record[1]
reward = record[2]
next_state = record[3]
now_value = action_value[state, action]
update_value = alpha*(reward + gamma*np.max(action_value[next_state,:]) - now_value)
value = now_value + update_value
return value
與 SARSA 方法不同之處主要在於
因此在實作上,主要的差異在於 update_value 這個變數,我們改採用 action_value 的最大值估計下一狀態的動作價值。
============================================================
[Greedy Policy]
Episode: 1000
[['*' '<' '<' '<']
['^' '^' 'v' 'v']
['^' '^' '>' 'v']
['>' '>' '>' '*']]
============================================================
看起來的結果與 SARSA 有差異,但我們不能保證是不是模擬過程造成的差異。
從 GridWorld 的例子中,我們看不太出這兩個演算法的差別。從數學上來看,可以推測 Q-Learning 產出的動作價值會高於 SARSA,畢竟 Q-Learning 每一次都使用最大價值更新,不過在 GridWorld 中並沒有發現特別的差異:
[SARSA - max action value]
[[ 0. 0. -0.99919909 -1.79209217]
[ 0. -0.93548848 -1.42440894 -0.99739422]
[-0.99711271 -1.40733501 -0.94895313 0. ]
[-1.74605935 -0.99796185 0. 0. ]]
[Q-Learning - max action value]
[[ 0. 0. -0.99680078 -1.73150158]
[ 0. -0.95623369 -1.52771181 -0.99645516]
[-0.99835771 -1.44740146 -0.95842201 0. ]
[-1.68129873 -0.99827127 0. 0. ]]
這是 Day 24 與 Day 25 的策略下,對應的動作價值。
在書上提了一個稱為 cliff-walking 的例子,說明了 SARSA 是一個比較保守的方法。明天將會介紹這個例子、應用 SARSA 與 Q-Learning 於該問題、並比較兩者的結果。