前言:

本文算是個人筆記,如有不足或需要討論的,歡迎交流。

有大佬知道如何搭網路的(如多少層和每層多少個神經元等引數怎麼調),求請教。。

強化學習簡介:

強化學習:Q-Learning個人理解

Q-Learning是強化學習方法的一種。要使用這種方法必須瞭解Q-table(Q表)。

Q表是 狀態-動作 與 估計的未來獎勵 之間的對映表,如下圖所示。(誰會做個好圖的求教=-=)

強化學習:Q-Learning個人理解

縱座標為狀態,橫座標為動作,值為估計的未來獎勵。每次處於某一確定狀態的時候,從表中查詢此狀態下最高未來獎勵值的動作作為接下來的動作,若存在多個相同的值,則隨機選擇其中一個。一直重複,直到終點。

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值)計算方法:這也是體現動態規劃、蒙特卡洛 以及 時間差分法區別的關鍵。

動態規劃:

強化學習:Q-Learning個人理解

蒙特卡洛:

要使用蒙特卡洛方法獲取某個狀態s的獎勵值。首先基於此策略

\pi

的一個episode的序列:

S

1

, A

1

, R

2

, S

2

, A

2

, 。。。, St, At, Rt

+1

, 。。。, Sk ∼ π

t時刻狀態St的獎勵可以表示為:

G_{t} = R_{t+1} +\gamma R_{t+2} + ... +\gamma^{T-1}R_{T}

強化學習:Q-Learning個人理解

時間差分法:

在目前狀態s下,使用TD方法獲得獎勵值。首先基於此策略

\pi

生成下一步動作a,然後獲得下一狀態s’,s‘下再使用

\pi

生成a’,此(s‘,a’)作為獎勵值。

獎勵值:

R_{t+1}+\gamma V(S_{t+1})

ps:γ為衰減係數,至於TD(n)的情況,也就是多走幾步。

強化學習:Q-Learning個人理解

目前為止,Q learning所要講的都講完了,應該沒有落下的。接下來就是DQN,將DQN必須要理解Q learning以及神經網路的一些基本原理。

如果對你有幫助,請點個贊,如果有問題,請提出。

照常:

強化學習:Q-Learning個人理解