AWS DeepRacer 日記 2021/11 (今月は大会ルールの把握とハイパラチューニングがメインになりました)

2021年10月から本格的にDeepRacerリーグに参加し始めました。
今回はDeepRacer日記第2回です。
筆者の試行錯誤をメモレベルで記載していきます。
参考になればうれしいです。

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

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

# 11/8
## プロリーグ参加確定

前回の記事で紹介したモデルでプロリーグ参加を果たしました！

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

![スクリーンショット 2021-11-08 222301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/52b4024c-e3eb-1d3f-57c1-ef6362a8680b.jpeg)

しかし、、11月はオープンリーグが始まらない。。
確認したら11月から2月まではオフシーズンですね。。



## re:Invent2021が開催されていた
ここで1位になれば決勝戦参加権を得られる！！

さっそくそのコースで学習開始
![スクリーンショット 2021-11-08 222337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/26e542c5-144c-fe7e-e437-f9319ef30db3.jpeg)

スピードだけ２にして玄人の方の報酬関数をそのまま利用

https://github.com/VilemR/AWS_DeepRacer/blob/master/reward_function.py

120分学習させる

# 11/11

## 学習結果確認

![スクリーンショット 2021-11-11 092701.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/33753e30-beab-659e-aee1-4d2eeebd9746.jpeg)

↓
re:Invent2021コースにエントリー

# 11/15
## 164位/241
![スクリーンショット 2021-11-22 220933.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/1d8890d8-5f8f-22d2-a206-863eff59566b.jpeg)

やはり1位になれば決勝戦参加権を得られるとあって、ハードルは高い。。


# 11/18
## 大会ルールの確認
ここで改めて大会ルールを確認。

https://blog.deepracing.io/2021/11/03/aws-deepracer-championships-2021/

![スクリーンショット 2021-11-22 221221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/63f453de-ea37-3650-c124-f404c1809f58.jpeg)


決勝出場の条件
40人が参加
1 2020 League Champion
24 AWS DeepRacer League racers
5 re:Invent Wildcard Race Winners
10 Community Wildcard Race Winners

決勝は11/15から12/3まで開催されており、3ラウンドで優勝者を決定する。

Round 1: Group Knockout Round [LIVE]
40名→16名　Championship Racing

こちらの様子は動画で残っていました。見るとレベルの高さにモチベ落ちます。。

https://www.twitch.tv/videos/1210064776?filter=highlights&sort=time


Round 2: Bracket of 16 [LIVE]
16名→3名

Round 3: Grand Prix Final [LIVE(ish)]
3名→1名


今年はファイナリストに日本人はいない模様

![スクリーンショット 2021-12-26 163727.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/2f2492ad-b65e-f294-af3e-df404586ec61.jpeg)
https://blog.deepracing.io/2021/11/17/2021-aws-deepracer-championship-finals/




## re:Invent 2021 Open Raceが開催されていた
練習のために一旦これに参加

コースを大会と同じVivalas Loopを選択
MAXスピードを2
報酬関数を下記
https://github.com/VilemR/AWS_DeepRacer/blob/master/reward_function.py
60分学習


# 11/24

## 291位／636
![スクリーンショット 2021-11-25 000518.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/4351d8bc-9fbd-8281-bef0-5ce75d833165.jpeg)


60分じゃ学習時間が足りなかった可能性あり＋直線が多いので、スピード速くしても大丈夫そう


# 11/28
## ハイパラ考察
ここでしばしハイパーパラメータとにらめっこする

世界一になった方の戦略についてもう一度確認。
(ここにもハイパーパラメータについて記載があった。)

https://www.dnp-ds.co.jp/tech_fun/pdf/tech_fun_007_1.pdf

→学習時間とクローン戦略のページが参考になりそう
![スクリーンショット 2021-12-26 155342.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/9990b4c2-b193-0955-8587-a8bd8f081053.jpeg)

「バッチサイズ、エポック数、エピソード数は最初に大きな値を設定した」
とかは理由を把握したいところ。。


「全く同じ条件の学習でもシミュレーション結果が異なるモデルになることも」
→これはなんとなく感じていた部分。評価にあたり重要な知識だと思う


「Trainingのコンソールの報酬関数グラフが右肩上がりから、なだらかになった時点で、
　学習していない他のコースで学習させてEvaluationを試して結果を確認していた」
→どこまで学習させるかについて右肩上がりならそのまま学習継続でもよさそう。

「クローン時にハイパーパラメータを変更」
主に以下の5つとのこと。これらの値を状況によって上手く調整していけるようになりたい。
まずは意味と使い所を把握する。

### ①Learning late（学習レート）
学習の結果を反映させる度合い。低すぎると学習効率が上がらず、高すぎると最適解に辿り着けない。

https://qiita.com/yuxzux/items/b14b4302e6fbaef6a3ec

### ②Batch size（バッチサイズ）
(ディープラーニングでよく使われる)ミニバッチ勾配降下法を使用した時に決める必要のあるパラメータ
ミニバッチ勾配降下法の基礎は下記
大きいと計算コストが上がり、小さいと局所解になりがち。

https://axa.biopapyrus.jp/deep-learning/gradient_descent_method.html

### ③Number of epochs
一つの訓練データを何回繰り返して学習させるか

https://www.st-hakky-blog.com/entry/2017/01/17/165137?amp=1


### ④Number of experience episodes between each policy-updating iteration (各ポリシー更新反復間のエクスペリエンスエピソードの数)

調査中。。


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

→エントロピーとはを理解したい。
下記の記事のエントロピーについての解説が理解しやすい。不確実さを表す数値。
すなわち「訓練中のアクションスペースの選択にランダム性を持たせる」ということ。

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

デフォルト値が0.01で優勝時モデルが0.4であることを考えると
最初は少なく、学習効果が薄くなってきたときに高くするべき値と考えれば良さそう。

## オープンレース
学習グラフが右肩上がりのため、スピード以外同じ条件で120分再学習
簡単なコースに見えるため、MAXスピードを3に上げる

# 11/29

## コミュニティ参加（英語）
AWS DeepRacer Community: https://deepracing.io/ にとりあえず参加。
英語分かる人に勧めて活用できそう！

![スクリーンショット 2021-11-29 095322.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/ee5c3c3e-a371-09c0-3e2b-2bab3b0b08c8.jpeg)


参考:コミュニティでSACについて質問があり、全員うまくいった様子はなかった。という回答が得られた例
![スクリーンショット 2021-12-26 164748.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/ac9f891e-26d3-4081-7bc2-8d53d94cfe35.jpeg)



## 268/855位
ジグザグ抑制したい、カーブでスピード落としすぎ。MINスピードを上げて再学習

下記の報酬関数ではジグザグ制御をやっていなさそう。
https://github.com/VilemR/AWS_DeepRacer/blob/master/reward_function.py

result_rewardを決定する直前（320行目前後）に下記の関数のジグザグ制御の部分を加えてみる。
https://github.com/hamham1004/DeepRacer/blob/master/reward_function.py


　　　　～～
        # Penalize reward if the car is steering too much (your action space will matter)
        ABS_STEERING_THRESHOLD = 30
        if abs(self.steering_angle) > ABS_STEERING_THRESHOLD:
            result_reward *= 0.9

        # Finally - check reward value does not exceed maximum value
        if result_reward > 900000:
            result_reward = 900000        
　　　　～～
        


まだ右肩上がりのグラフが続いているため、 Learning late（学習レート）を下げてみる。
デフォルトは0.0003
最大値の0.001に変更
MINスピードを0.5から1に変更

他人の関数を使うのではなく、自分でコーディングすると何度もエラーになった。
書いては見たが正しく判定されるのかの動作確認ができない。。

# 12/6

## 244/1361位
ジグザグはかなり減った。
![スクリーンショット 2021-12-06 222032.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/abc0a8d1-b766-4dfc-7738-4839b07acc8b.jpeg)

Rewardが見たことない挙動に
Learning lateを上げすぎたかも。。

![スクリーンショット 2021-12-06 222153.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/76dbd526-ecb0-41af-edfa-4ac5c77b0c6c.jpeg)