在強化學習(六)時序差分在線控制算法SARSA中咱們討論了時序差分的在線控制算法SARSA,而另外一類時序差分的離線控制算法尚未討論,所以本文咱們關注於時序差分離線控制算法,主要是經典的Q-Learning算法。html
Q-Learning這一篇對應Sutton書的第六章部分和UCL強化學習課程的第五講部分。git
Q-Learning算法是一種使用時序差分求解強化學習控制問題的方法,回顧下此時咱們的控制問題能夠表示爲:給定強化學習的5個要素:狀態集$S$, 動做集$A$, 即時獎勵$R$,衰減因子$\gamma$, 探索率$\epsilon$, 求解最優的動做價值函數$q_{*}$和最優策略$\pi_{*}$。github
這一類強化學習的問題求解不須要環境的狀態轉化模型,是不基於模型的強化學習問題求解方法。對於它的控制問題求解,和蒙特卡羅法相似,都是價值迭代,即經過價值函數的更新,來更新策略,經過策略來產生新的狀態和即時獎勵,進而更新價值函數。一直進行下去,直到價值函數和策略都收斂。算法
再回顧下時序差分法的控制問題,能夠分爲兩類,一類是在線控制,即一直使用一個策略來更新價值函數和選擇新的動做,好比咱們上一篇講到的SARSA, 而另外一類是離線控制,會使用兩個控制策略,一個策略用於選擇新的動做,另外一個策略用於更新價值函數。這一類的經典算法就是Q-Learning。dom
對於Q-Learning,咱們會使用$\epsilon-$貪婪法來選擇新的動做,這部分和SARSA徹底相同。可是對於價值函數的更新,Q-Learning使用的是貪婪法,而不是SARSA的$\epsilon-$貪婪法。這一點就是SARSA和Q-Learning本質的區別。函數
Q-Learning算法的拓補圖入下圖所示:post
首先咱們基於狀態$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'$。this
此時選擇的動做只會參與價值函數的更新,不會真正的執行。價值函數更新後,新的執行動做須要基於狀態$S'$,用$\epsilon-$貪婪法從新選擇獲得。這一點也和SARSA稍有不一樣。對於SARSA,價值函數更新使用的$A'$會做爲下一階段開始時候的執行動做。
下面咱們對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)
咱們仍是使用和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
跑完完整的代碼,你們能夠很容易獲得這個問題的最優解,進而獲得在每一個格子裏的最優貪婪策略。
如今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。
對於Q-Learning和SARSA這樣的時序差分算法,對於小型的強化學習問題是很是靈活有效的,可是在大數據時代,異常複雜的狀態和可選動做,使Q-Learning和SARSA要維護的Q表異常的大,甚至遠遠超出內存,這限制了時序差分算法的應用場景。在深度學習興起後,基於深度學習的強化學習開始占主導地位,所以從下一篇開始咱們開始討論深度強化學習的建模思路。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)