AWS再入門ブログリレー AWS DeepRacer 編

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2019』の 16 日目のエントリです。

昨日は まさを『Amazon WorkSpaces』編 でした。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2019 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。16 日目のテーマは・・・「再入門」の題材としては少し異色かもしれない『AWS DeepRacer』です。

目次

DeepRacer とは

AWS DeepRacer とは、昨年の re:Invent 2018 で発表された AWS の新しい機械学習関連サービスです。

AWS の機械学習関連サービスは、大きく以下の 3 つのカテゴリーに分けられます。

AI サービス
「画像認識」「言語翻訳」など特定分野について学習済みの AI をサービスとして提供するもので、機械学習の経験が無くてもすぐに利用できる。
(該当サービス: Amazon Rekognition、Amazon Translate、など)
ML サービス
機械学習の専門家 (データサイエンティスト) が機械学習を行うにあたりインフラの構築や管理をする必要がなく利用することができるマネージドな ML サービス。
(該当サービス: Amazon SageMaker)
ML フレームワーク/コンピューティングサービス
TensorFlow、PyTorch などの機械学習フレームワークや、GPU や FPGA などのコンピューティングインフラを提供する。
(該当サービス: AWS 深層学習 AMI、Amazon EC2 GPU インスタンス、など)

AWS DeepRacer は、これらのいずれにも属さない新しいサービスであり、 「あらゆるユーザーが、機械学習を楽しみながら学ぶことができる」 ことを目的として提供されています。

DeepRacer が扱う機械学習の技術範囲

ここで、「機械学習」「深層学習 (ディープラーニング)」「強化学習」といった AWS DeepRacer で使われる技術用語について簡単に整理しましょう。

機械学習 (Machine Learning):
いわゆる「人工知能 (AI)」を実現する手法のうち、大量のデータを機械的に処理して特徴を見出すことによって問題解決を行う手法のこと。
深層学習 (Deep Learning):
機械学習のうち、多層ニューラルネットワークを用いた機械学習手法のこと。

機械学習 (深層学習を含む) で採用されている学習アルゴリズムは、いくつかに分類されます。

教師あり学習 (Supervised Learning):
人間がデータと同時に「答え」を与えて、それをもとに学習をさせる。
例:「犬と猫の写真を学習させて、画像認識をさせる」
教師なし学習 (Unsupervised Learning):
データをひたすら与えて、特徴や傾向を抽出させることで学習をさせる。
例:「多数の購買履歴データを入力して、そこから消費者の購入傾向を導出して商品のレコメンデーションを行う」
強化学習 (Reinforcement Learning):
学習中の機械が判断した行動に対して「報酬」を与える (または与えない) ことにより、より良い行動が何であるかを学習させる。

AWS DeepRacer の自動運転学習は、学習手法としては「機械学習」に含まれる「深層学習」に分類され、学習アルゴリズムとしては「強化学習」を採用しています。

DeepRacer サービスの概要

さて、みなさんの中には、「DeepRacer」と聞くと下の写真のような「自動運転ミニチュアカー」をまず思い浮かべる方も多いのではないかと思います。

(写真は Amazon.com より引用)

実は、この写真のモノは、正式には「AWS DeepRacer Vehicle」(日本語では「AWS DeepRacer 車両」「AWS DeepRacer 自動車」) と呼ばれ、AWS DeepRacer サービスを構成する 1 要素に過ぎません。

では、AWS DeepRacer サービスの全体はどのようなものかと言うと、下の図のようになっています。

図に示した各フェーズについて順に説明します。

「学習」フェーズ

仮想空間に「仮想サーキット」を構築し、その上で「仮想車両」を走らせることにより、強化学習による自動運転の学習を行います。

学習は AWS DeepRacer のマネージメントコンソールから GUI 操作で行い、簡略化された (それでいて奥が深い) 数種類のパラメーターを設定するだけでよいため、機械学習に触れたことがない人でも容易に機械学習を始めることができます。

強化学習を行うと、学習の結果として「学習モデル」(「推論モデル」とも言う) が生成されます。
強化学習の特徴として、学習で得られた「学習モデル」をベースに学習を繰り返し重ねて行うことで、文字通り学習モデルを「強化」することができます。

なお、AWS DeepRacer の学習フェーズでは、仮想空間の構築に「AWS RoboMaker」サービス、強化学習の実施に「Amazon SageMaker」サービスがバックエンドとして使われています。

「評価」フェーズ

学習の結果として得られた「学習モデル」を使ってテスト走行を行い、学習がどの程度うまく進んでいるのか実際に試すことができます。

評価は、仮想環境で行うものと、実環境で行うものがあります。

仮想環境

仮想環境で行うものは、学習フェーズと同様に「仮想サーキット」上で「仮想車両」を走らせることで走行テストを行います。

評価の結果は、「コースの 1 周をコースアウトすることなくどこまで走破できたか」「1 周を完走できた場合、そのラップタイム」という形で確認ができます。
評価結果を参考にして、次の学習の方針を検討したり、次で説明する「レース参加」へ進むかどうかの目安としたりします。

実環境

実環境で行うものは、学習フェーズで得られた「学習モデル」(バイナリファイル) を「AWS DeepRacer Vehicle」のメモリに転送し、学習モデルに従って「AWS DeepRacer Vehicle」が自動運転を行うことで走行テストを行います。

※ 現時点 (2019年7月23日時点) では日本国内で AWS DeepRacer Vehicle が販売されていないため、実機を用いた走行テストは AWS 主催イベントなど限定された場面のみで可能となっています。

「レース参加」フェーズ

「評価」フェーズの結果で「ある程度学習ができた」と判断できれば、いよいよ、全世界のレーサーがしのぎを削る「AWS DeepRacer リーグ」にチャレンジしましょう。

仮想環境

仮想環境で行われているものは「AWS DeepRacer リーグ バーチャルサーキット」と呼ばれ、2019 年 5 月から 10 月まで、月替わりで舞台となるコースを替えて開催されています。

バーチャルサーキットは、最初に AWS DeepRacer サービスを利用している AWS アカウントで参加登録を行い、以後は何度でも走行エントリを行うことができます。
もし完走しなかったり、完走してもタイムが前回より遅かったとしても、ペナルティーとなることはありません。
複数回の走行エントリを行った場合、最も速いタイムが自分の成績としてランキングされます。
ですので、参加者は「学習」フェーズで学習モデルを育て、「評価」で学習の進行度を確認し、「レース」にチャレンジし、また「学習」「評価」「レース」と繰り返すことで、ランキングを上げていくこともできます。

各月の終わりには最終ランキングが発表され、優勝者には「re:Invent 2019」で開催される決勝リーグへの参加資格が与えられます。(参加費・交通費・宿泊費は AWS が負担!)
また、上位入賞者には副賞として AWS DeepRacer Vehicle の実機が進呈されます。

実環境

実環境で行われているものは「AWS DeepRacer SUMMIT サーキット」と呼ばれ、世界の各都市で開催されている AWS Summit の会場内で、AWS DeepRacer Vihecle 実機と物理コースを用いて開催されています。(日本でも 6 月の「AWS Summit Tokyo 2019」で SUMMIT サーキットが開催されました)

SUMMIT サーキットは基本的に各 SUMMIT で 1 回限りのチャレンジになるため、仮想環境で十分に育て上げた学習モデルを投入して挑むレーサーが多いようです。

SUMMIT サーキットも同様に、優勝者には「re:Invent 2019」で開催される決勝リーグへの参加資格が与えられます。

実際に始めてみよう

では、実際に AWS DeepRacer サービスを触ってみることにしましょう。

AWS マネジメントコンソールにサインインした後、右上のリージョン選択から「米国東部 (バージニア北部)」を選択します。(AWS DeepRacer は現時点ではバージニア北部リージョンのみで利用可能です)

サービス一覧から AWS DeepRacer を選択し、「Get Start」をクリックします。

初めて AWS DeepRacer サービスを利用する際は、AWS DeepRacer に必要な各種リソース (IAM ロール、S3 バケットなど) を準備する必要があります。
「Step 0: Create account resources」の「Create resources」をクリックすると自動的に作成が行われます。(数分間かかるので終わるまで待ちます)

リソースの準備が完了しましたら、「Step 2: Create a model and race」の「Create model」をクリックします。

「学習」を行う

「Create model」の画面に遷移します。
「Account resources」(の作成) は既に済んでいるので、下にスクロールします。

「Model name」(モデルに付ける一意な名前) と「Model description」(モデルの説明;省略可) を入力します。

「Environment simulation」では、学習させたいコースを選択します。
ここでは、現在「AWS DeepRacer リーグ バーチャルサーキット」で開催中 (記事執筆時) のコースに合わせて「Empire City Training」を選択してみましょう。

次に、「Action space」(アクションスペース) のパラメーターを設定します。
アクションスペースのパラメーターの意味は後ほど詳しく説明しますが、ここでは「Maximum speed」のみデフォルトの「1 m/s」から「4 m/s」に変更します。(速度が「1 m/s」だとあまりにも遅いため)

次に、「Reword function」(報酬関数) の設定を行います。
報酬関数は Python 言語で記述された関数となっていて、直接コードを入力するか、または、いくつか用意されているサンプルコードから選択することができます。
報酬関数についても後ほど詳しく説明しますが、ここでは表示されている内容のまま変更せずに進めます。

次に、「Hyperparameters」(ハイパーパラメーター) の設定を行います。
ハイパーパラメーターは、機械学習のチューニングを行うためのパラメーターですが、ここではデフォルトのまま変更せずに進めます。

最後に、学習を行う時間を「Maximum time」で指定します。
ここではデフォルトの「60 分」のままにします。
全ての設定パラメーターを指定しましたら、「Start training」をクリックすると学習が開始されます。

学習が開始されると、以下のような画面が表示されます。

左側に表示されているグラフは「報酬関数」によって与えられた「報酬」の推移です。
学習中は、しばらくコース内を走行して報酬が上がり、コースアウトすると報酬がガクっと下がり、またコース内を走行して報酬が上がり、・・・の繰り返しとなるためギザギザしたグラフになることが多いです。
全体的な傾向として、グラフが徐々に右肩上がりになっていれば学習が上手く行っており、グラフが水平だったり下がったりしている場合は学習が上手く行っていない、というように学習具合の目安になります。(一概には言えませんが)

右側には、仮想空間での仮想車両の車載カメラが捉えている映像が表示されます。
仮想車両が頑張って(?)学習している様子をリアルタイム見ることができて楽しめますが、学習具合の判断にはあまりなりません。
学習具合を詳細に分析するには、本記事の最後の方で紹介する「ログ分析」を行うことが効果的です。

左下には、学習の経過時間が表示されます。
学習の開始時と終了時にはそれぞれ数分間の準備・後処理時間が発生します。

なお、学習中にこの画面を閉じてしまっても、学習はバックグラウンドで継続しますので、ご安心ください。

「評価」を行う

学習が完了すると、「Start evaluation」ボタンを押すことができるようになっていると思います。
ここで「Start evaluation」をクリックすると評価を行うことができます。

コースは学習の時と同じ「Empire City Training」を選びます。

評価の回数 (コース周回数) を「3 ~ 5」の範囲で選択できますが、特に理由が無ければ最大の「5」を選択しましょう。
「Start evalustion」をクリックすると評価が開始されます。

評価が開始されると、以下のような画面が表示されます。

左側には、学習の時と同様に、仮想車両の車載カメラ映像が表示されます。
右側には、評価の「結果」が順次表示されていきます。

学習の時と異なるのは、学習は走行・コースアウトを繰り返しながら指定時間内で学習を繰り返しますが、評価は「コース 1 周をコースアウトすることなく走破する」または「途中でコースアウトした時点」で 1 回の評価が完了します。そして、指定した回数だけ評価が行われると、評価全体が終了します。

評価の結果を確認してみましょう。

評価の回数分の「Time」と「Trial results」が表示されています。

「Trial results」は、コースの何パーセント地点まで走破できたかという意味です。すなわち、「100%」であればコースを完走できたという意味であり、100% 未満は途中リタイアということになります。

「Time」は、評価の開始から終了までの所要時間です。すなわち、コースを完走できた場合はコースのラップタイムということになります。(途中リタイアした場合もタイムが表示されていますが、あまり意味が無いので無視して構いません)

今回の結果を見ると、5 回中 2 回だけ完走したことが分かります。また、ラップタイムは 2 回とも 25 秒台だったことが分かります。

「学習」を繰り返して学習モデルを鍛える

一応完走はできたものの、完走率で言うと 40 % というのは、まだまだ「AWS DeepRacer リーグ」に挑戦するには心許ないです。

ということで、もう少し学習モデルを「鍛えて」みましょう。

学習モデルに対して学習を重ねて行っていく際、「クローン」という操作を行います。
クローンは文字通り学習済みモデルの「複製」を作成して、複製したモデルをベースに学習を行うことです。

何故「クローン」ではなく「上書き」で学習が行えないのか? と疑問に思うかもしれませんが、クローンを行うことで、学習を進める過程で異なる学習方針に分かれた派生をすることができたり、学習が上手くいかなかった場合に以前のモデルに立ち戻って学習をやり直したりすることができるという利点があります。

学習済みの学習モデルで、右上の「Clone」をクリックします。(学習モデルは「評価」済みでも未評価でもどちらでも構いません)

新規に学習モデルを作成する時と同じような設定画面が表示されます。

新規作成時と異なるのは、クローンの際には設定パラメータのうち「アクションスペース」のみ変更ができない (最初に学習モデルを作成した時の設定になる) という点です。(これに関しては後ほど説明します)

アクションスペース以外のパラメータは、変更して学習の方向性を変えることもできますが、ここでは全てのパラメータを変更せずに進めます。(すなわち前回と同じ学習方針で学習を重ねる)

学習が完了しましたら、初回の学習時と同様に、学習済みモデルを「評価」してみましょう。

評価の結果は以下のようになりました。

完走率は、初回学習時の「5 回中 2 回」から、今回は「5 回中 3 回」に向上しました。
一方、完走時のラップタイムは「26 秒台 ~ 28 秒台」と、初回学習時より少しタイムが落ちる結果となりました。

もう少し学習を進めてみます。

もう 1 度クローンして学習を行い、評価を行います。
3 度の学習を重ねた学習モデルの評価結果は以下のようになりました。

完走率は、「5 回中 5 回」になりました。
しかし、完走時のラップタイムは「28 秒台 ~ 32 秒台」と、更にタイムが落ちてしまいました。

このように、学習を重ねると「完走率」や「ラップタイム」が向上する場合もありますが、逆に低下する場合もあります。
理由はいろいろ考えられますが、例えば、学習モデルがコースアウトしないことを重点に学習した結果、慎重になり過ぎて速度を上げなくなってしまった、などということもあり得ます。

※ 今回の場合は、選択した「報酬関数」のアルゴリズムが「センターラインになるべく沿って進む」というものであったため、コース取りについては積極的に学習したけれども速度については無頓着だったということが原因と考えられます。(報酬関数については後ほど詳しく解説します)

タイムが伸びなかったのは残念ですが、ここで一旦、学習モデルを鍛えるのは一段落しましょう。

「AWS DeepRacer リーグ」に挑戦

さて、とりあえず完走できそうな学習モデルが出来ましたので、いよいよ「AWS DeepRacer リーグ バーチャルサーキット」に挑戦してみましょう。

参加エントリに使う学習モデルを表示して、「Submit to virtual race」をクリックします。

初めて参加エントリを行う際は、自分の「レーサー名」を登録する必要があります。
レーサー名は一度登録すると後から変更できませんので、慎重に入力しましょう。

使用する学習モデルが選択されていることを確認します。
初回エントリ時のみ、規約同意のチェックを入れます。
全て準備が整いましたら「Submit model」をクリックします。

エントリ時にエラーとなってしまう場合があります。はっきりとした原因が分かっていないものが多いですが、いくつか対処法をご紹介します。

  • レーサー名を変えて再登録してみる。
  • 一度キャンセルで抜けて、再度エントリを試みる。
  • 表示上はエラーでも、内部ではレーサーの登録が完了している場合もあります。その場合は、一度キャンセルで抜けて再度エントリすると、既にレーサー名が表示されているので分かります。

バーチャルサーキットでの走行中は以下のような画面が表示されます。結果が出るまでドキドキしながら待ちましょう。

「Status」欄に緑字で「Completed 1 lap」と表示されれば、見事!完走です。
(残念ながら完走できなかった場合は、赤字で「Unable to finish 1 lap」と表示されます)

これでバーチャルサーキットにラップタイムが記録され、ランキング (Leaderboard) に順位が掲載されます。

学習時に設定するパラメーターの説明

ここからは、学習を行う際に設定する 3 種類のパラメーターについて、詳しく説明していきます。

アクションスペース

「アクションスペース」とは、車両が取り得る行動パターンを列挙したものであり、「ステアリング (ハンドル) の角度」と「速度」の組み合わせになります。
(ここでの「速度」は、車両の移動速度というよりは「アクセルを踏み込む強さ」と捉えた方が分かり易いと思います)

「アクションスペース」の定義は、以下の 4 つのパラメーターで行います。

項目 説明 値の範囲 単位
Maximum steering angle 最大ステアリング角度 1 ~ 30 (0.1刻み) ° (度)
Steering angle granularity ステアリング角度の段階数 3/5/7 -
Maximum speed 最大速度 0.8 ~ 8.0 (0.01刻み) m/s
Speed granularity 速度の段階数 1/2/3 -

例えば、「最大ステアリング角度」の値を「30」、「ステアリング角度の段階数」を「5」に指定した場合、取り得るステアリング角度のパターンは次の通りになります。

「-30°」「-15°」「0°」「+15°」「+30°」

同様に、「最大速度」を「6.0」、「速度の段階数」を「3」に指定した場合、取り得る速度のパターンは次の通りになります。

「2.0 m/s」「4.0 m/s」「6.0 m/s」

これらを組み合わせると、アクションスペースは以下のようになります。

アクション番号 ステアリング角度 速度
0 -30° 2.0 m/s
1 -30° 4.0 m/s
2 -30° 6.0 m/s
3 -15° 2.0 m/s
4 -15° 4.0 m/s
5 -15° 6.0 m/s
6 2.0 m/s
7 4.0 m/s
8 6.0 m/s
9 +15° 2.0 m/s
10 +15° 4.0 m/s
11 +15° 6.0 m/s
12 +30° 2.0 m/s
13 +30° 4.0 m/s
14 +30° 6.0 m/s

アクションスペースが上記の時、車両がアクション番号「4」を選択するということは、すなわち「ステアリングを左に 15° 切りつつ、アクセルを 4.0 m/s 相当に踏み込む (または緩める)」ということを意味します。

学習におけるアクションスペースの意味

車両 (学習モデル) は、決められた時間単位において、その時点の状況を示す入力情報に対して「次に取る行動 (アクション)」を選択します。

AWS DeepRacer において「状況を示す入力情報」とは車載カメラの映像です。
実環境 (AWS DeepRacer Vehicle) の場合は、車両に搭載された車載カメラの映像 (を学習に適した解像度・色深度に画像処理したもの) になります。
仮想環境の場合は、仮想空間に構築された 3D 空間を仮想的に撮影した「疑似的な車載カメラ映像」となります。
また、「決められた時間単位」は、車載カメラのフレーム数である「秒間 15 フレーム」となります。

学習を開始した直後は、学習モデルは入力情報に関係なく次に取る行動をアクションスペースの中からランダムに選択して実行します。(まだ何も学習しておらず、行動を選択するための情報を持ち合わせていないため)
しかし、学習が進むにつれ、学習モデルが入力情報に対して「より良い結果となるだろう」と考える行動を選ぶようになっていきます。

アクションスペースの設定の指針

ステアリング角度や速度の段階数を増やしてアクションスペースのパターンが多くした方が、様々な状況に柔軟に対応できるため、より「良い」学習結果が得られることが期待できます。
しかし、アクションスペースのパターンを増やすと、それだけ学習に要する時間 (学習モデルの学習結果が収束するのに要する時間) もかかるということになります。
よって、学習の精度と所要時間とのバランスを考慮してアクションスペースのパターン数を検討するのがよいと思います。

また、アクションスペースは次に説明する「報酬関数」や「ハイパーパラメーター」と異なり、最初に設定したら後から変更することは原則としてできません。
したがって、攻略するコースの傾向 (ストレート中心かカーブ中心か) などによって最初にアクションスペースの設定方針を検討する必要があります。
最初に何度かアクションスペースの設定を少しずつ変えた学習モデルを複数作成し、それぞれの評価を比較することで、適切なアクションスペースを見極めるのもよいかもしれません。(それだけ手間はかかりますが)

報酬関数

「報酬関数」(Reword Function) とは、車両がある「状態」にある時に選択した「行動」に対して、インセンティブまたはペナルティを与えるものです。
報酬関数によって算出された「報酬」(インセンティブまたはペナルティ) は学習モデルにフィードバックされて学習が行われます。

報酬関数は Python 言語で記述された関数です。
関数の入力パラメータ params は Python の辞書オブジェクトとなっており、キー名を指定することで「車両が向いている方角」「コースマップを複数のポイントで表した座標の配列」など、車両の状態やコースの情報に関する各種の値を取り出すことができます。

具体的な入力パラメータの項目と意味については、AWS ドキュメントの下記ページに掲載されています。
AWS DeepRacer 報酬関数の入力パラメータ - AWS DeepRacer

なお、これらの入力値は、車両が車載カメラから取得したり、学習モデルが推論で導き出したものではなく、外部から正確な情報として与えられるものになります。(例えて言うならば、車両に GPS や地図が搭載されているような感じです)

サンプル関数を見てみよう

文書だけでの説明ではよく分からないと思いますので、実際の報酬関数を見ながら、どのように関数が書かれているのか確認してみましょう。

以下に示すのは、サンプルとして用意されている報酬関数のうちの一つ「Follow the center line」(センターラインに沿って進む) です。

def reward_function(params):
    '''
    Example of rewarding the agent to follow center line
    '''
    
    # Read input parameters
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']
    
    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width
    
    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1
    else:
        reward = 1e-3  # likely crashed/ close to off track
    
    return float(reward)

パート毎に見ていきましょう。

    # Read input parameters
    track_width = params['track_width']
    distance_from_center = params['distance_from_center']

まず、最初に、入力パラメータ params からキーを指定して 2 つの値を取り出して、変数に格納しています。

  • track_width : コースの幅 (単位:メートル)
  • distance_from_center : センターラインから車両までの距離 (単位:メートル)
    # Calculate 3 markers that are at varying distances away from the center line
    marker_1 = 0.1 * track_width
    marker_2 = 0.25 * track_width
    marker_3 = 0.5 * track_width

次に、センターラインからの距離に応じた 3 箇所のポイントを「マーカー」として定義しています。
これは、センターラインからの距離に応じて 3 段階の境界線を引くようなイメージです。

  • marker_1 : センターラインから「コース幅の 10%」離れた位置
  • marker_2 : センターラインから「コース幅の 25%」離れた位置
  • marker_3 : センターラインから「コース幅の 50%」離れた位置
    # Give higher reward if the car is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1.0
    elif distance_from_center <= marker_2:
        reward = 0.5
    elif distance_from_center <= marker_3:
        reward = 0.1

センターラインから車両までの距離が、上で定義した 3 段階の「マーカー」(境界線) のいずれの範囲内にあるか、内側 (センターラインに近い順) から順に判定していきます。
そして、センターラインに近いほど、高い「報酬」を与えます。

  • センターラインから車両までの距離が、コース幅の 10% 以内の範囲に収まる場合: 報酬「1.0」
  • センターラインから車両までの距離が、コース幅の 25% 以内の範囲に収まる場合: 報酬「0.5」
  • センターラインから車両までの距離が、コース幅の 50% 以内の範囲に収まる場合: 報酬「0.1」
    else:
        reward = 1e-3  # likely crashed/ close to off track

上記のいずれの条件にも当てはまらない場合というのは、センターラインから車両までの距離がコース幅の 50% を超えている場合です。
センターラインはコースの中央にありますから、センターラインからコース幅の 50% の位置というのは、つまり「ほぼコースから出てしまっている」ということになります。
その場合には、ペナルティとして報酬を「0」にします。

ただし、報酬関数の仕様上、報酬の値を「0」にすることは禁止されています。
そのような場合には、代わりに「限りなく 0 に近い極小値」として「1e-3」を指定します。(1e-3 は 0.001 を表します)

    return float(reward)

最後に、報酬関数の戻り値として、決定した「報酬」の値を返します。

このように、報酬関数では、入力パラメータを使って計算式や条件判断を行い、最終的に「報酬」を決定するプロセスを記述します。

報酬関数の書き方については、前述した AWS ドキュメントのページにも入力パラメータを使った報酬関数の例が掲載されていますので、参考にしてみてください。
AWS DeepRacer 報酬関数の入力パラメータ - AWS DeepRacer

ハイパーパラメーター

上で説明した「アクションスペース」「報酬関数」が機械学習の知識を直接必要としないパラメーターであったのに対して、ハイパーパラメーターは機械学習をある程度理解していなければ設定することが難しいものとなります。

本記事では機械学習の詳しい解説を行わないため (何より私自身がまだ機械学習の初心者であるため)、ハイパーパラメーターの解説については割愛しますが、一つだけ例を挙げてみます。

強化学習で学習を進めていくと、特徴的なデータを過度に学習してしまい正しい推論ができなくなってしまう「過学習」という状態に陥る場合があります。

AWS DeepRacer で言うと、「ヘアピンカーブに差し掛かったら急ハンドルを切る」ということに重点を置いて学習させ過ぎた結果、緩いカーブでも急ハンドルを切ってしまう、といったところでしょうか。(ちょっと怪しいかも・・・)

このような過学習に陥ってしまった場合、ハイパーパラメーターの一つである「エントロピー (不規則性)」を増加して学習させたり、コースを変更した上で「学習率 (Learning rate)」を高くして再学習させたりすることで、学習モデルに強制的に変化を与えて過学習状態からの脱出を試みるという手法があります。

(ただし、基本的には一旦過学習に陥ってしまった学習モデルを改善することは難しいため、「学習させ過ぎないように調整しながら学習を行う」「過学習に陥ってしまったら諦めて学習モデルを作り直す」という方針で進めることを推奨します)

AWS DeepRacer のハイパーパラメーターの詳細については、AWS ドキュメントの下記ページに掲載されています。
AWS DeepRacer コンソールを使用した AWS DeepRacer モデルのトレーニングと評価 - AWS DeepRacer

ランキング上位を目指すために ~ ログを分析しよう

さて、本記事では学習の進み具合を「報酬グラフの傾き具合」や「完走率やラップタイムの推移」という曖昧な情報で判断してしまいましたが、「AWS DeepRacer リーグ」で上位ランキングを狙うためには是非とも「ログの分析」を行って頂きたいと思います。

AWS DeepRacer では、学習時や評価時のログデータが「AWS CloudWatch Logs」に格納されます。
ただ、AWS CloudWatch Logs のコンソールから生のログデータを直接参照しても、そこから「分析」するのは困難だと思います。

そこで、いくつかの「分析ツール」について紹介したいと思います。

AWS 公式ツール

Simulation Run Log Analysis and Visualization for AWS DeepRacer

これは、IPython ベースの分析ツールである Jupiter Notebook を使っており、対話的に分析が行えるのが特徴です。

ただし、ツールの使い方 (ドキュメント) が整備されていないこと、更新頻度があまり良くない (例えば、最新の「Empire City Training」コースの分析に必要なトラックデータが用意されていないなど) といったことなどから、使いこなすのは少々難しいかもしれません。

弊社ブログで紹介している分析ツール/分析手法

弊社ブログ Developers.IO でも、いくつか AWS DeepRacer のログ分析手法を紹介しています。

DeepRacerのモデルの学習状況をCloudWatch Logs Insightsで確認する | DevelopersIO

DeepRacerの走行ログをTableauで分析してみた #AWSDeepRacer #AWSDeepRacerJP | DevelopersIO

DeepRacerの走行ログを Matplotlibで可視化する #AWSDeepRacer #AWSDeepRacerJP | DevelopersIO

ログ分析手法の他にも、弊社ブログでは AWS DeepRacer のノウハウや各種記事を公開しています。
詳しくは特集カテゴリーを参照してみてください。
DeepRacer | 特集カテゴリー | DevelopersIO

DeepRacer の利用料金

AWS DeepRacer の利用料金については、AWS 公式サイトの下記ページを参照してください。
料金 - AWS DeepRacer | AWS

まとめ

ということで、AWS DeepRacer についての再入門ブログならぬ「初入門ブログ」(?) をつらつらと書いてみました。

機械学習の超初心者である筆者が、とりあえず AWS DeepRacer を始めてみようと思って「最低限」調べて書いた記事ですので、機械学習そのものに関しては「ほぼ」情報が無い記事になってしまいました。

それでも、私と同じような「機械学習よく分かんないけど、とりあえずやってみたい」と思った読者の方が、AWS DeepRacer を始めてみるきっかけになって頂けますと幸いです。

明日 (7/24) は ちゃだいん『AWS WAF』編 です。お楽しみに!