強化學習(五):Sarsa演算法與Q-Learning演算法
上一節主要講了Monte-Carlo learning,TD learning,
但是我們的目標是想得到最優策略,所以我們這一講就是為了通過價值函式,反過來改進策略。兩者互相迭代改進,最終收斂到最優策略與最優價值函式。策略評估與策略改進的思想可以參考強化學習第三講的內容。
On-Policy Monte-Carlo Control
強化學習第三講的策略優化過程分為兩個部分,一個是策略評估,一個是策略改進。從一個策略
上面說的交替迭代是在模型已知的情況下進行的。那麼對於模型未知的情況,是否還能使用呢?答案是不能。模型未知的情況下無法知道當前狀態的所有可能的後續狀態。進而無法確定在當前狀態下應該採取哪個動作是最好的。解決這個問題是利用Q(s,a)來代替V(s)。這樣即使不知道當前狀態的所有後續狀態,我們也可以根據已有的動作來選擇。這樣策略評估與策略改進就變成:從一個策略
不過利用Q(s,a)來代替V(s)有一個問題是,因為不知道當前狀態能夠執行的所有動作,所以只選擇當前最好的動作可能會陷入區域性最優。所以需要偶爾去嘗試新的動作,這就是探索(exploration)。
舉個例子:
如下圖,在你面前有兩扇門,考慮如下的行為、獎勵並使用貪婪演算法改善策略:
你開啟左側門得到即時獎勵為0:V(left) = 0;
你開啟右側門得到即時獎勵1:V(right) = +1;
在使用貪婪演算法時(也就是選擇Q(s,a)值最大的那個動作),接下來你將會繼續開啟右側的門,而不會嘗試開啟左側門。
你開啟右側門得到即時獎勵+3:V(right) = +2;
你開啟右側門得到即時獎勵+2:V(right) = +2;
。。。
這種情況下,開啟右側門是否就一定是最好的選擇呢?答案顯而易見是否定的。因此完全使用貪婪演算法改善策略通常不一定會得到最優策略。所以需要引入一個隨機機制,以一定的概率選擇當前的最好策略,同時也有一定的概率選擇其他的動作。這就是
On-policy Temporal-Difference Control
在強化學習第四講中我們知道,蒙特卡羅學習需要完整的episode才能更新,而TD learning可以做到單步更新。因此,我們可以講上面講的線上蒙特卡羅控制改成線上時序差分學習。下面講的Sarsa就是線上時序差分學習。
Sarsa
- 注意顏色加深那部分,在observe 到s’之後,又在狀態s’下選擇了一個動作a’。而s’ 和a’作為下一次迴圈的狀態s和動作a。也就是說,策略產生的動作,會在下一次迴圈中使用。
Sarsa(λ) 演算法
λ 的理解跟強化學習第四講的TD(λ) 是一樣的思想。- 注意這裡,每走一步之後,都要對之前的所有經歷過的狀態進行更新。
Q-Learning
- 上圖是Q-Learning演算法的虛擬碼。一般來說,episode並不是已經有了之後我們才來迭代(Q-Learning和Sarsa都是屬於TD-Learning),而是每走一步就更新一次Q(s,a)。所以,虛擬碼中的迭代就是for each step of episode。
- Choose a from s using policy derived from Q: 這個語句是為了在狀態s下選擇一個動作a來執行。那麼用什麼方法來選呢?括號裡面舉了一個例子:
ϵ−greedy 貪婪策略,也就是在狀態s下所有可執行的動作a中選擇Q(s,a)最大的那個動作。 - Take action a, observe r, s’: 上一步選擇了動作之後,就執行該動作,這樣會得到當前reward r,並進入下一個狀態s’。
- 接下來就是更新Q(s,a)了,更新Q(s,a)時利用了狀態s‘下所有可執行的動作a’中Q(s‘,a’)值最大的那個,比如Q(s’,a1)。但是下次迭代時,在狀態s’下不一定會選擇動作a1,這一點跟Sarsa的區別就在這。
On and Off policy Learning
- On-policy: Learn about policy
π from experience sampled fromπ 。On-policy是指產生資料的策略與評估和要改善的策略是同一個策略。比如,agent採用策略π 取樣,得到了一些episodes,然後就可以估算出v值了,然後再利用v值來改進這個策略。 Off-policy: Learn about policy
π from experience sampled fromμ 。Off-policy是指產生資料的策略與評估和改善的策略不是同一個策略。我們用π 表示用來評估和改進的策略,用μ 表示產生樣本資料的策略。比如一個機器人可以通過學習其他機器人或者學習人類的做法來評估和改進自己的策略。Sarsa是線上(On-policy)演算法而Q-Learning是離線(Off-policy)演算法。
關於Q-Learning與Sarsa的Python程式碼實現,可以參考我的github:
sarsa演算法
sarsa(lambda)演算法
Q-Learning 演算法
參考資料:
David Silver強化學習公開課