courseraのML・DLコースを2か月でやり遂げた話

## TL;DL

* courseraでMLとDLの講座を合わせて2ヶ月で受けた
* 困ったときには、とにかくディスカッションフォーラム
* 気軽にはじめてみるのが吉
    * 休みがあればタダでも相当できる
    * かけた費用は 9010円(ML) + 5588円(DL/1ヶ月)

### このページに書くこと

* やったときの気持ち
* どう進めたか
* 困ったときの解決方法

### このページに書かないこと

* コース/技術の詳細

## モチベーション

仕事や趣味でたまに機械学習を使ったり、日常的にML・DL関係の記事を読んだりしていましたが、常に、[落下傘方式](https://tjo.hatenablog.com/entry/2014/03/31/191907)的に勉強してきたため、正則化、最適化、数式による理解などなど、様々な知識が抜けていると感じることがありました。
諸般の事情で11月の1ヶ月間、長期間のお休みがある状態になったので、良い機会なので体系立てて機械学習を学ぼうと思い、courseraのMachine Learningと Deep Learning講座を受けてみました。
その他、以下のような気持ちがありました。

* 英語の勉強になればいいな
* numpy/keras使った実装の入門とかベクトル演算に慣れたい
* 「機械学習ﾁｮｯﾄﾜｶﾙ（かじったことことはあります）」と言えるように自信をつける
* 話のネタにしたい
* 休みボケ防止
* やるからにはやりきりたい
* できることならお金はそこまでかけたくない
* みんなやってるからやってみたい(参考記事)
  * [Coursera の機械学習コースを完走して修了証を取得した話](https://yubessy.hatenablog.com/entry/2016/01/11/214611)
  * [deeplearning.ai受講メモ (2/24更新)](https://naoyat.hatenablog.jp/entry/deeplearning.ai)
  * [それでもCourseraの機械学習コースをオススメする理由](http://d.hatena.ne.jp/shu223/20170207/1486451495)
  * [Courseraの機械学習コースのススメ 前編](https://qiita.com/mono0926/items/2c39649d24b2e515f4b5)
  * [数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと](https://qiita.com/katsu1110/items/423fc9ac567710a1bd9b)
  * [Python覚えて3ヶ月の素人がCoursera Deep Learning Specializationを1週間で完走した話](https://qiita.com/koshian2/items/116ebd6ae5dcb73e655c)

### やったこと

courseraの以下の計6つのコースです。

1. [Machine Learning](https://www.coursera.org/learn/machine-learning/)
1. [Deep Learning専門講座](https://www.coursera.org/specializations/deep-learning)
  1.  [Neural Networks and Deep Learning](https://www.coursera.org/learn/neural-networks-deep-learning?specialization=deep-learning)
  1. [Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization](https://www.coursera.org/learn/deep-neural-network?specialization=deep-learning)
  1. [Structuring Machine Learning Projects](https://www.coursera.org/learn/machine-learning-projects?specialization=deep-learning)
  1. [Convolutional Neural Networks](https://www.coursera.org/learn/convolutional-neural-networks?specialization=deep-learning)
  1. [Sequence Models](https://www.coursera.org/learn/nlp-sequence-models)

それぞれのコースの説明は上記の参考記事に譲ります。

## スケジュールとかけた費用

MLの講座を受けるのに、

* 10/15に登録開始
* 11/12に認定書の取得の支払い
* 11/17に修了

こちらは、支払いがなくてもコースは進められますが、[せっかくなのでお金を払って認定書をゲットしました](
https://www.coursera.org/account/accomplishments/certificate/2AGPF3UNL475)。9010円(79ドル、2018/11/12時点)かかりました。
間に10日ほど、旅行に行っていましたが講座は、大体1～3日で1Week分を進めていました。ある程度基礎的な知識は持っていたのと、日本語字幕があるので動画は倍速で見ていました。

DLの方は、

* 11/17に登録(無料期間開始)
* 11/20にコース1修了
* 11/24無料期間終了 同日サブスクリプションをキャンセル
* 11/28にサブスクリプションの支払い、同日コース2修了
* 11/29にコース3修了
* 12/1にコース4修了
* 12/16にコース5修了

という形で進めました。
DLはMLと違いサブスクリプション制です。一度、引っ越しのためcourseraを利用できない期間があり、サブスクリプションをキャンセルしていますが、支払い(5588円/月)を始めれば問題なく、前回終了したところから開始することができました。こちらは無料期間中でも認定書がもらえ、一連のコースをクリアすると、[すべての証明書をまとめたページのリンクがもらえます。](https://www.coursera.org/account/accomplishments/specialization/9XZ9BHCE3M5C)

無料期間が1週間あるので、かなり頑張ればコース3まで、そうでなくても、何日かお休みがあればコース1は終了できると思います。[参考記事に書かれている通り](https://qiita.com/koshian2/items/116ebd6ae5dcb73e655c)、間違ってもコース5までやってしまおうと思わないのが良いと思います。こちらも調子が良いときは、1~2日で1週間分を進めていました。12月に長期お休み期間が終わってからは、平日に1週間分のビデオをみて、休日にプログラミング課題を行うというペースで進めました。

今回、どちらのコースも、一度も期限に遅れることなく進めました。遅れたときにどうなるかはちょっとわかりませんでした。

ちなみに、上述の参考記事によく書かれている本人確認情報の登録ですが、私は行った記憶がありません。Googleアカウントで登録するなどアカウント作成方法によっては必要ないのかも。

## 必要なもの

講座を進めていく上で、必要だなと感じたものを挙げてみます。

- やってみようという気軽な気持ち
  - とにかく一から丁寧にわかりやすく教えてくれる。Andrew先生神
  - プログラミング課題もHintが多数
- 英語力
    - Google翻訳フル活用すればなんとかなる
    - とはいえ、Google翻訳も数式の前には無力なこともママあります
    - MLは日本語字幕がありますが、DLはコース1を除いて日本語字幕はほぼないです
    - 課題が徐々にケーススタディになっていくので課題設定を理解するのにある程度英語力が必要
- 長期間のお休み ( or 継続的な学習習慣 and お金 ) 
    - MLについてはじっくりできるので継続的にできます
    - DLについては、持続的にやると結構お金かかります
- python/numpy/octave/keras/に対する親しみ
    - 講義中に基礎的な知識は教えてもらえますが、やはり、ある程度知っていたほうがスムーズです
    - octaveはそこまで違和感はありませんでした
- やってやるという強い気持ち
  - 流石に終盤になるにつれて、CNNあたりからはプログラミング課題の難易度が上がったように感じました
  - よくCourseraから「頑張って期限より早く終わらせてね」「課題に不備があるから見てね」メールが飛んできて「やるしかないという気持ちに
  - 正直3回くらい心折れましたが、頭を冷やしたり、ディスカッションフォーラム読んだりしてなんとか乗り切った

## 困ったときは

プログラミング課題には細かくExpected Outputが用意され、自分の実装が正しいかどうか、都度確認することができますが、それでもExpected Output通りに出力しなかったり、期待通りの出力になるのに、`Sorry, your submission was incorrect.` で課題が通らないときもよくありました。
困ったときは、以下のようなことを行っていました

- 詰まったらディスカッションフォーラムで調べる
  - 心が折れたときも調べる
  - DLの後半では特にお世話になった
        - lowerつけるべきところを忘れていたり
        - Sequential Modelsでテストケースが適切でなく、baseballとfootballで間違っている件が一つあったり
- 誤ってグローバル変数を利用していないかを確認する
  - 関数外の変数を利用していて、期待通りの出力にはなるが、課題が通らない
  - 数式を実装する上で、一文字間違えても起こり得る
- notebookで、restart → save → run all → submitしてみる
  - コードは何も変えてないのに、なぜか不合格から合格に、みたいなことがある
  - ディスカッションフォーラムでもよく推奨される

他にも講座やテストでは以下のようなことを行っていました。

- 技術についてググる
    - 特にDLの後半は、論文の紹介が中心で、ビデオだけでは理解が進まないことが多かったです
    - それぞれの論文・技術は解説記事が日本語でも多数あるもので、よくググっていました
    - ただし、問題文とか課題文をググって読むのはHonor Code違反
- テストで自分の回答をスクショして残す
    - テストは繰り返し受けられる
    - 自分がどう答えたか、その回答がどうだったかを復習できればなんとかなる
    - テストの答え合わせで、何を回答してどう間違えたか教えてくれるコースもあれば、逆に教えてくれないコースもある
    - メモを取るのは大変なので、適当なchrome拡張([FireShot](https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg?hl=ja))を利用
- octaveの課題は、通ったテストまで `pause;` をコメントアウト
    - exX.m は改変しても課題には影響ないので反復実行を楽にできるようにする


## 最後に

はじめに挙げたモチベーションは、ほぼ満たせることができました。
機械学習・DLを体系的に学ぶことができ、入門として、とても良いものだったと感じます。

また、本当に、Andrew Ng先生によく励まされました。多分、他の先生だったらどこかで挫折していたのような気がしています。

MLはすべて、DLについても一週間は無料でできるものだったので。もっと早くに取り組んでいればよかったな、と思います。
また、今回、休みの都合もあり、短期間で駆け抜けましたが、参考資料のLecture Notesを読んだり、手法の理解をきちんと真面目に行った場合はもっと時間がかかると思います。
時間があった学生時代に、機械学習だけでもやっていれば、様々なことがスムーズに理解できたなー、と思いました。

### Feature Work

- ML/DLを使ったなにかアプリを作る
  - あくまで講座でしかないので、実践は大切
  - 課題設定、データ収集、前処理あたりは数こなす必要ありそう
- ライブラリ(keras)の使い方を学ぶ
  - [詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~](https://www.amazon.co.jp/dp/4839962510/)
  - [PythonとKerasによるディープラーニング](https://www.amazon.co.jp/dp/4839964262/)
- あわせて、RNN、LSTMあたりの理解を進める
  - 正直 Sequence Modelsはまだあまり理解できた感覚がない
  - LSTMの直感的理解の難しさ
- LinkedInに証明書を貼ってドヤる