masato-ka's diary

日々思ったこととか、やったことの備忘録。

Jetson Nanoで動く深層強化学習を使ったラジコン向け自動運転ソフトウェアの紹介

この記事について

 深層強化学習を利用してAI RC Carの走行を学習させるソフトウェアをGithub上で公開しています。learnign_racerと命名しました。2020年4月29日の時点でのバージョンはv1.0.0です。この記事ではこのソフトウェアについて紹介していきます。

github.com

なお、NVIDIAのJetson Community Projectsのページでも紹介されています。

developer.nvidia.com

learning_racerの概要

 このソフトウェアは10分から15分程度の学習時間で、コースに沿って走行する方法を獲得することができます。従来のAI RC Carでは人間のお手本操作をDNNに覚えこませる手法が一般的です1。ですが、本手法は教師なし学習の手法である強化学習をベースとしているため、教師データとなる人間のお手本操作は必要ありません。さらにJetson Nanoを搭載したJetBot2やJetRacer3といったAI RC Carに対応しています。下の動画は実際にJetBotで学習させた様子です。


Deep reinforcement learning with Jetbot( on the Jetson nano) in real world.

さらに、実機だけでなく、AI RC CarのシミュレータであるDonkeySIMを使い、WindowsUbuntu, macOSといったプラットフォームで実行することが可能です。そのため実機がなくてもこのソフトウェアを利用することが可能です。


Deep reinforcement learning with DonkeySIM.

 深層強化学習をエッジで学習させる仕掛け

 今回の手法はイギリスのベンチャーWAYVE4の手法からAntonio Raffine5さんがさらに発展させたものです。私はこれをJetBotやJetRacerで動くように実装を行いました。この手法がエッジでの深層強化学習に適している工夫が行われています。

Learning to Drive Smoothly in Minutes - Towards Data Science

 DQNに代表される深層強化学習教師なし学習で様々なタスクを解くことができる手法として注目されています6強化学習に必要な関数を深層学習で近似したこの手法では都度得られるデータをもとにDNNをゼロから学習させます。そのため、学習にはそれなりのリソースが必要になり時間がかかると言えます。

 一方でJetson Nanoのような非力なエッッジ側でAIを学習するにはさらに多くの時間がかかります。そのため、あらかじめ学習したAIを少量のデータで学習し直し目的のタスクに適応させる、転移学習と呼ばれる手法を利用することが一般的です7。しかし、今回の深層強化学習では転移学習の元となるモデルを用意することができません。

 そこで今回は2つの仕掛けを導入して、エッジでの深層強化学習を実現します。一つは深層強化学習の手法としてSAC(Soft Actor Critic)8を利用しました。もう一つの仕掛けはVAE(Variational Auto Encoder)を利用した状態表現学習(State Representation Learning)9です。それぞれについて説明します。

 平易に書くため、専門的には誤解が多いところがあるかもしれませんが、その場合はコメント欄で優しく指摘してください。より詳細な情報を知りたい場合はRaffineさんのMidiamを参照ください。

SAC(Soft Actor Critic)

強化学習は、多くの場合、シミュレーター上で試行を繰りすことで学習を進めていきます。エージェントと呼ばれるソフトウェアが、方策(Policy)と呼ばれるルールに従って、行動を行い、環境を変化させます。環境の変化から報酬を計算し、行動良し悪しを評価します。この結果得られたエージェントの行動、変化した環境の状態と報酬をデータとして集めて、行動全体の報酬の総和である価値が最大になるように方策を学習します。今回は実機のため、このエージェントのデータ集めは実時間で行わざる終えません。そのため、学習効率の良い、深層強化学習アルゴリズムであるSAC(Soft Actor Critic)を採用しました。

 SACはoff-policy型の深層強化学習のState of The Artな手法です。off-policyな方策型の深層強化学習は学習によって方策が変わっても過去のデータを活用することが可能です。そのため、新たな方策を学習しても少量の試行を行うだけで、過去に取得したデータと合わせて学習を行うことができます。そのため、効率的に方策の学習を進めることができます。

状態表現学習

 もう一つの仕掛けである状態表現学習(State Representation Learnig)は環境の状態をあらかじめ学習しておくことで、深層強化学習の学習効率を高める手法です。環境の状態は車両に搭載されたカメラで撮影した映像になります。状態表現学習を利用しない場合はこの画像を環境情報として深層強化学習の入力に与えます。画像という巨大な入力を学習する必要があるためマシンパワーが必要になります。しかし、状態表現学習を利用すると画像から圧縮した特徴を入力として利用することが可能です。今回は状態表現学習として千から1万程度の画像をVAEで学習しています。VAEの中間層から出力される潜在空間を32次元の特徴量としてSACへ入力にしています。下記画像の左側がカメラからの入力です。右側の画像は潜在空間からVAEが生成した画像です。潜在空間はカラーバーとして表示されています。

f:id:masato-ka:20200429143631p:plain
状態表現学習に使ったVAEの実行結果

 VAEの学習自体はGoogle Colaboratoryなどを利用して学習させています。集める画像の量が多いように感じますが、教師ありのAI RC CARよりもデータ量としては少なく、また教師データは必要ないため、収集は容易です10

 このようにエッッジでの学習が難しそうな手法でも、効率の良いアルゴリズムを採用することと、AIの学習全体を見直し、あらかじめクラウドで学習できる部分を切り出しておくことで、エッジ側で学習できるようになります。今回の場合は効率のよいSACの採用と深層強化学習の畳み込み層の計算をVAEとして切り出しクラウドであらかじめ学習しておくことがキモになります。 

ソフトウェアのセットアップ

続いて、learning_racerの利用方法を説明します。ソフトウェアはPythonで実装されpipコマンドでインストールすることができます。JetsonNanoでは環境固有の問題により、用意しているシェルスクリプトを利用してインストールします。

JetBot,JetRacer実機へのインストール

JetPack4.2以上のイメージではJetBotまたはJetRacerのソフトウェアを構築します。構築後、以下のコマンドでインストールします。

$ cd ~/ && git clone -b v1.0.0 https://github.com/masato-ka/airc-rl-agent.git
$ cd airc-rl-agent
$ sh install_jetpack.sh

DonkeySIMを用いたシミュレータ環境での実行

以下のサイトから環境に合わせてDonkeySIMをダウンロードします。Unityで作られた実行形式のバイナリです。

Releases · tawnkramer/gym-donkeycar · GitHub

以下のコマンドでインストールします。[choose platform]にはwindows, windows-gpu, osx, ubuntuのいずれか利用しているプラットフォームに合わせて実行します。windows-gpuを選択した場合、TensorFlow 1.15.0とPytorchが対応しているCUDA10.0がインストールされている必要があります。

$ cd ~/ && git clone -b v1.0.0 https://github.com/masato-ka/airc-rl-agent.git
$ cd airc-rl-agent
$ sudo pip3 install .\[choose platform\]

利用方法

詳細はこちらもREADMEを読んでいただければと思います。簡単に説明すると実機、シミュレータとも大きく3つのステップで学習します。

1. VAEモデルの作成

 まずはVAEモデルの学習を行います。実機やシミュレータを利用してコースの画像をくまなく撮影します。単純に1周するだけではなく、ジグザグ走行や、コースアウト、白線の上を走行など、様々なパターンを取得するのがコツです。学習の中でこのデータ集めが一番難易度が高い部分です。しかし、後段の深層強化学習の結果に大きく響くのでしっかりとデータを集めます。

 実機のデータに必要なツールはnotebooksフォルダに入っているためそちらを利用します。シミュレータの場合は画像を保存する機能があるため、そちらを利用します。学習用のJupyterノートブックもColaboratory向けに用意しています。

 VAEモデルの作成が面倒な場合は以下の学習ずみモデルも利用可能です。JetBotのデモでよく利用されるLEGO CITYの道路プレート用のモデルとDonkeySIMのGenerate-track-v1のモデルを用意しました。

2. パラメータ設定

基本的に、学習パラメータを変更しなくてもデフォルトのセッティングで学習はうまくいきます。その代わり機体に合わせて以下のパラメータを変更します。変更はconfig.ymlファイルに記載します。

パラメータ名 説明 設定の目安
MIN_STEERING ステアリング命令の最小値 -1のまま固定
MAX_STEERING ステアリング値の最大値 1のまま固定
MIN_THROTTLE 最小スロットル値 停止やバックしないようにJetBotやJetRacerの司令値の下限に合わせる
MAX_THROTTLE 最大スロットル値 JetRacerの場合は速度が出過ぎないように司令値に注意する
MAX_STEERING_DIFF 1ステップで変更できる最大ステアリング値 値を大きくすると大きく蛇行する0.35-0.2がベター

3. 深層強化学習の実行

 以下のコマンドで学習を開始します。<robot> はjetbot, jetracer, simのいずれかを指定します。また<device>はcpuかgpuを使っているマシンに合わせて指定します。シミュレータの場合はコマンド実行前に、シミュレータを実行しておきます。

$ racer train -vae vae.path -robot <robot> -device <device> -steps 10000 

 コマンド実行後しばらくすると車両が動き始めます。実機の場合はnotebookに入っているuser_interface_without_gamepad.ipynbを使い、車両がコースアウトする直前で停止させ、車両の位置を手で戻して、もう一度走行させます。

 シミュレータの場合は自動的に学習が進んでいくので、シミュレータの画面を眺めているだけでOKです。

まとめ

 この記事では深層強化学習を用いたAI RC Car向けのソフトウェアを紹介しました。紹介した内容としてはSACとVAEを組み合わせた深層強化学習の手法、実装したソフトウェアの構築方法と簡単な利用方法となります。現在、AI RC Carの世界では実機のレースはもとより、シミュレータを利用したバーチャルレースが始まっています。アメリカのAI Robocarコミュニティーが中心となり開催しています11。初代チャンピオンはなんと日本人のnaisyさんです。また、日本のAI RC Carコミュニティーでもすでにレースが開催されています12。今後このソフトウェアをもとにこういったレースへ参加していきたいです[]。