どうも、オリィ研究所(http://orylab.com/) の ryo_grid こと神林です。
今回は前回、Open AI Gymの二足歩行ロボを歩かせたNEATという手法で、他の課題も解けるか試してみようということで、パワー不足の車が振り子の要領で勢いをつけて山を登る、という課題を解かせてみます。
#前回のお話
前回は遺伝的アルゴリズムとニューラルネットワークを組み合わせた手法であるNEAT(NeuroEvolution of Augmenting Topologies)を用いて二足歩行ロボを歩かせました。
遺伝的アルゴリズムxニューラルネットワーク(NeuroEvolution)でOpen AI Gymの二足歩行ロボを歩かせた話
ただ、パラメータが多数あり、課題ごとにチューニングしないと性能が出ないのではないかという点に疑問が残りました。
そこで、今回は上述の課題を同じプログラムを用いて解いてみることを試みました。
上の画像のような勾配の坂道を、前進・後退のできる車が移動して最終的に右上の旗のあるところを目指します。
しかし、この課題はやっかいなことに、車はパワー不足でただ前進し続けるだけでは右の山を登れないという設定になっています。そこで、右左に振り子のように移動をしながら振幅を大きくして山を登りきるような動作をしなくてはなりません。
制御プログラムには観測情報(Observe)として2つの数値が渡されます。これは本来、知らずとも強化学習のAIなら解けるべき(でないと、汎用性が無くなる)なのですが、ちょっとズルをして、Open AI Gymのソースコードを調べてみたところ、車の速度と位置を返していることが分かりました。
利得(Award)はテストプログラムを動作して観察していると、山を登りきっていない間は-1、登りきったタイミングでプラス数百という値を返しているようでした。
解く
さて、どう解くかなのですが、通常は状況に応じて利得の値が変化して返ってくるものなのですが、この課題だと山を登りきらない限りずっと-1が返ってくるので、結果として登れていない限り利得の累積値に差が出ず、遺伝的アルゴリズムにおける各個体間の優劣を決めることができません。そこで、ズルをして、上記で調べて分かった観測情報のうちの車の位置をいわば利得として用いることにしました。
各種パラメータは課題固有の数値(ネットワークのチューニングとかではなく)以外は変更せずに動作させました。
結果
— ホクソryo_grid@86世代 (@ryo_grid) 2017年1月27日
https://gym.openai.com/evaluations/eval_ysDnHwZBTiDPej4743wBQ
# ソースコードや動作のさせ方等も載せてあります
解けました。
前回は学習に一日とかかかっていましたが、この課題は一・二分で解けてしまいました。
課題によって必要な時間というのも全然違うものなのですね。
また、遺伝的アルゴリズムやニューラルネットワークのパラメータは変化させずに、利用することができたので、さほどパラメータセンシティブではないということも分かりました。
次回は、これまでのプログラムの中身についてもう少し詳しく解説したいと思います。
以上です。