とりあえず完走できるDeepRacerの報酬関数と設定を晒してみる

ども、さっきーです。

昨年のAWS Summitでリリースされ、一部界隈では盛り上がっているAWS DeepRacerですが、先週末のAWS Summit Tokyoでは国内初となる実際の車を使ったレースが開催されて、これまた一部界隈では盛り上がっています。

さっきーも強化学習の勉強を兼ねて仮想環境でのレースにチャレンジしてみたのですが、これが恐ろしく難しい・・・
ワタクシのやり方がマズいのか、デフォルトの設定でやっても完走できないのです。
強化学習の専門家でもなく、プログラムすらろくに書けないからかもしれませんが・・・
一番簡単なコースさえ完走するのに一苦労した&詳細な設定を晒している所が見当たらなかったので、ワタクシの場合を晒しておきます。
たぶん、というか間違いなくもっと良いコードはありますが、そもそも完走すらできなくて何をどうすればイイの?状態の方の助けになればと。

ちなみに、下記の設定は、「re:Invent 2018」コース向けなので、現在オンラインレースで使われている「Kumo Torakku Training」には全くもって対応しておりません。(コース半分くらいので脱落)
順調に学習していれば「re:Invent 2018」のコースを20秒前後で完走してくれるハズです。

Environment simulation

re:Invent 2018

Action space

Maximum steering angle : 30 degrees
Steering angle granularity : 5
Maximum speed : 5 m/s
Speed granularity : 2

Reward function

def reward_function(params):
import math

# トラック上のwaypointと直近のwaypoint、およびコース上の基準軸に対する車体の向きをparamsから取得
waypoints = params['waypoints']
closest_waypoints = params['closest_waypoints']
heading = params['heading']

# 規定の報酬を設定する
reward1 = 1.0

# 現在の位置から最も近い次のwaypointと前のwaypointを取得する
next_point = waypoints[closest_waypoints[1]]
prev_point = waypoints[closest_waypoints[0]]

# 前のwaypointから次のwaypointに向かう角度(radian)を計算する
track_direction = math.atan2(next_point[1] - prev_point[1], next_point[0] - prev_point[0])
# degreeに変換
track_direction = math.degrees(track_direction)

# コース上の基準軸に対する車体の向きと直近のwaypointを繋ぐ向きの差分を取る
direction_diff = abs(track_direction - heading)

# 算出した方向の差分から車体の向きが大きくズレている場合にペナルティを与える
# 閾値の設定はコースの種類によって調整が必要
DIRECTION_THRESHOLD = 10.0
if direction_diff > DIRECTION_THRESHOLD:
reward1 *= 0.5

# コース幅、コースのセンターラインからの距離を取得する
track_width = params['track_width']
distance_from_center = params['distance_from_center']

# センターラインからの距離に応じて3つのマーカーを作成
marker_1 = 0.2 * track_width
marker_2 = 0.4 * track_width
marker_3 = 0.5 * track_width

# センターラインに近いほど高い報酬を設定
if distance_from_center <= marker_1:
reward2 = 1.0
elif distance_from_center <= marker_2:
reward2 = 0.5
elif distance_from_center <= marker_3:
reward2 = 0.1
else:
reward2 = 1e-3 # クラッシュもしくはコースアウトなので報酬を低くする

# 車体の向きによる報酬とセンターラインからの距離に応じた報酬を掛け合わせる
reward = reward1 * reward2

return reward

Hyperparameters

設定変更なし

Stop conditions

Maximum time : 120 mins

上記設定した後に学習をかければ一応は完走できるモデルが出来ているハズです。
学習は2時間も要らないかもしれませんが・・・

ちなみに、ワタクシは「Kumo Torakku Training」を完走するべくトライ中ですが、未だに出来ておりません・・・orz

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です