Udacityのディープラーニング基礎コース(Deep Learning Foundation)を終えた感想

[Udacityのディープラーニング基礎コース(Deep Learning Foundation)](https://www.udacity.com/course/deep-learning-nanodegree-foundation--nd101)を終えたので感想。

1月から17週の有料コースで、世界中で5000人以上の方がこのコースを受講しているメガコース。日本からも50名程度参加してるよう。

アメリカはもちろん飛び抜けて多そうだけど、中国、インド、カナダ、イギリス、ドイツあたりからも100名以上参加してそう

それなりに負荷の高いコースでしたが、かなり勉強になった。ディープラーニングの基本の実装から、フレームワークを使った具体的なプロジェクトまで幅広く学ぶことができた。

## AI

AIが世界を変えつつあるこのなかで技術者としてこの技術を学ぶことができるのはとても楽しい。

ディープラーニングのここ数年の驚くべき成果に興味を持ち、実際にライブラリなど利用して実装しようとすると、新しい概念が多すぎて、ほとんどこれまでのプログラムの知識が役に立たず、手探りにのままなんとなく動かしていた。

この技術を使うことで何ができ、何ができないか、何かを行うためにはどのようなデータセットがどれほど必要なのか知っておきたく、いくつか技術書を読んでみたもののなかなかその先が見えない。

ちょうどその頃にUdacityで新しくディープラーニング基礎コースが始まり受講してみることにした。

## 始める前

コースを受講する前はこれらの日本語で読めるこれら、[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](http://amzn.to/2p5n7P6)、[はじめての深層学習(ディープラーニング)プログラミング](http://amzn.to/2qJyBoL)、[よくわかる人工知能 最先端の人だけが知っているディープラーニングのひみつ](http://amzn.to/2q8bY02)の本読んで、TensorFlow、Chainerなどのライブラリを触って詳細分からないままサンプルコードベースに色々触ってるくらい。

## コースの内容

週ごとにビデオ講義とjupyterノートブックが与えられ、3週間に1回程度課題が与えられ、jupyter上でコーディング＆テストをして送るとUdacityコーチにより添削をされる。ちゃんとコードをみて修正する点や精度を高めるためのパラメータの設定などのアドバイスをしてもらえ、不明点があれば質問できる。

プロジェクトの締め切りは決まっていている。これまでのMOOCは自分のペースで学ぶためなかなか先に進まないことが多かったが、こちらはお金も払っているし締め切りもあるので個人的にモチベーションも保ちやすかった。逆に仕事が忙しいと時間を見つけるのが大変。

英語での受講だが、技術者であれば英語の文献には普通に当たっていると思うので問題はないと思う。(YoutubeでもDeeplerningビデオたくさん出しているデータサイエンティストSirajのテンションが高く理解できない部分もあったり。)

## コースを受講するにあたり必要な知識

コースを受講するためのいくつかの必要知識が設定されている。基本的なことは講座の中でも説明される。

 - 基本から中級までのPythonの知識
 - Numpyの知識
 - Anaconda、jupyterノートブックの知識
 - 数学：代数、微積分、行列計算

## パート1　ニューラルネットワークの基礎

Anaconda、Jupyterノートブックなど開発環境をセットアップして、TensorFlowの画像スタイルトランスファーを試す。

線形回帰、Numpyによる行列計算の基礎を学んで、ニューラルネットワークを構築する。この辺りは[ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](http://amzn.to/2p5n7P6)の前半に近い。

## 課題1 バイクシェアリングの需要予測

過去のデータからバイクシェアリングの利用者数を予測する課題が出る。バイクを何台持っていればもっとも効率的に回すことができるかを予想する。

この時点ではTensorFlowなどのライブラリを使わず、シグモイド関数なども実装する。
エポックやラーニングレートなどのハイパーパラメタを設定し正しく学習が進んでいくことを確認する。この時点では単純なニューラルネットワークで十分な精度が出てるとは言えないが、すぐに何かに応用できそうな課題で面白い。

## パート2 コンボリューショナル・ニューラルネットワーク 畳み込みニューラルネットワーク

MiniFlow、TensorFlowなどライブラリを使い始め、課題が複雑になり始め、GPUがなければ太刀打ちできなくなってくるため、AWSのGPUインスタンスの使い方を説明する。$100分のAmazonクレジットをもらえるため、サンプルの計算のために立ち上げる分には十分なGPU計算リソースを確保できる。

AWSのGPUインスタンスを使うには申請が必要で少し時間がかかるので課題を終わらせるために早めに申請が必要となる。私はAWSではなく、この後の課題でもクラウドGPUにはFloyedHubを使った。ローカルJytperノートでコーディングしてトレーニングまで実装できたらfloyedHubに送って計算させる感じ。

講義ではデータの準備を学び、深層ニューラルネットワークに入っていく、2層の小さなニューラルネットワークを構築し、トレーニング、チューニング、ドロップアウトなどを学ぶ。

マックスプーリング、アベレージプーリング、インセプションモジュールなどの詳細を学ぶことができるが、結構負荷の高い週でもある。

## 課題2 画像分類

画像を見えると何が写っているかを精度の高い順にラベル付けするタスク。

データソースとして[CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html)の6万枚の10種類のラベル付けされたデータセットを用いてして実際に画像分類のCNNを構築し、精度が出るまでネットワークを学習させる。最初はmacbookproのローカルで動かそうと思っていたが、遅すぎてGPUなければ厳しい課題となる。AWSでもFloyedHubでもクラウドのGPUリソース手軽に安く利用できるのでGUPマシン買わなくても当面問題ない。

## パート3-1 再帰型ニューラルネットワーク(RNN)

RNNの基礎、LSTMセル、Word2Vec、Sentiment Prediction RNNなどを学ぶ。

## 課題3 TVスクリプト生成

シンプソンズの過去の27シーズン分のスクリプトを学習させて、新しいTVスクリプトを自動生成させる。
結果は意味不明なものの、テキストのスタイルをちゃんと学んでいて面白い。

## パート3-2 トランスファーラーニング、強化学習(Reinforcement Learning) 
seq2seq、テキストジェネレーションなど言葉を扱う部分を引き続き学ぶ

## 課題4 機械翻訳

フランス語と英語の映画のスクリプトを学習させて、機械翻訳を作る。
開発者が知らない言語であっても、ちゃんと翻訳されていて驚くのだけど、これをこの超短期間に実装できるようになるのもすごい。ディープラーニングという技術の凄さ。

## Generative Adversarial Network (GAN)

ラベルなどの教師なしで学習をさせる。

ハイパーパラメーターの設定の仕方、セミハイパーパラメターの考え方を学ぶ。

GAN使うと馬が走っている映像の、馬をシマウマに置き換えたり、りんごが木になっている映像の中で、リングの部分をオレンジに置き換えたり、冬の景色を夏にしたりとか違和感なくできていて、もう本当にびっくりする。

課題は、MINST使ったデータから数値の生成と、2万枚のセレブの顔写真からGANで顔を生成させる。

## 修了証

個人情報と顔写真のチェックをして修了証が発行される。 

ディープラーニングの基礎編ということで3ヶ月だけれども、かなり勉強になった。

こんな風に高速道路が用意されて世界中でディープラーニング技術者が増え続けてるわけで、あらゆる産業でAIが普通に使われていくことは間違いない。

AIの面白さは、プログラマに分野の深いバックグランド知識がなくても、割と単純な数学的な仕組みから、コンピュータが膨大なデータから(時には人間よりもよく)特徴を抽出してしまうというところで、脳のネットワークの模倣を数学的に置き換えるだけでできることがこれほどあるのかと驚く。


このぐらいまで基礎知識がわかれば、最新の情報自分で学んで色々なデータで試してみたくなる。
新しいことがどんどんできていて面白い。オススメの講座です。