DeepRacer 実験ノート　～ ハイパーパラメータ試行実験 計画編 ～

初投稿です。

### 謝辞

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

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

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

# Index 

1. [はじめに](#始めに)
2. [実験に使用する報酬関数モデル](#実験に使用する報酬関数モデル)
3. [実験に対する基本的な考え方](#実験に対する基本的な考え方)
4. [実験内容について](#実験内容について)



# サマリ 

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

本投稿では、**どんな実験をしようとしているか** について書いてみました。


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


# はじめに  

DeepRacerでトレーニングを行う上で、
$\color{blue}{\large{\textbf{効果的な値をハイパーパラメータに設定したいが、}}}$
$\color{blue}{\large{\textbf{どのような値にすればよいかわからない}}}$
ということに悩む方も多いかと思います。  

私もその一人です。  

個々のハイパーパラメータの意味、役割を機械学習やDeepLearningの
基礎的な事柄から勉強した上で、DeepRacerに臨むという正攻法で対応していくことも大切だとは思います。
しかし、
なにせ、結構な分量あったり、高い難易度であったり、というがことが要因で
$\color{blue}{\textbf{ハイパーパラメータを感覚的になんとなく設定している}}$  という方も少なくないのではないでしょうか？


いったん論理はそこそこにしておいて、思考、実験　を行って
$\color{magenta}{\large{\textbf{ハイパーパラメータの設定値に対する動作をなんとなく理解していく}}}$
という方向性で記事を書いていきたいと思っています。


なお、本投稿は、DeepRacerの概要などについては触れていません。

# 実験に使用する報酬関数モデル

### - 報酬関数モデルの基本的な考え方 ------------
すごいモデルが出てくるのではないかと期待しないでください(笑)

今回ハイパーパラメータの動作を中心に考えていきたいため、
報酬関数モデルは **単純なモデル** の方がよいと考えました。

### 　モデルの基本的な考え方

　　　$\color{blue}{\large{\textbf{センターラインに沿って走る}}}$  

　
DeepRacerの[開発者ガイドの最初の例](https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-reward-function-examples.html#deepracer-reward-function-example-0)にあるような
『センターラインに従う』モデルと同等の考えに基づくモデルを利用します。

ただし、
**2種類の報酬関数モデルを利用したい**と考えています。

理由としては、
(私がなんとなく知っている)ハイパーパラメータにでてくる
勾配のバッチサイズ や 学習率 の概要を考慮すると、
もしかしたら差が出てくるのでは？という勝手な推測に基づいています。
このあたりは、バッチサイズや学習率の当たりでもう少し細かく書いていきたいと思います。


### - 非連続的な報酬関数モデル(離散的モデル) ------------

DeepRacerの[開発者ガイドの最初の例](https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-reward-function-examples.html#deepracer-reward-function-example-0)にあるような
『センターラインに従う』モデル 相当のモデルです。

車内から見えそうな光景に報酬関数のグラフを無理やりあてこんだイメージはこんな感じでしょうか？

離散的モデルのイメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/11a068f3-605a-4244-b6c9-d0c78a0214eb.png)

報酬関数の変数として与えられている **distance_from_center** が
このモデルでの$x$軸の値となります。

トレーニングを続けると、グラフの値が低い方向(例えば、トラックの端方向)には進みにくくなるといったイメージですです。
　  

### - 連続的な報酬関数モデル(Exp的モデル) ------------

ガウス関数のやまっぽいところを利用するモデルです。

ガウス関数

$\sigma$：分散　　$\mu$：平均  としたときに

$f(x) = \dfrac{ 1 }{ \sqrt{ 2 \pi } \sigma } \exp( -\dfrac{  ( x - \mu^2 )  }{  2 \sigma^2  } )$

の

$\exp( -\dfrac{  ( x - \mu^2 )  }{  2 \sigma^2  } )$

ここです。
センターラインからガウス分布 **的** に報酬を広げるイメージです。

このモデルでも
報酬関数の変数として与えられている **distance_from_center** が
先ほどの関数の$x$になります。


ガウス関数の最初の係数を取っ払っているので、
もはや、ガウス関数的な意味とか3$\sigma$内に99.7%収まる話とか関係性が全くありません。。。
形だけの利用です。

$\sigma$をいい感じに設定して広がりを調整していきます。
$\sigma$の値を出す際には、**track_length**を利用するといいかなと思われます。


こうすることで、
どちら側がより報酬が高いかの方向性が学習の過程で現れやすいのではないかと推測しました。


こっちも
車内から見えそうな光景に報酬関数のグラフを無理やりあてこんだイメージを作ってみると、
こんな感じでしょうか？

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

私の場合は、track_lengthだと感じがつかめなかったので、
$\dfrac{track length}{2}$　(レーン幅：片車線幅)を先に作って、
それをベースにいじいじしてみました。  

図の$\sigma$は、
$\dfrac{レーン幅}{6}$を用いた際のグラフです。

今回の実験は、この報酬関数モデルを利用します。



あんまり尖ったモデルだともはやどう動こうが報酬が0といったことになってしまうので、
なんとなーく広がるように調整が必要です。

以下の図は、$\dfrac{レーン幅}{15}$を用いたグラフです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/4875d249-440c-b72e-37eb-af994145f9d8.png" width=90% height=90%>

ど真ん中に進めるアクションスペースを選択した時以外は、
すべて同等にダメな選択だったというピンポイントすぎるトレーニングを積むことになるのかなと...

　  
　  
2つを重ねるとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/4a17c64b-e05d-db3c-c97c-b6e68c283868.png)

離散的モデルは、Exp的モデルにおいて、おおよそ
　　　0　$\leqq$ 0.3  は 0 を返す
0.3 $\lt$ 0.3 $\leqq$ 0.7 は 0.5 を返す
0.7 $\lt$ 0.3　　　は 1 を返す
といった感じになっています。

# 実験に対する基本的な考え方


資金が尽きたら回復する(≒給料日)まで一休み！！ が大前提


# 実験内容について

次に示すような観点を固定/変更することによって
どのようにトレーニング効率が上がる/下がるのかを実際に動かして様子を見たいと思います。


## 観点：トレーニング時間 - 固定する観点

**3時間**

あまり長くするとすぐに資金が尽きてしまうので、
最初の3時間でのモデルの成長効率を観察してみたいと思います。
スタートダッシュをどれだけキめコめるか！？という観点になってしまいますが、
これはこれで知りたい方もいるのではないでしょうか。

## 観点：車体の設定 - 固定する観点

#### カメラのタイプ

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

[タイムトライアルは単一カメラというルール](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)


#### 最高ステアリング角度

**30°**

急ハンドルはめったに切らないと思うので、
20°に設定して、きめ細かいステアリングを行うモデルもいいかなと思うのですが、
実験ということもありデフォルト値の30°を固定値として採用したいと思います。

#### 最高速度

**4 m/s**

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

#### ステアリング角度の種類数

**7**

大き目にしている方も多いのではないかと思うので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/70ee2bfa-86ed-7445-4e54-86c43b192388.png)



#### 速度の種類数

**3**

こちらも大き目にしている方も多いのではないかと思うので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/ae668c07-5921-647c-1bb1-906457488e69.png)


## 観点：車体の設定 - 変更する観点

#### CNNのレイヤ数

- 3 Layer CNN  
- 5 Layer CNN  


できれば細かく画像認識してくれそうな5Layerにしたいところですが、
3Layerでちゃちゃっと学習して意外に高スピードを出してくれるかもしれないので
2つを適宜試してみたいと思います。


## 観点：利用するコース

- Oval Track  
- Bowtie Track  

できるだけ単純なコースの代表例的なもので実験したいと思います。

## 観点：報酬関数でReturnするMax値

- 1.0
- 0.1

学習率と報酬関数のReturen値の大小関係に関係がありそうかなと考え大雑把に2通り。

## 観点：Gradient descent batch size

- 32  
- 64  
- 128  
- 512  


## 観点：Learning rate

- 0.001    (1e-3)
- 0.0001   (1e-4)
- 0.00001   (1e-5)
- 0.000001   (1e-6)
- 0.0000001   (1e-7)


## 観点：Number of epochs

- 3 (最小)
- 6
- 10(最大)


## 観点：Entropy

- 1
- 0.5
- 0.01
- 0.001
- 0.0001


## 観点：Discount factor

- 0.5
- 0.8
- 0.99
- 0.999
- 0.9999


## 観点：Number of experience episodes between each policy-updating iteration

- 5
- 10
- 20
- 40
- 50
- 100

# 最後に

これから、これらのパラメータを変えながら実験していきたいのですが、
これらの組み合わせパターンを出してみるとえらいことになるので、
ポイント絞ってやってみます。

試しに、Excelで組み合わせパターンを列挙してみましたが、
雰囲気だけでえらいことになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483028/2984b86b-403d-82a4-966a-a4feaef7a637.png)


まずは、
デフォの値でそれっぽい結果が得られそうな
Layerと報酬関数のMax値選びからやってみます。
次の投稿で・・・