強化学習 DQN(深層Q学習)を用いて、自作のレースゲームを作成。AIに爆走させてみました。
技術構成
- Python 3.6
-
TensorFlow 1.13.1
- Tensorflow Nvidia Docker
- CUDA 10.1
環境
- Xeon 16 コア/ 32 スレッド
- デュアルGPU TITAN X 1080 Ti
DQN(深層Q学習)とは?
2017年に囲碁の世界チャンピオンに勝利したAlpha Goの根幹技術ということでDQNは大きく注目を集めました。
従来のQ学習に加え、ニューラルネットワークの技術を用いて複雑な入力を扱うことができるようになったため、
純粋なQ学習よりもより広い分野(自動運転、ロボット操縦等)で期待されています。
DQNは 強化学習 に分類されます。
強化学習ではエージェント(Agent)が環境から状態(State)を受け取り、それを元に行動(Action)を起こし、
報酬(Reward)を受け取るというサイクルの中で、全体での報酬を最大化することを目的として学習します。
Q学習では「状況」のインプットから最大の「報酬」を得る「行動」を導くための関数(Q関数)を定義し、それを最適化するというプロセスを辿ります。
これらはその他の機械学習(教師あり、教師なし学習)とは大きく異なります。
なぜならその他の機械学習は数値や画像等のデータに対して分類や回帰、クラスタリング等を行うのに対して、
Q学習(強化学習)では環境に対して行動を最適化することを目標としているからです。
深層Q学習ではこのQ関数をニューラルネットワークを用いて最適な関数を導きます。
このニューラルネットワークの導入によってQ学習は囲碁の盤面の情報や画像、動画、音等を「状態」として受け取り、処理することができるようになりました。
このDQNの登場によりQ学習はより大きな活躍を期待されるようになりました。
レースゲームを爆速で走らせる。
DQNはゲームの世界でも注目されており、ブロック崩しやインベーダーゲームでは人間より強いAIプレイヤーがすでに生まれています。
今回のプロジェクトではレースゲームを自作しその中で人間には操作できないスピードで車を走らせることを目標としています。
なぜ自作のゲームなのか
すでにインターネット上にはOpenAI GymなどのQ学習用に最適化された環境が用意されています。
しかし、実際の多くの機械学習プロジェクトでは機械学習プロジェクト用に用意された環境でAIモデルを構築することはほとんどありません。
そのため今回はゲーム環境から開発を始めました。
学習概要
状態:前方5方向の壁への距離 + 速度が基準値より早いか + 前の「行動」に対する報酬
行動:「スピードUP方向変化なし」「スピード、方向変化なし」「スピードUP右カーブ」「スピードUP左カーブ」
ここには減速する選択肢がないため、学習が進むほど否応無しに爆速で走るモデルが出来上がります。
「スピード、方向変化なし」を選択し続ければ止まる様になっていますが基準値よりも低いスピードの場合、
下の「報酬」で減点されるため一定スピードを出す様に学習します。
報酬:新スコア − 旧スコア (もしスコアの差が9.9万以上なら1)+(もしスピードが基準値より低ければ減点)
(スコアの計算方法はUnityコミュニティのQ&Aを参考にしました。)
※スコアの計算方法
ラップ数(周回数)* 100万 + チェックポイントNo. * 10万 + 次のチェックポイントへの距離
実際のスコアは直接「報酬」として「エージェント」に渡してしまうとチェックポイントの加点が大きすぎて
細かい距離の変化による「報酬」についてはおおよそ無視されてしまいます。
そのため、実際に「環境」から与えられる「報酬」に対して処理を加えることで学習を進みやすくします。
学習の経過
最終的な学習は極めて単調に進みました。
下のグラフはX軸がトレーニングでのゲームのプレイ回数、Y軸がゲーム毎の点数を示しています。
これによると約4000回プレイすることで1周することに成功しています。
ただし、スタート地点に置ける車の角度はランダムなので同じモデルでも必ずしも毎回最高得点は出ません。
学習は以下の様に経過しました。
右下に学習におけるゲームのプレイ回数が表示されています。
最初の500回では直進する事で最初のチェックポイントを通過することを学習しました。
3000回付近最初のコーナーを曲がることを学習しました。
1万回付近でようやく安定して半周以上できる様になりました。
2万回で一周が安定してきました。
8万回プレイして学習した結果が下のグラフです。
最大スコアが1750万点以上すなわち17.5周以上を記録したことになります。
下にあるのが80000万回プレイしたモデルの結果です。
文字通り爆速で走る様になりました。
グラフを見る限りスコアの伸びが全く停滞していないため、まだまだ学習の余地が大きくあると思われます。
車の制御性能が高すぎる点は改善の余地がありますね。
プロジェクト中の課題
学習が一定の地点から進まなくなる
下のグラフの様に過去に30万点が出るものの学習を進めると20万点以上を出さなくなる問題に直面しました。
この原因を特定するために車が壁に衝突した際の座標を描画すると以下の様になりました。
点が描画された図の位置はコースでいうと青の矢印が示した点で、最初のコーナーの学習がうまくいっていない事がわかりました。
そこで、センサーの位置を調整する事で上で見られた様に学習が進むようになりました。
まとめ
DQNを含むあらゆる強化学習のプロジェクトでは「環境」「状態」「行動」「報酬」の概念について正確に理解し、
正しく定義し、エージェントに渡す事が重要です。
DQN等の深層学習を含むモデルを用いる際はどうしてもエージェントが学習した内容が不透明になりやすいので
どれだけ学習中の「状態」と「行動」を可視化できるかが正しいチューニングへの鍵になると思います。
あなたも、Avintonでこのような最先端技術を習得し活用してみませんか?
社員の成長を導きながら、AIやビッグデータなどの最先端技術をプロジェクトに活用していくことが私たちのビジョンです。Avintonの充実した技術研修でスキルアップを図り、あなたのキャリア目標を一緒に達成しませんか?