fu3ak1's tech days

何事もシンプルに。主にAWS関連の記事を書いています

DeepRacer入門 強化学習モデルを作成してレースに出場してみる

DeepRacerとは

AWS DeepRacer は、強化学習に対応した 1/18 スケールの完全自律型レースカーで、強化学習を学ぶためのサービスです。 自動運転ってワクワクしますよね。

モデルを作成してレースに出るまでの流れ、始め方を本記事にまとめておきます。

なお、DeepRacerでは報酬関数をどううまく書くかが重要ですが、今回は報酬関数の詳細(どう書いたら速くなるのかなど)は記載しません。私もまだまだ初心者なので教えてほしいです。

f:id:fu3ak1:20200831123133p:plain

aws.amazon.com

強化学習Reinforcement Learning)とは

強化学習は、機械学習の分野の1つです。強化学習のほかには、「教師あり学習(Supervised Learning)」「教師なし学習(Unsupervised Learning)」という分野があり、これらと比較するのがわかりやすいかなと思います。

教師あり学習は、画像から有名人の情報を判別するといった、正解があるデータ(教師データ)に対して学習するものです。

教師なし学習は、複数ユーザーのグループ分けなど、正解のないデータに対して学習をするものです。分けられたグループは元々正解があるわけではなく、単に似ているユーザーをグループ分けすることになります。

DeepRacerで使用する強化学習は、価値を最大化する学習方法で、教師あり学習に似ています。ある環境の中で、目的として設定された「報酬」を最大化する学習を行います。例えばDeepRacerでは、道から外れずに走れたら高報酬といった形で報酬を付与していきます。特に正解である道筋を示さない(教師データがない)という点で教師あり学習とは異なります。

DeepRacer 開始(モデルの作成まで)

それでは始めていきます。まずはDeepRacerの画面に遷移します。現在サポートされているリージョンは「バージニア北部」のみのためご注意ください。

f:id:fu3ak1:20200831141016p:plain

agentの作成

agent=自分専用の車です。デフォルトで「The Original DeepRacer」というものがあり、それを使用しても良いのですが、自分で作っておいたほうが愛着がわきますので作っておきましょう。

Your garage → Build new vehicleの順で選択します。

f:id:fu3ak1:20200831142458p:plain

今回は一番シンプルなtime trialレースを目的とするため、スペックもシンプルにしておきます。 カメラスペックはデフォルトの状態でNextをクリックします。

f:id:fu3ak1:20200831142901p:plain

次にAction spaceを設定していきます。報酬関数を書く際もここの数値は重要になってきます。 下記4つの値をインプットとして入力します。

  • Maximum steering angle (ハンドル角度の最大値)
  • Steering angle granularity (ハンドル角度増減の粒度)
  • Maximum speed(最大スピード)
  • Speed granularity(スピード増減の粒度)

カーブの多い複雑なコースなどを選択する場合は粒度の項目を増やしても良いかもしれませんが、最初はデフォルトで良いと思います。最大スピードはデフォルトの1m/sでは遅いので3か4くらいが良いと思います。

f:id:fu3ak1:20200831143611p:plain

上記項目を入力に応じて、agentが取りうる行動のリストが表示されます。 粒度に応じてリストの数も変動する形ですね。最大スピードだけ3に変えると以下のようになると思います。

f:id:fu3ak1:20200831143954p:plain

最後に名前と色を決めて完了です。今回はオレンジにしてみました。

f:id:fu3ak1:20200831144225p:plain

良い感じでできていますね。後から編集も可能です。

f:id:fu3ak1:20200831144307p:plain

モデルの作成

強化学習のモデルを作成していきます。Your models → Create modelで作成画面へ遷移します。

f:id:fu3ak1:20200831144542p:plain

モデルに任意の名前をつけて、

f:id:fu3ak1:20200831144757p:plain

学習対象のtrack(コース)を選択します。出場レースが決まっている場合はそのレースで使用されるtrackを選択すると良いかと思います。 例えば8月開催中の「2020 September Summit Online Qualifier」であれば、「2019 DeepRacer Championship Cup」というtrackになります。

f:id:fu3ak1:20200831145122p:plain

次の画面へ遷移して、Race TypeとAgentを選択します。 今回はRace Typeでは一番シンプルなTime trialを選択します。Agentでは先ほど作成した自分のAgentを選択します。

f:id:fu3ak1:20200831145157p:plain

次が報酬関数の設定です。一番重要なところです。 初めてやる方は、「Reward function examples」からサンプルの関数を取得してそれをそのまま使うか少し修正するぐらいが良いかと思います。

f:id:fu3ak1:20200831145456p:plain

デフォルトでは「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)

この関数はシンプルで、agentの位置と道の中央の距離が短いほど(より中央にいるほど)高報酬となっています。

  • 中央との距離がトラック幅の10%以下であれば1.0の報酬
  • 中央との距離がトラック幅の25%以下であれば0.5の報酬
  • 中央との距離がトラック幅の50%以下であれば0.1の報酬
  • それ以外は0.001の報酬

DeepRacerからは様々な入力パラメータが提供されているので、このパラメータをうまく使って報酬関数を作成していくことになります。

docs.aws.amazon.com

報酬関数を設定したら次の項目に進みます。 Training algorithm and hyperparametersの項目は上級者向けなので、デフォルトのまま進みます。

f:id:fu3ak1:20200831153249p:plain

Stop conditionsでは学習時間(学習を止める時間)を設定します。 最初はデフォルトの60分で良いと思いますが、シンプルな報酬関数であれば、120分くらいにしても良い感じで学習してくれるようです。

f:id:fu3ak1:20200831154155p:plain

作成したモデルを自動的にレース登録することも可能なようですが、ここでは無効にしておきます。 ここまででモデルの設定項目は終了です。Create Modelをしていきます。

f:id:fu3ak1:20200831154334p:plain

学習が始まっていきます。↓の画面は学習終了後の画面ですが、学習中は左のグラフが更新されていくとともに、右側に学習中の運転シミュレーションが動画で再生されます。(学習が終了すると動画は再生できません)

f:id:fu3ak1:20200831155056p:plain

シミュレーションはこんな感じです。最初は失敗ばかりでかわいいです。

f:id:fu3ak1:20200831155307p:plain

Stop conditionsで設定した時間(デフォルト60分)が経過すると学習が終了します。 結果の見方ですが、ざっくり言うと左側のグラフが全体的に右肩上がり(まだ向上の余地がありそう)であれば、 作成したModelをCloneして追加学習してみて良いと思います。 逆に、グラフが発散していたり収束しきっている場合は、別の報酬関数で追加学習したり、ハイパーパラメータを調整すると更に向上できる可能性があります。

f:id:fu3ak1:20200831155642p:plain

学習が完了したら、モデルのEvaluation(評価)を行っていきます。対象のコースと評価回数、Race typeを選んで、Start evaluationをクリックします。評価回数はデフォルトの3回でも良いですが、より多くの評価結果を見るのであれば最大の5回がおススメです。 評価回数以外は学習時と同じものを選びます。

f:id:fu3ak1:20200831160022p:plain

f:id:fu3ak1:20200831160044p:plain

f:id:fu3ak1:20200831160215p:plain

Evaluationが始まると、学習時と同じようにシミュレーション中の動画が再生されます。(Evaluationが終了すると動画は再生できません)

以下は評価後の画面です。1度もゴールできていないことがわかります。 全てのEvaluationで100%(ゴール)にする必要はないですが、平均で70~80%は超えておいたほうが良いかなという印象です。 全て100%になっていると、そのコースに対して過学習になっている可能性もあるので、難しいところです・・ (トレーニングと実際のレースでコースの形状が変わる場合など)

f:id:fu3ak1:20200831160334p:plain

長くなりましたがこれでモデルの作成完了です。これでレースに出場できます。 満足のいく結果が出なかった場合も、とりあえずレースに出場してみると良いかなと思います。

レースに出場する

モデルが出来たら、レースにモデルを提出するだけです。 今回はAWS Summitのレースに出場してみます。

f:id:fu3ak1:20200901132051p:plain

作成したモデルを選択して、Submit Modelをクリックします。 初回はRacer Nameを入力することになります。一度決定したRacer Nameは変えれないので注意してください。

f:id:fu3ak1:20200901130954p:plain

モデルの提出後、しばらくすると評価が完了し、自分の順位とタイムが表示されます。 16位/20、下のほうですね・・ (本記事で作成したモデルとは異なるモデルで挑んでいます)

f:id:fu3ak1:20200901132929p:plain

下部にあるWatch videoをクリックすることで、自分の走りっぷりを動画で見ることができます。 愛着わきますね!

f:id:fu3ak1:20200901133109p:plain

以上です!モデルが改善できたら再度モデルをレースに提出することができます。

料金について

料金は以下の通りです。公式サイトが一番わかりやすいと思います。 f:id:fu3ak1:20200901133509p:plain

一番時間がかかるのがトレーニングですね。Stop conditionsを1時間で設定した場合は学習のみで3.5USD発生することになります。

初めて利用する場合は以下のように無料利用枠が設定されていますので、10時間以内の学習、評価であれば無料で利用できます。 1回レースに出るくらいであれば充分ですね。

f:id:fu3ak1:20200901133852p:plain

まとめ

DeepRacerや機械学習なんもわからんていう人も、初回レース出場までであれば、あまり難しく考えずにできると思います。 一度覚えたら報酬関数を作りこんで、学習をいっぱいして、上位に組み込みたいですね。料金には注意しましょう・・