かざん技術ブログ

Python, Unity, Deep Q Network, 強化学習

Unity, Python, Deep Q Network Learningを使って自動運転

前回の更新からずいぶんと経ってしまった...
ドワンゴさんの人工知能研究所が開発した超人工生命Life in Sillico(以下LIS)という、
AIエージェントを強化学習で鍛えられるモジュールを使用して、自動運転のエージェントを作成したので、それについてまとめていこうと思う。
このLISというのが本当に素晴らしいモジュールで、Unityの環境上で作成したエージェントを、AIの学習によく使われるPythonを使って鍛え上げることができる。


LISの導入はこちらの記事で取り上げている。

参考にさせていただいたサイト、論文、記事

  1. Life in Silico : http://github.com/wbap/lis
  2. Lillicrap, et al. Continuous control with Deep Reinforcement Learning
  3. https://yanpanlau.github.io/2016/10/11/Torcs-Keras.html

手法

LISのドキュメントを直接見てくれた方が早い気もするが、AIエージェントがどう最適な行動を学んでいくのか(LISのシステム)について記述していく。

距離センサーは入力情報に使っていない

まず、今回作成したエージェントの入力情報だが、距離センサーに頼らず、車載カメラに映る画像のみを入力情報としている。
エージェントは車載カメラに映る画像からコースアウトしたり、障害物と衝突しない行動を選択していく。

Deep Q Network

エージェントを制御するアルゴリズムとして、LISではDeep Q Network(以下DQN)を用いている。
DQNは、環境から与えられた状態を入力として受け取り、車が選択できる各行動の価値(Q値)を出力するニューラルネットワークのこと。
ここでは、車載カメラの映像が状態となる。

強化学習

車の自律走行の学習方法として、強化学習を用いている。
強化学習とは、エージェントが環境との相互作用を通して、得られる報酬の総和を最大にする行動を学習していく学習法のこと。
ここでいう相互作用というのは、

  • エージェントが今どんな状態なのかを環境から受け取る
  • エージェントは状態を基に行動を選択して環境に返す
  • 環境はエージェントから受け取った行動を基に状態を変化させる
  • 環境は新しい状態と行動に対する報酬をエージェントに返す

といったサイクルのことである。 f:id:okuya-KAZAN:20180524144052p:plain
この学習方法で、車はコースアウトしたり、障害物とぶつからない最適な運転技術を学んでいく。
強化学習の詳細については、こちらの記事でまとめている。

学習の流れ

強化学習を用いて、DQNを学習させていく流れは以下のようになる。

  1. 車載カメラの映像をDQNに入力
  2. 行動の選択
    → ε-greedy法と呼ばれる手法で行動を選択する。
    確率εでランダムな行動を選択し、確率1-εで、DQNから出力(各行動のQ値)が最大となる行動を選択する。
    ε-greedy法を採用することで、他に価値の高い行動がないかを探索でき、様々な行動に対する適切なQ値の学習が可能となる。
  3. 選択された行動の評価
    → 2.で選択した行動に対して報酬を与える。
    例えば、コースに沿って走れていたならプラスの報酬、コースアウトしたり障害物と衝突してしまったらマイナスの報酬といった感じ。
  4. 経験の蓄積
    → 「ある状態である行動をとったらどれだけの報酬を得て、環境がどんな状態に変化した」といった経験を、メモリーと呼ばれる場所にストック。
  5. DQNの学習
    → メモリーに記録されている情報からランダムに経験を選び出し、ディープラーニングによってDQNをチューニングしていく。 f:id:okuya-KAZAN:20180524144123p:plain

実験

ここまで理論的なことを述べてきたが、ここからは実際にLISを使ってどんな実験をしたかを書いていく。

実験の目的

実験の最終的な目的としては、実際の車の1/10スケールの「RoboCar1/10(以下RoboCar)」が、研究室内に作成したコースを自律走行できるよう鍛え上げること。

実験の流れ

シミュレーション環境上でDQNモデルを訓練し、訓練されたモデルを実世界に適用させていく。 行った主な実験は以下の3つ。 1. Virtual Simulation →直線しかないシンプルな道路で自律走行できるよう学習。 2. Laboratry Simulation →シミュレーション環境上に、研究室とRoboCarとドライビングコースを作成し、RoboCarが自律走行できるよう学習。 3. RoboCar verification →Laboratry Simulationでの学習モデルを現実世界に適用。

※ 1,2がシミュレーション環境、3が現実世界での学習となる。

Virtual Simulation

環境

一般道路とほぼ同じ道幅の直線道路を用意して、30mごとに障害物を発生させる。
どちらの車線に障害物が発生するかはランダムに決定。

エージェント

一般的な軽自動車をイメージして作成し、DQNの出力は、右に10度ハンドル切る場合のQ値、左に10度ハンドル切る場合のQ値、直進する場合のQ値の3種類とした。

報酬設計

障害物と衝突するかコースアウトした場合、報酬として-1を与え、障害物を避けるごと(30m進むごと)に+1の報酬を与える。

結果

学習過程、学習の結果を動画にまとめて、YouTubeにアップしているので、ぜひご覧ください。

www.youtube.com

Laboratry Simulation

環境

以下の画像のようなコースを作成し、1エピソードにつき1つ、コース上のストレートの部分のランダムな位置に障害物を発生させる。

エージェント

実際のRoboCarと同じエージェントをシミュレーション環境上作成した。
DQNの出力は、右に25度ハンドル切る場合のQ値、左に25度ハンドル切る場合のQ値、直進する場合のQ値の3種類とした。

報酬設計


よりコースの真ん中を、よりコースの軸に沿って進むと多くの報酬がもらえるよう報酬設計した。 コースの軸に対する車体の傾きによる報酬から、|trackPos|による減点をし、最後に車のスピードと比例定数をかけたものを報酬とする。 |trackPos|はコースの真ん中を最小値0とし、真ん中からズレるだけ値が上昇して、コースの端が最大値の1となるよう正規化。

結果

こちらも学習過程、学習の結果を動画にまとめて、YouTubeにアップしているのでぜひご覧ください。

www.youtube.com

RoboCar verification

環境

Laboratory Simulationでの環境と同じになるようドライビングコースを設計した。

エージェント

実際の車の1/10スケールの「RoboCar1/10」をエージェントとした。
こちらもLaboratory Simulation上のAgentと同じプロパティ。

System Architecture

どんなかんじでRoboCarが動くのかを図にまとめる。

ZeroMQというのはネットワークを介して他言語、他OS間でもデータのやりとりができるインターフェース。 Distributed Messaging - zeromq

+αの実験

+αの実験として、信号認識モジュールとの連携を行った。
信号認識モジュールとは同じ研究室の同僚が作成したニューラルネットワークのモジュールで、車載カメラの映像から信号認識を行い、認識結果(Stop, Go)を出力するようチューニングされている。

結果

しつこいようだが、こちらも学習過程、学習の結果を動画にまとめて、YouTubeにアップしているのでぜひご覧ください。

www.youtube.com

まとめ

今回3つの実験を大雑把に書いてしまったが、今後はこれらの実験のより詳細を書き留められたらなと思う次第です。