2018年6月9日土曜日

常用增强学习实验环境 I (MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)




和其它的机器学习方向一样,强化学习(Reinforcement Learning)也有一些经典的实验场景,像Mountain-Car,Cart-Pole等。话说很久以前,因为没有统一的开发测试平台,大家都会自己实现,有用C/C++的,有用Python,还有用Matlab的。所以大家论文中看到的场景虽然相似,但很多时候不完全一样。这样一方面重新造轮子,另一方面还有可能因为实验环境的差别影响结果的比较。于是后面大家渐渐开始建立统一的实验平台,另一方面,由于近年来深度强化学习(Deep Reinforcement Learning)的兴起,各种新的更复杂的实验场景也在不断涌现。于是出现了OpenAI Gym,MuJoCo,rllab, DeepMind Lab, TORCS, PySC2等一系列优秀的平台。你会在大量的强化学习相关论文中看到它们的身影。下面就简单介绍下这些平台在Ubuntu下的搭建过程。关于一些基础环境(如Cuda, Anaconda, TensorFlow)的搭建可参考前面的文章:http://blog.csdn.net/jinzhuojun/article/details/77140806


MuJoCo
MuJoCo(Multi-Joint dynamics with Contact)是一个物理模拟器,可以用于机器人控制优化等研究。官方网站为http://www.mujoco.org/index.html。最新版本为1.50。下载地址为https://www.roboti.us/index.html。如果是Linux系统可以点mjpro150 linux。下载完成后解压到~/.mujoco下。注意要用是需要license的,可以在https://www.roboti.us/license.html上申请试用版30天免费license。先下载网站上提供的getid_linux,加执行权限在本地运行得到机器id连同其它信息填到申请页面,提交后会收到邮件包含key文件mjkey.txt。下载key文件后,放到~/.mujoco目录下。之后可以运行解压目录下bin里的simulate试下是否正常(需要将key文件也拷到simulate同级目录)。运行后将model目录下的模型拖入窗口,会看到类似下面的输出:

OpenAI对MuJoCo引擎做了Python 3的binding-mujoco-py,源码位于https://github.com/openai/mujoco-py。按readme中你可以通过下面命令安装:
[plain] view plain copy
pip3 install -U 'mujoco-py<1.50.2,>=1.50.1'  
如果安装过程中出现下面这种错误:
sh: 2: Syntax error: "(" unexpected
       ERROR: Invalid activation key
你可以下载源码安装:
[plain] view plain copy
cd mujoco-py  
pip install -e . --no-cache  
如果在后面有其它项目依赖到更高版本(如1.50.1),可以从官方release页面下载源码包(https://github.com/openai/mujoco-py/releases),然后用上面方法安装即可。然后运行下readme中的例子看是否运行正常。

OpenAI Gym
OpenAI Gym是OpenAI出的研究强化学习算法的toolkit,它里边cover的场景非常多,从经典的Cart-Pole, Mountain-Car到Atar,Go,MuJoCo都有。官方网站为https://gym.openai.com/,源码位于https://github.com/openai/gym,它的readme提供了安装和运行示例,按其中的安装方法:
最小安装:
[sql] view plain copy
cd gym  
pip install -e .  
完全安装:
[plain] view plain copy
apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig Pillow  libglfw3-dev  
pip install -e '.[all]'  
然后可以跑readme中的例子,如SpaceInvaders, Go, LunarLander, CarPole, MuJoCo等等:
         



通过源码下的examples/scripts/list_envs可以列出所有支持的场景。


如果装了Anaconda,过程中出现下面错误的话:
OSError: /home/jzj/anaconda2/envs/py35/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /home/jzj/anaconda2/envs/py35/lib/python3.5/site-packages/atari_py/ale_interface/build/libale_c.so)
可以通过在Anaconda环境中安装libgcc解决:
[plain] view plain copy
conda install libgcc  

如果在运行依赖Box2d引擎的sample时出现下面错误:
AttributeError: module 'Box2D._Box2D' has no attribute 'RAND_LIMIT'
可以先uninstall已有版本(如有),然后安装pybox2d:
[plain] view plain copy
pip uninstall Box2D-kengz  
cd pybox2d  
python setup.py clean  
python setup.py install  

Gym中也可以通过mujoco-py集成MuJoCo。如果出现下面错误,说明mujoco-py版本不对。目前Gym中支持MuJoCo 1.31和mujoco-py 0.5。按前面说明装上相应版本后即可。
DependencyNotInstalled: No module named 'mujoco_py.mjlib'. (HINT: you need to install mujoco_py, and also perform the setup instructions here: https://github.com/openai/mujoco-py/.)

rllab
和OpenAI Gym类似,rllab也是一个研究强化学习算法的框架。官方网站为https://github.com/openai/rllab。官方支持python 3.5+,基于Theano。与OpenAI Gym的区别在于OpenAI Gym支持更广泛的环境,且提供在线的scoreboard可以用于共享训练结果。rllab自己也提供一个基于pygame的可视环境,同时它也可兼容OpenAI Gym。除此之外,它提供了一些强化学习算法的实现,这些参考实现和一些组件可以使得强化学习算法的开发更快上手。安装步骤可按照官方网站:https://rllab.readthedocs.io/en/latest/user/installation.html
[plain] view plain copy
export PYTHONPATH=path_to_rllab:$PYTHONPATH  
./scripts/setup_linux.sh  
如果要想要在rllab中用MuJoCo的话再用下面脚本安装。
[plain] view plain copy
./scripts/setup_mujoco.sh  
rllab使用的是mujoco 1.31版本,这个脚本里会让指定相应的mujoco包和license key文件。以上安装脚本中会创建Anaconda环境,名为rllab3。通过下面命令进入环境:
[plain] view plain copy
source activate rllab3  
然后就可以运行例子了。比如用TRPO算法训练Cart-Pole场景的话,运行:
[plain] view plain copy
python examples/trpo_gym_cartpole.py  
这些sample中默认是无UI的,如果要有UI,可以搜索其中的plot=True,将之反注释即可。




如果你很和我一样穷,用的是贫民版GPU,加速时分不出memory的话:
RuntimeError: Cuda error: kernel_reduce_ccontig_node_m28488bfe450723ef20f18edd8e611eb0_0: out of memory. (grid: 1 x 1; block: 256 x 1 x 1)
可以退一步让Theano用纯CPU跑:
[plain] view plain copy
export THEANO_FLAGS=device=cpu  

DeepMind Lab
DeepMind Lab(原Labyrinth)是由DeepMind发布的3D迷宫场景强化学习平台。之前是DeepMind内部使用的,后来开源了。官方介绍https://deepmind.com/blog/open-sourcing-deepmind-lab/。论文 https://arxiv.org/pdf/1612.03801.pdf。源码位于https://github.com/deepmind/lab
最好在Python 2.7环境下编译运行。比如用Anaconda创建Python 2.7环境并进入:
[plain] view plain copy
conda create --name py27 python=2.7  
source activate py27  
然后按官方readme中的说明(https://github.com/deepmind/lab/blob/master/docs/build.md)安装。由于编译是基于bazel,所以需要先安装bazel。
[plain] view plain copy
sudo apt-get install lua5.1 liblua5.1-0-dev libffi-dev gettext freeglut3-dev libsdl2-dev libosmesa6-dev python-dev python-numpy realpath  
cd lab  
bazel build :deepmind_lab.so --define headless=glx  
bazel run :python_module_test --define headless=glx  
如果在Anaconda环境中,有可能碰到下面错误:
ImportError: cannot import name multiarray
表面上是缺少numpy,可以先看下numpy有没有装,没有的话可以用conda install numpy安装。如果装了有可能是串到~/.local或者/usr/lib/下的python package了(可以通过python -c "import sys; from pprint import pprint as p; p(sys.path)"检查)。简单点的方法就是将除了Anaconda环境下的numpy删除。
[plain] view plain copy
sudo apt-get remove python-numpy  
sudo ~/.local/bin/pip2.7 uninstall numpy  

接下来,按readme说明,通过下面命令可以分别跑agent玩家和人类玩家的迷宫场景:
[plain] view plain copy
bazel run :random_agent --define headless=false --  --length=10000 --width=640 --height=480  
bazel run :game -- --level_script tests/demo_map  



然后通过python api(https://github.com/deepmind/lab/blob/master/docs/python_api.md)就可以让强化学习算法利用该环境进行训练了。



TORCS
TORCS(The Open Racing Car Simulator)是一个跨平台的赛车游戏模拟器,也可作为强化学习的研究平台。官方网站:http://torcs.sourceforge.net/。但我们不需直接从官网下。gym_torcs是一个TORCS的强化学习环境,提供类似前面OpenAI Gym的接口,网站为https://github.com/ugo-nama-kun/gym_torcs

假设已安装了上面提到的OpenAI Gym。还需要安装依赖:
[plain] view plain copy
sudo apt-get install xautomation  
官方声明依赖Python 3.5,那就进入Python 3的环境(假设已创建Python 3.5的Anaconda环境py35):
[plain] view plain copy
source activate py35  
然后用conda install numpy安装numpy。
下载源码:
[plain] view plain copy
然后进入其vtorcs-RL-color子目录,按其中readme编译安装定制版torcs。安装完了运行torcs命令就能看到界面了。注意按readme说明需要进行一些设置,如赛道以及分辨率,因为实现中只支持64x64分辨率。运行示例代码可以跑一个随机选取动作的agent。
[plain] view plain copy
python example_experiment.py   


ps:截图还是用了默认分辨率,因为64x64太小看不清。

Readme中的Simple How-To示例了如何在Python中与该环境交互,然后就可以开发测试强化学习算法了。网上有个实现DDPG算法的例子可以参考:https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html


PySC2(StarCraft II)
DeepMind的AlphaGo把围棋搞定之后,业界开始把目光投向即时策略游戏,如StarCraft II(星际争霸II)。最近DeepMind和Blizzard合作出了个StarCraft II的研究平台,称为PySC2。介绍网站:https://deepmind.com/blog/deepmind-and-blizzard-open-starcraft-ii-ai-research-environment/。论文:https://deepmind.com/documents/110/sc2le.pdf。PySC2是基于Blizzard的StarCraft II Machine Learning API(https://github.com/Blizzard/s2client-proto)的Python下强化学习环境。源码位于:https://github.com/deepmind/pysc2

按照readme最简单的安装方法就是:
[plain] view plain copy
pip install pysc2  
然后需要根据https://github.com/Blizzard/s2client-proto中readme说明安装StarCraft II的环境。主要那几个包都比较大,下载要些时间,下载完成后按readme中解压到指定path下即可。然后就可以测试下了。按readme用以下命令可以分别起agent玩家和人类玩家的环境:
[plain] view plain copy
python -m pysc2.bin.agent --map Simple64  
python -m pysc2.bin.play --map Simple64  




OpenAI Baselines 
严格来说它本身不是一个开发环境。它是OpenAI出的一些深度强化学习算法(DQN, PPO, TRPO, DDPG)的实现,基于TensorFlow和OpenAI Gym,最新版需要Python 3。源码位于:https://github.com/openai/baselines
按readme中使用下面命令安装:
[plain] view plain copy
pip install baselines  
或者用源码中的setup.py安装:
[plain] view plain copy
cd baselines  
python setup.py install  
除了列出来的依赖,还可能依赖下面的库,使用conda或pip安装:
[plain] view plain copy
conda install Pillow atari-py  

另外如果用GPU加速但不幸碰到memory分不出的情况(CUDA_OUT_OF_MEMORY),可以强制TensorFlow使用CPU:
[plain] view plain copy
export CUDA_VISIBLE_DEVICES=""  

2018年6月8日金曜日

これから強化学習を勉強する人のための「強化学習アルゴリズム・マップ」と、実装例まとめ

これから強化学習を勉強したい人に向けて、「どんなアルゴリズムがあるのか」、「どの順番で勉強すれば良いのか」を示した強化学習アルゴリズムの「学習マップ」を作成しました。

さらに、各手法を実際にどう実装すれば良いのかを、簡単な例題を対象に実装しました。
本記事では、ひとつずつ解説します。

オレンジ枠の手法は、実装例を紹介します。

今回マップを作るにあたっては、以下の文献を参考にしました。
速習 強化学習: 基礎理論とアルゴリズム(書籍)
Deep Learning for Video Game Playing

強化学習とは

強化学習は、画像識別のような教師あり学習や、クラスタリングのような教師なし学習とは少し異なる、機械学習の分野です。

最終的に達成したいゴールはあるけれど、そこにいたる詳細な制御手法は分からないときに、ゴールできたかどうかをベースに、制御手法を構築する学習手法です。

例えばぶつからない車の自動運転技術の開発では、「センサーで車間距離が○ mになったら、ブレーキをさせる」というのは、ルールベースの制御です。

一方で、実際に車を何度もシミュレーションや実車で走らせて、ぶつかった場合は改善し、ぶつからなかった場合はその制御手法を採用し、何度も試行錯誤しながら、ぶつからないというゴールを達成させる学習手法が、強化学習です。

強化学習は主に「何かの制御」や「対戦型ゲームのアルゴリズム」に使用されることが多い手法です。

「何かの制御」であれば、先ほどのぶつからない自動運転技術の開発や、サーバールームの空調代金を安く抑える空調の制御手法の開発、共有サーバーの資源の最適配分、ロボットの運動制御などがあります。
また最近では、文章生成などにも使われたりしています。

基本的に作りたいもののゴールは設定できるけど、そのゴールを達成するための手法・ルール・制御をうまく設計できない場合に、強化学習が使われています。

「対戦型ゲームのアルゴリズム」では、アルファ碁やアルファ碁ゼロに強化学習が使われています。

本記事では「対戦型ゲーム」は取り扱っておらず、どちらかというと、「何かの制御」に使われる強化学習アルゴリズムを紹介します。

強化学習の例題

強化学習の例題としては、単純な迷路課題や3目並べなども使われますが、OpenAICartPoleが最もおすすめです。

CartPoleは以下のような、倒立振子の制御問題です。

CartPoleをおすすめする理由は、動画で動きが見れて楽しいのと、適度な複雑さがあるからです。
一方で使用するのは非常に簡単です。

このCartPoleは、小学生が掃除の時間にほうきを手のひらで立てて遊ぶのと同じ事をしています。

各時刻step=tで選択できる行動a(t)は、土台の車を(右に押す, 左に押す)の2択です。
そして、状態s(t)は土台の車の位置x(t)、速度v(t)と、棒の角度θ(t)と角速度ω(t)4変数です。

やりたいことは、状態s(t)に応じて適切な行動a(t)を実行し、棒を立て続けることです。

本記事ではこのCartPoleを対象に各アルゴリズムの実装を行いました。

それでは次に、各アルゴリズムを紹介します。

Deep Learningが生まれる前までの強化学習

強化学習において、Deep Learningが提案される前までのアルゴリズムには、代表的な手法が3つあります。
Q-Learning
SARSA、モンテカルロ法です。

Q-Learning

Q-LearningQ学習)は、最も代表的な手法になります。
まずはこの手法から勉強するのが良いです。

Q-LearningではQ関数と呼ばれる行動価値関数を学習し、制御を実現します。
行動価値関数Q(a|s)とは、状態s(t)のときに行動aを行ったときに、その先どれくらいの報酬がもらえそうかを出力する関数です。

このQ関数に行動右に押すと、左に押すを入力したときの出力を比べ、報酬が多いほうを選べば、自然とCartPoleが立ち続けることになります。

以下の記事で、openAICartPoleの使用方法からQ-Learningのアルゴリズム詳細と実装例までを紹介しているので、まずはこちちらをご覧ください。

CartPoleQ学習(Q-learning)を実装・解説【Phythonで強化学習:第1回】

SARSA、モンテカルロ法

SARSAQ-Learningと同様にQ関数を学習するのですが、少し学習の仕方が異なる手法です。

Q-LearningSARSA1stepごとにQ関数を学習していく手法です。
それらとは異なり、CartPoleが倒れるまで行動し、その行動履歴からQ関数を学習する手法がモンテカルロ法です。

今回のマップではモンテカルロ法から進展しているアルゴリズムはありませんが、重要なアルゴリズムです。

SARSAとモンテカルロ法のアルゴリズム詳細と、CartPoleで実装した例を、次の記事にまとめましたので、詳細はこちらをご覧ください。

シンプルな実装例で学ぶSARSA法およびモンテカルロ法【CartPoleで棒立て:1ファイルで完結】

Deep Learningが生まれる前までの強化学習手法としては、この3つが実装できれば良いのではと思います。

Deep Learningが生まれてからの強化学習

Deep Learningの出現にともない、強化学習にもDeep Learningが使われるようになり、ブレイクスルーが生まれました。

DQNDDQN

これまでQ関数を表すのに、実際には表を使用していました。
表のサイズが、「状態sを離散化した数」×「行動の種類」となります。

ですが、表ではサイズに限りがあるため、ニューラルネットワークを使用したかったのですが、うまくいっていませんでした。

そこでQ関数の表現にDeep Learningを使用したのがDQN(Deep Q-Network もしくは Deep Q-Learning Network)です。

DQNの出現により、より複雑なゲームや制御問題の解決が可能になり、強化学習が注目を集めました。
なおDeep Learning(深層学習)を用いた強化学習は、深層強化学習とも呼ばれます。

またDQNの学習で、2つのQ-networkを使用する手法をDouble DQNDDQN)と呼びます。

DQNDDQNのアルゴリズム詳細とCartPoleを実装した例を、以下にまとめましたのでご覧ください。

CartPoleDQNdeep Q-learningDDQNを実装・解説【Phythonで強化学習:第2回】

prioritized experience replayDueling DQN

DDQNをより良くするために、prioritized experience replayDueling DQNが提案されました。

prioritized experience replayは、Q学習がまだ進んでいない状態s(t)の経験に対して、優先的に学習を実行させる手法です。

こちらでアルゴリズム詳細と実装例を紹介しています。

実装例から学ぶ優先順位付き経験再生 prioritized experience replay DQN

Dueling DQNは、Q関数を状態価値関数V(s)Advantage関数A(a|s)に分割して学習するネットワークを使用する手法です。

Q(a|s) = V(s) + A(a|s)

となります。

ネットワークで表すと以下の図の通りです。

こうすることで、どんな行動のときもV(s)を学習するため、Q関数の学習が早く良くなります。

こちらでアルゴリズム詳細と実装例を紹介しています。

実装例から学ぶDueling Network DQN

A3Cの登場

DQNの登場後、さらに深層強化学習の性能を上げることになった重要な手法がA3Cです。

A3C

A3Cとは「Asynchronous Advantage Actor-Critic」の略称です。

A3Cの前に、並列化してDQNを行う手法として、GORILAGeneral Reinforcement Learning Architecture)が提案されていました。

ゴリラ(GORILLA)ではないので、注意してください。

なお"GORILA Python"で画像検索すると、いままで脳で想像したことのない面白い画像があります。
"GORILA Python"で画像検索した結果

話が脱線しました。

A3Cは並列計算に加え、さらにAdvantageと呼ばれる報酬の計算方法を使用しています。

Advantageは報酬の計算を1step後ではなく、数ステップ後まで行動を実施して行う計算手法です。

さらにA3Cには、Actor-Criticと呼ばれるネットワークが使用されています。

これは、Q関数ではなく、方策関数π(s)=[p(), p()]で直接、状態sに応じた行動を出力します。
p(
)は状態sで右に押すほうが良い確率を示します。
この部分をActorと呼びます。

さらに同時に、状態価値V(s)も学習させます。
この部分をCriticと呼びます。

DQNから比べると大きく変わっているので、理解が難しいのですが、実際にゆっくり実装してみると理解が深まります。

A3Cのアルゴリズム詳細とCartPoleを実装した例を、以下にまとめましたのでご覧ください。

実装しながら学ぶA3CCartPoleで棒立て:1ファイルで完結】

TRPOGeneralized Advantage Estimator

その他、強化学習のアルゴリズムとしてはA3Cとほぼ同時期に、TRPOGAEなども提案されています。

TRPO(Trust Region Policy Optimization)は、方策関数π(s)が一度に大きく更新されすぎないように制限をかけて、方策関数π(s)を更新する手法です。

また、GAEGeneralized Advantage Estimator)という手法は、Advantageを考慮して報酬を計算する際に、どの程度先のステップまで考慮するのかを、1つの式で一般的に表せるようにした枠組みです。

2017年最新の強化学習、UNREALPPO

速習 強化学習: 基礎理論とアルゴリズム(書籍)では、以上のアルゴリズムが紹介されていましたが、2016年末から2017年に発表されたアルゴリズムのうち、UNREALPPOはとくに重要な手法なので、紹介します。

UNREAL

UNREALは、「UNsupervised REinforcement and Auxiliary Learning」(UNREAL:教師なしの強化および補助学習)の略称です。

Auxiliaryを日本語にすると、「補助の」という意味です。
A3C
のネットワークに、直接の制御目的とは少し異なる補助タスクを組み込んで、補助タスクがうまくできるようになることで、本来のゴールへの制御もうまくなるという作戦です。

例えば、URENALの論文では「3次元空間の迷路タスク」の攻略に、3つの補助タスクを組み込んでいます。

1つ目は、ピクセルコントロールと呼ばれ、画像ピクセルが大きく変化する動きを補助タスクとして学習させることで、迷路を進みやすくし、動き方を学ばせています。

2つ目は、 prioritized experience replayを強化し、報酬がもらえたときの状態s(t)を多く学習させ、現在の状態s(t)から、将来の報酬を予測させる補助タスクを行っています。

3つ目は、A3Cでは状態価値V(s)を学ぶ際に、過去の経験をシャッフルしないのですが、シャッフルしたバージョンで状態価値V(s)を学ぶ補助タスクを行っています。

これらの補助タスクがうまくできるようになることで、本来のタスクと一部共有しているネットワークの重みが学習され、本来のタスクもうまくなる仕組みです。

PPO

PPOは、openAIから2017年に発表された手法で、UNREALよりも実装が簡単です。

方策関数π(s)の更新手法として、TRPOが提案されていましたが、TRPOは実装がややこしく、またA3CActor-Criticなど、出力が複数種類あるネットワークに適用できないという課題がありました。

この点を解決したのがPPOです。

PPOではClippingと呼ばれ、π(s) / π(s_old)が大きく変化した場合には、一定の値にしてしまう操作(Clip)を行います。

例えば、π(s_old)0.1なのにπ(s)0.9となった場合には、π(s) / π(s_old) = 9ではなく、1.2などにしてしまい、π(s) / π(s_old)1.2以上は全部1.2としてしまう操作をします。

こうすることで、TRPOとは異なる手法で、方策関数π(s)の更新が大きく変化しすぎるのを防ぎます。

PPOのアルゴリズム詳細とCartPoleを実装した例を、以下にまとめましたのでご覧ください。

実装しながら学ぶPPOCartPoleで棒立て:1ファイルで完結】

まとめ

以上、これから強化学習を勉強したい人に向けて、「どんなアルゴリズムがあるのか」、「どの順番で勉強すれば良いのか」を示した強化学習アルゴリズムの「学習マップ」を作成しました。

これから強化学習を勉強する方の参考になれば幸いです。

ご一読いただきまして、ありがとうございます。

 

https://qiita.com/sugulu/items/3c7d6cbe600d455e853b?utm_content=buffer0793a&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer