
こんにちは三谷です。
今回は、強化学習用シミュレーションライブラリ「OpenAI Gym」の使い方について徹底解説します!
OpenAI Gymとは?
OpenAI Gymとは、イーロン・マスクらが率いる、人工知能(AI)を研究する非営利団体「OpenAI」が提供するプラットフォームです。CartPole問題やブロック崩しなど、いくつかの環境(ゲーム)が用意されており、強化学習を学ぶことができます。シミュレーション環境と強化学習アルゴリズム間のインタフェースを確立されているため、初心者でも強化学習を学びやすくなっています。
「OpenAI Gym」の機能
OpenGLを利用した描画ができ、一部3Dでの描画も可能です。
物理演算エンジンは含まれていないため複雑な物理シミュレーションをする場合には、自分で物理計算のコードを書く必要があります。
より高度なシミュレーションを行うには、ゲームエンジンであるUnityや、物理演算エンジンのOpen Dynamics Engineを使用することもあります。
OpenAI Gymのインストール方法
OpenAI Gymは、無料のプログラミング言語Pythonの環境下で動作させることができます。そのためPythonのインストールと、それに付随するPycharmなどの統合開発環境のインストールが必要になってきます。PythonやPycharmのインストール方法はこちら(Pythonを使って強化学習をする方法を徹底解説.docx)を御覧ください。
OpenAI Gymは、単独でインストールすることもできますが、強化学習ライブラリChainerRLにも一部が含まれています。強化学習をPythonで行なうためにはChainerRLのような強化学習ライブラリを使用することが前提となることが多いため、以下の手順でライブラリをインストールすることで実行できます。
※後ほど説明するOpenAI gymの実行環境としては、公式にはPython 2.7または3.5のLinuxとOSXとなっています。Windowsでも今回ご紹介する範囲は対応可能ですので、Pythonのバージョンは3.5に設定してインストールをしてみてください。
※以下の手順はPycharmを使用したものです。
[File] – [Settings]で設定画面を開きます。
「Project :xxx
– 「Project Interpreter」で、「+」マークを選択します。
検索ウィンドウで以下のライブラリを検索し、表示されたライブラリを選択し
Chainer
ChainerRL
「Package ‘numpy’ installed successfully」が表示されたらインストールが完了です。
右上の「×」ボタンでダイアログを閉じます。
また、上記手順でうまく動作しない場合などのため、公式(https://github.com/openai/gym#installation)で紹介されているインストール手順も確認しておきましょう。フル機能を使用するためには、OSXやUbuntuの環境が必要です。
Gym機能の最低限をインストールするには、以下のコードを実行します。
pip install gym
まずは、この最低限の機能で試すことをおすすめします。その後、より複雑なことを試す場合に、以下の手順ですべての機能をインストールすることができます。
すべての環境をインストールするには、いくつかのシステムパッケージをインストールする必要があります。
OSX:
brew install cmake boost boost-python sdl2 swig wget Ubuntu 14.04 (non-mujoco only): apt-get install libjpeg-dev cmake swig python-pyglet python3-opengl libboost-all-dev \ libsdl2-2.0.0 libsdl2-dev libglu1-mesa libglu1-mesa-dev libgles2-mesa-dev \ freeglut3 xvfb libav-tools Ubuntu 16.04: apt-get install -y python-pyglet python3-opengl zlib1g-dev libjpeg-dev patchelf \ cmake swig libboost-all-dev libsdl2-dev libosmesa6-dev xvfb ffmpeg Ubuntu 18.04: apt install -y python3-dev zlib1g-dev libjpeg-dev cmake swig python-pyglet python3-opengl libboost-all-dev libsdl2-dev \ libosmesa6-dev patchelf ffmpeg xvfb
OpenAI Gymのシミュレーション環境まとめ
OpenAI Gymでは、様々な環境が用意されています。この中でも一般的なものをいくつかご紹介しましょう。それぞれの環境の詳細説明は、リンクにあるgihubのコードなどに含まれていますので、是非覗いてみてください。
CartPole(https://gym.openai.com/envs/CartPole-v1/)
左右に動くカートの上に乗った棒を落とさないように、バランスを取るシミュレーション環境です。カートを左右にうまく動かすことで、棒を倒さないようにすると報酬が得られます。
Acrobot(https://gym.openai.com/envs/Acrobot-v1/)
2つのリンク機構により動作する単純なロボットアームです。真ん中のリンク部分が左右の回転することにより、振り子の原理でアームを上のバーまで振り上げることができたら報酬が得られます。
Mountain Car(https://gym.openai.com/envs/MountainCar-v0/)
2つの山の間にいる車が、前後に勢いをつけ、坂を登ろうとします。車が右の山の頂上にあるゴールまで到達できたら報酬が得られます。
Breakout(https://gym.openai.com/envs/Breakout-v0/)
ブロック崩しのゲームです。下のバーが左右に動き、上にある得点が上がることが報酬となります。状態の定義には画像を使って強化学習を行なう問題として扱われます。
Ant(https://gym.openai.com/envs/Ant-v2/)
4つの足を持ったアリの3Dモデルが、いかに早く前に進むことができるかをシミュレーションできる環境です。3D環境はMuJoCoと呼ばれる物理演算エンジンを使用しているため、フルインストールが必要なのと、有償での提供となります。
OpenAI Gymの代表的なシミュレーション~CartPole問題
それでは実際にOpenAI Gymを使って、強化学習のプログラムを試してみましょう。今回使用するのは、CartPole問題という、強化学習を行う上で一番始めによく試される問題です。
OpenAI gymのサイト(https://gym.openai.com/envs/CartPole-v1/)より、CartPole問題の詳細を確認します。
摩擦のないトラックに沿って動くカートにポールが取り付けられており、カートは横向きに+1または-1の力が加えられるようになっていて制御できます。振り子が倒れないように左右の力を与え、維持できるようにすることが目的です。ポールが直立したままで維持できたタイムステップごとに+1の報酬が与えられます。エピソードは、ポールが垂直から15度を超えるときに終了するか、またはカートが中心から2.4ユニット以上移動すると終了します。
状態
番号 | 状態 | 最小値 | 最大値 |
---|---|---|---|
0 | カートの位置 | -4.8 | 4.8 |
1 | カートの速度 | -Inf | Inf |
2 | ポールの角度 | -24° | 24° |
3 | ポールの速度 | -Inf | Inf |
行動
番号 | 行動 |
---|---|
0 | 左にカートを押す |
1 | 右にカートを押す |
報酬
ポールが倒れなければ、1タイムステップごとに1の報酬が得られる
エピソードの終了条件
ポール角が±12°以上になること
カートの位置が±2.4を超える(カートの中央がディスプレイの端に達する)
エピソードの長さが200以上になった場合
CartPole問題を実装してみよう
ここでは、CartPole問題を実際にPythonのプログラムを書くことで実装してみます。まずは学習は全くせず、常にカートを右に移動(行動)させるというプログラムを書いてみます。
[File]-[New]で新しくファイルを作成します。
ダイアログボックスから「Python File」を選びます。
「Name」に「cartpole_practice.py」と入力し[OK]をクリックします。
ライブラリをインポートします。
import gym
CartPoleのインスタンスを作成し、状態を初期化します。
#CarPoleの読み取りセット env = gym.make("CarPole-v0") observation = env.reset()
行動を起こし、行動が行われた後の状態を確認します。今回は、ずっと右に動かし続ける動作をさせてみます。
#実行 for i in range(50): action = 1 #右に押す observation, reward, done, info = env.step(action) #情報を取得 print("observation = " + str(observation)) print("reward = " + str(reward))
ビジュアライズします。
env.render() #ビジュアライズ
ビジュアライズを終了します。
#終了 env.close()
[Run]-[Run]で「cartpole_practice.py」を選択し先ほど書いたソースコードを実行します。
以下のようなアニメーションが表示されます。
以下のような結果が表示されます。
observation = [ 0.02977195 0.15301161 - 0.04499931 - 0.2864956 ] reward = 1.0 observation = [ 0.03283218 0.34874546 - 0.05072922 - 0.5930245 ] reward = 1.0 observation = [ 0.03980709 0.54453946 - 0.06258971 - 0.90124568] reward = 1.0 observation = [ 0.05069788 0.74045105 - 0.08061463 - 1.212927 ] reward = 1.0 ・ ・ ・
まとめ
いかがだったでしょうか。OpenAIはインストールするだけで様々なシミュレーション環境を用意でき、楽しく強化学習を学ぶことができることがおわかりいただけたでしょうか。
是非他の環境も試してみてください!