【実証中】AWS DeepRacer ハイパーパラメータチューニング

AWS DeepRacerを始めましたが、ハイパーパラメータチューニングの壁にぶつかっています。（理解が難しい）
本記事ではハイパーパラメータの理解の仕方からチューニングについてのノウハウを記載していきます。

※DeepRacer参加方法については下記にまとめています

https://qiita.com/toma_shohei/items/a79abd8d71a2e284273f


## ハイパーパラメータ基礎
### ハイパーパラメータについて理解する
下記のブログはトレーニングアルゴリズムから説明していて図もあって分かりやすい解説が書いてあります。
まずはざっくり理解します。

https://qiita.com/dnp-yonezawa/items/02f6d04f71a13868b32d

### ハイパーパラメータの項目確認
あらためて設定画面を確認
![スクリーンショット 2022-01-28 081631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/3f793e28-dc98-b473-f630-f76b1a521932.jpeg)

公式のマニュアルでさらに理解を深めます。

https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-console-train-evaluate-models.html#deepracer-iteratively-adjust-hyperparameters

## バッチサイズについて
バッチサイズについては理解があいまいだったのですが、下記の記事が分かりやすかったです。
なぜかは分からないですが分割して学習することで高い成果が出るようです。

https://arakan-pgm-ai.hatenablog.com/entry/2017/09/03/080000

## ハイパーパラメータ変更影響
概要を理解したら、実例２つを確認します。
ハイパラチューニングがどのように影響を与えるのか見ておきます。

### 各ハイパーパラメータの意味と影響の理解
上記と同じ記事ですが、改めて各パラメータが何に影響するのかをざっくり把握します。

https://qiita.com/dnp-yonezawa/items/02f6d04f71a13868b32d#%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E8%80%83%E5%AF%9F


### 2019年世界一取った方のハイパラチューニング

JAWS DAYS 2020 AWS DeepRacerリーグで世界一になるには
https://www.dnp-ds.co.jp/tech_fun/pdf/tech_fun_007_1.pdf

下記の通り（ハイパーパラメータチューニング箇所のみ抜粋）

■P10抜粋
クローン時にハイパーパラメータを変更
・主に以下の5つ
・Learning late（学習レート）
・Batch size（バッチサイズ）
・Number of epochs
・Entropy
・Number of experience episodes between each policy-updating iteration (各ポリシー更新反復間のエクスペリエンスエピソーの数)
・バッチサイズ、エポック数、エピソード数は最初に大きな値を設定した
・2時間くらい学習後、ログを見て値を小さくしていったり、最初から小さな値を
設定して４～５時間学習させた
・あとは学習レートやエントロピーの値を調整していた
・値は報酬関数のグラフやログを見て適当な値を入れて調整していた


■P13抜粋
Training
・トレーニングジョブのエントロピーの値をチェック
・途中で値が上昇し始めてたら、トレーニング時間を短くしたりハイパーパラメータを調節して再トレーニング
・優勝モデルで0.4くらい


### WorkShopのハイパラ解説に変更影響の一例あり
スピード、学習率、エポック数、バッチサイズを変えて、学習効率がどの程度変わるかをグラフで図示してくれている。
「大きな学習レートをより有効に活用するには、小さなバッチサイズでトレーニングする必要があるようです。」
の一文を参考にする


https://catalog.us-east-1.prod.workshops.aws/v2/workshops/03f7e662-e3b1-4c5b-8fbe-b6af0c00c7b2/ja-JP/2-handson/2-2/2-2-7
モデルの作成4 - アルゴリズムとハイパーパラメータ
観察事項 : 収束を得るための最大速度とハイパーパラメータを変えてみる

## ハイパーパラメータチューニング実践
### 2021/11/29
Learning late（学習レート）のチューニングを実施
学習コース：Vivalas Speedway
![スクリーンショット 2022-01-28 230601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/823a6b37-2a50-505d-0341-800d04148b5c.jpeg)


学習レートを最大値の0.001（デフォルトは0.0003）に変更し学習開始

Rewardが見たことない挙動になった（後半は報酬が底辺になっている）
![スクリーンショット 2021-12-06 222153.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/f7dbc2f1-47a3-5e10-273d-f2920c45867c.jpeg)

学習レートだけを上げても収束されないことを確認（これは上記に紹介したブログ記載の通り）


### 2022/1/31
2019年世界一取った方のハイパラチューニング
「バッチサイズ、エポック数、エピソード数は最初に大きな値を設定した」
これでどれだけ走りが安定するのかを試す
下記の通り設定。

``` A:安定志向のパラメータ
コース：VivalasSpeedway
バッチサイズ　64→128
エポック数　3→10（最大値）
エピソード数　20→40（推奨される値は10、20 および 40 ）
MinimumSpeed 0.5→1
Maximu speed 1→2
学習時間 120分
``` 

※ジグザグがかなり減少した！
![0-video (1)_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/d52e6582-18e8-ba46-8b93-1100c629fb10.gif)


※こちらは2021年10月のハイパーパラメータデフォルト値のままで学習させたモデルの走り。
ジグザグ運転が課題でした。
![Video_20220210085753403_by_VideoShow_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/e590f988-1192-caf3-32ae-e38f01310512.gif)



### 2022/2/7
「大きな学習レートをより有効に活用するには、小さなバッチサイズでトレーニングする必要があるようです。」
の実証実験を実施。

``` A:学習効率が高いパラメータ
コース：Summit Speedway
バッチサイズ　64→32
エポック数　3→5
LearningRate　0.0003→0.001
MinimumSpeed 0.5→1
Maximu speed 1→3
学習時間 120分
```

学習結果。報酬は右肩上がりだが、学習継続してもこれ以上良い結果にはならなかった。
![スクリーンショット 2022-02-14 220728.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/0943b9a0-3801-0033-cb29-8b9c5ccf335b.jpeg)

※学習継続した結果の詳細は下記の2/21、2/28に記載。

https://qiita.com/toma_shohei/items/9b2f565d7e432dcbc3dd



比較的簡単なコースではあるが、
学習時間が2時間でMaxスピード3でコースアウト4回しかないのはかなり上々だと思う。
このモデルで上位１０％を達成できた。（101/1090位）

↓速いスピードでコースアウトも少ない
![Touma20220207-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/b1c54c6b-b5a7-3ae3-0d2c-f56d3c5e8734.gif)



## まとめ
ハイパーパラメータをうまくチューニングできるようになれば
トレーニング効率を上げられることは分かったので、
これから最適解を探っていきたいと思います！