【DeepRacer】ワークショップに参加してきたので初心者なりに色々いじってみる #AWSSummit #AWSDeepRacer #AWSDeepRacerJP

2019.06.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、Mr.Moです。
2019年 6月 12日(水) 〜 14日(金) 幕張メッセにてAWSに関する情報交換やコラボレーション、学習を行うことができる日本最大級のカンファレンス AWS Summit Tokyo 2019が開催されました。

そこで強化学習を楽しく学べるサービスDeepRacerのワークショップに参加してきました。さっそく学んだことをもとに自分なりにいじっていきたいと思います。
ちなみにSummit中のDeepRacerリーグの雰囲気は下記をご参照ください。

DeepRacerワークショップの概要

AWS DeepRacer は、 1/18 スケールのレーシングカーを利用して、強化学習を楽しみながら理解できるサービスです。強化学習に必要な環境はすべて AWS DeepRacer によって提供され、ユーザはレーシングカーを上手く走らせるための強化学習に集中することができます。AWS DeepRacer ワークショップでは、強化学習を体験しながら、実際のレーシングカーを走らせる方法をお伝えします。具体的には、強化学習の基礎的な内容を紹介し、コンソールの利用方法や、レーシングカーが走る様子をシミュレーションで確認する方法をご説明します。

スピーカー

アマゾン ウェブ サービス ジャパン株式会社
技術統括本部
ソリューションアーキテクト

鮫島 正樹


ワークショップの詳しい内容は下記の記事をご参照ください。

本記事の目的

世界リーグで勝てる完全自走型のMyレーシングカーのモデルを作るため、まずは初心者なりの第一歩を踏み出します。 また、そのために何をしないといけないのかをワークショップでいただいた情報から探してみたいと思います。

今回選択する仮想コースは下記の「re:Invent 2018」です。(ちなみに、モデルのトレーニングを行うときは、参加したいレースのトラックに似ている仮想コースを選択するのが良さそうです)

ワークショップのドキュメントを読む

ワークショップのドキュメントはこちらです。

ドキュメントを見ると下記の設定を主にいじっていくことが分かります。

  • Action space
  • 報酬関数
  • ハイパーパラメータ

Action space を設定してみる

トレーニング中や、トレーニング済みのモデルから選択したAction spaceを設定します。Actionとは、速度とステアリング角の組み合わせです。クルマが取れる行動を定義します。

Steering angle granularity の値は上記の赤丸と青丸のカーブがだいたい同じ角度に見え、するとパターンはあまり必要無さそうと思い 30度,15度、0度 の角度があれば充分と判断、設定値を「5」としました。 Maximum speedの値は長いストレートなトラック部分を活かすためにMaxである「8」を設定。Speed granularityは「2」でもいけるかと思いましたが、上記の赤丸部分がスピードをそこそこ落とさないと曲がるのが厳しいかなぁと思い悩んだ末「3」と設定しました。

報酬関数を作ってみる

強化学習において、報酬関数はある行動から得られる結果を評価し、その行動に報酬を与えます。

報酬関数で使える変数を見てみる

変数名 シンタックス 説明
all_wheels_on_track params['all_wheels_on_track'] Boolean 4輪全てがトラック(走行路または線)上にある場合、all_wheels_on_trackTrue となります。1輪でもトラックの外にある場合、all_wheels_on_trackFalse となります。
x params['x'] Float 車の前車軸の中心の x 座標をメートル単位で返します。
y params['y'] Float 車の前車軸の中心の y 座標をメートル単位で返します。
distance_from_center params['distance_from_center'] Float [0, track_width/2] トラックの中心からの絶対距離。トラックの中心は全ての waypoints の中心が繋げられた線により定義されます。
is_left_of_center params['is_left_of_center'] Boolean 車がトラックの中心から左側に位置するかどうかを示します。
is_reversed params['is_reversed'] Boolean 車がトラックの順方向でトレーニングしているのか、逆方向でトレーニングしているのか。
heading params['heading'] Float (-180,180] 車の先頭の向いている角度を示します。x 軸が増加する方向(y 軸は固定)に向いている場合、0を返します。y 軸が増加する方向(x 軸は固定)の場合、90 を返します。y 軸が減少する方向(x 軸は固定)の場合、-90 を返します。
progress params['progress'] Float [0,100] 完了したトラックの割合をパーセンテージで示します。100 はラップの完了を示します。
steps params['steps'] Integer [0,inf] 完了したステップを返します。 1ステップは1つの (state, action, next state, reward) タプルに対応します。
speed params['speed'] Float 期待する車のスピードがメートル/秒で返されます。これは選択されたアクションに結び付けられます。
steering_angle params['steering_angle'] Float 度単位で表される、ステアリングの角度。定義した Action Space に紐づきます。注: 正の値は左向きを表し、負の値は右向きを表します。これは2次元平面上で処理されます。
track_width params['track_width'] Float トラックの幅を表します
waypoints params['waypoints'] for the full list or params['waypoints'][i] for the i-th waypoint List トラックの中心の順序付きリストで、各要素は (x, y) 座標です。リストのインデックスは 0 から始まります。
closest_waypoints params['closest_waypoints'][0] or params['closest_waypoints'][1] Integer 車の現在地から最も近い waypoint のインデックス。params['closest_waypoints'][0] は後方のインデックスを、params['closest_waypoints'][1] は前方のインデックスを示します。

左曲がりオンリーのコースであればis_left_of_centerを使えば簡単にインコースを攻められそう!と思いましたが「re:Invent 2018」の仮想コースは右曲がりもありますね。。そもそもインコースを攻め続ければ良いタイムに繋がるというものでもないかもしれません。

では、トラックのどの段階に来た時に道幅のどの位置にいるのが良いかを細かく制御するには closest_waypoints が下記の図のようなイメージとすると使えそうでしょうか。あと distance_from_centertrack_widthis_left_of_center あたりも必要になってくるのではないかと思います。

ただ、多くのパターンを網羅するような報酬関数は関数を作る工程だけで相当時間を使いそうですね。。

最終的に作った報酬関数

最終的に4輪全てがトラック上にあればOKにしました、自由です!細かく指示するよりスピードにのってもらって、あとは臨機応変に対応してもらおうという作戦です。この方が強化学習っぽい感じしませんか?(筆者は強化学習初心者です)

def reward_function(params):
    # パラメーターのセット
    all_wheels_on_track = params['all_wheels_on_track']
    speed = params["speed"]

    # デフォルトの報酬
    reward = 1e-3

    # 4輪全てがトラック上にある時にスピードにおうじて報酬をUP
    if all_wheels_on_track:
        reward = (speed**2)/100

    return float(reward)

学習結果

4時間学習させた結果が上記です。AWS Summit Tokyo 2019 のリーグの順位でいうと50位〜100位ぐらいでしょうか。普通ぐらいのタイムになりますね。 また、今回は使いませんでしたがprogressstepsといった報酬関数で使える変数にも可能性を感じています。

ちなみにハイパーパラメータはいじってません。まずは「Action space 設定」と「報酬関数」を試行錯誤した後にハイパーパラメータの設定をいじるのがおすすめの流れとのことでした。

作業後のお掃除

初期Setup時に作成したAWSの各種リソースで課金が発生し続けている状態です。作業が終わったらResetして不要な課金を抑えましょう!

ちなみに

DeepRacerではcloneする機能があり、こちらを使うと前回のモデルから追加学習できるみたいです。 学習の仕方も一気に実施したり、追加学習を駆使したり工夫する余地がありそうですね。

まとめ

ワークショップの説明が非常に丁寧だったのとDeepRacerが強化学習を上手くラップしてくれているおかげで初心者でも簡単に始められました。また実際に動くものを試行錯誤して作っていくのは楽しいですね。ドハマリすると永遠に時間を費やしそうです(笑)。