強化學習:Q-Learning個人理解
前言:
本文算是個人筆記,如有不足或需要討論的,歡迎交流。
有大佬知道如何搭網路的(如多少層和每層多少個神經元等引數怎麼調),求請教。。
強化學習簡介:
Q-Learning是強化學習方法的一種。要使用這種方法必須瞭解Q-table(Q表)。
Q表是 狀態-動作 與 估計的未來獎勵 之間的對映表,如下圖所示。(誰會做個好圖的求教=-=)
縱座標為狀態,橫座標為動作,值為估計的未來獎勵。每次處於某一確定狀態的時候,從表中查詢此狀態下最高未來獎勵值的動作作為接下來的動作,若存在多個相同的值,則隨機選擇其中一個。一直重複,直到終點。
Q表的作用可看出是至關重要的。那麼關鍵就在於如何獲取一個可用的Q表。一般來說,我們的RL任務的模型都是未知的,不可以採用動態規劃的方法。兩種基本方法——蒙特卡洛(MC)和時間差分法(TD)。
簡單說下,MC方法是每做完一個episode才進行一次更新。而TD是每走一步進行一次更新。
蒙特卡洛(MC):
找了許多資料都沒找到使用這方法的程式碼,所以只能從其定義出發說明是如何工作的。(有錯誤請指正)
1:隨機選取一個狀態S開始遊戲
2:直到遊戲終或者行動步數到達最大時,獲得一個(s,a)序列,以及每個對應的獎勵。
3:對序列中的(s,a),利用其所獲得的獎勵值,更新其對應的Q值。(MC獎勵獲取方法在文章末尾)
4:重複1步驟,直到收斂(即Q表不再變化,或變化很小),但要求每個狀態s都能夠被選到。
時間差分法(TD):
這個能做到每一步都更新一次,同時可以非同步跟新(不用每次都要求所有狀態更新一次來輪轉,選到誰就更新誰,所以也要求每個狀態都能夠選到)。一般說的TD都指的是TD(0) (ps:為啥不叫TD(1)啊),即每次只往後看一步,這是什麼意思呢,看了接下來的流程估計就懂了。(使用的都是(s,a)值)
1:隨機選取一個狀態S開始遊戲
2:此s狀態下選取a(根據貪婪 或者 ε-貪婪),並在動作a的狀態下獲得s',即下一狀態,繼續在s'使用策略獲得a'。
3:使用(s,a)狀態下的反饋獎勵r以及(s',a')的未來獎勵(Q值)更新(s,a)的未來獎勵。
(一般這兩者與目前s狀態的未來獎勵加權求和)(ps: 這裡就是sarsa與Qlearning的區別,s‘是指s中透過策略抵達的下一狀態,但此狀態下也有許多的(s,a)值,該以哪個來更新呢?Qlearning中,選取最大的(s,a)為更新值。sarsa中,對所有(s,a)值求平均,作為更新值。這也是所謂的Q learning高風險高收益,sarsa比較保守的原因。)
4:重複1步驟,(但要求每個狀態s都能夠被選到。)
#Initialize table with all zeros
Q
=
np
。
zeros
([
env
。
observation_space
。
n
,
env
。
action_space
。
n
])
# Set learning parameters
lr
=
。
8
y
=
。
95
num_episodes
=
2000
#create lists to contain total rewards and steps per episode
#jList = []
rList
=
[]
for
i
in
range
(
num_episodes
):
#Reset environment and get first new observation
s
=
env
。
reset
()
rAll
=
0
d
=
False
j
=
0
#The Q-Table learning algorithm
while
j
<
99
:
j
+=
1
#Choose an action by greedily (with noise) picking from Q table
a
=
np
。
argmax
(
Q
[
s
,:]
+
np
。
random
。
randn
(
1
,
env
。
action_space
。
n
)
*
(
1。
/
(
i
+
1
)))
#Get new state and reward from environment
s1
,
r
,
d
,
_
=
env
。
step
(
a
)
#Update Q-Table with new knowledge
Q
[
s
,
a
]
=
Q
[
s
,
a
]
+
lr
*
(
r
+
y
*
np
。
max
(
Q
[
s1
,:])
-
Q
[
s
,
a
])
rAll
+=
r
s
=
s1
if
d
==
True
:
break
#jList。append(j)
rList
。
append
(
rAll
)
這是網上找到的一個程式碼,每個episode執行99次動作,s最開始都是同一個地方,在這99次動作中,每次s產生的下個s1狀態作為下一次的s,然後每次進行TD(0)更新。
注意,這裡所用的是上面提到的TD(0),若想要TD(n) ,n>1,
(以上面程式碼為例)
則應該在每次j下,還要新增n次迴圈,
n次迴圈的每一次都要用Q表選擇a然後獲得s‘,對每次獲得的(s,a)加權求合,然後以此加權值更新當前的(s,a)。
當然下一狀態應該是第一次選a時所獲得的狀態s’。
如果還是不懂的話,建議參考David Silver關於TD的那節(沒記錯的話是第五節的課)。或者是看
An Introduction to RL - SuttonBook
這本書中關於TD的部分。
未來獎勵(Q值)計算方法:這也是體現動態規劃、蒙特卡洛 以及 時間差分法區別的關鍵。
動態規劃:
蒙特卡洛:
要使用蒙特卡洛方法獲取某個狀態s的獎勵值。首先基於此策略
的一個episode的序列:
S
1
, A
1
, R
2
, S
2
, A
2
, 。。。, St, At, Rt
+1
, 。。。, Sk ∼ π
t時刻狀態St的獎勵可以表示為:
時間差分法:
在目前狀態s下,使用TD方法獲得獎勵值。首先基於此策略
生成下一步動作a,然後獲得下一狀態s’,s‘下再使用
生成a’,此(s‘,a’)作為獎勵值。
獎勵值:
ps:γ為衰減係數,至於TD(n)的情況,也就是多走幾步。
目前為止,Q learning所要講的都講完了,應該沒有落下的。接下來就是DQN,將DQN必須要理解Q learning以及神經網路的一些基本原理。
如果對你有幫助,請點個贊,如果有問題,請提出。
照常: