今回は、OpenAI Gym を使って、車の山登りの強化学習をやってみます。
こんにちは cedro です。
皆さん、OpenAI Gym をご存知ですか?
OpenAI Gym とは、イーロン・マスク氏やサム・アルトマン氏が率いる、人工知能を研究する非営利団体「OpenAI」が提供している強化学習用の環境(ジム)で、これを使ってエンジニアは様々な強化学習を試してみることができます。
どんなものがあるかと言うと、Atari社のゲームでは「インベーダー」、「パックマン」、「アステロイド」など59個があります。
この他、囲碁のようなボードゲーム、歩き方のシミュレーションなどの他に、車の山登り(上の動画)や倒立振子といった基礎的なものまであります。
ということで、今回は、 OpenAI Gym を使って、車の山登りの強化学習をやってみます。
OpenAI Gym の環境をインストールします
まず、Github からパッケージをダウンロードします。
1 2 3 |
pip install -e . |
gym フォルダーに移動し、パッケージをインストールします。
1 2 3 |
pip install gym |
gym をインストールします。
1 2 3 |
brew install cmake boost boost-python sdl2 swig wget |
依存ライブラリーをインストールします(これは、OSXの場合です)。
1 2 3 |
pip install 'gym[all]' |
その他の環境をインストールします。
1 2 3 |
conda install -c conda-forge ffmpeg |
評価結果を動画で保存するために、ffmpeg をインストールします。
1 2 3 |
pip install chainer |
今回使うプログラムは、Chainer で書かれているため、Chainer をインストールします。
1 2 3 |
pip install chainerrl |
Chainer の強化学習ライブラリーである、ChainerRL をインストールします。
プログラムを用意します
今回は「機械学習名古屋」の6月の勉強会で使われたプログラムをありがたく使用させて頂きます。
このプログラムは、いわゆるDNQ(Q学習をDNNで近似したもの)で、ε-greedy法でランダム行動を選択したり、過去の経験(状態、行動、報酬などの組み合わせ)をランダムに選択して学習に利用する機能を持っています。
1 2 3 |
env = gym.make('MountainCar-v0') |
プログラムをダウンロードしたら、MLN_201806 フォルダー内にある handson_dqn.py の21行目 env = gym.make(‘CartPole-v0‘) を上記に修正します。「’ ’」の中に表示されているのは、モデル名です。
ちなみに、モデル名が ‘CartPole-v0′ のままだと倒立振子、’Acrobot-v1′ に変更すると関節のある二本のアームのモデルに変更できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ python handson_dqn.py -h optional arguments: -h, --help show this help message and exit --outdir OUTDIR 出力ファイル保存先ディレクトリ。 存在しなければ自動生成されます。 (default: _output) --gamma GAMMA 割引率 (default: 0.95) --final-exploration-steps FINAL_EXPLORATION_STEPS 探索ステップ数 (default: 10000) --start-epsilon START_EPSILON ε-greedy法 の開始ε値 (default: 1.0) --end-epsilon END_EPSILON ε-greedy法 の終了ε値 (default: 0.1) --replay-buffer REPLAY_BUFFER Experience Replay のバッファサイズ (default: 1000000) --replay-start-size REPLAY_START_SIZE replay-start-size (default: 500) --target-update-interval TARGET_UPDATE_INTERVAL target-update-interval (default: 100) --update-interval UPDATE_INTERVAL update-interval (default: 1) --train-episodes TRAIN_EPISODES 訓練エピソード数 (default: 200) --max-episode-len MAX_EPISODE_LEN 1回のエピソードの最大ステップ数 (default: 2000) --test-episodes TEST_EPISODES 検証エピソード数 (default: 10) |
python handson_dqn.py -h と入力すると、どんなパラメーター設定ができるかの一覧表が表示されますので、これを元に色々いじってみます。
強化学習をやってみます。
ポイントとなるパラメーターの説明をします。
1)割引率
将来貰える報酬をどれくらい現在の価値として考慮するかを表すパラメータです。割引率0なら直後の報酬のみを考えることになり、割引率1なら将来貰える報酬を全てそのまま考えることになります。但し、割引率1だと計算が収束しないので、通常は0.9位が良く使われます。
2)ε-greedy 法の終了ε 値
一端、報酬が高い行動が見つかったとしても、その行動だけにとらわれると、もっと報酬の高い行動を見つけるチャンスを失うかもしれません。そのため、確率εでわざとランダムな行動をとるという設定です。
3)訓練エピソード数
いわゆる訓練回数です。1回のエピソードの最大ステップ数は、20,000です。
1 2 3 |
python handson_dqn.py --train-episodes=50 --gamma=0.99 --outdir=_output50 --end-epsilon=0.05 |
① 訓練エピソード数:50回、割引率:99%、ε値:5%で強化学習をやってみます。
50回訓練すると、勢いをつけるのに一往復半掛かっていますが、見事に頂上へ行くようになります。
1 2 3 |
python handson_dqn.py --train-episodes=100 --gamma=0.99 --outdir=_output100 --end-epsilon=0.05 |
② 訓練エピソード数:100回、割引率:99%、ε値:5%で強化学習をやってみます。
100回訓練すると、1回前へ少し動くのが勿体ないですが、勢いを付けるのに半往復になりました。
1 2 3 |
python handson_dqn.py --train-episodes=200 --gamma=0.99 --outdir=_output200 --end-epsilon=0.05 |
③ 訓練エピソード数:200回、割引率:99%、ε値:5%で強化学習をやってみます。
200回訓練すると、1回バックして勢いを付けるだけで、一気に頂上まで行くまでに進歩します。動きにムダがなくなりましたね。
まだ、強化学習の中身は、あまり良く分かっていませんが、今回は、まず触ってみました。
では、また。
コメントを残す