Deep QLearning算法详解(强化学习 Reinforcement Learning)
一、算法詳解
文章最后附有博主自己實(shí)現(xiàn)的深度qlearning玩space invader游戲
本文介紹的是基于神經(jīng)網(wǎng)絡(luò)的qlearning算法。我們知道傳統(tǒng)的qlearning算法只能處理狀態(tài)和動(dòng)作有限的情況,對(duì)于無(wú)窮多,則是無(wú)法有效處理的。現(xiàn)實(shí)生活中,環(huán)境的狀態(tài)肯定是無(wú)窮多的,而神經(jīng)網(wǎng)絡(luò)正好可以處理這樣的情況。這里深度qlearning算法使用一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)表示一個(gè)q表,無(wú)論環(huán)境的狀態(tài)有沒(méi)有出現(xiàn)過(guò),我們都可以將狀態(tài)輸入到神經(jīng)網(wǎng)絡(luò),去評(píng)估價(jià)值函數(shù)。
1.1 幾個(gè)概念
1.1.1 什么是critic?
critic:批評(píng)家,評(píng)論家。
在這里算法要更新就是一個(gè)critic,而不是一個(gè)actor(agent),使用critic來(lái)間接指導(dǎo)actor做決策,critic的作用就是評(píng)估一個(gè)actor有多好,水平高不高。
1.1.2 狀態(tài)價(jià)值函數(shù)Vπ(s)V ^{\pi }(s)Vπ(s)和狀態(tài)動(dòng)作價(jià)值函數(shù)Qπ(s,a)Q^{\pi }(s,a)Qπ(s,a),以及他們之間的關(guān)系
π\(zhòng)piπ表示一個(gè)actor,s是一個(gè)狀態(tài),a是指actor看到狀態(tài)s時(shí)做出的動(dòng)作
-
Vπ(s)V ^{\pi }(s)Vπ(s)指使用actor π\(zhòng)piπ時(shí),當(dāng)看到狀態(tài)s時(shí),計(jì)算累計(jì)獎(jiǎng)勵(lì)的期望值
舉個(gè)例子吧,不然有點(diǎn)難以理解,這里計(jì)算的依然是累計(jì)獎(jiǎng)勵(lì)的期望值。我個(gè)人理解,如果要寫出具體 Vπ(s)V ^{\pi }(s)Vπ(s)公式的話,應(yīng)該是這樣
Vπ(s)=∑τR(τ,s)p(τ)(1)V^{\pi}(s)=\sum_{\tau }R(\tau ,s)p(\tau)\tag{1}Vπ(s)=τ∑?R(τ,s)p(τ)(1)
公式解釋:R(τ,s)R(\tau ,s)R(τ,s)表示在一個(gè)eposide內(nèi),只計(jì)算s之后的所有累計(jì)獎(jiǎng)勵(lì)的和。比如τ={s1,a1,r1,s2,a2,r2,...,sT,aT,rT,End}\tau =\{s_{1},a_{1},r_{1},s_{2},a_{2},r_{2},...,s_{T},a_{T},r_{T},End\}τ={s1?,a1?,r1?,s2?,a2?,r2?,...,sT?,aT?,rT?,End},我們計(jì)算R(τ,s2)R(\tau ,s_{2})R(τ,s2?),由上面的定義知道,R(τ,s2)=r2+...+rTR(\tau ,s_{2})=r_{2}+...+r_{T}R(τ,s2?)=r2?+...+rT?,這里沒(méi)有計(jì)算r1r_{1}r1?,只計(jì)算看到s2s_{2}s2?之后的所有獎(jiǎng)勵(lì)。p(τ)p(\tau)p(τ)表示eposide τ\tauτ出現(xiàn)的概率。
舉一個(gè)sutton強(qiáng)化學(xué)習(xí)書(shū)上的例子。
例子1:
假設(shè)我們采樣得到8個(gè)eposides,分別如下:
1、sa,r=0,sb,r=0,Ends_{a},r=0,s_{b},r=0,Endsa?,r=0,sb?,r=0,End
2、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
3、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
4、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
5、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
6、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
7、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
8、sb,r=0,Ends_{b},r=0,Endsb?,r=0,End
這里給出了8個(gè)采樣得到的eposide,并且忽略所采取的動(dòng)作,這里是采樣得到8個(gè)eposide來(lái)逼近Vπ(s)V^{\pi}(s)Vπ(s),選擇采樣來(lái)逼近Vπ(s)V^{\pi}(s)Vπ(s),是因?yàn)閍ctor所處的環(huán)境和actor本身都具有隨機(jī)性,由上面的公式(1)可以看到,如果所有的eposides有無(wú)窮多個(gè),那么計(jì)算機(jī)根本無(wú)法實(shí)現(xiàn)計(jì)算Vπ(s)V^{\pi}(s)Vπ(s)
根據(jù)上面的8個(gè)eposides,可以計(jì)算得到:
Vπ(sb)=1+1+1+1+1+18=34V^{\pi}(s_{b})=\frac{1+1+1+1+1+1}{8}=\frac{3}{4}Vπ(sb?)=81+1+1+1+1+1?=43?
只有在第二到第七個(gè)eposide時(shí),遇到狀態(tài)sbs_{b}sb?才有獎(jiǎng)勵(lì),第一個(gè)eposide中,當(dāng)遇到狀態(tài)sbs_{b}sb?時(shí),所有累積的獎(jiǎng)勵(lì)值是0。第8個(gè)eposide也是如此。就算第一個(gè)eposide變成sa,r=1,sb,r=0,Ends_{a},r=1,s_{b},r=0,Endsa?,r=1,sb?,r=0,End,Vπ(s)V^{\pi}(s)Vπ(s)依然不變還是34\frac{3}{4}43?. -
Qπ(s,a)Q^{\pi }(s,a)Qπ(s,a)指actor看到狀態(tài)sss之后確定選擇動(dòng)作aaa之后的獎(jiǎng)勵(lì)累積期望
為什么說(shuō)確定選擇動(dòng)作aaa呢?看到狀態(tài)sss,其實(shí)有很多個(gè)動(dòng)作可以選擇,但是在這里就是確定選擇動(dòng)作aaa,而不是別的動(dòng)作。還有一個(gè)因素就是選擇動(dòng)作的時(shí)候具有隨機(jī)性,比如采用ε?greedy\varepsilon -greedyε?greedy方法,會(huì)有一定的幾率隨機(jī)選擇動(dòng)作。 -
兩者之間的關(guān)系
假設(shè)有...,st,at,rt,st+1,......,s_{t},a_{t},r_{t},s_{t+1},......,st?,at?,rt?,st+1?,...,那么就有Qπ(st,at)=E(rt+Vπ(st+1))Q^{\pi }(s_{t},a_{t})=E(r_{t}+V ^{\pi }(s_{t+1}))Qπ(st?,at?)=E(rt?+Vπ(st+1?))
這里還是要求期望的。不過(guò)在實(shí)際操作的時(shí)候需要采樣或者直接把變成Qπ(st,at)=rt+Vπ(st+1)Q^{\pi }(s_{t},a_{t})=r_{t}+V ^{\pi }(s_{t+1})Qπ(st?,at?)=rt?+Vπ(st+1?)。這種情況就是只采樣一個(gè)用來(lái)逼近期望。這樣網(wǎng)絡(luò)收斂的效果可能不是太好,畢竟用一條樣本來(lái)逼近還是效果不大好的。
1.1.3 如何計(jì)算Vπ(s)V ^{\pi }(s)Vπ(s)?
-
Monte-Carlo(MC)方法
如下圖,我們使用一個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)計(jì)算Vπ(s)V ^{\pi }(s)Vπ(s),并且根據(jù)actor玩游戲的實(shí)際情況,來(lái)優(yōu)化這個(gè)神經(jīng)網(wǎng)絡(luò),并且利用這個(gè)神經(jīng)網(wǎng)絡(luò)(q表,我們前面說(shuō)到了使用神經(jīng)網(wǎng)絡(luò)來(lái)表示這個(gè)q表以處理狀態(tài)極其復(fù)雜多變的情況,所以神經(jīng)網(wǎng)絡(luò)==q表)來(lái)指導(dǎo)actor進(jìn)行決策。
例子:假設(shè)有狀態(tài) sa和sbs_{a}和 s_{b}sa?和sb?,計(jì)算Vπ(sa)和Vπ(sb)V ^{\pi }(s_{a})和V ^{\pi }(s_{b})Vπ(sa?)和Vπ(sb?)的步驟如下:
對(duì)于Vπ(sa)V ^{\pi }(s_{a})Vπ(sa?):
(1) actor(agent)玩游戲或者和環(huán)境互動(dòng).
(2) 狀態(tài) sas_{a}sa? 出現(xiàn)在某個(gè)回合(episode)中.
(3) 僅記錄從狀態(tài) sas_{a}sa? 出現(xiàn)到這個(gè)回合結(jié)束后的累積的獎(jiǎng)勵(lì),我們將其記為GaG_{a}Ga?.
(4) 將狀態(tài)sas_{a}sa?輸入到神經(jīng)網(wǎng)絡(luò)然后輸出 Vπ(sa)V ^{\pi }(s_{a})Vπ(sa?),這個(gè)神經(jīng)網(wǎng)絡(luò)輸出的是個(gè)標(biāo)量.
(5) 利用 回歸(regression) 的方法來(lái)優(yōu)化神經(jīng)網(wǎng)絡(luò),使得神經(jīng)網(wǎng)絡(luò)的輸出的Vπ(sa)V ^{\pi }(s_{a})Vπ(sa?)來(lái)逼近GaG_{a}Ga?.
(6) 對(duì)于任何一個(gè)狀態(tài)都可以重復(fù)以上過(guò)程,直到神經(jīng)網(wǎng)絡(luò)收斂。
對(duì)于Vπ(sb)V ^{\pi }(s_{b})Vπ(sb?)的計(jì)算也是如此。 -
Temporal-Difference-Approach(時(shí)間差分方法)
時(shí)間差分方法,顧名思義,肯定是需要兩個(gè)連續(xù)時(shí)間步上的狀態(tài)才能達(dá)到訓(xùn)練神經(jīng)網(wǎng)絡(luò)的目的。
假設(shè)actor玩游戲或者與環(huán)境互動(dòng)的一個(gè)episode中的連續(xù)兩步是...,st,at,rt,st+1,......,s_{t},a_{t},r_{t},s_{t+1},......,st?,at?,rt?,st+1?,...
首先,Vπ(st)=rt+Vπ(st+1)(2)V^{\pi }(s_{t})=r_{t}+V^{\pi }(s_{t+1})\tag{2}Vπ(st?)=rt?+Vπ(st+1?)(2)
π{\pi}π表示agent或者actor。
時(shí)間差分方法每連續(xù)的兩個(gè)時(shí)間步都會(huì)訓(xùn)練一次神經(jīng)網(wǎng)絡(luò),因此收斂的速度也會(huì)相對(duì)來(lái)說(shuō)較快。步驟如下
(1) 假設(shè)在時(shí)間步 ttt 觀測(cè)到狀態(tài) sts_{t}st?
(2) actor根據(jù)現(xiàn)在的狀態(tài) sts_{t}st? 做出動(dòng)作 ata_{t}at? ,得到獎(jiǎng)勵(lì) rtr_{t}rt?
(3) actor觀測(cè)到下一個(gè)時(shí)間步 t+1t+1t+1 的狀態(tài) st+1s_{t+1}st+1?
(4) 將狀態(tài) sts_{t}st?, st+1s_{t+1}st+1? 輸入進(jìn)神經(jīng)網(wǎng)絡(luò)得到 Vπ(st)V^{\pi }(s_{t})Vπ(st?) 和 Vπ(st+1)V^{\pi }(s_{t+1})Vπ(st+1?)
(5) 利用公式2,我們將Vπ(st)V^{\pi }(s_{t})Vπ(st?) 和 Vπ(st+1)V^{\pi }(s_{t+1})Vπ(st+1?)的差值逼近時(shí)間步的獎(jiǎng)勵(lì) rtr_{t}rt?. 還是利用回歸(Regression)的方法來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
圖片來(lái)自李宏毅老師的強(qiáng)化學(xué)習(xí)課程,侵刪!!! -
兩種方法之間的關(guān)系
蒙特卡洛方法有更大的方差,方差大說(shuō)明效果不好,相比來(lái)說(shuō)時(shí)間差分方法的訓(xùn)練速度更加高效,收斂的更快,時(shí)間差分方法只需要使用兩個(gè)時(shí)間步的信息就可以訓(xùn)練網(wǎng)絡(luò),而蒙特卡洛方法卻需要等待一個(gè)完整的episode完成之后才可以進(jìn)行訓(xùn)練。不知道大家發(fā)現(xiàn)沒(méi)有,突然覺(jué)得這個(gè)方法也是有點(diǎn)類似監(jiān)督學(xué)習(xí)方法,這個(gè)深度qlearning算法里面的“監(jiān)督信息是環(huán)境反饋過(guò)來(lái)的獎(jiǎng)勵(lì)”,我們需要使用獎(jiǎng)勵(lì)來(lái)指引actor的學(xué)習(xí)。
對(duì)于同一個(gè)采樣出來(lái)的樣本,使用兩種方法計(jì)算出來(lái)的同一個(gè)狀態(tài) sas_{a}sa? 的價(jià)值函數(shù)是不一樣的
比如下面的例子:
假設(shè)我們采樣得到8個(gè)eposides,分別如下:
1、sa,r=0,sb,r=0,Ends_{a},r=0,s_{b},r=0,Endsa?,r=0,sb?,r=0,End
2、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
3、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
4、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
5、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
6、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
7、sb,r=1,Ends_{b},r=1,Endsb?,r=1,End
8、sb,r=0,Ends_{b},r=0,Endsb?,r=0,End
我們先使用蒙特卡洛方法計(jì)算 Vπ(sa)V^{\pi}(s_{a})Vπ(sa?):
觀察采樣出來(lái)的數(shù)據(jù),我們可以看到狀態(tài) sas_{a}sa? 只是出現(xiàn)在 第一條樣本里面,而且直到游戲結(jié)束,得到的兩個(gè)獎(jiǎng)勵(lì)值都是0,所以 Ga=0G_{a}=0Ga?=0,因?yàn)槲覀冃枰?Vπ(sa)V^{\pi}(s_{a})Vπ(sa?) 逼近 GaG_{a}Ga?,所以理想情況下有Vπ(sa)=0V^{\pi}(s_{a})=0Vπ(sa?)=0.
接著使用時(shí)間差分方法來(lái)計(jì)算Vπ(sa)V^{\pi}(s_{a})Vπ(sa?):
從第一條采樣樣本可以看到狀態(tài) sas_{a}sa? 和 sbs_{b}sb? 是兩個(gè)相鄰的狀態(tài),因此由公式2可以知道計(jì)算 Vπ(sa)V^{\pi}(s_{a})Vπ(sa?),需要使用 Vπ(sb)V^{\pi}(s_{b})Vπ(sb?)的值。
根據(jù)采樣的8條樣本,我們使用這八條樣本的 $V^{\pi}(s_{b})_{i},i=1,2,…,8的期望值來(lái)近似逼近 Vπ(sb)V^{\pi}(s_{b})Vπ(sb?)
因此有Vπ(sb)=1+1+1+1+1+18=34V^{\pi}(s_{b})=\frac{1+1+1+1+1+1}{8}=\frac{3}{4}Vπ(sb?)=81+1+1+1+1+1?=43?
由在第一條樣本中在狀態(tài) sas_{a}sa? 時(shí)actor得到的獎(jiǎng)勵(lì)是0,所以Vπ(sa)=0+Vπ(sb)=34V^{\pi }(s_{a})=0+V^{\pi }(s_{b})=\frac{3}{4}Vπ(sa?)=0+Vπ(sb?)=43?.
可以看到,不同的計(jì)算方法得到的價(jià)值函數(shù)的值是不一樣的。
二、算法運(yùn)行流程
步驟一: actor(agent) π{\pi}π和環(huán)境(Environment)互動(dòng)
步驟二: 使用蒙特卡洛方法或者時(shí)間差分方法來(lái)計(jì)算狀態(tài)價(jià)值函數(shù)Vπ(s)V^{\pi}(s)Vπ(s)或者狀態(tài)動(dòng)作價(jià)值函數(shù)Qπ(s,a)Q^{\pi}(s,a)Qπ(s,a)
步驟三: 使用回歸(Regression)方法訓(xùn)練神經(jīng)網(wǎng)絡(luò)
步驟四: 價(jià)值函數(shù)指導(dǎo)actor做出更好的策略,循環(huán)以上步驟,直到收斂。
基于TD方法的QLearning具體如下圖:
算法流程里面的butter要改為buffer。
三、幾個(gè)小技巧
3.1 技巧1 target網(wǎng)絡(luò)和predict網(wǎng)絡(luò)
其實(shí)在傳統(tǒng)的qlearning里面以及涉及到了“q_target和q_predict”的概念了,這里的深度qlearning在訓(xùn)練的時(shí)候同樣也是由target網(wǎng)絡(luò)和predict網(wǎng)絡(luò),只不過(guò)是兩個(gè)網(wǎng)絡(luò)需要共享參數(shù),其中target是固定的,只有在predict網(wǎng)絡(luò)以target的輸出為目標(biāo)更新若干次之后采后將predict網(wǎng)絡(luò)的參數(shù)重新賦給target網(wǎng)絡(luò)。
有需要可以看看傳統(tǒng)的qlearning算法。傳送門:傳統(tǒng)qlearning算法講解
我們以李宏毅老師的課程講解如何訓(xùn)練的
這里使用的是時(shí)間差分方法來(lái)訓(xùn)練的
右邊的 Target 網(wǎng)絡(luò)的參數(shù)在一定時(shí)間內(nèi)是固定的,Target網(wǎng)絡(luò)輸出的值是左邊網(wǎng)絡(luò)需要回歸的目標(biāo),然后更新這個(gè)來(lái)更新左邊的predict網(wǎng)絡(luò),更新若干次之后,然后將predict網(wǎng)絡(luò)的參數(shù)重新賦給Target網(wǎng)絡(luò),一直訓(xùn)練,直到收斂。
3.2、技巧2之 ε?greedy\varepsilon -greedyε?greedy選擇動(dòng)作
使用這個(gè)技巧有利于actor學(xué)會(huì)探索,也可以確保當(dāng)訓(xùn)練的次數(shù)足夠多時(shí),所有的動(dòng)作都可以被的更新到。隨機(jī)探索的可能性會(huì)隨著訓(xùn)練的進(jìn)行逐漸變小的
我們之前在強(qiáng)化學(xué)習(xí)(RL)QLearning算法詳解介紹過(guò)了這個(gè)技巧,不再重復(fù)。
3.3 技巧3 Boltzmann選擇動(dòng)作
利用狀態(tài)動(dòng)作價(jià)值函數(shù)的大小來(lái)選擇動(dòng)作,值越大,這個(gè)對(duì)于的動(dòng)作被選擇的概率就越大,對(duì)于的動(dòng)作被選擇的概率公式如下:
P(a∣s)=exp(Q(s,a))∑aexp(Q(s,a))(3)P(a|s)=\frac{exp(Q(s,a))}{\sum_{a}exp(Q(s,a))}\tag{3}P(a∣s)=∑a?exp(Q(s,a))exp(Q(s,a))?(3)
3.4 技巧4 RePlay Buffer
設(shè)計(jì)一個(gè)Buffer將actor玩過(guò)的experience存儲(chǔ)起來(lái),可以重復(fù)使用這個(gè)數(shù)據(jù)更新網(wǎng)絡(luò)。
假如使用時(shí)間差分方法,我們可以在Buffer存儲(chǔ)器里面存儲(chǔ)只需要兩個(gè)時(shí)間步就可以,比如其中一條數(shù)據(jù)可以是:st,at,rt,st+1s_{t},a_{t},r_{t},s_{t+1}st?,at?,rt?,st+1?,當(dāng)儲(chǔ)存很多時(shí),也可以進(jìn)行batch學(xué)習(xí)。
四、小例子
基于卷積神經(jīng)網(wǎng)絡(luò)的小例子
4.1 readme
- 安裝gym
- 安裝atari-py
在第二步很容易出現(xiàn)ale_c.dll不存在的問(wèn)題。
以下是解決方法
分三步:
第一步:先卸載atari-py。pip uninstall atari-py
第二步:再重新安裝這個(gè)。pip install --no-index -f https://github.com/Kojoley/atari-py/releases atari_py
第三步:pip install gym
# -*- coding: utf-8 -*-import gym
import torch.nn as nn
import torch as t
from torch.nn import functional as F
import randomdicount_factor = 0.9
eplison = 0.1
lr = 0.001
epochs = 50
nums_p2t = 100 #每隔100詞將Q_Net_predict的參數(shù)賦給Q_Net_target,然后繼續(xù)固定target網(wǎng)絡(luò)
env = gym.make("SpaceInvaders-v0") # 構(gòu)造一個(gè)太空入侵者的環(huán)境# 下面這個(gè)神經(jīng)網(wǎng)絡(luò)是用來(lái)預(yù)測(cè)
class Q_Net_predict(nn.Module): def __init__(self, nums_action):super(Q_Net_predict,self).__init__()#下面開(kāi)始定義卷積和全連接層,計(jì)劃使用兩個(gè)全連接層和兩個(gè)卷積層self.conv1 = nn.Conv2d(3, 16, 5, 2)self.conv2 = nn.Conv2d(16, 16, 5, 2)self.linear1 = nn.Linear(1728,256)self.linear2 = nn.Linear(256,nums_action)def forward(self, x):#先進(jìn)行類型的轉(zhuǎn)換state = t.from_numpy(x[:,:,::-1].copy())state = state.permute((2,0,1)).unsqueeze(dim=0).float()#開(kāi)始使用卷積,最大池化和線性層out = self.conv1(state)out = F.relu(out)out = F.max_pool2d(out,(2,2))out = self.conv2(out)out = F.relu(out)out = F.max_pool2d(out,(2,2))s = out.size()out = out.view(1,s[1]*s[2]*s[3])out = F.relu(self.linear1(out))out = self.linear2(out)return out# 下面這個(gè)神經(jīng)網(wǎng)絡(luò)是用來(lái)作為Q_Net_predict擬合的目標(biāo)函數(shù)
class Q_Net_target(nn.Module): def __init__(self, nums_action):super(Q_Net_target,self).__init__()#下面開(kāi)始定義卷積和全連接層,計(jì)劃使用兩個(gè)全連接層和兩個(gè)卷積層self.conv1 = nn.Conv2d(3, 16, 5, 2)self.conv2 = nn.Conv2d(16, 16, 5, 2)self.linear1 = nn.Linear(1728,256)self.linear2 = nn.Linear(256,nums_action)def forward(self, x):#先進(jìn)行類型的轉(zhuǎn)換state = t.from_numpy(x[:,:,::-1].copy())state = state.permute((2,0,1)).unsqueeze(dim=0).float()#開(kāi)始使用卷積,最大池化和線性層out = self.conv1(state)out = F.relu(out)out = F.max_pool2d(out,(2,2))out = self.conv2(out)out = F.relu(out)out = F.max_pool2d(out,(2,2))s = out.size()out = out.view(1,s[1]*s[2]*s[3])out = F.relu(self.linear1(out))out = self.linear2(out)return outdef choose_action(logits):## 使用eplison-greedy選擇agent需要執(zhí)行的動(dòng)作v = random.uniform(0, 1)q_value, index = t.topk(logits, 1, dim = 1)#下面開(kāi)始eplison-greedy 算法if v > eplison:#這里是求最大的狀態(tài)價(jià)值函數(shù)對(duì)應(yīng)的動(dòng)作q_value_t = logits[0,index[0][0]]action = index[0][0].item()else:#下面是隨機(jī)產(chǎn)生動(dòng)作action = random.randint(0, 5)q_value_t = logits[0, action]return action, q_value_tdef q_learning():all_count = 0#下面開(kāi)始#先定義兩個(gè)狀態(tài)價(jià)值函數(shù)網(wǎng)絡(luò)q_target = Q_Net_target(6)q_predict = Q_Net_predict(6)#定義一個(gè)優(yōu)化器opt_Adam = t.optim.Adam(q_predict.parameters(),lr = lr)#將target網(wǎng)絡(luò)的參數(shù)凍結(jié)for p in q_target.parameters():p.requires_grad = Falsefor _ in range(epochs):done = False#初始化一個(gè)狀態(tài)observation = env.reset() #每個(gè)episode的初始狀態(tài)while not done:env.render()#下面開(kāi)始網(wǎng)絡(luò)的參數(shù)復(fù)制if all_count % nums_p2t == 0:target_paras = q_target.state_dict()predict_paras = q_predict.state_dict()target_paras.update(predict_paras)q_target.load_state_dict(target_paras)#下面使用q_predict網(wǎng)絡(luò)的輸出選擇動(dòng)作predict_logits = q_predict(observation)action, q_value_t = choose_action(logits= predict_logits)#下面根據(jù)動(dòng)作得到獎(jiǎng)勵(lì)以及下一個(gè)時(shí)間步的狀態(tài)observationobservation, reward, done, info = env.step(action)#現(xiàn)在有了observation,需要使用使用target網(wǎng)絡(luò)計(jì)算observation的狀態(tài)價(jià)值函數(shù)target_qvalue = q_target(observation)q_value_t_ = max(target_qvalue[0]).item()#我們需要使reward+q_value_t_ 和 q_value_t接近loss = (reward + q_value_t_ - q_value_t)**2loss.backward()opt_Adam.step()all_count +=1env.close()if __name__ == '__main__':q_learning()
五、參考文獻(xiàn)
1、李宏毅老師的強(qiáng)化學(xué)習(xí)算法
2、莫煩python的強(qiáng)化學(xué)習(xí)系列
3、ale_c.dll確實(shí)解決方法
4、openai官網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的Deep QLearning算法详解(强化学习 Reinforcement Learning)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 西伯利亚(Siberia)冷空气
- 下一篇: 拳击体重级别划分