App下載

Python玩CartPole(DQN)

猿友 2018-08-06 18:20:04 瀏覽數(shù) (12039)
反饋

本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄

下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解

導(dǎo)語(yǔ)

利用Python搭建簡(jiǎn)單的深度強(qiáng)化學(xué)習(xí)網(wǎng)絡(luò)(DQN)玩CartPole這個(gè)小游戲。。。

這是來(lái)自PyTorch官方教程的一個(gè)簡(jiǎn)單實(shí)例。

感覺還是挺有意思的~~~

直接進(jìn)入正題吧~~~

內(nèi)容較長(zhǎng),做好心理準(zhǔn)備~~~


相關(guān)文件

百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1G-Z_Mpdd4aXnsTqNKvZbZw

密碼: xf7x

參考文獻(xiàn)

官方英文教程鏈接:

http://pytorch.org/tutorials/intermediate/reinforcement_q_learning.html

另外:

對(duì)英文文獻(xiàn)閱讀有困難的同學(xué)也不必?fù)?dān)心,我已經(jīng)把這個(gè)教程翻譯為中文放到了相關(guān)文件中。

同時(shí),我也在微信公眾號(hào)“Charles的皮卡丘”底部菜單欄“資料共享”→“整理匯總”中分享了(即強(qiáng)化學(xué)習(xí)實(shí)例1)。

整理匯總”中也有翻譯自官方文檔的PyTorch60分鐘快速入門教程,以及我自己結(jié)合一些講座和tutorials整理的強(qiáng)化學(xué)習(xí)基礎(chǔ)教程。


開發(fā)工具

系統(tǒng):Windows10

Python版本:3.6.4

相關(guān)模塊:

gym模塊;

numpy模塊;

matplotlib模塊;

PIL模塊;

torch模塊;

torchvision模塊;

以及一些Python自帶的模塊。

其中PyTorch版本為:

0.3.0


環(huán)境搭建

安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。

補(bǔ)充說(shuō)明:

PyTorch暫時(shí)不支持直接pip安裝。

有兩個(gè)選擇:

(1)安裝anaconda3后在anaconda3的環(huán)境下安裝(直接pip安裝即可);

(2)使用編譯好的whl文件安裝,下載鏈接為:

https://pan.baidu.com/s/1dF6ayLr#list/path=%2Fpytorch


原理介紹

(1)增強(qiáng)學(xué)習(xí)

為了便于大家更好地理解,我決定從增強(qiáng)學(xué)習(xí)開始講起,當(dāng)然只講其主要思想,不作深入討論。

在AI領(lǐng)域,我們一般使用Agent來(lái)表示一個(gè)具備行為能力的物體,例如最近比較火的無(wú)人車。那么增強(qiáng)學(xué)習(xí)考慮的問題就是Agent和環(huán)境environment之間交互的任務(wù)。比如假設(shè)我們有一只AI皮卡丘:

現(xiàn)在我們要讓這只皮卡丘去撿左上角的飯團(tuán)。那么皮卡丘周圍的物體包括飯團(tuán)就是環(huán)境,皮卡丘通過(guò)外部的比如攝像頭來(lái)感知環(huán)境(不妨假設(shè)皮卡丘的眼睛就是一對(duì)攝像頭),然后皮卡丘需要輸出一系列的動(dòng)作來(lái)實(shí)現(xiàn)撿起飯團(tuán)這個(gè)任務(wù)。

當(dāng)然你也可以讓皮卡丘去完成其他任務(wù)。

不過(guò),不管是什么樣的任務(wù),都包含了一系列的動(dòng)作action、觀察observation還有反饋值Reward。

所謂的Reward就是Agent執(zhí)行了動(dòng)作與環(huán)境進(jìn)行交互后,環(huán)境會(huì)發(fā)生變化,變化的好與壞就是Reward來(lái)表示的。比如上面的例子:

如果皮卡丘離飯團(tuán)變近了,那么Reward就應(yīng)該是正的,否則就應(yīng)該是負(fù)的。

接下來(lái)這里用了Observation觀察一詞而不是環(huán)境那是因?yàn)锳gent不一定能得到環(huán)境的所有信息,比如皮卡丘上的攝像頭就只能得到某個(gè)特定角度的畫面。因此,只能用Observation來(lái)表示Agent獲取的感知信息。事實(shí)上,人與環(huán)境交互也是如此。

在每個(gè)時(shí)間點(diǎn),Agent都會(huì)從可以選擇的動(dòng)作集合A中選擇一個(gè)action執(zhí)行。這個(gè)動(dòng)作集合可以是連續(xù)的也可以是離散的,動(dòng)作集合的數(shù)量將直接影響整個(gè)任務(wù)的求解難度。

那么知道了整個(gè)過(guò)程,任務(wù)的目標(biāo)就出來(lái)了,那就是要能獲得盡可能多的Reward。沒有目標(biāo),控制也就無(wú)從談起,因此,獲取Reward就是一個(gè)量化的標(biāo)準(zhǔn),Reward越多,就表示執(zhí)行地越好。每個(gè)時(shí)間片,Agent都是根據(jù)當(dāng)前的觀察來(lái)確定下一步的動(dòng)作。每次的觀察就作為Agent的所處狀態(tài)state。因此,狀態(tài)state和動(dòng)作Action存在映射關(guān)系,也就是一個(gè)state可以對(duì)應(yīng)一個(gè)action,或者對(duì)應(yīng)不同動(dòng)作的概率(常常用概率表示)。那么state到action的過(guò)程就稱之為一個(gè)策略Policy。當(dāng)然,也可以是之前的一系列的狀態(tài)動(dòng)作集合到action的映射。

綜上所述,增強(qiáng)學(xué)習(xí)的任務(wù)就是找到一個(gè)最優(yōu)的策略policy從而使reward最多。

當(dāng)然,我們一開始并不知道最優(yōu)的策略是什么,因此往往從隨機(jī)的策略開始,使用隨機(jī)的策略進(jìn)行試驗(yàn),就可以得到一系列的狀態(tài)、動(dòng)作和反饋。也就是一系列的樣本Sample。增強(qiáng)學(xué)習(xí)的算法就是需要根據(jù)這些樣本來(lái)改進(jìn)policy,從而使得得到的樣本的reward更好。正是這種讓reward越來(lái)越好特性,該算法才被稱為增強(qiáng)學(xué)習(xí)。

(2)Q-Learning

由于增強(qiáng)學(xué)習(xí)的樣本是一個(gè)時(shí)間序列,因此將增強(qiáng)學(xué)習(xí)的問題模型化,就引入了馬爾科夫決策過(guò)程。

簡(jiǎn)單的說(shuō),就是我們可以假設(shè):

Agent的下一個(gè)狀態(tài)僅取決于當(dāng)前的狀態(tài)和當(dāng)前的動(dòng)作。注意這里的狀態(tài)是完全可觀察的全部的環(huán)境狀態(tài)。也就是說(shuō),只要我們有一個(gè)初始狀態(tài),后繼狀態(tài)就是全部確定的(絕大多數(shù)的增強(qiáng)學(xué)習(xí)都可以模型化為馬爾科夫決策問題。

當(dāng)然現(xiàn)實(shí)情況環(huán)境一般不完全可觀察,然后有一些隨機(jī)性,那么只能進(jìn)行估計(jì)。

既然一個(gè)狀態(tài)對(duì)應(yīng)一個(gè)動(dòng)作,或者動(dòng)作概率,而有了動(dòng)作,下一個(gè)狀態(tài)也就確定了。這就意味著每個(gè)狀態(tài)可以用一個(gè)確定的值來(lái)進(jìn)行描述。可以由此判斷一個(gè)狀態(tài)是好的狀態(tài)還是不好的狀態(tài)。比如之前的皮卡丘往左上角走肯定是好的狀態(tài),往右下角走肯定是不好的狀態(tài)。那么狀態(tài)的好壞其實(shí)等價(jià)于對(duì)未來(lái)回報(bào)的期望。因此我們可以引入回報(bào)Return來(lái)表示某個(gè)時(shí)間的狀態(tài)將具備的回報(bào)。另外我們?cè)僖胍粋€(gè)概念估值函數(shù),用估值函數(shù)來(lái)表示一個(gè)狀態(tài)未來(lái)的潛在價(jià)值,也就是變成了皮卡丘向左上角看感覺那邊是飯團(tuán)然后左上角的估值就高了。也就是說(shuō)估值函數(shù)是回報(bào)的期望值。定義出估值函數(shù)接下來(lái)就是如何求解的問題了

這部分我決定一帶而過(guò)而不是放上一堆公式來(lái)嚇人。

實(shí)際上,求解估值函數(shù)只需要從定義出發(fā)進(jìn)行簡(jiǎn)單的推導(dǎo)即可。最后可以證明估值函數(shù)是可以通過(guò)迭代來(lái)進(jìn)行計(jì)算的。

考慮到每個(gè)狀態(tài)之后都有多種動(dòng)作可以選擇,每個(gè)動(dòng)作之下的狀態(tài)又都不一樣,我們更關(guān)心某個(gè)狀態(tài)下的不同動(dòng)作的估值。即根據(jù)每個(gè)動(dòng)作的估值來(lái)選擇最好的一個(gè)去執(zhí)行,這就是動(dòng)作估值函數(shù)Q。需要注意的是這里的reward是執(zhí)行完動(dòng)作之后得到的reward,而之前的reward是state對(duì)應(yīng)的reward即多種動(dòng)作對(duì)應(yīng)的reward的期望值。

顯然,現(xiàn)在我們要求解的是最優(yōu)動(dòng)作估值函數(shù)。這可以利用估值迭代的方法進(jìn)行求解,其核心思想是每次根據(jù)新得到的reward和原來(lái)的Q值來(lái)更新現(xiàn)在的Q值。Q-Learning的思想完全根據(jù)估值迭代得到。

但是實(shí)際情況下,我們沒有辦法遍歷所有的狀態(tài)還有所有的動(dòng)作,我們只能得到有限的樣本,于是Q-Learning提出了一種類似梯度下降的方法來(lái)減少估值誤差,即每次朝著目標(biāo)邁進(jìn)一小步,最后可以收斂到最優(yōu)的Q值。

(3)DQN

說(shuō)白了就是用一個(gè)深度神經(jīng)網(wǎng)絡(luò)來(lái)作為Q值的網(wǎng)絡(luò)。

(4)最后來(lái)看我們的CartPole小游戲

我們需要控制下面的cart移動(dòng)使連接在上面的桿保持垂直不倒。這個(gè)任務(wù)簡(jiǎn)化到只有兩個(gè)離散動(dòng)作,即向左或者向右用力。

如果桿子過(guò)于傾斜,或者cart移出一個(gè)范圍,那么游戲結(jié)束。

具體的建模和實(shí)現(xiàn)過(guò)程可以參考我翻譯的官方文檔。

這里我只講下主要思路。

一開始,我們什么也不知道,也就是DQN網(wǎng)絡(luò)中的超參數(shù)是完全隨機(jī)的。實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),我們需要實(shí)踐,因此我們將根據(jù)當(dāng)前的狀態(tài)選擇下一步的action,action的選擇方式為:

① 利用DQN網(wǎng)絡(luò)選擇一個(gè)action(當(dāng)然此時(shí)的DQN網(wǎng)絡(luò)沒啥子用,因?yàn)樗械某瑓?shù)都是隨機(jī)生成的);

② 隨機(jī)選擇一個(gè)action。

為什么要有隨機(jī)選擇呢?簡(jiǎn)單而言就是為了探索新世界,如果我們一味地跟著模型走,而沒有創(chuàng)新,顯然我們永遠(yuǎn)也不可能進(jìn)步。

選擇了action之后,我們就可以得到environment反饋的reward。同時(shí)我們也進(jìn)入了新的state。

如果新的狀態(tài)并沒有使游戲over,那么我們就繼續(xù)。

如果游戲over了,那么我們就重新開始。

在這個(gè)過(guò)程中,我們DQN網(wǎng)絡(luò)是一直在更新的,更新的目標(biāo)當(dāng)然是要使得在不同的state下采取的action獲得最佳的reward。

這樣,除了第一次DQN是在瞎選外,之后的選擇還是有一定的經(jīng)驗(yàn)根據(jù)的。

隨著一次又一次的行動(dòng),我們的模型最終會(huì)變得越來(lái)越優(yōu)秀,畢竟失敗是成功之母嘛,吸取經(jīng)驗(yàn)教訓(xùn)還是很重要的吧~~~

That's ALL。


使用演示

一般的CartPole(即完全隨機(jī)行動(dòng)):



我們可以發(fā)現(xiàn)它毫無(wú)章法,很快就Over了。

DQN玩CartPole(參照官網(wǎng)寫的):

剛開始訓(xùn)練時(shí):


訓(xùn)練一段時(shí)間后:


這是我根據(jù)官網(wǎng)教程寫的源碼,做了比較詳細(xì)的備注~~~

我們可以看到隨著訓(xùn)練次數(shù)的增加,其存活下來(lái)的時(shí)間也呈上升趨勢(shì)。

另外:

源代碼中也提供了一份來(lái)自某YouTube主的源碼,他精簡(jiǎn)了官網(wǎng)的源代碼,供有需要者參考。

更多

T_T文章部分內(nèi)容來(lái)源自我整理的DQN入門資料(資料基本都來(lái)自于國(guó)外相關(guān)學(xué)科的大佬講座和一些tutorials)。

就這樣吧,如果有什么不對(duì)的地方也可以給我留言,我會(huì)更正的~~~

0 人點(diǎn)贊