Udacity の深層強化学習ナノ学位を修了しました

# 概要
[Udacity](https://www.udacity.com/) という(アメリカの)オンライン講座に、この夏 [Deep Reinforcement Learning Nanodegree](https://www.udacity.com/course/deep-reinforcement-learning-nanodegree--nd893) (深層強化学習ナノ学位) というものが開講しました。999 ドルと非常に高額なのですが、なんと自腹で払って受講しました(よく決断したものです。家族の皆さん、ごめんなさい..)

世に同様のコースや資料はいくつかあるのですが、特に現業務では必要とされていないということもあり、どれもあまり長続きせず、金を無駄にもできないというプレッシャーと、しきりに運営から来る締め切り通知で尻を叩いてくれるという監視役に期待して、ポチってしまいました。8月末のことです。

当然、論文を容易に理解し、立ちどころに実装できてしまう腕に自信のある方には不要です。私も色々書籍を見たり、別の(無料の)オンラインでの講義資料を見たりしたのですが、途中で挫折したことは数知れずで、私にとっては非常にありがたい講座でした。とはいえ、講習は英語で行われるし、途中で論文読んでねという個所もあり、なかなかにハードなところもあります。それでも教えてくれる人がいたり、情報交換の場があったりすると相当歩みが楽に感じました。以下、ダイジェストで雰囲気伝えますので、受講するかどうか検討されている方の参考になれば幸いです。

# Udacity について
[Udacity](https://www.udacity.com/) は、Udemy と名前は似ているものの、まったく別の有料オンライン講座サービスです。内容はかなり高度なものが多く、[Data Analyst](https://www.udacity.com/course/data-analyst-nanodegree--nd002), [iOS Developer](https://www.udacity.com/course/ios-developer-nanodegree--nd003) などの基本を押さえたものもあれば、[自動走行車の実装](https://www.udacity.com/course/intro-to-self-driving-cars--nd113)、[空飛ぶ車の実装](https://www.udacity.com/course/flying-car-nanodegree--nd787)など、かなりぶっとんだ(でもお金と時間さえあれば受けてみたい)講義が揃ってます。但し内容が充実しているだけに、受講料がかなり高いです。

実は昨年 Udacity の [Deep Learning](https://www.udacity.com/course/deep-learning-nanodegree--nd101) の講習を受けたのですが、その際はキャンペーン中で 399ドル でそれでも高いのですが(その時は色んな経緯があって会社(前職)に請求できた) いまや最低額が 999ドル となってしまいました。

講習はすべて英語資料/動画によって進みますが、実装に慣れるためのハンズオン資料が豊富にあります。また途中でレビュアー付きの実装課題が出てくるのが特徴です。課題提出後、条件を満たしているかをレビュアーによりチェックされます。2-3ヶ月の講義期間のうち、数週間ごとに課題提出の期限が設定されています。実際には修了期限さえ守れば何も言われないので、この期限は目安に過ぎないのですが、メールでアラートも飛んでくるのでちょっとしたプレッシャーになります。

# Udacity DeepRL NanoDegree について
[DeepRL NanoDegree](https://www.udacity.com/course/deep-reinforcement-learning-nanodegree--nd893) は2018年夏から始まった Nanodegree(=ナノ学位) です。Deep系のモデルを使った強化学習を実装できることを目標とした講義になっています。金額は999ドルです。正直高いです。内容が濃くて確かに値段相応という雰囲気もありますが、もう2-3割安くても.. という感じもします。嫁(or旦那)ブロックが働きそうなご家庭であってもなくとも業務と直結すると口説いて是非会社で払ってもらいましょう。説得材料に本ポストが役に立てば幸いです。

おそらく1-2ヶ月に1回の頻度で、講習が順次開始するようです。受講修了期限まで4ヶ月とありますが、実装に慣れた人であればもう少し早く終わると思います。私は、課題のバグが見つけられずにハマってしまったのと、受講中に家族人数が増えるというドラスティックなイベントがあり.. きっちり4ヶ月かかってしまいました。なお、受講に週に4-5時間は確保したいところです。

- [Udacity DeepRL Nanodegree 公式ページ](https://www.udacity.com/course/deep-reinforcement-learning-nanodegree--nd893)
- [Github レポジトリ](https://github.com/udacity/deep-reinforcement-learning) (講習に用いるプログラムなどを含む)

なお、受講開始すると受講者用の slack にアカウントがもらえます。このサンプルのここがおかしいといったバグ報告・回避方法や、どうやったらうまく実装できるの？といった情報交換はほぼ全て slack 経由で実施されていた感じです。私は英語のメッセージをただ見ていただけですが、それでも十分役に立ちました。講義ページにも情報交換のUIがあるのですが、こちらはあまり有効に機能している雰囲気ではありませんでした。

# 実施前提・実行環境
すべてのアルゴリズムの実装に Python を、Deep系のモデルの構築に Pytorch (0.4.0) を使います。Python, Notebook の操作はさることながら Pytorch で基本的なネットワークの構築程度はできる前提で話は進みます。なお Udacity 側で Pytorchのイントロ資料(Jypyter notebook)が用意されています([github で公開されています](https://github.com/udacity/DL_PyTorch))が、特にこの資料にこだわる必然性はありません。

基本的に github の [Dependencies](https://github.com/udacity/deep-reinforcement-learning#dependencies)に記載された環境設定をすれば自分のPCでも実行できます。なお、途中のハンズオンや課題用に、この環境がインストールされた実行環境が Udacity 側で用意されていて、ブラウザから簡易に起動できます(よくできています)。馬力のいる課題ではGPUをONにして実行できます。とはいえ私はほとんどこの環境を使っていなくて、簡易なものはノートPCでやってしまい、重たいハンズオンや提出課題向けには AWSのGPUインスタンスを使いました。なお受講者には、$100のAWS利用権(!)が付与されます(これは他のNanodegreeでも同じはず)

# 講義資料の形態
基本的に、英語でしゃべる講師の説明をYoutube動画で確認しながら進める形式です(Udacityのページからのみ閲覧可らしい)。一般のYoutube動画と同じく英語字幕(精度に難があるが自動翻訳で日本語も出る)が表示され、再生スピードも調整可能です。どの講師も話し方をある程度訓練しているようで、かなり聞きやすい英語に感じましたが、それでもリスニングに難がある自分には英語字幕を見ながら聞けるのがありがたい感じでした(途中わずかに英語字幕が出ないこともありましたが、ほとんどついていた)

この Nanodegree では講習動画のクオリティはかなり高かった一方で、まとめとなる資料が不足していた感があり、動画の中で数式を追うような場面も多く、受講者 slack では「こんなに自分でノート書いたよ！」などと自分のノートみせあいっこするようなスレッドが立ってたりしていました。「理論の詳細にこだわらず、大づかみに理解することを優先する」というようなポリシーが公言されているからとは思うのですが、若干不満の残るところです。

# 課題の提出
DeepRL Nanodegree では提出が必須の課題(**Project** と呼ばれる)が3回ありました。実装に用いたソースコードと学習済みモデルが必要になる他、ソースコードの利用方法とモデルの構造/パラメータ/学習結果(時間経過がわかるグラフ)を含めたレポートドキュメントの作成を求められました。提出はGithubまたはZIP送付のいずれかですが、Udacity側ではGithubでの提出に重きを置いているようで、第三者がみて利用方法や経緯がわかりやすいような README.md を書くように、といった外部への成果公開スキルのチェックに力点があるように感じました。明らかに提出はGithubが楽チンで、私もGithubで提出するようにしました。

# 講義内容
講義は次の4つのパートに分かれています。

## Part 1. Introduction to Deep Reinforcement Learning
Deepに入る前の強化学習の基礎から説明が入ります。Value-Based の手法として SARSA, Q-Learning, Expected SARSA を習得します。説明としては丁寧ですが、価値関数や行動価値関数、ベルマン方程式などの数式や概念について登場が唐突なので、全く予備知識のない人は事前にこの辺りは自分で補った方がいいかもしれません。補助資料としては Sutton & Barto の Reinforcement Learning (2nd) の Preview 版の最初の方を読めとなっているのですが、短時間で読み切るには分量あるのでささっと要点だけつかんで読むか「これからの強化学習」の冒頭とかを読んでおくぐらいはした方がよさそうです。

なお、このPart1を受講している冒頭1ヶ月で「ちゃんと最初の計画を立てろよ」「今週はここまでちゃんと進んだか？」という確認メールがうざいほど飛んできて、いきなり最初からドロップアウトしないようにこれでもかとケツを叩かれます。この辺りの仕組みはなかなかよくできています。

- [Sutton & Barto, Reinforcement Learning (2nd) Preview のページ](http://incompleteideas.net/book/the-book-2nd.html)

## Part 2. Value-Based Methods
ここから Deep-Q Learning の実装に入ります。ここの解説はかなり懇切丁寧な印象がありました。サンプルの実装から始まって改善手法として Double DQN, Dueling DQN が紹介されています

- [Deep-Q Learning の説明に利用されているNotebookがあるgithubレポジトリ](https://github.com/udacity/deep-reinforcement-learning/tree/master/dqn)
- [Double DQN 論文](https://arxiv.org/abs/1509.06461)
- [Dueling DQN 論文](https://arxiv.org/abs/1511.06581)

このパートで最初の課題(Project 1)が登場します。Unity製のシミュレータ上で動くプレイヤーを操作して黄色いバナナだけをうまくキャッチするように動かすアルゴリズムを実装せよというものです。
![42135619-d90f2f28-7d12-11e8-8823-82b970a54d7e.gif](https://qiita-image-store.s3.amazonaws.com/0/261752/42e9bb69-8d64-9773-8700-1361002a2190.gif)
状態としては画像ではなく事前にセレクトされた特徴量が状態として与えられるので、そこまで難しい課題ではありません(画像を状態としたエージェントのコーディングは、発展課題となっています)。私は Double DQN を実装してみました。ところで後の課題でもそうですが、Unityのシミュレータの画面がよくできていて、学習後のエージェントの挙動がうまくいった時の確認に充実感がありとても楽しいです(Unityによるシミュレータは実装/ビルド済みのものを配布しており、シミュレータの実装は講習の範囲外となっていました)

割と早く終えられたかなと思いましたが、8月末から開始してこの課題を終えたのが10/17頃でした。

- [Project1 の課題用 github レポジトリ](https://github.com/udacity/deep-reinforcement-learning/tree/master/p1_navigation)

## Part 3. Policy-Based Methods
ここから Policy-Based の手法の実装になります。まずベースとなる手法である **REINFORCE** アルゴリズムから始まり、さらに発展版として **PPO (Proximal Policy Optimization)** の説明につながります (この辺りの解説を含めた Notebook があるのですが、公式githubにありません)

さらに発展手法/別手法として **Actor-Critic**, **GAE**, **DDPG** の説明が続きます。説明はそれなりにしっかりしているのですが、アルゴリズムの雰囲気をつかむ程度で先に進み「詳しくはちゃんと論文を読みなさい」となってきて、示された論文をせっせとダウンロードしてきて片っ端から読む感じになります。この点こういう作業に慣れていないとかなりしんどいかもしれません。私も慣れているわけではありませんが、こうして概略を示しておいて手法間の関連性を明らかにしたうえでこれを読みなさいとガイドしてくれるのは、読むべき対象を絞れて時間を短縮できるので非常にありがたいところでした。

- [PPO (Proximal Policy Optimization)](https://arxiv.org/abs/1707.06347)
- [GAE (Generalized Advantage Estimator)](https://arxiv.org/abs/1506.02438)
- [DDPG (Deep Deterministic Policy Gradient)](https://arxiv.org/abs/1509.02971)

このパートの課題としては Unityで実装された Reacher というロボットアームをコントロールして浮遊するボールを長くタッチするものです。

![43851024-320ba930-9aff-11e8-8493-ee547c6af349.gif](https://qiita-image-store.s3.amazonaws.com/0/261752/cfbe921a-50c7-39a9-5258-c70ebf86da84.gif)

Action は 4次元の連続量で必然的に Policy-Based の手法を選択することになります。20エージェント版も選択できて複数エージェントの結果から学習するメリットも活用できます。Udacityのヒントでは「DDPGを実装してみれば？」となっていて、slackでもDDPGで実装した人が多かったようで、DDPGの実装ヒントなどの情報が多く飛び交っていました。

私はここはチャレンジと思ってPPO+GAEを用いたロジックの実装をしてみましたが、PPOの実装を間違ってしまいなかなか収束せず、気づくまでにだいぶ時間がかかりましたが結局とても勉強になりました (DeepRL の実装をかなり参考にしました)。正直なことを言うとこの課題を終えたのがすべてのパートの締め切り1週前だったのでした。

- [Project2 の課題用 github レポジトリ](https://github.com/udacity/deep-reinforcement-learning/tree/master/p2_continuous-control)
- 私が参考にした [DeepRL](https://github.com/ShangtongZhang/DeepRL) : PPO, DDPGなどの実装がありよくできていて勉強になる。

## Part 4. Multi-Agent Reinforcement Learning
このパートは受講開始時には未完成で急きょ作られたパートです。趣旨としては、複数エージェントで協力が必要な状況ではそれ用のアルゴリズムがいるよねということで Multi-Agent 版の DDPG (MA-DDPG)の解説がありますが、正直急ごしらえ感が満載でここは不満が残りました。slackでもかなり不満がぶちまけられていたようで今後の改善が望まれるところです。

![42135623-e770e354-7d12-11e8-998d-29fc74429ca2.gif](https://qiita-image-store.s3.amazonaws.com/0/261752/7b72848f-5025-c401-fca7-1adea56ba96a.gif)

ここでは 2人でテニスのラリーを続ける課題なのですが、Policy-Based の課題で作ったロジックがそのまま適用できてしまい、なんだか拍子抜けするものでした。(slack では MA-DDPG の実装方法が盛んに議論されていましたが私には時間的にほとんど余裕がありませんでした)

- [Project3 の課題用 github レポジトリ](https://github.com/udacity/deep-reinforcement-learning/tree/master/p3_collab-compet)
- MADDPG の論文 : [Multi-Agent Actor-Critic for Mixed
Cooperative-Competitive Environments](https://papers.nips.cc/paper/7217-multi-agent-actor-critic-for-mixed-cooperative-competitive-environments.pdf) .. すみません、読んでません..

# 問題点に思ったところ
以下、取り上げなかった問題点を挙げてみます

## Github, Linkedin
これはほかの Nanodegree でも重複しているのかもしれませんが、途中でGithubとLinkedinで上手く自己アピールをするためのアカウントの作り方課題というものがありましたが、私にはちょっと余計に感じました。なるべく実名を乗せよ、顔写真はちゃんとつけろと自己アピール指導されるのですが、「自分の存在を外にどんどんアピールしよう」という海外のエンジニアの気質があまりに強く、これには私も若干辟易しました。これらのトピックはあまり日本人にはなじまなそうです (とはいえ必須課題なのでちゃんとしておきましたが..)

## レビュアーについて
私は以前 Deep Learning Nanodegree も受けたのですが、レビュアーのチェックが若干雑かもしれません。これは評価基準として、スコアが基準値以上になっているか、レポーティングの体裁がしっかりしているかという点に重きを置いていると思われ、実装上の問題点や改善点などに重きがあまり置かれていないためかと思われます。とはいえコードに問題点が残っていたらそもそもスコアが基準に達しないことが多いので、それほど気にならないと言えばそうなのですがちょっと残念でした。

# まとめ
なかなかに重たい出費だったのですが、それだけに内容もかなりしっかりしており、一人ではここまで達することは難しいということを考えるとかなり得るものが多かった講習でした。私には課題をクリアすることで必死な感じでしたが、もう少し他の課題にあたってみてレベルアップを図りたいと思います。