社内勉強会：AWS DeepRacer基礎編（モデル作成）を開催した

# はじめに

社内でAWS DeepRacer人口が増えてきており、ちょっと乗り遅れてしまった人向けにAWS DeepRacer勉強会基礎編を開催したのでその内容を公開します。

本記事では基礎編の**モデル作成**ついて解説しています。

その他の勉強会の内容については、以下の記事をご確認ください。

- [社内勉強会：AWS DeepRacer基礎編（ログ取得）を開催した](https://qiita.com/dnp-yonezawa/items/69dc6bd04fa2b6229090)
- [社内勉強会：AWS DeepRacer基礎編（ハイパーパラメータ）を開催した](https://qiita.com/dnp-yonezawa/items/02f6d04f71a13868b32d)
- [社内勉強会：AWS DeepRacer応用編（ログの分析・可視化）を開催した](https://qiita.com/dnp-yonezawa/items/569c5871c74852230a9f)

# モデル作成準備
## AWSマネジメントコンソールにログイン

AWS マネジメントコンソールにログインし、「サービス」の一覧でAWS DeepRacerを検索します。

![aws_console_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/6cb21775-d3e2-51c0-ae7d-3dc2d2b4779e.png)


## リージョンの選択

ナビゲーションバー右上からリージョン名を選択し、「米国東部（バージニア北部）/ North Virginia」に変更します。

![aws_console_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/0c193c40-ed8e-30fc-7423-c0840382de0f.png)


## Reinforcement learningの立ち上げ

AWS DeepRacerコンソールが開いたら、左ペインの[Reinforcement learning]をクリックします。

![aws_console_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/0b183f12-b1fe-3857-ab08-b23dd31ace4b.png)

# モデル作成

## モデル作成画面の立ち上げ

AWS DeepRacerコンソール画面から[Create model]ボタンをクリックします。

![create_model_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/0361df6b-7f0e-64ba-74b5-190a4fe2ffb9.png)


## モデル名の設定

モデル名（Model name）とモデルの説明（Model description - optional）を入力します。
※ モデル名はアカウント内で重複しないように設定する必要があります。

![create_model_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/a77a60cc-7b91-8a68-69cb-dc732c281d9d.png)


## Environment simulationの設定

トレーニングに使用するコースを選択します。
※ 7つのコースが利用可能（2019/07/17現在）

![create_model_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/8eeb7a1c-ff62-3146-6874-2e7e1939e1de.png)


## Action spaceの設定

以下のAction space（AWS DeepRacerのステアリングの角度とスピード）に関するパラメータを設定します。

![create_model_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/1eb331e9-a665-d2a8-683e-5c3cdc36a129.png)

- Maximum steering angle：最大のステアリング角度
- Steering angle granularity：ステアリング角度の分割数
- Maximum speed：最大のスピード
- Speed granularity：スピードの分割数

※ 筆者がAWS Summit Tokyo 2019に参加した際は、以下のパラメータに設定しました。

- Maximum steering angle：25 degrees
- Steering angle granularity：3
- Maximum speed：6 m/s
- Speed granularity：2

## Reward functionの設定

車両の動作に応じた報酬関数を定義します。[Reward function examples]をクリックすると、報酬関数のサンプルを見ることができます。

※ 3つのサンプルが利用可能（2019/07/17現在）

<details><summary><strong>Follow the center line (Default)</strong></summary><div>

センターラインに沿って走行する報酬関数

```python
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)
```
</div></details>

<details><summary><strong>Stay inside the two borders</strong></summary><div>

トラックの境界線内で走行する報酬関数

```python
def reward_function(params):
    '''
    Example of rewarding the agent to stay inside the two borders of the track
    '''
    
    # Read input parameters
    all_wheels_on_track = params['all_wheels_on_track']
    distance_from_center = params['distance_from_center']
    track_width = params['track_width']
    
    # Give a very low reward by default
    reward = 1e-3

    # Give a high reward if no wheels go off the track and
    # the agent is somewhere in between the track borders
    if all_wheels_on_track and (0.5*track_width - distance_from_center) >= 0.05:
        reward = 1.0

    # Always return a float value
    return float(reward)
```
</div></details>

<details><summary><strong>Prevent zig-zag</strong></summary><div>

ジグザグ走行を抑制する報酬関数

```python
def reward_function(params):
    '''
    Example of penalize steering, which helps mitigate zig-zag behaviors
    '''
    
    # Read input parameters
    distance_from_center = params['distance_from_center']
    track_width = params['track_width']
    steering = abs(params['steering_angle']) # Only need the absolute steering angle

    # 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 agent is closer to center line and vice versa
    if distance_from_center <= marker_1:
        reward = 1
    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

    # Steering penality threshold, change the number based on your action space setting
    ABS_STEERING_THRESHOLD = 15

    # Penalize reward if the agent is steering too much
    if steering > ABS_STEERING_THRESHOLD:
        reward *= 0.8

    return float(reward)
```
</div></details>

※ 筆者がAWS Summit Tokyo 2019に参加した際は、Prevent zig-zagをベースにした報酬関数でトレーニングしました。

![create_model_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/01138383-b566-fb45-d059-201cf8d7a6ce.png)





## Hyperparametersの設定

以下のハイパーパラメータに関する設定をします。

- Gradient descent batch size：勾配降下のバッチサイズ
- Number of epochs：エポック数
- Learning rate：学習率
- Entropy：エントロピー
- Discount factor：割引係数
- Loss type：損失タイプ
- Number of experience episodes between each policy-updating iteration：各ポリシー更新反復間のエクスペリエンスエピソードの数

![create_model_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/beddb88b-18b5-e204-341f-21e6f6a02ee6.png)

※ 筆者がAWS Summit Tokyo 2019に参加した際は、Gradient descent batch sizeを128にし、それ以外はデフォルトでトレーニングしました。
※ ハイパーパラメータの詳細については、[社内勉強会：AWS DeepRacer基礎編（ハイパーパラメータ）を開催した](https://qiita.com/dnp-yonezawa/items/02f6d04f71a13868b32d)をご確認ください。


## Stop conditionsの設定

Maximum timeにトレーニングの時間を設定します。

![create_model_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/6b5f8fb2-6b17-898e-f9c8-4bfcf5d77580.png)

※ 筆者がAWS Summit Tokyo 2019に参加した際は、re:Invent 2018 2時間、AWS Track 1時間、Bowtie Track 1時間、re:Invent 2018 30分トレーニングしました。

## トレーニングの開始

[Start training]をクリックし、トレーニングを開始します。

![create_model_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/2025ae6c-a577-f00d-ef42-e1df726a4ee1.png)

## トレーニング中の画面

左のグラフはトレーニングの進行状況を示しており、横軸はトレーニング時間、縦軸は報酬を示しています。
右上がりのグラフであれば、最適な報酬を探索している状態であると考えられます。

右の図（コンソール画面では動画）は走行中の車の視点を示しており、走っている様子を確認することができます。

![create_model_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/58f02684-65a9-e217-a3f4-ec5efe633235.png)

# モデル作成後

トレーニングが終了すると、Trainingの右にCompletedが表示されます。

![evaluate_model_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/c783a7f9-b558-4624-4c26-0bea2f573833.png)


## モデル評価

[Start evaluation]をクリックし、評価したいコースと試行回数を選択しモデルを評価します。

![evaluate_model_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/b4c93241-9992-db06-e434-9b50c584ffdc.png)

![evaluate_model_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/6723b0f0-77e8-6736-ae33-5f493923595f.png)

評価が完了すると、AWS DeepRacerコンソール画面から評価結果を確認することができます。

![evaluate_model_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/0563b6ec-2cf7-4739-f372-4a302ea89eff.png)

## 再トレーニング

トレーニングしたモデルを使ってさらにトレーニングをしたい場合、[Clone]ボタンをクリックし、Environment simulation、Reward function、Hyperparameters、Stop conditionsの設定をし、再トレーニングます。

※ Action spaceは変更できません。

![evaluate_model_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/771abb30-a3cd-0a52-93aa-f372d47e93b8.png)

## モデルのダウンロード

実機で動かしたい場合、[Download model]ボタンをクリックしてモデルをダウンロードします。

![evaluate_model_006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/b4983720-e39a-d2fd-3a9a-b7b6359f83c2.png)

## Virtual raceの参加

Virtual raceに参加したい場合、[Submit to virtual race]ボタンをクリックし、使用するモデルを選択後、[Submit model]ボタンをクリックします。

![evaluate_model_007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/791cd515-b8de-23cc-02e7-6c0cef608ad9.png)

![evaluate_model_008.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/57b0dd26-5eb5-9463-3457-f78a182ae603.png)

Virtual raceの画面から結果を確認することができます。

![evaluate_model_009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463865/e90bbf6d-eb90-69bf-8e09-c3190e336f6c.png)

# まとめ

本記事では、モデル作成準備～レースの参加方法まで解説しました。

Action space、Reward function、Hyperparametersについては、精度向上に向けて試行錯誤で色々試してみていただけたらと思います。