強(qiáng)化學(xué)習(xí)快餐教程(1) - gym環(huán)境搭建

強(qiáng)化學(xué)習(xí)快餐教程(1) - gym環(huán)境搭建

欲練強(qiáng)化學(xué)習(xí)神功,首先得找一個(gè)可以操練的場(chǎng)地。
兩大巨頭OpenAI和Google DeepMind都不約而同的以游戲做為平臺(tái),比如OpenAI的長(zhǎng)處是DOTA2,而DeepMind是AlphaGo下圍棋悬钳。

下面我們就從OpenAI為我們提供的gym為入口,開(kāi)始強(qiáng)化學(xué)習(xí)之旅偶翅。

OpenAI gym平臺(tái)安裝

安裝方法很簡(jiǎn)單默勾,gym是python的一個(gè)包,通過(guò)pip安裝即可聚谁。
例:

pip3 install gym --user

源代碼的下載地址在:https://github.com/openai/gym

gym平臺(tái)的目的就是提供一個(gè)供強(qiáng)化學(xué)習(xí)進(jìn)行比較和交流的標(biāo)準(zhǔn)化平臺(tái)母剥。

第一個(gè)gym游戲:cart pole

cart pole是一個(gè)最簡(jiǎn)單的小游戲模型,它是一個(gè)一維的小車(chē)上豎起一根棍子形导,然后通過(guò)調(diào)整左右來(lái)保證棍子不倒环疼。

我們先來(lái)一個(gè)隨機(jī)輸入的例子,大家先讓這個(gè)小游戲跑起來(lái):

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    env.render()
    env.step(env.action_space.sample()) # take a random action
env.close()

通過(guò)運(yùn)行可以看到朵耕,別說(shuō)棍子不倒了炫隶,繞著圈帶著小車(chē)不知道飛到哪里去了。

gym主要為我們提供了兩種元素:環(huán)境和操作阎曹。
我們首先通過(guò)gym.make來(lái)生成cartpole的運(yùn)行環(huán)境伪阶,然后reset給小車(chē)和棍子一個(gè)初始化的值。
最后处嫌,通過(guò)env.step將操作傳給環(huán)境去控制小車(chē)栅贴。

操作

cartpole的操作非常簡(jiǎn)單,只有兩種命令锰霜,用0和1表示筹误。0是向左推小車(chē)桐早,1是向右推小車(chē)癣缅。小車(chē)是處在一個(gè)光滑軌道上的,根據(jù)牛頓第一定律哄酝,在無(wú)外力時(shí)處于靜止或勻速直線運(yùn)動(dòng)的狀態(tài)友存。

剛才我們調(diào)用env.action_space.sample(),就是在0和1之間隨機(jī)生成兩種狀態(tài)之一做為輸入陶衅。

除了剛才的隨機(jī)策略外屡立,我們也可以采取交替的策略:

import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
    i = 0
    env.render()
    env.step( (i+1) % 2) 
env.close()

獲取環(huán)境信息

但是,有了操作之后是個(gè)開(kāi)環(huán)的系統(tǒng)搀军,我們需要通過(guò)從環(huán)境中讀取信息來(lái)更好地決策膨俐。

其實(shí)勇皇,不管是reset還是step,環(huán)境都是會(huì)返回一系列值給我們的焚刺。

reset會(huì)返回一個(gè)狀態(tài)信息給我們敛摘。而step會(huì)返回一個(gè)四元組,分別是狀態(tài)信息乳愉,獎(jiǎng)勵(lì)信息兄淫,是否已經(jīng)結(jié)束和附加信息。

我們進(jìn)行一輪迭代蔓姚,先判斷下是否已經(jīng)失敗捕虽,如果已經(jīng)倒了就結(jié)束游戲,然后統(tǒng)計(jì)一下我們活了幾輪:

import gym
env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step( (i+1) % 2)
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

下面我們?cè)龠M(jìn)一步坡脐,去讀取一下?tīng)顟B(tài)信息泄私。針對(duì)cartpole這個(gè)問(wèn)題,狀態(tài)信息還是一個(gè)4元組备闲,分別是:

  • 小車(chē)位置
  • 小車(chē)速度
  • 棍的傾斜角度
  • 棍的角速度

在本游戲中挖滤,如果角度大于12度,或者小車(chē)位置超出了2.4浅役,就意味著失敗了斩松,直接結(jié)束。

閉環(huán)控制

知道了反饋信息之后觉既,我們就可以想辦法進(jìn)行閉環(huán)控制了惧盹。
比如我們只取位置參數(shù),如果偏左了就向右推瞪讼,反之亦然:

def action(status): 
    pos, v, ang, va = status
    print(status)
    if pos <= 0: 
        return 1
    else: 
        return 0 

完整代碼如下:

import gym

def action(status): 
    pos, v, ang, va = status
    print(status)
    if pos <= 0: 
        return 1
    else: 
        return 0 

env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step(action(status))
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

下面是我運(yùn)行一次的結(jié)果:

[-0.01635101  0.00400916 -0.02452805 -0.01815461]
[-0.01627082  0.19947413 -0.02489114 -0.31847439]
[-0.01228134  0.39494158 -0.03126063 -0.61890199]
[-0.00438251  0.59048591 -0.04363867 -0.9212643 ]
[ 0.00742721  0.78616953 -0.06206395 -1.22733599]
[ 0.0231506   0.59189892 -0.08661067 -0.95472622]
[ 0.03498858  0.3980421  -0.1057052  -0.69046268]
[ 0.04294942  0.2045334  -0.11951445 -0.43283924]
[ 0.04704009  0.0112884  -0.12817124 -0.18009313]
[ 0.04726586 -0.18178868 -0.1317731   0.0695676 ]
[ 0.04363008 -0.37479942 -0.13038175  0.31794448]
[ 0.0361341  -0.56784668 -0.12402286  0.56683387]
[ 0.02477716 -0.76103061 -0.11268618  0.81801468]
[ 0.00955655 -0.95444458 -0.09632589  1.07323592]
[-0.00953234 -1.14817057 -0.07486117  1.33420176]
[-0.03249575 -0.9521891  -0.04817713  1.01906429]
[-0.05153954 -0.7564593  -0.02779585  0.71165164]
[-0.06666872 -0.5609637  -0.01356281  0.41035059]
[-0.077888   -0.36565212 -0.0053558   0.11342282]
[-0.08520104 -0.17045384 -0.00308735 -0.180945  ]
[-0.08861011  0.02471216 -0.00670625 -0.47460027]
[-0.08811587  0.21992817 -0.01619825 -0.76938932]
[-0.08371731  0.41526928 -0.03158604 -1.06712463]
[-0.07541192  0.61079456 -0.05292853 -1.36955102]
[-0.06319603  0.80653727 -0.08031955 -1.67830763]
[-0.04706529  1.0024934  -0.1138857  -1.99488277]
[-0.02701542  1.19860803 -0.15378336 -2.32055915]
[-0.00304326  1.39475935 -0.20019454 -2.65634816]
dead in 27 steps

角策略

上一種策略我們是根據(jù)車(chē)的位置來(lái)進(jìn)行控制钧椰。我們還可以考慮根據(jù)角度來(lái)進(jìn)行控制:

import gym

def action_a(status): 
    pos, v, ang, va = status
    print(status)
    if ang > 0: 
        return 1
    else: 
        return 0

env = gym.make('CartPole-v0')
status = env.reset()
for step in range(1000):
    i = 0
    env.render()
    status, reward, done, info = env.step(action_a(status))
    if done: 
        print('dead in %d steps' % step)
        break
env.close()

從一些次嘗試來(lái)看,角策略比上一個(gè)位置策略要更優(yōu)一些:

[ 0.00780229 -0.02463916 -0.01033269 -0.03445555]
[ 0.00730951 -0.21961142 -0.0110218   0.25494948]
[ 0.00291728 -0.41457429 -0.00592281  0.54413566]
[-0.00537421 -0.60961251  0.0049599   0.83494657]
[-0.01756646 -0.41455866  0.02165883  0.54382761]
[-0.02585763 -0.21974767  0.03253538  0.25804686]
[-0.03025258 -0.02510495  0.03769632 -0.02419899]
[-0.03075468  0.16945669  0.03721234 -0.30475403]
[-0.02736555  0.36402912  0.03111726 -0.58547272]
[-0.02008497  0.55870171  0.01940781 -0.86819324]
[-0.00891093  0.75355429  0.00204394 -1.15471154]
[ 0.00616015  0.94864953 -0.02105029 -1.44675287]
[ 0.02513314  0.75379272 -0.04998535 -1.16072073]
[ 0.040209    0.55935628 -0.07319976 -0.88411992]
[ 0.05139612  0.36530055 -0.09088216 -0.61531734]
[ 0.05870214  0.17155806 -0.10318851 -0.35258554]
[ 0.0621333  -0.02195676 -0.11024022 -0.09414094]
[ 0.06169416 -0.21534017 -0.11212304  0.16182831]
[ 0.05738736 -0.40869329 -0.10888647  0.41714169]
[ 0.04921349 -0.60211728 -0.10054364  0.67361   ]
[ 0.03717115 -0.7957087  -0.08707144  0.93302056]
[ 0.02125697 -0.98955482 -0.06841103  1.19712154]
[ 1.46587604e-03 -1.18372790e+00 -4.44685947e-02  1.46760271e+00]
[-0.02220868 -1.37827822 -0.01511654  1.74607025]
[-0.04977425 -1.57322512  0.01980486  2.03401309]
[-0.08123875 -1.37831278  0.06048513  1.74752417]
[-0.108805   -1.18392804  0.09543561  1.47425204]
[-0.13248357 -0.99009321  0.12492065  1.21283837]
[-0.15228543 -0.796785    0.14917742  0.96176679]
[-0.16822113 -0.60394842  0.16841275  0.71942016]
[-0.1803001  -0.41150733  0.18280116  0.48412211]
[-0.18853024 -0.21937201  0.1924836   0.25416579]
[-0.19291768 -0.02744473  0.19756691  0.02783298]
[-0.19346658  0.16437637  0.19812357 -0.19659389]
[-0.19017905  0.35619437  0.1941917  -0.42082427]
[-0.18305516  0.54811122  0.18577521 -0.64655444]
[-0.17209294  0.74022551  0.17284412 -0.87546311]
[-0.15728843  0.93262987  0.15533486 -1.10920578]
[-0.13863583  1.12540784  0.13315074 -1.34940608]
[-0.11612768  1.31862936  0.10616262 -1.59764218]
[-0.08975509  1.51234492  0.07420978 -1.85542638]
[-0.05950819  1.70657739  0.03710125 -2.12417555]
[-0.02537664  1.90131142 -0.00538226 -2.40517032]
[ 0.01264959  1.7062367  -0.05348567 -2.11414485]
[ 0.04677432  1.51168791 -0.09576856 -1.83845627]
[ 0.07700808  1.31774548 -0.13253769 -1.57698862]
[ 0.10336299  1.12442853 -0.16407746 -1.32840846]
[ 0.12585156  0.9317127  -0.19064563 -1.09123975]
dead in 47 steps
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末符欠,一起剝皮案震驚了整個(gè)濱河市嫡霞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌希柿,老刑警劉巖诊沪,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異曾撤,居然都是意外死亡端姚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)挤悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渐裸,“玉大人,你說(shuō)我怎么就攤上這事』杈椋” “怎么了尚氛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)洞渤。 經(jīng)常有香客問(wèn)我怠褐,道長(zhǎng),這世上最難降的妖魔是什么您宪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任奈懒,我火速辦了婚禮,結(jié)果婚禮上宪巨,老公的妹妹穿的比我還像新娘磷杏。我一直安慰自己,他們只是感情好捏卓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布极祸。 她就那樣靜靜地躺著,像睡著了一般怠晴。 火紅的嫁衣襯著肌膚如雪遥金。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天蒜田,我揣著相機(jī)與錄音稿械,去河邊找鬼。 笑死冲粤,一個(gè)胖子當(dāng)著我的面吹牛美莫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梯捕,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厢呵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了傀顾?” 一聲冷哼從身側(cè)響起襟铭,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎短曾,沒(méi)想到半個(gè)月后寒砖,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡错英,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年入撒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隆豹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭岩。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出判哥,到底是詐尸還是另有隱情献雅,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布塌计,位于F島的核電站挺身,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锌仅。R本人自食惡果不足惜章钾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望热芹。 院中可真熱鬧贱傀,春花似錦、人聲如沸伊脓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)报腔。三九已至株搔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纯蛾,已是汗流浹背纤房。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翻诉,地道東北人帆卓。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像米丘,于是被迫代替她去往敵國(guó)和親剑令。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容