数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと

　機械学習を学ぶのに最も適した教材と言われる、[Machine Learning | Coursera](
https://www.coursera.org/learn/machine-learning)　を受講し終わりました！

「機械学習に興味はあるけど、何から始めたらいいかわからない」
「Courseraはいいって聞くけど、難くて挫折する気がする」
「機械学習やるなら、[PRML](https://www.amazon.co.jp/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E8%AA%8D%E8%AD%98%E3%81%A8%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E4%B8%8A-C-M-%E3%83%93%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/dp/4621061224)がいいって聞いたけど」

　という人は多いと思います。私も同じように思っていました。Courseraの機械学習コースを始めたのはなんとなくですが、修了してみて、やって本当に良かったと思います。機械学習は面白いし夢があるので、ちょっとでも興味がある人の背中を押したいと思い、このコースの何がいいのか簡単にまとめたいと思います。

*過去の記事*
[Coursera Machine Learning (1): 機械学習とは？単回帰分析、最急降下法、目的関数](http://qiita.com/katsu1110/items/fac314996f34540da260)
[Coursera Machine Learning (2): 重回帰分析、スケーリング、正規方程式](http://qiita.com/katsu1110/items/6a6d5c5a6b8af8fbf813)
[Coursera Machine Learning (3): ロジスティック回帰、正則化](http://qiita.com/katsu1110/items/e4ef613559f02f183af5)
[Coursera Machine Learning (4): ニューラルネットワーク入門](http://qiita.com/katsu1110/items/cc54c258f2533f8a0149)
[Coursera Machine Learning (5): ニューラルネットワークとバックプロパゲーション](http://qiita.com/katsu1110/items/62a2f86b3a4b8a4583bf)
[Coursera Machine Learning (6): 機械学習のモデル評価（交差検定、Bias & Variance、適合率 & 再現率）](http://qiita.com/katsu1110/items/97c3f98a987ea92b2cc1)
[Coursera Machine Learning (7): サポートベクターマシーン (SVM)、カーネル (Kernel)](http://qiita.com/katsu1110/items/43b69436723daf6d34e7)
[Coursera Machine Learning (8): 教師なし学習 (K-Means)、主成分分析 (PCA)](http://qiita.com/katsu1110/items/10ae4a62cfd37e37cd0b)
[Coursera Machine Learning (9): 異常検知 (Abnomaly Detection)、レコメンダシステム (Recommender System)](http://qiita.com/katsu1110/items/b6a20e903516b8f3be13)
[Coursera Machine Learning (10): 大規模機械学習](http://qiita.com/katsu1110/items/ea1b1309a7e4ccd89106)
[Coursera Machine Learning (11): 写真の光学文字認識](http://qiita.com/katsu1110/items/b43a1ace7c8bbf354864)

# 実は初心者向け #
　私は数学があまり得意ではありません。数学で大学受験失敗してますし、理系ですが専門はバイオ系なので、大学で数学はほとんどやりませんでした。プログラミングもほとんどやりませんでした。

　バイオは面白い分野ですが、定性的すぎるきらいがあります。個人的な好みとして、もっと定量できることがしたいなぁと思い、その圧倒的な汎用性からバイオにも進出してきた機械学習を学んでみることにしました。実はPRML (Pattern Recognition and Machine Learning)も持っていた（もらった）のですが、Courseraにしたのは、

- タダである。
- オンラインなので、自分のペースで学べる。
- 評判がいい。

　という極めて普通の理由です。

　あと、コースのイントロに、このコースで何を学ぶのか書いてあったのですが、

> In this class, you will learn about the most effective machine learning techniques, and gain practice implementing them and getting them to work for yourself. More importantly, you'll learn about not only the theoretical underpinnings of learning, but also gain the practical know-how needed to quickly and powerfully apply these techniques to new problems.
このクラスでは、最も有用な機械学習のテクニックについて学び、それら実用する練習もします。さらに強調したいのは、このコースでは機械学習の理論的土台を学ぶだけではないということです。新たな問題に対して素早く、強力な機械学習のテクニックを応用するために必要な、実践的なノウハウも学ぶのです。

（Coursera | Machine Learning, About this courseより引用）

　これかっこいいなと。**今の自分が3か月後、機械学習を理解し、自分の手で実用できてたらすごいな**と。というわけで、始めました。タダだし、失うものは何もありません。

 実際、このコースでは機械学習の基本的な内容をシステマティックに学びます。例を挙げると、以下のような内容です。

- 教師あり学習 (回帰分析、ロジスティック回帰、ニューラルネットワーク、SVM)
- 教師なし学習（K-Means、PCA、異常検知）
- 機械学習の実用例（レコメンダシステム、大規模機会学習、コンピュータービジョン）
- モデル評価（正規化、フィッティング評価、交差検定、天井分析）

　これ、3か月で全部理解できて使えるようになったらかっこいいですよね。

　オンラインだから完全に自分のペースで学べるんじゃないかと最初思ってましたが、**Courseraは授業期間が決まっており（機械学習の場合は11週）、毎週課題提出があるので、ある程度コンスタントに学び続ける必要があります**。意外とこれがいいプレッシャーになり、途中で投げずに済みました。私のような人間は完全な自由だとすぐ怠けるので、期間が定まってなかったら投げてたと思います。

　11週と聞くと長く感じますが、「3か月で機械学習を理解できる」と言い換えれば逆にすごいことです。とはいえ、

　「いやいや、3か月で機械学習を理解させようってコースなら、きっとスパルタなんでしょ！？てかスタンフォード大学の教授が教えてんでしょ！？英語でしょ！？ゼッタイ難しいって！」

　と最初ビビってましたが、ビビる必要はありませんでした。

　このコース、スパルタでもなければ（思ったより）難しくもありません。スタンフォード大学の**Andrew Ng教授**はCourseraを立ち上げた張本人であり、人工知能 (Artificial Intelligence)、深層学習 (Deep Learning)に造詣が深い天才ですが、たまにいる日本の大学教授のように宇宙語を話す人ではありません。

　平易な英語で、基本をわかりやすく簡潔に話してくれます。決して生徒を蹴落とすためのコースではありません。レクチャーのビデオは全て観るべきです。というより、観ないと毎週課されるクイズ突破できません。逆に言えば**レクチャーのビデオを全て観てれば毎週満点でクイズを突破できます**。話の内容は全て書き起こされており、日本語訳もあります。だから大丈夫です。

　毎週のクイズは、5問構成で5分程度で終わらせることができます。がりがり計算したりする問題は出ず、あくまでその週に学んだ内容を理解しているかどうかを試すものです。例えば、下のような問題が出ます。

> あなたは、ある会社がここ一週間以内に倒産するかどうか、倒産危機にあった似た会社のデータを用いて予測したいとします。これは、分類 (Classification) 課題ですか？それとも回帰 (Regression) 課題ですか？

　レクチャーのビデオを観ていれば、誰でもわかる問題です。

# どのくらいのプログラミング力が必要か #
　「いくら教授がわかりやすく教えてくれるからと言っても、プログラミングの課題もあるんでしょ！？機械学習を使うコード自分で書くんでしょ！？」

　そうです、**ほぼ毎週、機械学習を実用するためのプログラミング課題が出ます**。言語は**Matlab**あるいは**Octave**です。行列計算が得意な言語で、信号解析が必要な研究室にいた人なら触ったことがあると思います。

「MatlabもOctaveも知らん……機械学習は学びたいけどそのために新しい言語やりたくない……」

　という人もいるかもしれません。[Kaggle](https://www.kaggle.com/)でもMatlabやOctaveをつかっている人はほぼ見ないです（みんなPythonかR)。

　ではどうしてAndrew教授はOctaveにしたのか、レクチャーでこう語っています。

> In the past, I've tried to teach machine learning using a large variety of different programming languages including C++ Java, Python, NumPy, and also Octave, and what I found was that students were able to learn the most productively learn the most quickly and prototype your algorithms most quickly using a relatively high level language like octave.
過去にね、他の言語 (C++, Java, Python) でも機械学習教えようとしたことあったんだけど、学生さんの学習が最も生産的で、早く、アルゴリズムを試せるようになるには、Octaveのようなハイレベル言語を使った方がいいって気づいたんだよね（意訳）。

　確かに**Matlab/Octaveは、他の言語に比べて学習コストが圧倒的に低い**です（基本計算しかできないからね！）。Andrew教授によれば、シリコンバレーでも新しい機械学習のアルゴリズムを試すとき、とりあえずパパッと書けるOctaveで実装してみて、よさそうならもっと汎用的な言語 (C++, Java, Pythonなど）で再実装する人も多いとか。

　例として、主成分分析 (PCA) などで必要な固有値分解 (Singular Value Decomposition)をしてみます。データ行列を$X$としたら、以下のコードで一瞬で実装できます。

```matlab
% Compute covariance matrix
sigma = (X'*X)/size(X,1);
% Singular value decomposition
[U,S,V] = svd(sigma);
```

　$U$には左固有ベクトル、$S$には固有値、$V$には右固有ベクトルが格納されています。

　ここはQiitaなのでプログラミングができない人はいないと思いますが、**コース内にOctave/Matlabのチュートリアルも用意されています**し、プログラミング課題で特別変な構文を使ったりとかはないので、「新しい言語かぁ……」という心配は一切不要です。たまたまライセンスを持ってる研究教育機関にいたりしてMatlabを持っている人以外は、何も考えずに[Octave](https://www.gnu.org/software/octave/)をダウンロードしましょう。Matlabは使いやすいIDEもセットのハイスペック言語ですが、一般人には価格が高すぎます。

# どのくらいの数学力が必要か #
　「いくら教授がわかりやすく教えてくれて、クイズもレクチャービデオ観ればできて、Octaveも簡単に使えるとしても、実際に機械学習を使うのって数学力必要でしょ！？」

　それはそうですが、必要なことをその都度学んでいけばいいと思います。このコースを受講するにあたり、必要な数学力は以下の2つだと感じます。

- 高校数学までの一般的知識
- 行列計算の基本的なルール

　おそらく**日本の理系の人は何の心配もいらない**と思います。大学で数学をやっていない場合、数学記号（$s.t.$など）で？となるかもしれませんが、レクチャー聞いていれば雰囲気でわかります。

「高校数学までは完璧だが、新課程で行列が無くなったから行列計算とかわからん！あぁ辛い、この若さが！」

　という若い人でも大丈夫です。**コース内に行列計算に関するチュートリアルがある**からです。文系の人でも、数学に多少は興味がないと機械学習を学ぼうなんて思わないはずなので、とりあえずコースを初めてみて、もし足りないところがあったら理系の友達に聞くなりしてその都度調べて学んでいけばいいと思います。

　というのは、行列計算が大事と言っても、それは数学的な話もそうではありますが、アルゴリズム実装における実用面の話が大きいのです。

　Matlab/Octaveでも、**ループを書くと処理速度がガクッと落ちます**。一方、行列計算で一気に要素同士の計算をすると、さほど速くないMatlab/Octaveでもサクッと処理してくれます。そのため、コース内でも繰り返し、ループを使わず**ベクトル化 (Vectorization)**することが強調されています。機械学習が大量のデータを扱いますし、処理は速ければ速いだけよいのですね。

　ベクトル化の例を以下に示します。あらゆる機械学習のアルゴリズムが何をしてるかというと、

1) モデルとなる**仮定関数 (Hypothesis Function)**を作る。

2) 実測値と、仮定関数から計算された予測値の差を表す**目的関数 (Cost Function)**を作る。

3) 目的関数を最小にするモデルパラメーターを求めるため、**最急降下法 (Gradient Descent)**などを用いる。

　ということをしています。

　例えば、回帰分析 (Regression)で、説明変数 (Independent Variables)が複数ある**重回帰分析 (Multivariate Regression)**を行うときの目的関数$J$は、説明変数$X$、目的変数$y$、モデルパラメーター$\theta$、データポイント数$m$として、以下のように書けます。

```math

J(\theta) = \frac{1}{2m} (X\theta - y)^{\mathrm{T}}(X\theta - y)

```

　このとき、説明変数の数が$n$だとすると、データポイント数が$m$なので、行列$X$の次元はm x n、$y$の次元はm x 1になります。$T$は転置行列を示す記号ですね、単純に元の行列の行（ヨコ）と列（タテ）を逆にしただけです。

　これをループで実装すると、

```matlab
J = 0;
for i = 1:m
    for k = 1:n
        J = J + (X(i,k)*theta(k) - y(i))^2;
    end
end
J = J/(2*m);
```

　となりますが、ベクトル化するとこうなります。

```matlab
J = ((X*theta - y)'*(X*theta - y))/(2*m);
```

　後者の方が全然速いです。ループが必要な場面もありますが、できるだけ速く機械学習を進め、人生の時間を効率的に使うため（Andrew教授はよくこれおっしゃる）にも、ベクトル化は効果的です。次元を意識してコーディングしないとバグるので、行列計算の基本を知っておかないといけないのですね。

　「数学力もそこまで最初は必要じゃないことはわかった。でもここから3か月でちゃんと機械学習を理解して使えるところまで来るの？」

　来ます！……と言いたいところですが、その人がどこを目標にしているかによると思います。

　初心者が修了すれば、**機械学習、データ解析に関して、受講前と全く違った世界が見える**はずです。機械学習の重要なアルゴリズムが何をやっているのか理解して、自分のデータにそれを適切に応用することができるようになるでしょう。Kaggleや他の機械学習コンペに参加したり、人に機械学習について語れるようにもなると思います。

　ただ、機械学習の世界は広大で、しかも日々進歩を続けています。例えば様々なニューラルネットワークの種類を知り、理解し、それがどう最新の深層学習の進化につながっているか理解したければ、まだまだ学ぶことがたくさんあります。

　それでも、コース修了時点で必要条件は満たしているはずです。PRMLの3章以降も（苦しみながら）読み進められるようになるでしょう。Andrew教授も全講座終わった後にこう言っています。

>  You should now consider yourself an expert in machine learning. You're now well qualified to use these tools of machine learning to great effect.
あなたは今、自身を機械学習の専門家だと思っていい。これら機械学習のツールを使って、ものすごいものを作る資格があるんだ。（意訳）

　人によって意見が異なるのはあたりまえですが、私は受講して本当によかったと思っています。

#まとめのまとめ#
- Coursera | Machine Learning は初心者向けのコースである。
- 3か月間のコンスタントな学習は必要。
- 求められる数学力、プログラミング力は高くない。
- 機械学習を使う必要条件を満たすことができる。

#終わりに#
　QiitaでCoursera Machine Learningの最終回のまとめを書いた時の繰り返しになってしまいますが、いい言葉なので、やはり最後は、Andrew Ng教授の言葉を引用して閉めたいと思います。

> 私は、あなたたちが機械学習を自分の人生を良くするだけでなく、よかったらいつか、多くの他の人たちの人生も良いものにしてくれるように願っています。
I hope that you find ways to use machine learning not only to make your life better but maybe someday to use it to make many other people's life better as well. (Andrew Ng)