DeepRacer 実験ノート　～ ハイパーパラメータ試行実験 実験用のRacingCar設定模索編 ～




### 謝辞

本ページにたどり着いていただき、ありがとうございます。

まだまだ勉強不足で、間違っている部分があるかもしれません。
何かしら気づかれた方はご連絡いただけると有難いです。
本記事の内容について流用などされる方は、ご自身で内容の妥当性を
検証していただくことを前提で利用される様お願いさせてください。

また、とりあえず投稿することを目的に文章は書きなぐった感じになってしまっていますが、
おいおい章構成や文章自体を修正していきます。

<details><summary><- 変更履歴はここをクリック </summary><div>

1. 2020/03/30:新規作成
</div></details>

# Index 

1. [サマリ](#サマリ)
2. [はじめに](#始めに)
3. [実験する車の各パラメータについて](#実験する車の各パラメータについて)
4. [試行結果(各レイヤ数での結果)](#試行結果(各レイヤ数での結果))
5. [結果比較:3Layerと5Layerグラフ](#結果比較:3Layerと5Layerグラフ)
6. [最後に](#最後に)




# サマリ 

投稿では、DeepRacerの**ハイパーパラメータの設定**について
**いろいろと思考、実験してみた結果**を書いてみたいと思っています。

本投稿では、**車のパラメータの選定** について書いてみました。


読んでいただいた方の参考になればうれしいです。


# はじめに  

[前回](https://qiita.com/satussy777/items/e5b008c164f4f8bc430e) 実験したいことの概要を書きましたが、
今回は、実験に用いる車のパラメータを決めるためのいくつかの実験をやってみたいと思います。

# 実験する車の各パラメータについて  

## カメラのタイプ[固定する]

**ノーマルのカメラ**

[タイムトライアルは単一カメラというルール](https://d1.awsstatic.com/deepracer/2020AWSDeepRacerLeagueTermsandConditions.pdf)(4. WINNER DETERMINATION: Summit Circuit Race Rules: a.)があるようなので、
ステレオじゃない方を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/e67ae168-c23b-a485-8e24-ac0d41001a03.png)


## 最高速度[固定する]

**4 m/s**

あまり遅いのもなんなので、
こちらは現時点でMax値の 4m/s としたいと思います。


## 最高ステアリング角度[固定する...が今後別の角度もちょっと実験はしてみたい]

**30°**

デフォルトの30°をとりあえずは採用したいと思います。

ただ、
2020年3月のVirtual Circuit(SOLA Speedway)の先頭の大カーブ(下図の赤枠当たり)で、
私のモデルだと30°はあまり利用していなかったのもあって、
30°以下にしてもいいかもと考え始めてはいますが、
いまはハイパーパラメータの実験に注力したいため30°を採用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/e61043a0-fc35-813f-7412-61f596c4261d.png)

## CNNのレイヤ数

- 3 Layer CNN  
- 5 Layer CNN  

2020年から新たにでてきた観点ですが、
双方の違いを見てみたいと考えています。

## ステアリング角度の種類数[固定する]

* 7  

選択肢を減らした方がより高速に学習はできるのではないかと推測しています。
条件によっては5にするといったことも有効かもしれません。

## 速度の種類数[固定する]

* 3  

こちらも
選択肢を減らした方がより高速に学習はできるのではないかと推測しています。
条件によっては2にするといったことも有効かもしれません。

## ハイパーパラメータ[固定する]

今回は、Layerの違いによる差異を見てみたいので、
ハイパーパラメータはすべてデフォルトで固定して試します。

| 項目                                                                     | 値     |
| :----------------------------------------------------------------------- | :----- |
| Gradient descent batch size                                              | 64     |
| Number of epochs                                                         | 10     |
| Learning rate                                                            | 0.0003 |
| Entropy                                                                  | 0.01   |
| Discount factor                                                          | 0.999  |
| Loss type                                                                | Huber  |
| Number of experience episodes <br>between each policy-updating iteration | 20     |



## コース

* Oval Track  

単純なコースで試します。

## 報酬関数モデル

* [Exp的モデル](https://qiita.com/satussy777/items/e5b008c164f4f8bc430e#--%E9%80%A3%E7%B6%9A%E7%9A%84%E3%81%AA%E5%A0%B1%E9%85%AC%E9%96%A2%E6%95%B0%E3%83%A2%E3%83%87%E3%83%ABexp%E7%9A%84%E3%83%A2%E3%83%87%E3%83%AB-------------)  
  

$\sigma$は、$\dfrac{レーン幅}{3}$を用います。
また、平均が0(＝センターラインが最も報酬が高い)として、
平均の位置(＝センターライン中央にいる居る時)での報酬関数のMax値は 1 です。


(レーン幅＝$\dfrac{1}{2}$トラック幅 です。)


Exp的モデルのイメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/ca6ae064-1df5-6792-2925-c9ffbed9b0b2.png)



# 試行結果(各レイヤ数での結果)

## Layter ： 3

| 項目                 | 値                   |
| :------------------- | :------------------- |
| CNNのレイヤ数        | $\color{red}{\textbf{3}}$   |
| 最高速度             | 4 m/s<固定>          |
| 最高Steering角度     | 30$^{ \circ }$<固定> |
| 速度の種類数         | 3                    |
| Steering角度の種類数 | 7                    |
| 報酬関数のMax値      | 1.0                    |

### Layter ： 3 での結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/a8676a11-2c75-bf1f-513e-de404104de93.png)


Rewardのグラフ と Progress をもう少し詳細化するために、
Excelで2019年のDeepRacerのような形でグラフ化してみます。

ただ、何度やっても、ログからはAWSコンソールのグラフの値の1/2の値しか算出されません。
※下記はAWSコンソールのグラフ と Excelの結果 との比較(緑線が報酬値のグラフ)
<img width="360" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/a8676a11-2c75-bf1f-513e-de404104de93.png"><img width="290" height="250" alt="image" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/75cb926b-ba10-b6a4-10ee-4056fd61cd59.png">

実際に、ログから求めた値を2倍してAWSコンソールのグラフの軸の値と合わせて、
手動でフィットするよう重ね合わせてみたのですが、ほとんどフィットしているので、
AWSコンソールのグラフはログの集計値の2倍で描かれているのはほぼほぼ間違いないかなと推測しています。

報酬値について、ログから求めた値を2倍してAWSコンソールのグラフと重ね合わせたグラフ
(黄線：ログから求めた値の線　緑線：AWSコンソールのグラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/6ac0969b-f0e8-1731-366d-17c780c58f88.png)

今後、よく意味が分からない2倍はせずに分析していきます。

改めて、、

### Iterationと報酬関数の合計値とのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/75cb926b-ba10-b6a4-10ee-4056fd61cd59.png)

### IterationとProgressとのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/22119ac9-2e53-46cb-ac9b-0e02cbefc685.png)



## Layter ： 5

| 項目                 | 値                   |
| :------------------- | :------------------- |
| CNNのレイヤ数        | $\color{red}{\textbf{5}}$   |
| 最高速度             | 4 m/s<固定>          |
| 最高Steering角度     | 30$^{ \circ }$<固定> |
| 速度の種類数         | 3                    |
| Steering角度の種類数 | 7                    |
| 報酬関数のMax値      | 1.0                    |

### Layter ： 5 での結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/65b725b1-8eaf-0653-6254-802dddea2ca8.png)


### Iterationと報酬関数の合計値とのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/5f35c115-28c1-6913-dd17-beea06a26e16.png)

### IterationとProgressとのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/4b15a583-a04e-dcee-1d88-f4a4eb63ec29.png)





# 結果比較:3Layerと5Layerグラフ

### AWSコンソール上の結果
**3Layer**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/a8676a11-2c75-bf1f-513e-de404104de93.png)
**5Layer**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/65b725b1-8eaf-0653-6254-802dddea2ca8.png)

3Layer,5Layerを同じスケールで比較してみます。
1回の試行だけなので、たまたま 以下の様になったという観点は捨てれませんが...

### Iterationと報酬関数の合計値との比較グラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/d0154fa8-c4c9-9562-9965-43e4d0690345.png)

報酬関数の合計値としては、ともにIterationに対する成長率が変わらないかなと感じます。

### IterationとProgressとのグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/bf470038-134c-90e9-5fd7-f521d815a1e5.png)

Progressとしては、ともにIterationに対する成長率は5Layerの方が多少良かったです。


# 最後に
今回トレーニング時間が3時間だったので、あまり差異が出なかった気もします。

3Layerに設定することによる劇的な差異が(トレーニング序盤では)見られないということで、
今後5Layerを用いて実験していきたいと思います。


次回は、```Gradient descent batch size```を変化させてみたいと思います。



# DeepRacer 実験ノート

1. [DeepRacer 実験ノート ～ ハイパーパラメータ試行実験 計画編 ～](https://qiita.com/satussy777/items/e5b008c164f4f8bc430e)
2. [DeepRacer 実験ノート ～ ハイパーパラメータ試行実験 実験用のRacingCar設定模索編 ～](https://qiita.com/satussy777/items/d1f239becd3003854b34)