AWS DeepRacerの仮想サーキットでランキング50位圏内に入るまでに得たノウハウを晒してみる

AWS DeepRacerで仮想サーキットのランキング上位を目指そうと試行錯誤していますが、なんとか50位圏内に入ることができました。(ﾊﾟﾁﾊﾟﾁ-
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AWS DeepRacerの仮想サーキットに参戦できたー<br><br>ここからが本当の戦いだー(白目 <a href="https://t.co/YQVPU2ZxyY">pic.twitter.com/YQVPU2ZxyY</a></p>&mdash; 甲斐甲🌤️ヴェポライザーとDeepRacer楽しい (@k_aik_ou) <a href="https://twitter.com/k_aik_ou/status/1131375057844953088?ref_src=twsrc%5Etfw">May 23, 2019</a></blockquote>


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AWS DeepRacerで良いモデル作るには報酬設計とハイパーパラメータ設定をそれこそ網羅的に試行錯誤してなんぼって考えてるから、Leagueがあって競い合いつつもノウハウ共有しないと、モデル作成に費やした時間分だけAWSさんが課金で(ﾟдﾟ)ｳﾏｰするだけから、みんな頑張ろうな！</p>&mdash; 甲斐甲⛅C++とブロックチェーン勉強中 (@k_aik_ou) <a href="https://twitter.com/k_aik_ou/status/1127084018065743872?ref_src=twsrc%5Etfw">May 11, 2019</a></blockquote>

なので、ここまでに得たノウハウを共有してみます。


以下の記事もよろしければご参考ください。

AWS DeepRacerを利用する際に覚えておいたほうがよいこと - Qiita
https://qiita.com/kai_kou/items/5ebf54ef41d38d16f24d

AWS DeepRacerで報酬関数の実装をあれこれ試してみた - Qiita
https://qiita.com/kai_kou/items/8a45c687baca8c9465f6

AWS DeepRacer関連情報まとめ【随時更新】 - Qiita
https://qiita.com/kai_kou/items/5c02d0dca26a33dd8761


## 強化学習の特性を考えて報酬設計する

報酬関数の実装やハイパーパラメータを適当に触って試行錯誤するにも、暗中模索しないように公式ドキュメントなどからAWS DeepRacerで使われているアルゴリズムの特性を知った上で報酬設計しています。

AWS DeepRacer モデルのトレーニングと評価 - AWS DeepRacer
https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/create-deepracer-project.html

ざくっと抜粋。

> - 観察データとアクションを想定される報酬にマッピングする関数

> - モデルをトレーニングすることは、想定される報酬を最大化する関数を見つける、または学習すること

> - 最適化されたモデルによって車両が最初から最後までトラックで走行するためにどのようなアクション (速度とステアリング角度のペア) を取れるかを規定

> - 高速なトレーニングパフォーマンスのための近位ポリシー最適化 (PPO) アルゴリズムのみがサポート

> - トレーニング強化学習モデルは反復プロセス

> - 一度にある環境でのエージェントのすべての重要な動作をカバーする報酬関数を定義するのは困難

> - 賢明な方法は、単純な報酬関数から始めて、段階的に強化していく方法

報酬関数を設計するポイントは下記が参考になります。

和訳:Environment Design Best Practices - Qiita
https://qiita.com/Alt_Shift_N/items/2c37fbb26d739b7f3046


より深くPPOアルゴリズムについて知りたい方は下記が参考になります。

【強化学習】実装しながら学ぶPPO【CartPoleで棒立て：1ファイルで完結】 - Qiita
https://qiita.com/sugulu/items/8925d170f030878d6582


## トレーニングの過学習に気をつける

AWS ReepRacer コンソールの報酬グラフでトレーニングし過ぎかどうか確認するのに活用しました。
AWS DeepRacer コンソールの報酬グラフは標準設定だと過去1時間のグラフが表示されますが、CloudWatchとおなじで、グラフの表示期間が変更できます。

右肩上がりのままだからまだトレーニングしてもいいかなとか、
<img width="351" alt="スクリーンショット 2019-05-14 17.55.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/db9f0042-5efb-6dfd-3b1c-78bdb216332a.png">

横ばいで微妙だなぁとか
<img width="349" alt="スクリーンショット 2019-05-14 13.01.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/7ca4f146-e077-bc0e-39ba-c9712948891e.png">

ある時点から下がってきてるぞとか
<img width="338" alt="スクリーンショット 2019-05-14 9.48.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/f56a849e-b231-d803-a785-f218d5f67b1b.png">

私もよくわかってなくて感覚で申し訳ありませんが、実装した報酬関数のままトレーニング継続するか、実装を見直すかなどの判断に報酬グラフを参考にしています。


## モデルのクローンを活用する

公式ドキュメントにあるように、1つの報酬関数で完結するのではなくて、段階的にトレーニングするのがよさそうです。

AWS DeepRacer モデルのトレーニングと評価 - AWS DeepRacer
https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/create-deepracer-project.html

>- 一度にある環境でのエージェントのすべての重要な動作をカバーする報酬関数を定義するのは困難

>- 賢明な方法は、単純な報酬関数から始めて、段階的に強化していく方法

クローン時に報酬関数をそのままでトレーニングを継続するのか実装を変更するのかを選択できます。
アクションは変更できないので気をつけましょう。


## アクション設定でスピードを最速にする

仮想サーキットのランキングで上位を狙うならば、スピードはMAXのみで良いです。
実機の場合にどうなるかは試したことがないので不明です。


## ハイパーパラメータは変更しなくても50位圏内に入れる

いまのところのハイパーパラメータは初期設定のままでなんとかなっています。
おそらく報酬関数の実装とトレーニングでタイムに限界が来たら学習率を高めるのに手を入れる感じでしょうか？
ガチ勢にコツを伺いたいところです。

PPO で学習させる際のベストプラクティス - Qiita
https://qiita.com/dora-gt/items/18440bea7aa0fc8aa17f


## 100%完走できるモデルにこだわらない

トレーニング完了後の試走で5周すればすべて完走できるモデルにしなくても(いまのところは)良いと思います。
LondonLoopだと2周連続で完走すればラップタイムが記録されるルールになっています。
なので、5周のうち2,3回完走できるようになったら仮想サーキットに挑むのもありです。

3周完走できたモデルをSubmitしたらうまい具合に2周連続で完走してくれてラップタイム記録されました。
<img width="394" alt="スクリーンショット 2019-05-22 11.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/8687419e-7df5-afc6-4655-8c684b034c88.png">


## 試走結果は変動する

トレーニング後に試走ができますが、必ずしも同じような完走率、タイムにはなりません。
際どい結果になった場合は試走しなおして確認するのもありです。

同じモデルで2回試走した結果。ブレます。
<img width="300" alt="スクリーンショット 2019-05-22 11.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/d35b4ecc-8821-3505-92c4-dd7c48f926eb.png"> <img width="300" alt="スクリーンショット 2019-05-22 11.44.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/bf9e6359-ea00-e360-8afe-17c4e34df059.png">


## モデル作成時に詳細項目を活用する

トレーニングを繰り返しているとどのモデルが何だったか忘れます。
詳細からアクション設定や報酬関数の実装は確認できますが、クローンしてトレーニングする場合、経緯を詳細にメモっておくと役に立ちます。
<img width="600" alt="スクリーンショット 2019-05-14 12.11.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/7b6863cd-de14-9caa-879b-2c0f7b9bd602.png">


## 仮想サーキットのレーサー名は変更できない

仮想サーキットへモデルをSubmitする際に初回のみレーサー名の入力ができます。
初回以降は変更不可で開催される全レースで共通のレーサー名になるので気をつけましょう。
<img width="896" alt="スクリーンショット 2019-05-23 10.27.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/abb7d156-3068-38f3-023f-c873ba744227.png">


## 1度仮想サーキットにSubmitしたモデルは再Submitできない

5周のうち2,3回完走できるモデルを仮想サーキットにSubmitした場合、運次第で完走するしないが起こりえます。
なので、ラップタイムが記録される条件になるまで同じモデルをSubmitしたいところですが、できないみたいです。
(未確認ですが、)再度Submitしたモデルをクローンして5分くらいトレーニングすれば別モデルとみなされるかもしれません。


## やっぱりコストが高い

仮想サーキットのLondonLoopで50位圏内に入るまでに費やしたコストはこちら。
<img width="483" alt="スクリーンショット 2019-05-23 11.40.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48549/4b9ac4ec-4a53-95b5-437b-4a85048a6cfb.png">
いやーきついっす。


## 最後に

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AWS DeepRacerのLondonLoopで12〜13秒台3/5で完走できるようになったけどそこからのトレーニングがむずい。多分ここが本当のスタートラインっぽい。<br>これは課金がとまらなさそうだ… <a href="https://t.co/4r5dXpefkN">pic.twitter.com/4r5dXpefkN</a></p>&mdash; 甲斐甲☀ヴェポライザーとDeepRacer楽しい (@k_aik_ou) <a href="https://twitter.com/k_aik_ou/status/1131040421499379712?ref_src=twsrc%5Etfw">May 22, 2019</a></blockquote>

みんなで(出せるところまでは)ノウハウを共有して、ランキング上位目指しましょう！！！


## 参考

AWS DeepRacerを利用する際に覚えておいたほうがよいこと - Qiita
https://qiita.com/kai_kou/items/5ebf54ef41d38d16f24d

AWS DeepRacerで報酬関数の実装をあれこれ試してみた - Qiita
https://qiita.com/kai_kou/items/8a45c687baca8c9465f6

AWS DeepRacer関連情報まとめ【随時更新】 - Qiita
https://qiita.com/kai_kou/items/5c02d0dca26a33dd8761

AWS DeepRacer モデルのトレーニングと評価 - AWS DeepRacer
https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/create-deepracer-project.html

和訳:Environment Design Best Practices - Qiita
https://qiita.com/Alt_Shift_N/items/2c37fbb26d739b7f3046

【強化学習】実装しながら学ぶPPO【CartPoleで棒立て：1ファイルで完結】 - Qiita
https://qiita.com/sugulu/items/8925d170f030878d6582

PPO で学習させる際のベストプラクティス - Qiita
https://qiita.com/dora-gt/items/18440bea7aa0fc8aa17f