前言:
本文算是個人筆記,如有不足或需要討論的,歡迎交流,郵箱即QQ。
有大佬知道如何搭網絡的(如多少層和每層多少個神經元等參數怎么調),求請教。。
照例頂封面:
強化學習簡介:image.png
Q-Learning是強化學習方法的一種。要使用這種方法必須了解Q-table(Q表)。
Q表是 狀態-動作 與 估計的未來獎勵 之間的映射表,如下圖所示。(誰會做個好圖的求教=-=)
image.png
縱坐標為狀態,橫坐標為動作,值為估計的未來獎勵。
每次處于某一確定狀態的時候,從表中查找此狀態下最高未來獎勵值的動作作為接下來的動作,若存在多個相同的值,則隨機選擇其中一個。一直重復,直到終點。
Q表的作用可看出是至關重要的。那么關鍵就在于如何獲取一個可用的Q表。一般來說,我們的RL任務的模型都是未知的,不可以采用動態規劃的方法。兩種基本方法--蒙特卡洛(MC)和時間差分法(TD)。
蒙特卡洛(MC):
找了許多資料都沒找到使用這方法的代碼,所以只能從其定義出發說明是如何工作的。(有錯誤請指正)
- 1:隨機選取一個狀態S開始游戲
- 2:直到游戲終或者行動步數到達最大時,將獲得的未來獎勵(以目前表以及游戲每個狀態本身的反饋獎勵獲得)。
- 3:重復2步驟N次,所獲得獎勵的平均值為目前此狀態S的新的未來獎勵值(注意,可以使用目前平均值為新的值,直接覆蓋舊的值。也可以新值與舊值加權求合)。對于(s,a)的未來獎勵同理。
- 4:重復1步驟,但要求每個狀態s都能夠被選到。
很明顯這要的時間相當多,所以這也應該是沒人用他寫代碼的原因吧。
時間差分法(TD):
這個能做到每一步都更新一次,同時可以異步跟新(不用每次都要求所有狀態更新一次來輪轉,選到誰就更新誰,所以也要求每個狀態都能夠選到)。一般說的TD都指的是TD(0) (ps:為啥不叫TD(1)啊),即每次只往后看一步,這是什么意思呢,看了接下來的流程估計就懂了。(使用的都是(s,a)值)
- 1:隨機選取一個狀態S開始游戲
- 2:此s狀態下選取a(根據貪婪 或者 ε-貪婪),并在動作a的狀態下獲得s‘,即下一狀態。
- 3:使用s狀態下的反饋獎勵以及s’的未來獎勵更新s的未來獎勵。(一般這兩者與目前s狀態的未來獎勵加權求和)(ps: 這里就是sarsar與Qlearning的區別,s'是指s中通過策略抵達的下一狀態,但此狀態下也有許多的(s,a)值,該以哪個來更新呢?Qlearning中,選取最大的(s,a)為更新值。sarsar中,對所有(s,a)值求平均,作為更新值。這也是所謂的Qlearning高風險高收益,sarsar比較保守的原因。)
- 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的部分。
目前為止,Qlearning所要講的都講完了,應該沒有落下的。接下來就是DQN,將DQN必須要理解Qlearning以及神經網絡的一些基本原理。
如果對你有幫助,請點個感謝,如果有問題,請私信。
照常: