第9回 倒立振子課題CartPoleの実装環境を構築する|Tech Book Zone Manatee

マナティ

作りながら学ぶ強化学習 -初歩からPyTorchによる深層強化学習まで

第9回 倒立振子課題CartPoleの実装環境を構築する

SEやプログラマ、エンジニア、一般の方を対象に、少しずつ実際にプログラムを作りながら、強化学習および深層強化学習について解説していきます。

本連載をまとめ、さらに多くの記事を追加した書籍『つくりながら学ぶ!深層強化学習』を2018年7月に発売しました!


(上の書籍画像をクリックすると購入サイトに移動できます)

はじめに

 前回まで、迷路課題を対象にし、強化学習の基礎的知識と実装方法について解説しました。今回からはより複雑な課題である倒立振子の制御手法を強化学習させます。今回ははじめに、倒立振子課題であるOpenAI GymのCartPoleプログラムについて紹介します。その後、 ローカルPC上でPythonを実装する環境と、CartPoleプログラムを実行する環境の構築方法を解説します(Windows版)。

倒立振子課題CartPoleとは

 倒立振子課題とCartPoleについて解説します。

 倒立振子課題とは土台の上に回転軸を固定した棒を立て、立てた棒が倒れないように土台を右・左へと細かく動かして、制御する課題です。イメージとしては、小学生の頃そうじ時間に手のひらの上にほうきを立てて遊んだと思いますが、あの動作とまったく同じになります。

 この課題をOpenAI GymのCartPoleというプログラムで実装することができます。以下の図9.1がOpenAI GymのCartPoleの実行の様子です。

CartPole
図9.1 倒立振子課題CartPoleの実行の様子(再生繰り返し)

 OpenAIとはテスラやスペースXでおなじみのイーロン・マスク氏らが寄付を行い2015年末に創設された、人工知能・AIの推進を目的とする研究組織です[1]。OpenAI GymとはOpenAIが2016年4月に公開した、強化学習アルゴリズムを実装したり比較するための課題を集めた実行環境となります[2]。今回使用するCartPoleはOpenAI Gymのプログラムのなかでも様々な論文などで使用される、定番課題です。

ローカルPC上でCartPoleを実装・実行する環境の構築方法

Python実行環境であるAnacondaのインストール方法

 今回はWindowsユーザー向けに、Anacondaと呼ばれるPythonの機械学習関連のライブラリがまとまっているディストリビューションを使用し、Pythonの実行環境を構築する方法を解説します。

※MacやLinuxの場合はAnacondaを使用しない方法をお勧めします。詳細は記事の長さの都合上割愛させていただきます。例えば、"Python OpenAI mac 環境構築"などで検索すると構築方法が見つかりますので参考にしてください。

 Anacondaのダウンロードページから、自分のPC環境に合ったAnacondaインストールファイルをダウンロードし、インストールします。基本的にはPython 2.系ではなく、新しいPython 3.系バージョンを選ぶのをおすすめします(図9.2)。

https://www.anaconda.com/download/

Anaconda1
図9.2 Anacondaのダウンロード

 ダウンロードボタンをクリックすると、メールアドレスを尋ねられますが、[No thanks]をクリックし、アドレス登録をしなくてもダウンロードできます。

 インストール作業はデフォルト設定のまま[Next]と[Next]と進め、全てデフォルト設定のままインストールを実行します。

仮想環境の構築

 続いてプログラムを実行するための仮想環境を構築します。

 WindowsのスタートメニューからAnaconda Navigatorをクリックし起動させます。立ち上がったHome画面の左端の上から2番目の[Enviroments]をクリックし、環境設定画面を開きます(図9.3)。

Anaconda2
図9.3 Anaconda Navigatorの起動画面

 環境設定画面の左から2列目の固まりの一番下に[Create]というボタンがあるのでクリックします(図9.4)。構築する仮想環境名はなんでも良いのですが、今回は分かりやすいように、「rl_env」とします。reinforcement learningの仮想環境という意味です。Python 3.6のデフォルト設定のままで[Create]をクリックします。もしAnaconda Updateの画面が開いた場合は、Updateを実施してください。これで新たな仮想環境が構築されます。

Anaconda3

Anaconda3a
図9.4 Anacondaでの仮想環境構築

 以上で、一度Anaconda Navigatorを閉じてください。

 続いてPython使用時にパスが通るように、Windowsの環境変数を追加します。構築された「rl_env」の画面右下に表示されている、仮想環境が管理されているフォルダー名をメモしてください。

Anaconda4
図9.5 仮想環境が管理されているフォルダー名

 次に[コントロール パネル]-[システムとセキュリティ]-[システムの[システムの詳細設定]から「システムのプロパティ」を表示させ、[環境変数...]をクリックします。環境変数設定画面の上側、ユーザー環境変数の[新規...]ボタンをクリックし、以下の設定を行います(図9.6)。

変数名 PYTHONPATH
変数値 【図9.5のフォルダー名】\rl_env\Lib\site-packages
例(開発環境によって異なります) C:\Users (ユーザー名)\AppData\Local\Continuum\Anaconda3
\envs\rl_env\Lib\site-packages

Anaconda4
Anaconda5
図9.6 環境変数の設定

 この設定によりPython使用時に、先ほど作成した仮想環境が管理するフォルダー内で、追加インストールするPythonライブラリを管理できます。

 Anaconda Navigatorを一度閉じて、再度立ち上げ、環境変数の設定を反映させます。Anaconda Navigatorを立ち上げたら、左端の[Environments]をクリックし、環境設定画面に移動します。

 続いて作成した仮想環境「rl_env」の横の  をクリックし[Open Terminal]を選択します。するとターミナルが立ち上がります。

OpenAI Gymに必要なライブラリのインストール

 最後にOpenAI Gymを実行する際に必要となるライブラリをインストールします(図9.7)。以下のコマンドを1つずつ実行してください。

pip install gym
pip install matplotlib
pip install JSAnimation
pip uninstall pyglet -y
pip install pyglet==1.2.4
conda install -c conda-forge ffmpeg

Anaconda6

Anaconda5555
図9.7 ターミナルからライブラリをインストール

 pip installやconda installは他人が作ったPythonのライブラリ(パッケージ)を自分の環境にインストールするコマンドです。pipでインストールできるライブラリはPyPI(the Python Package Index)と呼ばれるサービスで管理されており、PyPIに登録されているライブラリはpipコマンドで簡単にインストールすることができます。condaの場合はさらに、Anacondaでも管理されています。ただし、他人が作ったライブラリなので、そのプログラムが自分のPCの他のプログラムに悪影響を与える可能性があるため、仮想環境を作って閉じた安全な環境内で使用するのが一般的です。

 gymとはOpenAI Gymのライブラリです。Cartpole課題を実行するために必要なので、pipコマンドで仮想環境にインストールを行います。その他のライブラリはgymで動画を描画するのに必要なライブラリたちになります。

 以上で、WindowsでJupyter notebookを使用してOpenAI GymのCartPoleプログラムを実行する環境が構築されました。

 ターミナルから以下のコマンドを打ち込みます。

jupyter notebook

 すると、Jupyter notebookがWebブラウザ上で開きます。Jupyter notebookの操作は前回までのtry Jupyter!と同じ操作となります。

CartPoleの実装

 Jupyter notebookで新規Pythonファイルを作成します。そして、以下のコードを1つ目のセルに入力し実行します。

# Jupyterでmatplotlibを使用する宣言と、使用するライブラリの定義
import gym
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

 次に、動画を再生・保存する関数display_frames_as_gifを定義します。この関数の詳細はJupyter notebook上でのgif保存の解説[3]で解説されている内容とほぼ同じです。そのためここでは説明は割愛いたします。今回は、movie_cartpole.mp4という名前で動画を保存するように、1行だけ変更を加えています。

# 動画の描画関数の宣言
# 参考URL http://nbviewer.jupyter.org/github/patrickmineault
# /xcorr-notebooks/blob/master/Render%20OpenAI%20gym%20as%20GIF.ipynb
from JSAnimation.IPython_display import display_animation
from matplotlib import animation
from IPython.display import display


def display_frames_as_gif(frames):
    """
    Displays a list of frames as a gif, with controls
    """
    plt.figure(figsize=(frames[0].shape[1]/72.0, frames[0].shape[0]/72.0),
               dpi=72)
    patch = plt.imshow(frames[0])
    plt.axis('off')

    def animate(i):
        patch.set_data(frames[i])

    anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames),
                                   interval=50)

    anim.save('movie_cartpole.mp4')  # 追記:動画の保存です
    display(display_animation(anim, default_mode='loop'))

 続いて、CartPoleを実行する部分をコーディングします。今回はきちんと制御はせず、土台のカートをランダムに右か左へと動かします。本来は、棒の角度がある程度傾くと終了させるのですが、このプログラムではあえて終了させずに適当に動かし続けています。

# CartPoleをランダムに動かす
frames = []
env = gym.make('CartPole-v0')
env.reset()
for step in range(0, 200):
    frames.append(env.render(mode='rgb_array'))  # framesに各時刻の画像を追加していく
    action = np.random.choice(2)  # 0(カートを左に押す),1(カートを右に押す)をランダムに返す
    observation, reward, done, info = env.step(action)  # actionを実行する

 上記セルを実行すると、変数framesに各stepごとのCartPoleの画像が格納されます。Windows環境で実行すると、動作が止まる変なウィンドウが表示されてしまう場合があります。このウィンドウは無視しておき、プログラムを一通り実行したら強制的に閉じてください。

CartPole1
図9.8 実行結果

最後にframesに格納された画像を、定義した関数display_frames_as_gifで再生・保存します。

# 動画の保存と描画
display_frames_as_gif(frames)

 上記コマンドを実行すると、図9.9の画面が表示され、実行した結果を再生できるようになります。また実行したプログラムと同じフォルダー内(通常は C:\Users\(ユーザ名)\AnacondaProjects )にmovie_cartpole.mp4が生成されています。

CartPole1
図9.9 コード実装後のgif再生の様子(再生繰り返し)

 生成された動画(図9.10)を見ると、土台(Cart)がランダムに左・右に動くため棒が倒れてしまっている様子が分かります。今後、棒が倒れないように土台のカートを制御する手法を強化学習していきます。

CartPole2
図9.10 ランダムにカートを動かしたときの様子

まとめ

 今回は新たにOpenAI GymのCartPole課題を実行するWindowsでの環境設定の解説と、CartPole実行の様子を紹介しました。次回はこの倒立振子課題をQ学習による強化学習で制御する手法を解説します。

引用

[1] イーロン・マスク氏ら、AI研究組織「OpenAI」を創設--人類への貢献を目指す https://japan.cnet.com/article/35074857/

[2] OpenAI Gym https://gym.openai.com/docs/

[3] Jupyter notebook上でのgif保存の解説 http://nbviewer.jupyter.org/github/patrickmineault/xcorr-notebooks/blob/master/Render%20OpenAI%20gym%20as%20GIF.ipynb

著者プロフィール

株式会社電通国際情報サービス ⼩川雄太郎(著者)
株式会社電通国際情報サービス(ISID)、技術本部 開発技術部に所属。ディープラーニングをはじめとした機械学習関連技術の研究開発・技術支援、およびHR techに関するデータ解析を業務とする。明石高専、東京大学工学部を経て、東京大学大学院新領域創成科学研究科、神保・小谷研究室にて、脳機能計測および計算論的神経科学の研究に従事し、2016年博士号(科学)を取得。東京大学特任研究員を経て、2017年4月より現職。JDLA DeepLearning for GENERAL 2017。