機械学習をゼロから1ヵ月間勉強し続けた結果

# 追記

2018年の機械学習勉強法などをまとめました！
[2018年版もっとも参考になった機械学習系記事ベスト10](https://qiita.com/junichiro/items/67ddf03014597552d78b)


# はじめに

2016/12/14 から約1ヵ月間、機械学習の勉強をし続けました。これは[会社](http://www.uzabase.com/)の自由研究という制度を利用させて頂いて、1ヶ月間は業務から離れて、機械学習の勉強だけをやり続けた記録です。

勉強してきたもののうち教師あり学習までは、Qiita にその記録をまとめましたので過去記事一覧からご覧ください。

# 過去記事一覧
* [1日目 とっかかり編](http://qiita.com/junichiro/items/ee50af10df77d52cd432)
* [2日目 オンライン講座](http://qiita.com/junichiro/items/7a5b95d7122176e94fe0)
* [3日目 Octave チュートリアル](http://qiita.com/junichiro/items/33954f08411e33d33506)
* [4日目 機械学習の第一歩、線形回帰から](http://qiita.com/junichiro/items/d4dc67bdebb9fccb7ef5)
* [5日目 線形回帰をOctave で実装する](http://qiita.com/junichiro/items/1a4b87e99b471cf5bea1)
* [6日目 Octave によるVectorial implementation](http://qiita.com/junichiro/items/7972b1b6ad3d087fbde0)
* [7日目 ロジスティック回帰 (分類問題) その1](http://qiita.com/junichiro/items/8de94c84c35e9851d42a)
* [8日目 ロジスティック回帰 (分類問題) その2](http://qiita.com/junichiro/items/5d20a40a3a282af422a3)
* [9日目 オーバーフィッティング](http://qiita.com/junichiro/items/4d2c91128c9bd850f580)
* [10日目 正規化](http://qiita.com/junichiro/items/8b1867201663c5af38a4)
* [11日目 ニューラルネットワーク #1](http://qiita.com/junichiro/items/7794cedf834a4f6ef52c)
* [12日目 ニューラルネットワーク #2](http://qiita.com/junichiro/items/b522ea41c02f90d23aa5)
* [13日目 機械学習に必要な最急降下法の実装に必要な知識まとめ](http://qiita.com/junichiro/items/527b1f211ed814528ded)
* [14日目 機械学習で精度が出ない時にやることまとめ](http://qiita.com/junichiro/items/7e2842c7afba2407c49b)
* [最終日 機械学習をゼロから1ヵ月間勉強し続けた結果](http://qiita.com/junichiro/items/3457e33e502086a200f1)

# 1ヵ月なにをしたか

1. [ITエンジニアのための機械学習理論入門](https://www.amazon.co.jp/IT/dp/4774176982/) を読破
2. [Coursera でStanford が提供しているMachine Learning の講座](https://www.coursera.org/learn/machine-learning/)

基本的にはほぼひたすら2. の講座をやりました。どのようにこの講座に取り組んだかと、この講座の内容をまとめておきます。

# Machine Learning の講座

[Machine Learning](https://www.coursera.org/learn/machine-learning/)

* 1日あたりの講義ビデオがだいたい2〜4時間くらいあるのでまずそれを見ます。
  * 1本あたりは5〜10分くらいなので、あまり飽きがこないで見ることができます。
  * ビデオの合間には簡単なクイズがでるので「それに答えられる」ということで理解できていることを確認できます。
* 数本のビデオの合間には前述のよりもう少し大きめのクイズがあります。
  * 4択クイズが5問で80%以上の正答率を出す(4問以上正解する)と次へ進めます。
  * 8時間以内に3回しかRetake できないのでこれをクリア出来ない場合は少し講座が止まってしまいます。
  * Retake 時には問題文や選択肢が少し変わるので間違っていたところだけをやり直すという形ではありません。
  * しっかり理解しないと次へ進めないので逆に進めることができれば安心できます。
* 1日の最後に実装のテストがあります。
  * PDF にして15ページくらいの課題で、それをOctave で実装します。
  * ある程度ヒントを与えてくれていて穴埋め形式で不足しているところをコーディングします。
  * オンラインで提出して、リアルタイムで採点されます。
  * 100% 正解してようやく次に進めます。
  * Web などで正解を探してコピペなどするのは厳しく罰せられ、場合によっては講座から追い出されます。
  * 理解できないと本当に進めません。
  * 穴埋め形式とはいえ、中盤から(ニューラルネットワークあたりから)はかなり難しくなってきます。
* 全部で11週あります。内容は後述。
* 僕は上記の他に、学んだことを大学ノートに手書きでまとめることで理解を進めました。
* さらに、一部(教師あり学習とその改善まで)をQiitaにまとめることで理解の確認を行いました。

# 講座の内容

[Machine Learning](https://www.coursera.org/learn/machine-learning/)

講座の内容は上記のページのシラバスに掲載されていますが、僕なりに訳して再掲しておきます。

---
##### 第1週目
* イントロダクション
 * 機械学習がどこで活躍するかなど
* 単一変量による線形回帰
 * 予測モデル
* (オプション) 機械学習に必要な線形代数概観

##### 第2週目
* 多変量による線形回帰
 * 多変量(特徴ベクトル)による予測モデル
* Octave 基礎 
 * **機械学習を学ぶため**にはOctave が最適であると、Ng 教授はいいます。
 * 過去にPython を含むいろいろなツールを使ってきたが、理解度が最も高かったのがOctave とのこと
 * 環境構築や言語そのものでつまずかずに、機械学習に集中するにはOctave が良い
 * まずOctave でやってみて、できるようになってからそれをPython なり、自身のプロダクトで採用している言語なりで置き換えるのがよいと。

##### 第3週目
* ロジスティック回帰(分類)
 * 主に二値分類
 * 多値分類は、one-vs-all を使って二値分類の繰り返しで表現
* 正規化
 * $ \lambda $ を使って正規化し、オーバーフィッティングに対処する

##### 第4週目
* ニューラルネットワーク概観

##### 第5週目
* ニューラルネットワーク詳細

##### 第6週目
* 機械学習を実践する時のアドバイス
* 機械学習で問題(主に誤差)が起きたときのネクストステップ

**ここはとてもためになりました。**

##### 第7週目
* サポートベクターマシン(いわゆるSVM)

##### 第8週目
* 教師なし学習
 * K-means 法
 * クラスタリング
* 次元削減

**7週目まではすべて教師あり学習の話で、8〜9週目は教師なし学習の話です**

##### 第9週目
* 異常検知
* レコメンド
 * 協調フィルタリング

##### 第10週目
* 大規模なデータにおける機械学習
 * 確率的勾配降下法
 * オンライン学習

##### 第11週目
* 機械学習の実践例: Photo OCR 

---

とにかく、Ng 教授は教え方がうまいです。また、こちらのモチベーションをあげてくれるのもとても上手です。ある程度進んだところでは「シリコンバレーにいるたいていの機械学習エンジニアより、ここまできたあなたのほうが理解している」とか、講座最後の「サンキュースピーチ」みたいなものは、感動して涙が出そうになりますし、今後この道でもっと腕を磨きたいと奮い立たせてくれます。本当におすすめの講座です。

講座で僕が提出したものはすべてgithub にまとめてあります。講座を受講される予定の方は、講座終了後にご覧ください。「Machine Learning Honor Code」という誓約によると、それ以前には見ないほうが良いものとなっていますので。

追記　2020/11/25
そもそも公開が不可なので private にしました。
ご指摘ありがとうございました。
~~https://github.com/junichiro/ml-programming-assignments~~

# before / after

## before

before でいうと、もともとほぼゼロだったので、なにもないというところからのスタートです。理系の学部卒なのでそれなりに数学の知識はあるということと、統計が好きということは多少プラスに働いたとは思いますが。

## after

この1ヵ月で手に入れたスキルを列挙します。

* 機械学習
 * 線形回帰の理解
 * ロジスティック回帰の理解
 * ニューラルネットワーク及び深層学習の理解
 * サポートベクターマシン(SVM)の理解
 * 教師なし学習によるクラスタリングの理解(分類とは全く別物)
 * 次元削減の理解
 * オンライン学習の理解(確率的勾配降下法とともに)
 * 機械学習中に発生する問題点の理解と、対処法についての理解
* Octave
 * Octave はじめて書きました。
 * $ \sum $ の計算やベクトルの計算をスムーズにできます。
 * 行列の計算をスムーズにできます。
 * 機械学習で思いついたアイデアをそのままOctave のコードで表現できます。
 * 最急降下法などの最小を求める問題で適切なライブラリを利用できます。
* Qiita
 * Qiita ではじめて記事を書きました。
 * Qiita で数式を書きました。いまではコスト関数くらいならチートシートなしで書けます。これは便利ですね。
 * フォロワーやストックやいいねもいくつか頂きました。

1ヵ月やるとここまでのスキルが手に入りますので、講座はオススメです。

# リファレンス

* [ITエンジニアのための機械学習理論入門](https://www.amazon.co.jp/IT/dp/4774176982/) を読破
* [Coursera でStanford が提供しているMachine Learning の講座](https://www.coursera.org/learn/machine-learning/)
* [深層学習](https://www.amazon.co.jp/dp/4061529021/)
* [ニューラルネットワークと深層学習](http://nnadl-ja.github.io/nnadl_site_ja/)
* [確率的勾配降下法とは何か、をPythonで動かして解説する](http://qiita.com/kenmatsu4/items/d282054ddedbd68fecb0)
* [Qiitaの数式チートシート](http://qiita.com/PlanetMeron/items/63ac58898541cbe81ada)
* [Grapher](https://ja.wikipedia.org/wiki/Grapher)(Mac の標準グラフ描画アプリ)
 * Qiita で数式を書けることを知るまでは、このアプリで数式を書いて画面キャプチャして使っていました。
* [TensorFlowのチュートリアルを通して、人工知能の原理について学習する](http://qiita.com/jintaka1989/items/3b70b5c5541620536fa2)
* [Courseraの機械学習コースのススメ 前編](http://qiita.com/mono0926/items/2c39649d24b2e515f4b5)
* [機械学習 はじめよう](http://gihyo.jp/dev/serial/01/machine-learning)

# 今後

今後はこの1ヵ月で身につけた知識、ノウハウを使って、具体的な分類やレコメンドの実装に取り組みます。ニューラルネットワークを理解したうえで、TensorFlow などのチュートリあるに取り組んで見るのもいいかなと思っています。

自由研究を終えて業務に戻ると、機械学習とは一度離れたプロジェクトを担当する予定なので、そのときは個人的に20% ルールなどを用いて、継続的に実践課題に取り組みたいと思いますので、よろしければフォローしておいて頂ければと思います。ありがとうございました。

ここまで連載(?) をご覧いただきありがとうございました。今後も、身につけたものなどのフィードバックを得るためにも定期的にQiita に記事を書いて行きたいと思います。