分析ツールを使用して AWS DeepRacer のモデル開発を加速する

2021-05-07
日常で楽しむクラウドテクノロジー

卜部 達也

AWS DeepRacer は 2018 年の発表以降、強化学習を楽しみながら学ぶことができるプラットフォームとして多くの皆様に愛されてきました。個人でお楽しみになられるお客様はもちろん、社内イベントとしてご活用いただいたり、AWS や機械学習のための学びの場としてお使いいただいた例も数多くあります。

たくさんのお客様をご支援するなかで AWS DeepRacer のモデルを改善するためのテクニックや、学習経過に関するグラフの見方などのさまざまな質問・お問い合わせをいただく機会も増えました。5 月 11 日~12 日に行われる AWS Summit Online では、AWS DeepRacer リーグを 5 月 2 日〜 5 月 31 日まで開催されており、それに合わせて 2 つのワークショップを開催します。この記事はそのうちの上級者向けのワークショップに関する情報をまとめたものになります。

AWS DeepRacer を始めたが「グラフをどう解釈するべきか、またモデルを改善するためにどんな方法を取れば良いのか」といった具体的な悩みに対してのアプローチ方法を解説することを目的としています。特定の事例を紹介するだけではなく、課題の確認〜解決方法の検討〜改善の確認、といった一連のプロセスを実行するための思考過程を身につけていただくようなワークショップになっています。

この記事を見てご興味持っていただけたのであれば、ぜひ AWS Summit Online の AWS DeepRacer ワークショップに参加し、また AWS DeepRacer リーグに参戦してください ! 皆様がモデルの開発を (文字通り) 加速されることを期待しています !

この記事で前提となる知識は

  • AWS DeepRacer ワークショップのハンズオン動画 (AWS DeepRacer 概要 2020 年版) を受講したことがある
  • AWS DeepRacer モデルの学習と評価をおこなったことがある
  • AWS DeepRacer の物理リーグ・バーチャルリーグに参加したことがあり、学習したモデルをリーダーボードに提出したことがある。

方を対象としています。

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. 報酬関数の設計と改善

ここでは、より速く一貫性のあるモデルをトレーニングするために使用できる報酬関数のヒントとテクニックについて説明します。

ここに示したのは非常に基本的な報酬関数になります。reward_function と名付けられた (文字通りの) 報酬関数には AWS DeepRacer のシステムから params という辞書型の引数が渡されます。この params には自車や他車、コース情報を含む非常にたくさんの情報が格納されています。この報酬関数の例では、track_width (トラックの幅)、distance_from_center (トラックのセンターラインと自車との距離) というパラメータを使って、自車がトラックの中央にいる場合に高い報酬がエージェント (AWS DeepRacerにおける自車) に与えられます。

報酬関数に利用できるパラメータは こちら を参照ください。ここで重要 (かつしばしば誤解されがちな) なポイントは、モデル (ニューラルネットワーク) はあくまで入力センサー (カメラと LiDAR センサー) で見たデータだけに基づいて行動を決めるのに対して、報酬関数は以下のことを全て知っているということです。

  • 車がどこにいるか
  • 車が何をしているか
  • コースの大きさや形
  • コース上の他の物体の状況

これらの情報をニューラルネットワークに直接入力させることはできませんが、報酬関数をうまく設計することで開発者の思ったような運転をさせることができます。次はその例を示します。

1-1. 有効なパラメータ: steps

steps は見落とされがちですが、progress と組み合わせることで同じ時間内に自車をトラックのできるだけ遠くに進めることができます。まず、AWS DeepRacer におけるステップ (step) についておさらいします。

ステップとは表示されているループの一回のことで、以下のイベントが発生します。

  • エージェントに搭載されているセンサーがデータ (状態 : S で表す) を取得する
  • ニューラルネットワークがそのデータを入力して行動を出力する
  • エージェントが実際にその行動をとる (例えば 0.33 m/s で直進する)
  • 環境 (簡単にはシミュレータ) から報酬を得る

運転にともない、エージェントはこのステップを時々刻々と繰り返します (1 秒間に約 15 回発生します)。この一連のステップの繰り返しをエピソードと呼びます。例えば、マシンがコースアウトするとエピソードはリセットされ、1 ステップ目からカウントされ直します。

それでは、実際に steps\ パラメータを用いた報酬関数について説明していきます。

if steps > 0:
  reward = ((progress*150) / steps)**2
else:
  reward = 1

この報酬関数では、steps の他に progress というパラメータを使っています。progress はトラック 1 周の何 % を走行したかを示す値です。報酬関数のうち、 ((progress*150)/steps) の項に注目します。Progress が高ければ高いほど報酬が高くなります(150 に深い意味はありません、係数だと考えてください)。反対に steps は分母にあるので steps が低ければ低いほど報酬が高くなります。この項を二乗しているため、その効果はさらに強調されます。Progress を走行距離、steps を歩いた歩幅と例えると、この報酬関数は「少ない歩幅でできるだけ遠い距離へ到達する」ことに高い報酬が与えられることがわかります。このような報酬が与えられるとエージェントはどんな走行戦略を獲得するでしょうか。以下の図に示します。

学習が進むにつれ、エージェントの走行経路は左から右のように変化します。1 ステップでなるべく遠くまで進むために、S 字コーナーをなるべく直進するようなレーシングラインを取っていることがわかります。これは実際のカーレースでもよく取られる戦略です。

1-2. 報酬関数の可視化

報酬関数を設計するとき、開発者の狙いが報酬関数に適切に反映されているかを確認することは非常に重要です。そのために有効な方法は報酬関数を可視化することです。前述の報酬関数を可視化してみます。

クリックすると拡大します

可視化することで「なるべく低い steps で ( x 軸の左側で)」「なるべく高い progress で (y 軸の上側で)」報酬関数が高いことがわかり、開発者の狙い通りに設計できていることを確認できます。

1-3. ウェイポイント

ウェイポイントとは、トラック上のセンターラインおよびサイドラインに設定された点の集合です。この点の座標情報を用いることで、例えばトラック上の自車位置の情報を得ることができます。ここでは、ウェイポイントを用いた報酬関数の設計方法を紹介します。この方法はトラックの特定の領域に対して手設計で報酬を与えるため議論が分かれるところですが、うまく活用すれば非常に有効な方法になります。

クリックすると拡大します

re:Invent 2018 のトラックで説明します。一般的に、カーレースでは以下のようなアウトインアウトと呼ばれるドライビング戦略が有効です

  • トラック外側を走り減速してコーナーに侵入する
  • コーナー内ではインコースを走行する
  • コーナー出口ではトラックの外側を走り加速する

ウェイポイントを使って、これらの行動に対して報酬を与えるように報酬関数を設計してみます。

クリックすると拡大します

このトラックでは、トラックを反時計回りに走行します。コーナーの中 (図のグレーの領域) ではコーナーの内側、すなわち左側を走行することに高い報酬を与えます。コーナーのウェイポイントは 10 から 20 までの領域です。報酬関数ではこのウェイポイント領域に (左側を走行してほしいという思いを込めて) “L” というリスト名をつけています。同様にコーナー手前 (図の黄色の領域) には “R” というリスト名をつけました。

報酬関数の if 文に着目すると、自車 (の最近傍のウェイポイント番号) がコーナー内にあるとき、自車がトラックの左半分にいるときに報酬 1 が支払われていることがわかります。同様に、自車がコーナー手前にいるときには自車がトラックの左半分にいない (すなわち右側にいる) ときに報酬 1 が支払われていることがわかります。このように報酬関数を設計することで、トラックの特定の領域に対して意図した走行をさせることが可能になります。

ウェイポイントを報酬関数に取り入れるときは、自車や他者と複数のウェイポイントとの距離や角度を算出することがよく出てきます。このような場合 NumPy, SciPy, Shapely のようなライブラリを活用すると良いでしょう。詳細は AWS DeepRacer のドキュメント を参照してください。


2. 学習状況の観察

前章では報酬関数の設計のヒントについてお話ししました。次に、AWS DeepRacer での学習状況を観察するためのヒントについてお話しします。報酬関数を設計し学習を開始したときに、学習は順調にいっているのかそれとも学習を切り上げて別のアプローチを試すべきかの判断を行うための考え方をいくつかの例とともにお話しします。

2-1. 学習グラフと評価グラフの役割

AWS DeepRacer のコンソールでよく見るグラフについて解説していきます。このグラフでは二つの指標について確認することができます。一つ目は、ある一定の数のエピソード (これを 1 iteration という塊にしています) に対しての平均報酬を示しています。グラフの緑色のプロットです。二つ目はトラックの完走率で、学習時の完走率を青色のプロット、評価時の完走率を赤色のプロットで表しています。完走率が学習時と評価時で二つあるのは、その目的が異なるからです。

クリックすると拡大します

学習時に自車はモデル更新のために経験 (走行履歴) を収集しています。このとき、モデルは新しい戦略を獲得するためにある程度ランダム要素を取り入れて行動を選択しています。収集した経験はリアルタイムで学習に用いられるのではなく、一定のかたまり (バッチ) として定期的にバックグラウンドでニューラルネットワークの更新に用いられます。モデルの更新中に、既存の (学習前の) モデルが評価されます。評価時にはランダム要素を取り入れないため、車両としての純粋な性能を示しています。

2-2. 学習の継続の判断

学習・評価グラフを見る目的で重要なのは、「このまま学習を継続するべきか」という判断をすることです。ここではそのための判断基準をお話しします。

図の例では、評価時の完走率が 500 iteration ほどで 100 %に到達しています。これは良い兆候ですが完全には安定しておらず、さらには学習時の完走率グラフはまだ 100 %に達していません。この報酬関数とモデルには将来性があるため、もう少し学習の時間が必要だと言えます。

クリックすると拡大します

反対にこちらの図の例では、学習時・評価時とも完走率が 15 %を超えず改善の兆しもないことがわかります。これは良い兆候ではなく、モデル、報酬関数、学習パラメータ (もしくはその全て) が良くない可能性があります。学習を切り上げて、他のアプローチを試してみた方がよいでしょう。

クリックすると拡大します

2-3. 強化学習における過学習

過学習は機械学習において非常に重要な概念です。ニューラルネットワークが学習データを正確に学習しても、あまりにも特定のポイントに特化しているために、新しいデータに対する予測性能を発揮できず、非常に間違ったこと答えを出すことがあります。強化学習においても、また特に AWS DeepRacer においても、モデルが特定のトラックで長時間学習された場合にこの問題が発生します。

優れたモデルは、道路の特徴であるサイドラインやセンターラインに基づいて判断することができ、そのためどんなコースでも走行できるはずです。一方、(強化学習において) 過学習したモデルは、そのようなトラックの特徴を全く見ていないかもしれません。むしろ、背景の草の形や壁の角度などを見て、ある方向に曲がることを覚えているのかもしれません。そうすると、そのモデルは特定のコースではスムースに走れても、別のコースではうまく走れないことが起きます。もしくは同じコースでも物理的な環境では、テクスチャー、照明などのわずかな違いによって、まったくうまく走れないことがあります。

この例では、評価時の完走率が 100 %に達したのが 200 iteration 以降で、学習率が 100 % に達したのが 500 iteration 以降となっています。この時点で、モデルはかなり完全に学習されており、これ以上学習されると、このトラックでモデルが過剰に学習されてしまう可能性があります。

このモデルをさらに学習するのであれば、別のトラックで学習した方が良いかもしれません。複数のトラックで、より短い時間で学習をおこなうことは非常に有効な戦略です。

クリックすると拡大します

2-4. ハイパーパラメータの調整

AWS DeepRacer のデフォルトのハイパーパラメータは非常に優れていますが、ときにはハイパーパラメータを調整することも考えられます。この例では、学習完了グラフと報酬グラフが上下に揺れています。これは学習が収束していないことを示唆しており、学習率を低く調整することで改善する可能性があります。

クリックすると拡大します


3. ログファイルとモデルの分析

前章では、学習グラフを解釈する方法について話しました。しかし、この学習グラフからは車両が実際にどのように走行したか、例えば車のスピードについての情報は得られません。たとえ完走率が 100 % であっても遅い車は速い車に負けてしまいます。では、どうやってその情報を引き出すのか、ここではログファイルの分析を中心にモデルの可視化についても説明していきます。こちらの jupyter notebook を例に説明しておきます。

3-1. トラックとウェイポイントの可視化

このように、ウェイポイントを視覚化することで、前述のウェイポイントを使った報酬関数を設計することができます。この例ではウェイポイントが 0 から 153 まで表示されています。

ここで 1 つ指摘しておきたいのは、もっとも近いウェイポイントへの方向を使うのはあまり面白くないということです。車両がウェイポイントに向かっているかどうかで報酬が決まるのであれば、数ポイント先のウェイポイントを選択したほうが良いでしょう。

例えば、車両がウェイポイント 50 の近くにいる場合、ウェイポイント 70 の方向を確認してみましょう。ただし、急なカーブでは注意が必要です。トラックの内側の方向を示してしまう可能性があります。

クリックすると拡大します

3-2. エピソードごとの報酬

AWS DeepRacer のコンソールでは、グラフを見やすくするために一定数のエピソードを束ねて 1 iteration として平均値をプロットしています。しかし、このグラフではエピソードごとに報酬や完走率がどれくらいばらつくかがわかりません。

エピソード単位での報酬や完走率のバラツキを確認するために、このノートブックでは、一定のエピソードごとの分散、そして各エピソードの報酬の生データのプロットを確認することができます。このプロットをみるとエピソードごとの報酬のばらつきが大きいことがわかるため、このモデルをレースに投入した場合、非常に良い走りをするものがあれば、かなり速い段階でコースアウトするものもあるという挙動を把握できます。

クリックすると拡大します

3-3. トラック上での報酬関数の分布を分析

この図は、走行履歴からトラック上での報酬関数の分布をヒートマップで可視化したものです。トラック上のどこで車両が報酬を得ているかを把握することができます。

この例では、ほとんどがセンターラインに沿っているときに高い報酬が支払われていることがわかります。しかし、これが報酬関数を設計する開発者の意図と異なっていることもあります。コーナーの内側にもう少し寄って欲しいとか、コーナーに近づいたときに外側に移動してほしいという意図です。このような開発者の意図と実際の報酬関数とのズレを把握するのにこのヒートマップは非常に重要です。

報酬関数を改善するには前述の steps を使った報酬関数やウェイポイントを使った報酬関数を参考にしてください。

クリックすると拡大します

3-4. トラック上でのアクション分布のヒストグラム

前述のトラック上の報酬関数の可視化では、車両がどんな行動をとったかの情報がありません。そこで、高い報酬をとった行動がトラック上のどこでどんなアクションをとっていたのかを可視化したのが下の図になります。

以下の図は特定のアクション (0.33 m/s で直進) でトラック上で高い (ある閾値以上の) 報酬を得た時の位置と回数を視覚化したものになります。例えばウェイポイント 33 から 82 までのなだらかな左コーナーを見てみましょう。右の図の gentle left と示した領域において、このアクションが高い報酬を得た回数がわかります。ノートブックでは他のアクション (例えば右にステアリング) の情報もわかります。コーナーを曲がるために有効なアクションに対して高い報酬が支払われているか確認してください。もし、右折するアクションに多くの報酬が支払われているのであれば報酬関数を再考する余地があります。

このようにして、ニューラルネットワークがトラックの特定の場所で何を判断しているかを正確に把握し、報酬関数を調整して別の報酬を与えるフィードバックループを形成できます。

また、報酬関数が有効に機能しているかを確認することにも使えます。上の図は、報酬関数として 15 度以上のステアリングに対して罰則を設定していた例になります。実際にステアリングが 30 度以上のアクションが行われていない (高い報酬が支払われていない) ことが右のグラフよりわかります。

3-5. モデルの可視化

このノートブックで最も便利なのは、センサデータを直接ニューラルネットワークに読み込み、何が意思決定を潤しているかを可視化できることです。ノートブックには 900 枚以上のサンプル画像が用意されています。基本的には、画像がニューラルネットワークに渡され、アクションが決定されると、入力データのどの部分がその決定の主要因となったかを、画像上のピクセルをヒートマップとして重ね合わせて確認することができます。

これにより、モデルがトラックのどの部分をピックアップしているかを正確に把握することができます。ここでは 3 つの例を紹介します。

 1 つ目は左で、コースラインに着目しておりとても良いモデルに見えます。

真ん中の例はちょっと疑問ですね。中心線の周りや壁に少しハイライトが当たっていますが、全体的には前方の何もない道路に焦点を当てているようです。ログデータなどの他の情報がない場合は、このモデルをさらに訓練したいと思います。

一番気になるのは、最後の右側の例です。センターラインやサイドラインにハイライトが入っていますが、それよりも草むらや壁やそれらのアングルに注目しているようです。このモデルは過学習しており道路の特徴以外で判断していると言えるでしょう。過学習を解消させるにはこのモデルをさらに別のコースで学習させた方がよいでしょう。


4. おわりに

いかがでしたでしょうか。
この記事によって AWS DeepRacer リーグでより良い成績を残すためのヒントとなれば幸いです。

上述のとおり、5 月 11 日~ 12 日開催予定の AWS Summit Online では当記事の内容をオンデマンドのワークショップで詳しく解説しますのでぜひ AWS DeepRacer ゾーンにお立ち寄りください。2021 年の AWS DeepRacer リーグは誰でも参加できるオープン部門と、オープン部門で好成績を残したレーサーが進出できるプロ部門という 2 つの部門ができました。オープン部門で毎月のレースで上位 10 % 以内にランクインすれば、プロ部門に進むことができます。プロ部門に進んだ方には公式グッズが多数入った「AWS DeepRacer Pro ウエルカムキット」が贈られます。2021 年のリーグではこのほかにも多数の賞品がラインアップされ、賞品獲得チャンスが昨年の 5 倍になっています。ぜひ、上位を目指して頑張ってください !

2021年のDeepRacer リーグの参加要領はこちら からご確認ください。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

プロフィール

卜部 達也
アマゾン ウェブ サービス ジャパン合同会社
機械学習ソリューションアーキテクト

公立研究所で化学センサーの研究開発、企業研究所で自動運転の研究開発を経て 2020 年から現職。主に製造業のお客様への機械学習の導入・運用支援を担当。
趣味は、ネットオークションでジャンク品を購入して直したり直せなかったりすること。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する