数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路

巷ではDeep Learningとか急に盛り上がりだして、機械学習でもいっちょやってみるかー、と分厚くて黄色い表紙の本に手をだしたもののまったく手が出ず（数式で脳みそが詰む）、そうか僕には機械学習向いてなかったんだ、と白い目で空を見上げ始めたら、ちょっとこの記事を最後まで見るといいことが書いてあるかもしれません。

# 対象
* 勉強に時間が取れない社会人プログラマ
* そろそろ上司やらお客様から「機械学習使えばこんなの簡単なんちゃうん？」と言われそうな人
* 理系で数学はやってきたつもりだが、微分とか行列とか言われても困っちゃう人

# この記事で行うこと
* 数学の基礎知識に慣れるための、数式が最初から出てこないプログラマ向けの数学入門書の紹介
* 機械学習の初学者には鉄板の、オンライン講座（MOOC）の機械学習コース紹介

# 環境
* WindowsでもMacでもLinuxでも大丈夫(MATLAB/Octaveというツールを使います)
* 紙とペンがあると思考を整理するのに便利。

# 略語・読み紹介
* PRML = WEBで機械学習で検索すると必ず出てくる略語。機械学習関連では一般的に本のこと。冒頭で紹介した分厚くて黄色い表紙の本はこれです（ちなみに上下巻あります）。正式な本の名称は、[パターン認識と機械学習 - ベイズ理論による統計的予測](http://pub.maruzen.co.jp/book_magazine/book_data/search/9784621061220.html)。英語版原著（Pattern Recognition and Machine Learning）の頭文字を取って、PRMLとなった模様。ちなみに読みは「プレモル」。サントリーのビールに似ているので後はわかりますね。
* MOOC / MOOCs = Massive open online course(s)の略。インターネット上で無料で受講できる大規模なオープンな講義のこと。読みは「ムーク（ス）」。今回お世話になります。

# 初心者の機械学習の流れ
「全然機械学習勉強したことなくて、ちらっと本読んだら数式出てきてよくわからないんですけど、どこから手をつけたらいいですか？」というプログラマからの質問に対して、お勧めの回答は以下になると思われます。（自分の実体験を存分に含んでいます）

1. 行列とかベクトルがわからないと、動画を見てても途中で何やってるかわからなくなるので、プログラマ向けの数学の本をまず読む。
2. [Coursera](https://www.coursera.org/)というオンライン講座の会員になって、スタンフォード大のAndrew NG先生の[Machine Learning](https://www.coursera.org/learn/machine-learning)コースを受講する（無料です）。

では詳しく見ていきましょう。

# プログラマ向けの数学の本
プログラマの皆さんにおいては、ゲームとかソフトウェアとかマニュアル見なくてもなんとかなることが多くて、とりあえず動かしてそれから考えよう的な思考回路が形成されていると思われます。

ただ、機械学習の勉強をそのノリで進めようとしても、どこかで詰まるというか、やっぱ切れ味のいい武器手に入れてからでないと遠く行ってもすぐ死ぬよなー、というのがよくわかる感じになります。

機械学習の本は微分積分と線形代数を大前提としているところがあって、いきなり数式が出て詰むのは、そこらへんの知識がないのが原因です。

前述の２のMachine Learningのコースは、そのあたり数学の知識無しでもわりと進めるような構成になっていて、途中で解説もしてくれるプログラマに優しいコースです。

それでも、最低限行列とベクトルの扱いに慣れていないと、コース内でさらっと行列の操作があっても、今それ何やってるんでしたっけという状態になりやすいです。なので、事前に準備体操として慣らしておくのがいいです。

プログラマを対象にしたお勧めの線形代数の本はこちらです。

* [プログラミングのための線形代数 平岡 和幸  (著), 堀 玄  (著) オーム社](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0-%E5%B9%B3%E5%B2%A1-%E5%92%8C%E5%B9%B8/dp/4274065782)

個人的には次のMachine Learningのコースを理解するのに最低限必要なのは、行列の積だと思っているんですが、頭の中でどう解釈すればいいか懇切丁寧に書いてあるので、まずは上で紹介した書籍の「1.2 行列と写像」を読み進んでください。

私は、行列のある数式のどこにどう注目しないといけないのかが全然理解できてなかったのですが、上で紹介した書籍の「1.2.13 補足(1):サイズにこだわれ」を読んでなるほどと思いました。


# Machine Learningコースを受講する
機械学習初心者にお勧めなのが、今から紹介するオンライン講座になります。登録の仕方はここでは説明しないですが、会員登録方法について書いてあるページを参考にしてください。[MOOC 101:Coursera で授業を受けよう (1) アカウント作成 ~ 授業登録](http://mooc101.blogspot.jp/2013/09/coursera-1.html)

お勧めできる点として、いいところを並べてみます。

* 無料です
* 機械学習で初学者に必要な知識と考え方を通して解説してくれます
* 基本英語ですけど、このコースの動画に全て日本語字幕がついています
* 動画だけではなくて、試験もあります。実際にプログラムして結果を提出する必要もあります。なので、自分が理解できているかどうかがわかりやすいです。
* 試験は何度でも提出できるので、間違ったらどうしようとか思わなくていいです
* 期限が無いです。自分のペースで学習を進めることが出来ます。
* 動画ダウンロードできるので、電車の中で動画見たりもできます

いい所尽くめですが、オンライン講座の特徴としてどうしてもコントロールできない部分があります

* 期限もなくお金も払っていないので、気を抜くと途中で辞めちゃうのです

実際、講座始める人に比べて、最後までやりきる人の比率がとっても低いというデータがあるそうです。なので最終的に必要なのは「鉄の意志」です。それが難しい場合は友達や同僚と一緒に学ぶのがいいかもしれません。

ここでは後押しのために、何が学べるのか、具体的な内容を少しご紹介します。


# Machine Learningコースの内容
[courseraで日本語コースを検索する](https://www.coursera.org/courses?languages=ja)と、2番目ぐらいに下の画像のコースが出てきます。この[Stanford University Machine Learning with Andrew Ng](https://www.coursera.org/learn/machine-learning)の内容について説明します。

![2015-05-24_200408.png](https://qiita-image-store.s3.amazonaws.com/0/32778/e588050f-cf03-0e2e-f9ae-fbb821f339e7.png)

※いろんなWEBページに同内容の紹介があるのですが、時期によってコース数とか条件が変わってくるようで、今回は2015/5/24現在のオープンコースについての紹介になります。

※※コースの章タイトルは全て英語で書かれています。（）内の日本語訳は適当にこちらでつけました。

## 1. Introduction (イントロダクション)
機械学習とはなんぞや、どういうところで使われているかという説明と、ツールのインストール方法について説明しています。

動画はもちろん字幕付きなのですが、知らないとどこに字幕スイッチあるかわからないかもしれません。動画プレイヤーが表示されたら、右下にアイコンが並んでいます。右から4番目のアイコンをマウスオーバーすると、字幕一覧が出てくるので、Japaneseを選んでください。

![2015-05-24_201355.png](https://qiita-image-store.s3.amazonaws.com/0/32778/d9992ccf-840a-a756-f267-a20d43288c8f.png)

また、イントロダクションはちょっと特殊で、最初動画が並んでいるのかなと思って次へ進むとテキストのみのページになって、説明が英語で書いてあって、日本語翻訳を探しちゃうのですが、残念ながらありません。

解説は、WindowsならMATLABを入れましょう（このコースを受講したら無料で使えます）。Linux/Mac OS XならOctaveを入れましょう、と説明しているだけですので、インストール指示に従ってインストールしましょう。

各章でディスカッションできる掲示板っぽいところがあるのですが、一切何も書かなくても最後まで到達できるので、インストール方法以外は取りあえず無視しておきましょう。

## 2. Linear Regression with One Variable (1変数の線形回帰)
ここから本番です。機械学習の初歩は、線形回帰からなのかということがわかります。

またこの章では、前の章ではなかった、Reviewという名のテストがあります。
テストは、5問中4問正解でPASSなのですが、回答を1つ選ぶだけではなくて、あてはまるもの全て選べとか、数字を計算して入れろとか、数打てば当たる形のテストにしていないです。
しかも困ったことに、回答の内容が毎回変わる（順番だけではなくて、内容も変わる）ので、前回正解したのに今回間違うとかあります。

オンライン講座のテストの対策というべきか、上記のように結構面倒な仕組みにしているにも関わらず、さらに追い討ちをかけるように、3回間違えると（3回とも4問以上正解できないと）8時間のウェイトペナルティがあります。（ペナルティはこれだけです）

ペナルティ中は、下の画像のように、後何分待機という表示が出てきます。
![2015-05-23_203646.png](https://qiita-image-store.s3.amazonaws.com/0/32778/81c200f5-944e-a8f1-7761-3fc6ef11cebc.png)

テストに合格できなくても次に進めないということはありませんので、さっさと次の章の動画を見始めるのがよいです。

## 3. Linear Algebra Review (線形代数の復習)
線形代数がわからないと、この先進めなくなりそうなことがよくわかる章です。基礎について懇切丁寧に時間をとっています。機械学習に行列とかベクトルとかがどう関わってきて、何を計算しないといけないかをこの章で掴んでください。

この章のReviewはちょっと変わっていて、章内で１，２回発生する確認テストと同じ位置づけのものをReviewの形式で行います。そのため、クリアしても全体の成績に反映されません。混乱しないようにしましょう。後にも先にもこの形のテストはここだけです。

## 4. Linear Regression with Multiple Variables (多変数の線形回帰)
1変数で線形回帰を理解できたので、多変数の線形回帰の講義になります。また、多変数を扱うにあたって、スケールをあわせたり、パラメータの調整についての議論があります。

また、この章から、プログラムの投稿というテストが加わります。MATLAB/Octaveに慣れていないとちょっと解くのが辛いです。で、MATLAB/Octaveについては次の章で解説があります。なので、先に次の5章やってから戻ってきた方がいいです。

ちなみに、プログラムはMATLAB/Octaveから直接アップロードできます。アップロードするとWEB上で成績が見れます。アップロードは何度もできるので、気兼ねなく試しましょう。
![2015-05-24_204241.png](https://qiita-image-store.s3.amazonaws.com/0/32778/f44e2d9e-b0c5-6c39-ea72-f284c76a52d0.png)

## 5. Octave Tutorial (Octaveの説明)
Octaveって書いてますけど、MATLABも同じです。行列処理になれていない人は、この章の「Vectorization」の動画の内容をマスターすると、for文不要な計算式が構築できるようになると思います。個人的にはこの講座受けてよかったと思った一瞬でした。

## 6. Logistic Regression（ロジスティック回帰）
動画内でも先生が1人でノリ突っ込みしてましたが、「回帰(Regression)」っていう名前なのに「分類(classification)」に使うロジスティック回帰を学ぶ章です。線形回帰と似ているところ、違う所を確認することで、機械学習の理解に厚みが出てきます。

またここでもプログラムの投稿テストがあるのですが、困ったことに次の章の知識がないと解けない問題（Regularization:正則化）が入っています。私は結局解けずに次の章に行って戻ってきてやりなおしました。説明しなくても解けるだろうと思われているのか、いろいろ深い部分です。

## 7. Regularization（正則化）
だんだん機械学習らしくなっていくというか、「○○をより良くするためにこれを数式に追加する」的な要素の一つである正則化について学ぶ章です。章としては短いのですが、このあたりをさらっと流してしまうと、後々あれってなんだっけと見返さないといけないことが増えてきますので、きっちり理解しておきましょう。

## 8. Neural Networks: Representation（ニューラルネットワーク：表現）
このコースの前半最大の山場、ニューラルネットワークについてになります。わりと複雑なので、2つの章にわかれています。この章はまず入力から出力までどう計算していくのかを説明しています。

## 9. Neural Networks: Learning（ニューラルネットワーク：学習）
こちらがニューラルネットワークを機械学習させる上で大事な、バックプロパゲーション(誤差逆伝播法)の説明の章になります。

私は、今まで他の本とかWEB見ても、いまいちニューラルネットワークがどう学習しているのか理解できていなかったんですが、この動画と実装を見て、ようやくどういう計算で学習しているのかが判った気がしました。

## 10. Advice for Applying Machine Learning（機械学習を適用するためのアドバイス）
機械学習の理論はわかった、さて実際に適用するとしたら何に気をつけないといけないか、というエンジニア必見の章になります。

アンダーフィット、オーバーフィット、学習曲線はどうなっているか、といった実際に機械学習を現場に持ち込もうとするときの指針になる章ですね。

## 11. Machine Learning System Design（機械学習システムデザイン）
前の章と同様、こちらの章も機械学習を現場にあてはめようとすると起こる問題の提示と解決策の章になります。

具体的には、99%起こらなくて、1%起こるような事象に対して、機械学習の指標はどうあるべきかというような話です。

## 12. Support Vector Machines（サポートベクターマシン(SVM)）
分類アルゴリズムの一つである、SVMについての章になります。SVMは人気があるアルゴリズムなのでしっかり教えると先生が仰ってました。

また、最後の動画では他のアルゴリズムはどういう時に使って、SVMはいつ使うべきかというような話もあるので、覚えておきたいところです。

## 13. Unsupervised Learning（教師無し学習）
この章から15章までが教師無し学習の章になります。この章ではK-Meansアルゴリズムというずば抜けて人気らしいクラスタリングアルゴリズムについて学びます。

プログラム提出については量が少ないからか、次の章のお題とまとめて、次の章で行う形になっていました。

## 14. Dimensionality Reduction（次元削減）
この章では次元削減について学びます。次元削減というのは概念で、実際に学ぶアルゴリズムはPCA(主成分分析)と呼ばれているアルゴリズムになります。

私は、100次元だろうが1000次元だろうが2次元か3次元まで圧縮しちゃえばグラフに描画可能になると聞いて、学習するモチベーションが沸いてきました。

また、次元削減できるなら極端に少なくしたらどうなるのかと思ったのですが、そこはちゃんと答えが用意されていて、元の状態に対してどれくらい次元圧縮したら情報量がどの程度欠落するのかがわかるとのことで、そういうの重要と思いました。

## 15. Anomaly Detection（アノマリー検出）
アノマリー＝異常を検出するアルゴリズムを学習する章です。

ここで初めて正規分布（結構複雑な数式）が出てくるのですが、それ以前にいろいろ数式に慣れ親しんできた私にとっては、それほど凶悪な数式に見えなくなっているのでした。

興味深かったのが、教師あり学習とアノマリー検出の比較で、データがどういう状態ならどっちを使うべきみたいな話で大変今後参考になるなと。

## 16. Recommender Systems（レコメンドシステム）
ユーザが評価した映画のレーティングをどうつけるのか、というすごく実用的な仕組みの解説の章です。

最初は限定的で小さめのデータから始まって、最終的には穴あきの部分があっても、全てのパラメータを一気に計算してしまうような、話の流れがいい感じでした。

## 17. Large Scale Machine Learning（大規模機械学習）
大規模データになると毎回律儀に全データ計算してると遅いのでどうしよう、の章です。

ここで初めて、Map-Reduceなる概念が登場しますが、分割したら早いよねというレベルなので、もうちょっと詳しく知りたい方は別の文献にあたったほうがよいです。

## 18. Application Example: Photo OCR（応用例：写真からのテキスト抽出）
最終章は応用例として、パイプラインを使った機械学習ロジックの組み合わせで、写真からのテキスト抽出を行います。

実際にプログラム組めるのかなと思ったら、この章にはプログラム提出はありませんでした。

## 全部テストをパスしたら何が起こるか
期限付きコースの場合は、修了証っぽいものを発行（これは有料）してくれるらしいのですが、完全オープンなこの機械学習コースについては、コースをパスしたという結果が、コース上段に表示されるのみとなります。

実際に全部パスしたところ、下のような状態になりました。「Course Passed」の部分に何かリンク先があるかなーと思ったのですが、ありませんでした。

![2015-05-24_070350.png](https://qiita-image-store.s3.amazonaws.com/0/32778/1ecbd007-7947-75cf-f939-52daab1084b3.png)

※（2015-05-25追記）
メールで「Congratulations on completing Machine Learning」とお褒めの言葉が届いていました！

# 機械学習コース終わったよ。次何しよう。
プログラマなら手を動かしていろいろ実装していきましょう。サンプルコードの意味もわかるし、どこを修正したらどうなるか、なんとなくイメージできるのではないでしょうか。

勉強会とか開催して、まだ機械学習未経験な人を巻き込んで仲間増やしていくのも一つの方法ですね。

プレイヤーが増えないとこの手の分野は伸びないので、ぜひ周りに広げていきましょう。


# （おまけ）ところで、Andrew Ng先生はカタカナ表記だとどうなるのでしょうか？
Google先生に確認した所、どうみても3種類の記述があるので、一つに絞るのをあきらめました。

* [現代ビジネス:グーグルで有能な人材が続々と流出：　その背景にあるのは何か?](http://gendai.ismedia.jp/articles/-/41218)

> スタンフォード大学准教授のアンドリュー・エン（Andrew Ng）氏

* [ASCII.jp:Googleのディープラーニングはレトロゲームを自分で学習してプレイする](http://ascii.jp/elem/000/000/991/991583/index-2.html)

> Baidu Researchのチーフサイエンティストとしてディープラーニングの研究を行うアンドリュー・グ（Andrew Ng）氏

* [日本の科学と技術:ニコニコ動画の（株）ドワンゴが人工知能の研究に乗り出す](http://scienceandtechnology.jp/archives/4914)

> スタンフォード大学のアンドリュー・ング(Andrew Ng) 教授