在文章強化學習與馬爾可夫決策中,介紹了使用馬爾可夫決策模型對強化學習的過程進行建模,本篇文章將介紹基於這一模型而引出的一些強化學習的經典算法。
Q-learning是強化學習的經典算法之一,它是一個value-based算法,同時也是一個model-free的算法。這裏的Q指的是動作價值,即當前狀態 下,通過策略 採取動作 之後,能夠獲得的獎勵 。
算法原理
該算法的主要思想很簡單。假設強化學習過程中所有狀態的集合爲 ,動作空間爲 。首先建立一張Q值表,記錄強化學習過程中每一個時刻 的狀態 下,採取不同的動作 的收益。一張Q值表的示例如下:
state | a1 | a2 |
---|---|---|
s1 | q(s1,a1) | q(s1,a2) |
s2 | q(s2,a1) | q(s2,a2) |
s3 | q(s3,a1) | q(s3,a2) |
之後,根據這一張Q值表來選取能夠獲得最大的收益的動作,一般是通過 -greedy的方式選取當前狀態下,Q值最大的動作。
Q-learning的整個迭代過程實際上就是去更新這張Q值表,當Q值表收斂時,通過 -greedy選取的Q值就是最優動作價值函數 ,其對應的策略就是最優策略 。
這裏需要注意的是,由於Q-learning是model-free的算法,因此不用考慮環境的狀態轉移模型,也就不用關心狀態價值函數 。
Q-learning是使用時序差分TD來更新Q值表的,時序差分的更新公式如下:
其中 表示TD目標, 是TD誤差。
算法流程
隨機初始化所有的狀態 和動作對應的價值????。對於終止狀態其????值初始化爲0。然後執行下面的流程,迭代 次。
初始化 爲當前狀態序列的第一個狀態。
用 -greedy在當前狀態 選擇出動作 。
在狀態 執行當前動作 ,得到新狀態 和獎勵 。
更新價值函數 :
;
如果 是終止狀態,當前輪迭代完畢,否則轉到步驟2。
SARSA和Q-learning非常相似,除了價值函數的更新方式,其他都是一模一樣。其算法流程如下:
初始化 爲當前狀態序列的第一個狀態。
用 -greedy在當前狀態 選擇出動作 。
在狀態 執行當前動作 ,得到新狀態 和獎勵 。
用 -greedy在新狀態 選擇出動作
更新價值函數 :
;
如果 是終止狀態,當前輪迭代完畢,否則轉到步驟2。
兩者的不同之處是上述第4步和第5步。
Q-learning在根據當前狀態 下執行動作 之後,直接用貪婪算法選擇在新狀態 下,回報最大的動作 對應的 值來更新 值表,但是這個動作 沒有被立刻執行,真正在新狀態 下執行的動作是根據更新之後的 值表選擇出來的。
反觀SARSA,使用的是 -greedy從新狀態 下選擇出動作 ,再更新完 值表之後,SARSA在下一輪迭代中更是直接去執行了動作 ,基本上是「說到做到」。因此,兩者在新狀態 下得到的 值會有一些差別。
由於SARSA這種「說到做到」的特性,因此被稱爲在線學習算法,而Q-learning這一類的算法,被稱爲離線學習算法。
Sarsa(lambda)是Sarsa的增強版。與普通的Sarsa不同,Sarsa(lambda)在更新完當前狀態 的 值之後,還會將之前所走過的所有狀態的 值一起給更新了。也就是說,Sarsa(lambda)不但思考糾正當前狀態的選擇,還對以往的記憶狀態進行反思糾正。因此,Sarsa(lambda)的收斂速度,比普通的Sarsa快。其算法流程如下:
其中 是一個矩陣,用來保存其經歷過的所有狀態的信息。參數 是一個值爲[0,1]的衰減值,通過 對矩陣 進行更新,增強離當前狀態比較近的記憶,疏遠那些太久之前的記憶。
由於Sarsa(lambda)會保存狀態記憶,因此除了提高收斂速度之外,還可以解決在訓練過程中,智能體反覆執行無意義動作的問題,例如老鼠在尋找奶酪的時候,繞着柱子轉圈圈的行爲就沒什麼意義了。怎麼解決呢,在 這一步之前,直接將矩陣 中這個狀態 這一步之前,直接將矩陣 中這個狀態 對應的行置爲0即可。
最後,無論是Q-learning還是Sarsa,都是基於