App下載

Python玩CartPole(DQN)

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

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

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

導語

利用Python搭建簡單的深度強化學習網(wǎng)絡(luò)(DQN)玩CartPole這個小游戲。。。

這是來自PyTorch官方教程的一個簡單實例。

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

直接進入正題吧~~~

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


相關(guān)文件

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

密碼: xf7x

參考文獻

官方英文教程鏈接:

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

另外:

對英文文獻閱讀有困難的同學也不必擔心,我已經(jīng)把這個教程翻譯為中文放到了相關(guān)文件中。

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

整理匯總”中也有翻譯自官方文檔的PyTorch60分鐘快速入門教程,以及我自己結(jié)合一些講座和tutorials整理的強化學習基礎(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)模塊即可。

補充說明:

PyTorch暫時不支持直接pip安裝。

有兩個選擇:

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

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

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


原理介紹

(1)增強學習

為了便于大家更好地理解,我決定從增強學習開始講起,當然只講其主要思想,不作深入討論。

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

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

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

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

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

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

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

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

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

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

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

(2)Q-Learning

由于增強學習的樣本是一個時間序列,因此將增強學習的問題模型化,就引入了馬爾科夫決策過程。

簡單的說,就是我們可以假設(shè):

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

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

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

這部分我決定一帶而過而不是放上一堆公式來嚇人。

實際上,求解估值函數(shù)只需要從定義出發(fā)進行簡單的推導即可。最后可以證明估值函數(shù)是可以通過迭代來進行計算的。

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

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

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

(3)DQN

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

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

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

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

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

這里我只講下主要思路。

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

① 利用DQN網(wǎng)絡(luò)選擇一個action(當然此時的DQN網(wǎng)絡(luò)沒啥子用,因為它所有的超參數(shù)都是隨機生成的);

② 隨機選擇一個action。

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

選擇了action之后,我們就可以得到environment反饋的reward。同時我們也進入了新的state。

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

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

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

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

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

That's ALL。


使用演示

一般的CartPole(即完全隨機行動):



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

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

剛開始訓練時:


訓練一段時間后:


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

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

另外:

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

更多

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

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

0 人點贊