プログラミング歴8ヶ月でもCourseraの機械学習講座を修了できた話

# はじめに
4月から機械学習を勉強し始め、先日、機械学習で有名なAndrew Ng先生の[Coursera 機械学習講座](https://www.coursera.org/learn/machine-learning)を修了しました。

実際に受講してみて、プログラミング歴の浅さや数学ができるできないに関わらず、多くの方にオススメできる内容だったことから、今回は振り返りをしながら魅力をお伝えしていければと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307533/922b6722-1ecc-41d2-e1e3-00639fca4bdb.png)


# Courseraを受講するに至った経緯
私は現在、プログラミング歴8ヶ月（実務経験2ヶ月）の身であり、普段はRuby/RailsでWebサービス開発をしている機械学習とは馴染みがない人間なのですが、上司から4月上旬に水面下で動いている機械学習を使ったプロジェクトがあるから興味あるなら一緒にやってみない？と言われたことをきっかけに、勉強を始めることになりました。

そこで、機械学習の勉強法について調べていた時に機械学習を学ぶのに最適な教材という口コミが多かったCourseraに挑戦しようとした次第です。

# Courseraを始める前に準備したこと
Courseraの受講開始日が4/15からだったので、受講開始までに以下のことをしました。

- [Google Machine Learning Crash Course with TensorFlow APIs](https://developers.google.com/machine-learning/crash-course/)
- 数学の簡単な復習
 - [マンガでわかる微分積分](https://www.amazon.co.jp/%E3%83%9E%E3%83%B3%E3%82%AC%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E5%BE%AE%E5%88%86%E7%A9%8D%E5%88%86-%E5%BE%AE%E7%A9%8D%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%AB%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE-%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6%E6%95%99%E7%A7%91%E6%9B%B8%E3%81%AF%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%AB%E3%81%8F%E3%81%84%E3%81%AE-%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%BB%E3%82%A2%E3%82%A4%E6%96%B0%E6%9B%B8-%E3%81%9F%E3%81%84%E3%82%89/dp/4797342501/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E5%BE%AE%E5%88%86%E7%A9%8D%E5%88%86&qid=1557809418&s=gateway&sr=8-7)
 - [マンガ　線形代数入門](https://www.amazon.co.jp/%E3%83%9E%E3%83%B3%E3%82%AC-%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0%E5%85%A5%E9%96%80-%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%A7%E3%82%82%E6%A5%BD%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%B9%E3%82%8B-%E3%83%96%E3%83%AB%E3%83%BC%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9-%E9%8D%B5%E6%9C%AC%E8%81%A1-ebook/dp/B00ZR7XVNO/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0&qid=1557809475&s=gateway&sr=8-7)
 - [マンガでわかる統計学](https://www.amazon.co.jp/%E3%83%9E%E3%83%B3%E3%82%AC%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E7%B5%B1%E8%A8%88%E5%AD%A6-%E7%B4%A0%E6%9C%B4%E3%81%AA%E7%96%91%E5%95%8F%E3%81%8B%E3%82%89%E3%82%86%E3%82%8B-%E3%81%8F%E8%A7%A3%E8%AA%AC-%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%BB%E3%82%A2%E3%82%A4%E6%96%B0%E6%9B%B8-%E5%A4%A7%E4%B8%8A-%E4%B8%88%E5%BD%A6/dp/479734251X/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E7%A2%BA%E7%8E%87%E7%B5%B1%E8%A8%88&qid=1557809505&s=gateway&sr=8-8)

GoogleのMLチュートリアルについては、先輩社員に勧められてやってみたのですが、

- 機械学習のキーワードを英語で一通り押さえられる  
（[ここに](https://developers.google.com/machine-learning/glossary/)キーワードがとても分かりやすく整理されているのでありがたいです。）
- 実装済みのコードをポチポチしていくことで機械学習ライブラリを使えば何が出来るのかのイメージが掴める
- 下図のようにビジュアルも豊富でイメージが掴みやすい

というように、ボヤッとでも機械学習の輪郭を掴むことができたのでやってみて良かったなと思っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307533/c68a73e0-6580-8ad7-ef24-dde06814ac71.png)
（画像参照元：[Reducing Loss: Playground Exercise](https://developers.google.com/machine-learning/crash-course/reducing-loss/playground-exercise)）

数学については、理系だったのですが化学系だったのでそれほど使う機会はなかった＆数学が得意という意識はなかったため、「[文系エンジニアがCourseraの機械学習コースを1ヶ月で修了したので振り返ってみました。](https://qiita.com/poly_soft/items/0f7c09470af4ad5dbd39#%E6%95%B0%E5%AD%A6%E3%81%AE%E4%BA%88%E5%82%99%E7%9F%A5%E8%AD%98%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6)」の中で紹介されているものをそのまま購入して一読しておきました。

# コース全体を通して学ぶ内容
講座は全11週間分（3ヶ月分）あり、全体として学ぶ内容を簡単にまとめると下記の通りです。

```
教師あり学習
 - 線形回帰、ロジスティック回帰、ニューラルネットワーク、サポートベクターマシン(SVM)、カーネル
教師なし学習
 - K-Means、主成分分析(PCA)、異常検知
機械学習の応用例／関連トピック
 - レコメンドシステム(協調フィルタリング)、ビッグデータ
機械学習システムを構築する上でのTips
 - バイアス／バライアンス、正則化、アルゴリズムの評価方法、学習曲線、エラー分析、天井分析
```

以上のように、機械学習の記事などを見ていたらよく出てくる話題について体系的に学ぶことができます。

# Courseraを受講してみての所感
一言で言うと、オススメです。（修了証が不必要であれば無料で受講できるので是非！）

Andrew Ng先生が数学や機械学習の専門家以外の人にも分かるように、講義の中で必要なものについては適宜丁寧にレクチャーしてくれるお陰で、個人的にはとても敷居が高く感じていた機械学習の分野が少し身近に感じたような感覚を持つことができました。

各週の最後にプログラミング課題があったため、毎回講義の中で学んだアルゴリズムを実際にコードに落とし込み正しく動くまでひたすら頭と手を動かす必要があり、講義内容をきちんと理解した状態で着実に進める点もgoodでした。（個人的には結構重くて毎回苦戦しながらも、何とかやり遂げました。）

また、機械学習の理論だけではなく、実際に使う場面を想定しながら、どうすればよりよいモデルが作れるのか？どう考えればより効率よく計算ができるか？等の、Andrew Ng先生が実際に用いているTipsを随所に散りばめてくれていたのは本当に学びが深かったです。

# 完走するまでに掛かった時間
4/15から受講を始め、1ヶ月計80時間でCourseraの機械学習コースを完走しました。

各週で目安時間が書かれているのですが、合計したら52時間だったので約1.5倍くらい掛かってしまったようです。

毎回プログラミング課題に大変時間を取られていたので、これは完全に私のプログラミング力の低さに起因するものだと思います。笑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307533/245fb7ab-8804-49bb-3e5d-a5e24b63827d.png)

# 完走するためにあると便利な知識やTipsなど
## プログラミングスキルについて
Courseraの機械学習講座ではOctaveという計算に特化した言語を用いるのですが、2週目でチュートリアルもありますし、文法などはプログラミング歴の浅い私でも問題なく扱えるようになる程度にはシンプルなので、プログラミング初学者でも、for文、if文、デバッグの方法あたりを知っている人ならば何も問題ないと思います。

## 英語について
講義が英語で自信がないという場合も以下のように字幕を出せるのでそこまで理解に困ることはないと思います。

ちなみに、色々試した結果、個人的には日本語字幕だと音声とのタイミングズレてることがあり、やや見にくいと感じることが多かったため、動画部分は英語字幕・下側の部分に日本語を表示する方法が1番しっくり来てました。

そして動画を一周見た後、理解が浅いところは日本語で確認したり、@katsu1110さんのまとめ記事（例えば、[Coursera Machine Learning (1): 機械学習とは？単回帰分析、最急降下法、目的関数](https://qiita.com/katsu1110/items/fac314996f34540da260)など）を見て理解を深めるという流れで進めていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307533/6677f9a0-de28-0e4a-35e5-cc85cc614057.png)
（参照元URL：https://www.coursera.org/learn/machine-learning/lecture/RKFpn/welcome ）

## プログラミング課題をこなす上でのコツ
個人的に課題をしていく上で意識・実践していたことを下記します。

- 線形代数はとにかく次元を合わせさえすれば何とかなる
- ひたすら`keyboard`でデバッグしながら少しずつ進む（Octaveではファイルの中に`keyboard`と入れるとそこで処理を止められます）
- 面倒くさがらずに課題ドキュメントの英語を読む・講義やOctaveのチュートリアルを見直す・イメージや数式をノートに書き起こしながら今何の計算をしたいのかを都度確認する

プログラミングスキルが大して高くない僕でも完走できたのが証拠で、本当にちゃんとドキュメントを読めばヒントは全て書かれているし、終わってみてみるとびっくりするくらいシンプルな実装ばかりなので、初見で難しそうと諦めずに最後までトライしてみてください！

# (参考)提出した課題のコード
参考程度に私が提出した課題の回答はGitHubに上げています。

https://github.com/MasashiFukuzawa/Coursera_MachineLearning

Courseraでは倫理規範により人の答えを見ることはNGであるため、回答はコースを完走した後に見て下さい。

# まとめ
- 約1ヶ月でCourseraの機械学習講座を完走しました。
- 機械学習の世界は広く深いと聞きますが、ひとまず入門はできたのではないかと感じています。
- プログラミング歴の浅い私でも頑張れば何とかなることを示すことができたと思います。
- 最終的にプロダクトに落とし込めるよう、「ただの基礎学習」とならないように目的意識を持って深掘りしていきたいと思います。