Python覚えて3ヶ月の素人がCoursera Deep Learning Specializationを1週間で完走した話

Courseraの[Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning)の5コースを1週間で完走してきたので体験レポートを書きたいと思います。**1週間での完走はほとんどエクストリームスポーツだった**ので、実践する方は注意してください。

## きっかけ
Andrew Ng先生の[Cousera Machine Learning](https://www.coursera.org/learn/machine-learning)を受講したら面白かったので、同じAndrew Ng先生ディープラーニングのコースも受講することにしてみました。ただし、機械学習のコースと異なり、ディープラーニングのコースを完全にクリアするには課金（2018年5月現在月額49ドル）が必要です[^1]。Courseraには[Financial Aid](https://learner.coursera.help/hc/en-us/articles/209819033-Apply-for-Financial-Aid)があるため、条件次第では月額課金の補助が出ることもありますが、手続きが英語で審査に15日はかかるのでちょっと面倒くさい。

[^1]: 課金が必要なのは「プログラミング演習とテスト、修了証の発行」。講義自体は無料のAudit（聴講）モードでも見られます。このコースの場合、講義の動画がYouTubeに公式にアップロードされています。

ただし1個だけ手続きなしで全員適用される技があり、ディープラーニングのコースの場合、「**7日間の無料トライアル期間**」があります。このお試し期間中では、月額課金した場合と同様のアクセスが可能。要するに、お試し期間中にコースをクリアすれば修了証がもらえてしまいます。つまり**1週間以内に全5コースを完走すればよくね？**というとても頭の悪い発想ができます。**実際やってみたらできました**。多分自分がDeep Learning Specializationを1週間以内に完走した最初の日本人だと思います（前例いたら大変申し訳無い）。

## バックグラウンド
どのぐらいの事前知識があって受講したか晒しておきます。

* もともとC#をやっていたが、Pythonは覚えて3ヶ月。Python覚えたてに[この記事](https://qiita.com/koshian2/items/e5488380505a373f5bce)を書いたらそこそこバズった。
* Pythonは[公式チュートリアル](https://docs.python.jp/3/tutorial/)を読んだ。特に本は読んでいなく、サーバーでのデータ収集のプログラムを書いてたら自然と身についた。
* Coursera Machine Learning（ML）クリア済み。MLの講義受ける前は機械学習のきの字も知らなかった。こちらは練習がてらにPythonに移植しながら3週間ぐらいで終わった。
* SVMあたりまではわかるがそれ以上のディープラーニングは何がなんだかわからない
* Numpy, Scikit-learnの使い方はわかるが、Tensor-flowやKerasといったフレームワークは一切触れたことがない

##注意点（必ず読んでね）
予め断っておくと、**本来これは16週かけて勉強することを想定されたもので、1週間で終わらせることを想定されたものではありません（重要）**。全5コースで計16回の講義があり、1回あたり演習も含めて3～6時間程度の学習時間が必要とされています。1回の講義あたり4時間と見ても累計64時間、1週間で終わらせる場合1日平均9時間勉強しなくてはいけません。これを1週間続けます。1日だけ9時間やるのは簡単でも、これを続けるのが結構つらい。

![nebusoku_s.png](https://qiita-image-store.s3.amazonaws.com/0/232088/97f0750e-234f-ae01-c564-497f0d090788.png)

**普通は課金して1週間＋1ヶ月（5週間）で終わらせるほうをおすすめ**します。この場合は2日で1講義終えればいいので、これでもハイペースですが、かなり人権のある勉強の仕方ができます。その人のペースにあわせて、2ヶ月、3ヶ月と期間を調整してみてください。自分でやってて言うのもアレですが、1週間チャレンジするのは頭おかしい人ぐらいの認識でいいです。自分は「命削って勉強してる！楽しい！！」を体験できました。

逆に言えば、時間の余裕があり、腕に覚えがある方はぜひチャレンジしてみてください。間違いなく忘れられない1週間になると思います。今まで本読んでも何やってるんだかわからなかったディープラーニングが、受講後は「ああ、これね」というぐらいになりました。この感覚が1週間で得られるのはなかなかに気持ちいい。エクストリーム・ディープラーニングRTA、自分の記録は6日半でしたが、7日以内クリアにチャレンジしてみてはいかがでしょうか。

## 特に1週間で完走したい人への注意点
「無理しないように」ということ以外に、技術的に3つほど注意点があります。

* **プログラミング課題はこまめに保存しましょう**。自分の環境ではカーネルがエラー出て落ちると、カーネルを再起動してもうまくいかず、作業内容を放棄してウィンドウを閉じてまた開き直さないとダメでした。特にサーバーが重い時間は注意してください。重い時間帯は10分に1回ぐらいカーネルが落ちました。サポートに問い合わせたら重くなる時間帯があるようで、重いときはまたあとでやってねと言われます。
* **身分証の確認は3～5営業日と書いてあるがそれ以上かかることもある**。修了証の発行に必要なID確認が、自分の場合5営業日経っても認証されませんでした（書類不備のメールはこない）。調べていると[数時間で終わったケースもあれば、2ヶ月経っても保留中のままのケース：英語記事](https://www.quora.com/How-long-does-Coursera-usually-take-to-verify-an-ID)もあるようです。2ヶ月経っても認証されなかった人は、最終的にCouseraの[Help Center](https://learner.coursera.help/hc/en-us/requests/new?ticket_form_id=120983)に問い合わせたら認証されたようです。自分も**5営業日経って問い合わせたら認証されました。ただし、問い合わせは英語オンリー（？）なので、英語で問い合わせする必要があります**。なので、前もってID認証だけ終わらせておくのが安全です。MLの講義と並行して認証しておくのがいいと思います。
* **Machine Learningの講義の内容を理解しておく**。これはゆっくりやる場合にも当てはまるかもしれませんが、Machine Learningの内容をちゃんと把握しておくと前半楽できます。特に、**ニューラルネットワークとBias vs Variance**の所はちゃんと理解しておいたほうがいいです。Backward Propagationは自分も初めてのときは何やってるんだかわからなかったのですが、Machine Learningのコースのほうが時間がある分丁寧に説明しています。なので「バックプロパゲーションって何？」というレベルだったら、まずはMachine Learningのコースを受講しましょう。

ちなみに自分が1週間チャレンジ始めるときにこちらを参考にしました。

参考：http://naoyat.hatenablog.jp/entry/deeplearning.ai

## コースの詳細
前置きが長くなってしまいましたが、5コースの構成は以下のとおりです。また自分が1週間で完走したときの感想も合わせて書いておきます。

###1. Neural Networks and Deep Learning
1. Introduction to deep learning
2. Neural Networks Basics
3. Shallow neural networks
4. Deep Neural Networks

全4週。1週目はコースの導入となぜディープラーニングが流行ったかということについて。2週目はロジスティック回帰の復習、計算グラフ、Pythonの使い方。3週目は基本的なニューラルネットワークをざっくり復習。4週目は隠れ層の数を増やしてDNN（ディープニューラルネットワーク）とハイパーパラメーターについて。各週の最後に「Heros of deep learning」というインタビュー形式のお楽しみ要素があります。

プログラミング課題ではまだTensorFlowやKerasといったフレームワークは使いません。あくまでNumpyだけを使ってForward/Backward Propagationがどんな式になるかを習得することを目指しています。

1週間で完走を目指す場合は、ここのコースが一番時間が稼げるエリアです。Machine Learningの講座をやっていればだいたいこのへんわかったので、倍速再生にして1コマでも多く行けるようにしました。ここは日本語字幕がほぼ完備されているので、速度が出しやすいところです。

![my_image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/232088/3b7979a4-5036-4280-28da-bbed235b9ce8.jpeg)

###2.Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
1. Practical aspects of Deep Learning
2. Optimization algorithms
3. Hyperparameter tuning, Batch Normalization and Programming Frameworks

全3週。1週目は訓練/開発/テストデータの分け方、Bias vs Variance、正則化、ドロップアウト、勾配の消失・爆発、He Initialization、Gradient Checkingについて。2週目はミニバッチ、モメンタム、RMSprop、Adamアルゴリズム、局所解/鞍点について。3週目はチューニングのプロセス、ハイパーパラメーターの選び方・どこを重点的にチューニングするか、バッチ標準化、ソフトマックス分類器、TensorFlowの導入をそれぞれ学びます。

プログラミングの課題は、3週目の最後にやっとTensorFlowを導入しますが、それまではコース1と同様に、ハイパーパラメーターのチューニングや初期値のとり方、最適化アルゴリズムによってどの程度精度や収束の早さが変わるかをNumpyベースで見ていきます。

1週間で完走を目指す場合は、ここも速度が稼げるエリアです。日本語字幕もだいたい整備されていて読みやすいです（字幕整備してくれた人には頭が上がらない）。新しい概念がいろいろ登場してごちゃごちゃしますが、基本的なところは普通のニューラルネットワークと変わらないので理解しやすかったです。途中、Adamアルゴリズムのところが難しくて山がありますが、演習で1回やったあとはTensorFlowにまかせてしまうので、こういうやつだったのかぐらいの理解で大丈夫です。
![cost.jpg](https://qiita-image-store.s3.amazonaws.com/0/232088/93e369a4-e849-ffbb-8b18-dee45789457b.jpeg)

###3.Structuring Machine Learning Projects
1. ML Strategy (1)
2. ML Strategy (2)

全2週。1週目は訓練/開発/テストデータ、本番環境のどこで問題が起きているのかに対するケーススタディ、単一の評価尺度、訓練/開発/テストデータの分布の同一性、人間の認識精度とベイズエラー。2週目はエラー分析、最初のシステムを手っ取り早く作ることの重要性、追加のデータが必要になり訓練データとテストデータが異なるようになった場合（ミスマッチ）の対応法、ミスマッチの解釈、転移学習、マルチタスク学習、end-to-endのディープラーニングを学びます。

このコース3は他のコースと毛色が違って、ディープラーニングの技法よりもマネジメント寄りの話です。プログラミング課題はありませんが、いつもより小テストの問題が多く、英文読解が求められます。

自分の場合、コース1と2で飛ばして結構疲れてしまった[^2]ので、ここはスピード落としました。多分ここで話している内容は結構重要だと思います。MLの講座でも似たような話をしていましたが、DLに置き換えてもっと体系立てて整理した感じです。あとで振り返って整理しようかと思います。
現状コース3から日本語字幕がほぼなくなってくる[^3]ので、英語字幕と格闘しました。英語字幕をGoogle翻訳使ってやる方法がありますが（以下参照）、字幕をいちいちダウンロードするのが面倒くさかったのでそのまま英語字幕で見ました。

参考：https://qiita.com/PonDad/items/33b5f514b0ca7be88685

[^2]: 1日目はいいんだけど、2日目、3日目も3～4コースやってると心理的にしんどくなってくる。コース2～3あたりが先が見えなくて一番心理的につらかったです。
[^3]: 日本語字幕がなくなったときは、例えば自転車を漕いでいてずっと舗装された道かと思ったら、急に砂利道になってそれが延々と続くような絶望感を感じました。先生の英語はとても聞き取りやすく、理解できないわけではないけど、理解できるスピードや精度が落ちてしまうのは仕方ないです。本当日本語字幕入れてくれる人には頭が上がらない。

日本語字幕ありだと1.5倍速～2倍速ぐらいで見れても、英語字幕だと等速～1.25倍ぐらいになってしまいます。先生がゆっくりはっきり喋ってくれるのが本当ありがたかったです。
テスト問題はいつもより長めの英語読解ですが、自分はバンバンGoogle翻訳を使いました。内容わかっていても読解でミスったら面白くないので。

![mont-saint-michel-688405_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/232088/abe44d84-120b-8d4a-fd1d-d0c684f5805b.jpeg)

ちなみにこのコース3が終わると「おめでとう！このビデオが終わったらあなたはシリコンバレーの多くのエンジニアや研究者よりも、よりスマートかつ戦略的に機械学習のプロジェクトの意思決定ができるよ」と褒めてくれます[^4]。本当かよ。

[^4]: Machine Learningの講義でもそんな話を聞いた気がする

###4.Convolutional Neural Networks
1. Foundations of Convolutional Neural Networks
2. Deep convolutional models: case studies
3. Object detection
4. Special applications: Face recognition & Neural style transfer

全4週。1週目は畳み込み層、Padding、Stride、プーリング層など畳み込みニューラルネットワークの基礎。2週目はResNet、1x1の畳み込み層、Inception Network、オープンソースのネットワークからの転移学習のすすめ、訓練データの増強の仕方。3週目はランドマーク検出、物体（の位置）検出、Sliding Windows、Bounding Box、IoU（Intersection Over Union）、Non-max Suppression、Anchor Box、YOLOアルゴリズム。4週目は顔認識、One Shot学習、Siameseネットワーク、Triplet Loss、顔認証と2値分類、Neural Style Transfer、深層畳み込みニューラルネットワークを、それぞれやります。

プログラミングの課題として、1週目は理解のためにNumpyによる畳み込みニューラルネットワークのForward/Backward Propagationの実装と、TensorFlowによるハンドサイン（指による数字）の認識を行います。2週目ではKerasを導入しResidual Networkを実装します（ここからはずっとKerasを使います）。3週目では、YOLOのアイディアであるBounding BoxやIoUの実装をみつつ、YOLOv2を用いて車載画像からの物体検出を行います。4週目では、Neural Style Transferによる画像生成、顔認証を行います。

自分が1週間で完走したときでも、このコース4とコース5はさすがに難しくて、1日1コース～2コースが限度でした。特にプログラミングで画像を動かすことになるので、4階のテンソルを当たり前のように処理する必要が出てきます。普通のニューラルネットワークは2階テンソル（行列）でよかったので、ここの衝撃が大きかったです。
あと自分はKerasを全く触ったことがなかったので、「レイヤー(引数)(変数)」のような二重括弧の扱いが理解するのが大変でした。ただ、慣れればとても使いやすいフレームワークだと思います。

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/232088/073f337f-3a6c-02bb-8ddb-4668174c5f6e.jpeg)

YOLOのアルゴリズムは結構ややこしいですが、物体検出自体は面白かったですね。特に出てきた画像がSF感ありました。YOLO限らずこの畳み込みネットワークの応用例はとても華があり、これぞディープラーニングという感じがしました。Neural Style Transferも楽しかったです。顔認証はエンコードさえしてしまえばあとは単純なので、「あっ…これは自分でも理解できる」ってなったのがよかったです。

###5.Sequence Models
1. Recurrent Neural Networks
2. Natural Language Processing & Word Embeddings
3. Sequence models & Attention mechanism

全3週。1週目は、再帰型ネットワーク（RNN）の基本、固有名詞の認識・音楽生成・機械翻訳等のケース別に異なるRNNがあること、GRU、LSTM、Bidirectional-RNN。2週目はEmbedding matrix、Word2Vec、Negative Sampling、GloVe、センチメント分類、単語のバイアス除去。3週目はBeam Search、Beam Searchのエラー分析、Bleu Score、Attentionモデル、音声認識、Trigger Word Detectionなどです。

プログラミングの演習は引き続きKerasを使います。1週目はまずNumpyでGRUとLSTMのForward/Backward Propagationを実装します。LSTMのBackward Propagationは発狂しそうなぐらいややこしいです。次にKerasを使い、単純なRNNを使って恐竜の名前の辞書からランダムに新しい恐竜の名前を生成します（これは楽しかった）。次に、組み込みのLSTMを使い、ジャズの音楽を生成します（これも面白かった）。2週目はコサイン類似度を用いた単語の類推と、EmbeddingとLSTMを用いて与えられた文章に対する絵文字の推定を行います。3週目では、Attentionモデルを用いた日付のフォーマットの統一（機械翻訳）と、Trigger word detectionを用いた音声認識（OK, Googleみたいなやつ）を行います。

<img width="968" alt="mangosaurus.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/232088/41483717-5350-5ece-6ae7-afd86717c31b.jpeg">

正直、RNNは難しくて内容よくわかりませんでした。ただ最後なので気合でどうにかなりました。最後演習のTrigger word Detectionが「Activate」と喋ったタイミングを認識するようなプログラムで、誘導通りにやってほえーっとなっただけなのですが、これがどうもend-to-endのディープラーニング（と書いてあった）で、そうなんだと関心しました。とりあえず内容よりも完走できたことの達成感のほうがすごかったですね。


##受講の記録
自分はこのようなペースで1週間で完走できました。

**1日目**：～コース1のWeek3（3回分消化）
**2日目**：～コース2の終わり（4回分消化）
**3日目**：～コース4のWeek1の途中（2.5回分消化）
**4日目**：～コース4のWeek3（1.5回分消化）
**5日目**：～コース5のWeek1（2回分消化）
**6日目**：全コース終了　（2回分消化）

実際は端数でて6.5日ぐらいになっています。16回の講座を7日で走り切るには1日あたり平均2.3コースやらないといけないので、内容が難しいコース4、コース5をこのペースで走り切るのは相当きついです。なので、1週間完走を目指したければ、前半のコース1～3を早く終わらせるのがいいと思います。

全てのコースを完了すると、いつものコース別の修了証のほかにDeep Learning Specializationの修了証ももらえます。
![dl.png](https://qiita-image-store.s3.amazonaws.com/0/232088/a0b67f00-a560-bd78-33cf-f86d07d60c27.png)

**一番つらかったのは眠気です**ね。ご飯食べたあとにAndrew先生のイケメンボイスを聞いていると普通に眠くなります。説明はとてもわかりやすいです。眠くなったらこまめに寝ましょう。

##まとめ
こう振り返ってみると、相当いろんなこと詰め込んでやってたんですね。まだ日本語字幕が未整備の部分が多いので、敷居が高いところもありますが、これをやればだいたいのディープラーニングの本は読めると思います。それどころか、先生も論文の紹介をして「この論文は読みやすいよ。気になったら読んでみてね」とか言ってたので、本だけでは物足りないレベルまでやっているはずです。

Andrew Ng先生の解説はMLの講義のときのようにとてもわかりやすいので、1週間で完走ということにこだわらず、ぜひ自分のペースで挑戦してみてください。もし英語にためらいがなければ世界でも指折りのわかりやすさだと思います。