#使ったモデル
強化学習もAWSも未経験だったのでまずAWSの公式ドキュメントを参考にモデルを作ってみました。
コース上に4輪が留まる且つ直近のwaypointの角度と車体の角度に大きなずれがなければ高い報酬を得るように設計しました。コース内に留まることを目的としたモデルです。
def reward_function(params):
import math
# paramsの取得
waypoints = params['waypoints']
closest_waypoints = params['closest_waypoints']
heading = params['heading']
all_wheels_on_track = params['all_wheels_on_track']
distance_from_center = params['distance_from_center']
track_width = params['track_width']
# 報酬の初期値
reward = 1e-3
# コースのセンターに近いほど高い報酬を設定
if all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.2:
reward = 1.0
elif all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.1:
reward = 0.8
elif all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.05:
reward = 0.5
# 現在の位置から最も近い次の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:
reward *= 0.5
return float(reward)
DeepRacer内の強化学習がどのようになっているのか把握できてないのですが、報酬に傾斜をつけた方がモデルの学習が進みやすいと考えて、コースのセンターと車両の距離に対して報酬の傾斜をつけています。
学習は5時間(クローン前のモデルで2時間学習済み)
ハイパーパラメータは初期値のままです。
#実機を動かしてみて
このモデルではMaximumSpeedを約40%ではほぼ確実に完走できました。
それより上げるとout側にコースアウトすることがほとんどでした。
会場でちらっと聞いた話ではMaximumSpeedが60%でも完走できるモデルだと、
タイムはかなりいいそうです。
ちなみにシミュレーションのEvaluationでは
| 1 | 00:00:23.434 | 100% |
| 2 | 00:00:23.029 | 100% |
| 3 | 00:00:25.052 | 100% |
でした。
初日に僕が見た時間でtopだった方がアウトインアウトするように報酬を与えたと言っていたけど、
どういう報酬関数を組んだのだろう。。。