はじめに
最近なにかと話題のAI、どのような仕組みで動いているのか気になり、
強化学習AIの構造を軽く調べてみました。
1.状態に応じて特定の行動をする。
2.報酬を得る。
3.報酬をもとに行動を変えていく、
これを連続的に行い報酬を最大化していく行動です。
(認識が間違っていればすみません)
「おっマイクラでもできそうじゃね!」と思い、今回は強化学習AIをコマンドで作れるのか挑戦してみることにしました。
海外を探してもコマンドで強化学習AIを作っている方がいなかったので、何も情報がなく大変でした。
何を学習していくのか
視覚的にわかりやすくシンプルなものがいいと思い、
25mほどの簡単な障害物を通り抜けゴールにたどり着く、いわば迷路です。
取らせる行動
学習に呼び出す条件を減らしたい面からできる行動は3種類に絞りました。
・前進 (1m)
・右回転 (30度)
・右回転 (-30度)
与える報酬
・ゴールに到着すると多大な報酬
・ゴールに近づくごとに微小な報酬
・行動回数が増えるごとに微小な罰 (なるべく少ない行動でゴールに到着させるため)
与える情報
・現在の座標
・現在の視点方向
・現在の行動回数
・前回の学習ステップのすべての行動
・前回の学習ステップの行動にもとづくすべての座標と視点方向
・報酬が最大になった学習ステップのすべての行動
・報酬が最大になった学習ステップの行動にもとづくすべての座標と視点方向
↓大量の学習データをマクロでまとめてstorageにまとめていつでも取り出せるようにした物
具体的にどんな処理で実装したのか
①. 現在いる座標と視点が合致または類似するデータを参照する。
②. 参照できるデータがあれば0~99の乱数を呼び出す。
③. 乱数が0の場合、参照したデータとは違う行動をランダムに行う。
④. 乱数が1~99の場合、参照したデータと同じ行動をする。
⑤. 参照できるデータがなければランダムに行動を行う。
⑥. ①~⑤を繰り返し、200回行動したら前回までのデータと比較し報酬が以前より高い行動のみデータを上書きして次のステップに移行する。
※"200回行動したら"はコース全体が最短で40回ほどの行動でクリアできそうだったので余分にデータを蓄えないための意図です。
実際に学習させてみた
学習初期
まだ学習データがないので完全にランダムな動きをしてまったく進みませんでした。
学習100ステップ経過
後ろには進みづらく少しだけ前に行くようになり、進歩が感じれます。
学習10000ステップ経過
序盤迷うことなく前に行くようになり、平均してコースの中盤まで行くようになりました。
学習は/tick rate
を最大まで上げ効率的に行うことができました。
結果
学習は10000ステップからはほとんど学習結果が変わらず、極わずかしかゴールしませんでした。
原因はデータ格納に使っていたstorageに膨大なデータを蓄積したため格納上限に当たってしまったためです。
これを改善するためにはデータ格納をやり方を工夫することにより対処できるのではないかと思います。
また、AIに地形データなども認識させることにより自然生成の地形を移動できるような汎用的なAIも頑張ればできそうに感じます。