幾行代碼實(shí)現(xiàn)強(qiáng)化學(xué)習(xí)
在過去的一年中,強(qiáng)化學(xué)習(xí)已經(jīng)取得了重大進(jìn)步,最新技術(shù)每?jī)蓚€(gè)月發(fā)布一次。 我們已經(jīng)看到AlphaGo擊敗了世界冠軍圍棋選手Ke Jie,Multi-Agents玩了捉迷藏,甚至AlphaStar在星際爭(zhēng)霸中也擁有自己的實(shí)力。
實(shí)施這些算法可能會(huì)非常具有挑戰(zhàn)性,因?yàn)樗枰獙?duì)深度學(xué)習(xí)和強(qiáng)化學(xué)習(xí)都有很好的理解。 本文的目的是讓您快速使用一些簡(jiǎn)潔的程序包,以便您可以輕松地開始學(xué)習(xí)強(qiáng)化學(xué)習(xí)。
有關(guān)如何實(shí)施SOTA深度強(qiáng)化學(xué)習(xí)算法的深入教程,請(qǐng)參閱此內(nèi)容。 強(qiáng)烈推薦您仔細(xì)閱讀!
一、環(huán)境
在開始實(shí)現(xiàn)這些算法之前,我們首先需要?jiǎng)?chuàng)建一個(gè)工作環(huán)境,即游戲。 對(duì)于算法而言,重要的是要了解什么是動(dòng)作和觀察空間。 為此,我們將介紹幾個(gè)可用于選擇有趣環(huán)境的軟件包。
1. Gym
Gym是用于開發(fā)和比較強(qiáng)化學(xué)習(xí)算法的工具包。 它通常用于實(shí)驗(yàn)和研究目的,因?yàn)樗峁┝艘粋€(gè)易于使用的界面來處理環(huán)境。
只需使用以下命令安裝軟件包:
- pip install gym
之后,您可以使用以下代碼創(chuàng)建環(huán)境:
- import gym
- env = gym.make(‘CartPole-v0’)
在 CartPole 環(huán)境中,您的任務(wù)是防止頭連接到推車的電線桿掉落。
env變量包含有關(guān)環(huán)境(游戲)的信息。 要了解CartPole的操作空間是什么,只需運(yùn)行env.action_space即可產(chǎn)生Discrete(2)。 這意味著可能有兩個(gè)離散的動(dòng)作。 要查看觀察空間,請(qǐng)運(yùn)行env.observation_space,它產(chǎn)生Box(4)。 此框代表 n(4)個(gè)封閉間隔的笛卡爾積。
要渲染游戲,請(qǐng)運(yùn)行以下代碼:
- import gym
- env = gym.make('CartPole-v0')
- obs = env.reset()
- while True:
- action = env.action_space.sample()
- obs, rewards, done, info = env.step(action)
- env.render()
- if done:
- break
我們可以看到,如果我們選擇采取隨機(jī)行動(dòng),則小車車一直在失敗。 最終,目標(biāo)將是運(yùn)行強(qiáng)化學(xué)習(xí)算法,該算法將學(xué)習(xí)如何解決此問題。
有關(guān)Gym中環(huán)境的完整列表,請(qǐng)參閱此。
注意:如果您在運(yùn)行atari(阿塔利)游戲時(shí)遇到問題,請(qǐng)參見內(nèi)容:https://github.com/openai/gym/issues/1726。
2. Retro
創(chuàng)建有趣的環(huán)境的另一個(gè)選項(xiàng)是使用Retro。 該軟件包由OpenAI開發(fā),可讓您使用ROMS來模擬Airstriker-Genesis之類的游戲。
只需使用以下命令安裝軟件包:
- pip install gym-retro
然后,我們可以使用以下方法創(chuàng)建和查看環(huán)境:
- import retro
- env = retro.make(game='Airstriker-Genesis')
同樣,要渲染游戲,請(qǐng)運(yùn)行以下代碼:
- import retro
- env = retro.make(game='Airstriker-Genesis')
- obs = env.reset()
- while True:
- action = env.action_space.sample()
- obs, rewards, done, info = env.step(action)
- env.render()
- if done:
- break

要安裝ROMS,您需要找到相應(yīng)的.sha文件,然后運(yùn)行:
- python3 -m retro.import /path/to/your/ROMs/directory/
注意:有關(guān)易于使用的環(huán)境的完整列表,請(qǐng)運(yùn)行:
- retro.data.list_games()
3. Procgen
強(qiáng)化學(xué)習(xí)的一個(gè)典型問題是,生成的算法通??梢栽谔囟ōh(huán)境下很好地工作,但無法學(xué)習(xí)任何可通用的技能。 例如,如果我們要改變游戲的外觀或敵人的反應(yīng)該怎么辦?
為了解決這個(gè)問題,OpenAI開發(fā)了一個(gè)名為Procgen的軟件包,該軟件包允許創(chuàng)建過程生成的環(huán)境。 我們可以使用此軟件包來衡量強(qiáng)化學(xué)習(xí)代理學(xué)習(xí)通用技能的速度。
渲染游戲非常簡(jiǎn)單:
- import gym
- param = {"num_levels": 1, "distribution_mode": "hard"}
- env = gym.make("procgen:procgen-leaper-v0", **param)
- obs = env.reset()
- while True:
- action = env.action_space.sample()
- obs, rewards, done, info = env.step(action)
- env.render()
- if done:
- break
這將生成可在其上訓(xùn)練算法的單個(gè)級(jí)別。 有幾個(gè)選項(xiàng)可用于以程序方式生成同一環(huán)境的許多不同版本:
- num_levels-可以生成的唯一級(jí)別數(shù)
- distribution_mode-使用哪種級(jí)別的變量,選項(xiàng)為"easy簡(jiǎn)單","hard難","extreme極致","memory記憶","exploration探索"。 所有游戲都支持“易”和“難”,而其他選項(xiàng)則取決于游戲。
二、強(qiáng)化學(xué)習(xí)
現(xiàn)在,終于是時(shí)候進(jìn)行實(shí)際的強(qiáng)化學(xué)習(xí)了。 盡管有許多可用的軟件包可用于訓(xùn)練算法,但由于它們的可靠實(shí)現(xiàn),我將主要研究“穩(wěn)定Baselines ”。
請(qǐng)注意,我不會(huì)在此帖子中解釋RL算法的實(shí)際工作方式,因?yàn)檫@本身就需要一個(gè)全新的帖子。 有關(guān)最新算法(例如PPO,SAC和TD3)的概述,請(qǐng)參見內(nèi)容:
https://github.com/dennybritz/reinforcement-learning。
1. 穩(wěn)定的基線(穩(wěn)定Baselines)
穩(wěn)定基準(zhǔn)(SB)是基于OpenAI基準(zhǔn)的,旨在使研究社區(qū)和行業(yè)更容易復(fù)制,改進(jìn)和識(shí)別新想法。 他們?cè)?ldquo;基線”上進(jìn)行了改進(jìn),使之成為一個(gè)更穩(wěn)定,更簡(jiǎn)單的工具,使初學(xué)者可以嘗試進(jìn)行“強(qiáng)化學(xué)習(xí)”,而不會(huì)陷入實(shí)施細(xì)節(jié)中。
SB之所以經(jīng)常使用,是因?yàn)樗梢暂p松,快速地應(yīng)用最新的強(qiáng)化學(xué)習(xí)算法。 此外,創(chuàng)建和訓(xùn)練RL模型只需要幾行代碼。
安裝可以簡(jiǎn)單地通過以下方式完成:pip install stable-baselines。 然后,為了創(chuàng)建和學(xué)習(xí)RL模型(例如PPO2),我們運(yùn)行以下代碼行:
- from stable_baselines import PPO2
- from stable_baselines.common.policies import MlpPolicy
- model = PPO2(MlpPolicy, env, verbose=1)
- model.learn(total_timesteps=10_000, log_interval=10)
有些事情可能需要一些解釋:
- total_timesteps:要訓(xùn)練的樣本總數(shù)
- MlpPolicy:實(shí)現(xiàn)actor-critic的Policy對(duì)象。 在這種情況下,將使用2層64層的多層感知器。還有視覺信息策略,例如CnnPolicy甚至CnnLstmPolicy
為了將此模型應(yīng)用于CartPole示例,我們需要將環(huán)境包裝在Dummy中,以使其可供SB使用。 然后,在CartPole環(huán)境中訓(xùn)練PPO2的完整示例如下:
- from stable_baselines.common.policies import MlpPolicy
- from stable_baselines.common.vec_env import DummyVecEnv
- from stable_baselines import PPO2
- import gym
- env = gym.make('CartPole-v0')
- env = DummyVecEnv([lambda: env])
- model = PPO2(MlpPolicy, env, verbose=1)
- model.learn(total_timesteps=50_000, log_interval=10)
- obs = env.reset()
- while True:
- action, _states = model.predict(obs)
- obs, rewards, dones, info = env.step(action)
- env.render()
如上圖所示,PPO2僅用50,000步就設(shè)法找到一種保持極點(diǎn)穩(wěn)定的方法。 這只需要幾行代碼和幾分鐘的處理!
如果要將其應(yīng)用于Procgen或Retro,請(qǐng)確保選擇一個(gè)允許基于卷積的網(wǎng)絡(luò)的策略,因?yàn)橛^察空間很可能是環(huán)境當(dāng)前狀態(tài)的圖像。
最后,CartPole示例非常簡(jiǎn)單,僅需訓(xùn)練50,000步即可。 大多數(shù)其他環(huán)境在顯示出顯著改進(jìn)之前通常需要執(zhí)行幾千萬步。
注意:《穩(wěn)定基準(zhǔn)》的作者警告初學(xué)者在產(chǎn)品中使用該軟件包之前,對(duì)強(qiáng)化學(xué)習(xí)要有很好的了解。 強(qiáng)化學(xué)習(xí)有許多關(guān)鍵組成部分,如果其中任何一個(gè)出現(xiàn)錯(cuò)誤,該算法將失敗,并且可能會(huì)留下很少的解釋。
2. 其他軟件包
還有其他一些常用于應(yīng)用RL算法的軟件包:
- TF-Agents-比穩(wěn)定基線需要更多的編碼,但通常是強(qiáng)化學(xué)習(xí)研究的必備軟件包。
- MinimalRL-在Pytorch中以非常少的代碼實(shí)現(xiàn)的最新RL算法。 它絕對(duì)有助于理解算法。
- DeepRL-Pytorch的另一種實(shí)現(xiàn),但是此版本還具有實(shí)現(xiàn)要使用的其他環(huán)境。
- MlAgents-一個(gè)開放源代碼的Unity插件,使游戲和模擬可用作培訓(xùn)代理的環(huán)境。
三、結(jié)論
強(qiáng)化學(xué)習(xí)可能是一個(gè)棘手的課題,因?yàn)楹茈y調(diào)試代碼中是否以及何時(shí)出現(xiàn)問題。 希望這篇文章可以幫助您開始進(jìn)行強(qiáng)化學(xué)習(xí)。