Courseraの機械学習コースを始めるまえに用意しておくこと、覚悟すべきこと

https://www.coursera.org/learn/machine-learning

話題のCoursera Machine Learning (機械学習)を年明けから受講していて、ついさっき全課題を終了した。全部で11週くらい、3ヶ月ほどかかるとの触れ込みだったが、平日の夜中にちょこちょこと動画を見つつ、土日のまとまった時間を使える時に出来る限り進めてみたら1ヶ月ちょっとでなんとか全て終えることが出来た。

始めた当初はやはり英語が得意ではないんだけど大丈夫だろうか？数学も苦手なんだけど大丈夫なんだろうか？とこの講義を学び通すことが出来るか、かなり不安だった。
しかし、機械学習の分野ではかなり有名人であるらしいAndrew Ng先生の比較的聞き取りやすい英語、とても親切丁寧な語り口、機械学習初心者向けである故に難しい数式がわからなくても大丈夫だよと講義中にも安心させて励ましてくれる心意気のおかげで、合わせて10時間以上に及ぶ数式とグラフに溢れた濃密な講義ビデオも、よく分からない部分を何度も見返したり、英語表現でわからない部分を必死に調べながらではあるが、何とか全部見ることが出来、課題も全てクリアすることができた。ひとえにAndrew先生のおかげである。
そんな長時間に及ぶ怒涛の講義ビデオ最終回ラスト5分、日中時間がとれない中でも何とか時間をやりくりして講義を最後までやり通した者たちへ先生から送られた激励の言葉には感動しすぎて、不覚にも泣いてしまった。MOTHER2をクリアしたときよりも泣いてしまった。大学の留年が確定したときよりも泣いてしまった。そんな感動に包まれた勢いでこれを書いている。
受講はしたいが英語とか数学とか時間的な問題とかがあるから不安、という人に対して実際どうだったのかを伝えたい。

# 講義の構成
線形回帰、ロジスティック回帰、ニューラルネットワーク、SVMなどの教師あり学習から、K-meansやアノマリー検出などの教師なし学習、映画のレコメンドシステムを例に取った協調フィルタリング、そしてアルゴリズムだけでなく機械学習をよりよく機能させるにはどうしたらいいのか、どういう方法をとればより精度が良くなるかについてなど盛りだくさんの内容を講義ビデオによって学べる。それらがだいたいトピックごとに11週に分割されている。

1週間の中でやることは

- 講義ビデオ(日本語字幕あり)
- 各ビデオ復習テキスト
- チャプターごとの復習クイズ
- プログラミング課題

という感じ。プログラミング課題は最初の週と最後の2週間は無いため、8週分。これらが1週間毎に締切が設定されている。クイズとプログラミング課題を80%以上正解してクリアしないことには先の講義へ進めない。（期限よりも早く終わらせてどんどん先に進むことは可能）

# 数学はどれくらいできたほうがいい？
やはり理屈を学ぶ上で数学は避けて通れない。ビデオの中でも数式はバシバシ出て来るし、その数式をプログラミング課題で実装しなきゃいけなかったりする。が、実際はそこまで高度な数学力は求められない。

### 線形代数
データや機械学習で求めるパラメータはほとんど行列やベクトルに入っているので、行列の演算知識が必要になる。が、第一週でその線形代数の復習講義を行ってくれるので、そんなに問題はない。実際、線形代数と言ってもこの講義内で使うのは行列の和と差と積、あとは転置行列とかそれくらいのもの。固有値もちらっとでてくるけど、「ここ分からなくても全然かまわんで〜」とAndrew先生は流してくれるので、そこまで理解していなくてもいい。ただ、プログラミング課題で、何行何列の行列を扱っているのかというのを意識し続けないといけないので、多少計算練習は必要かもしれない。大学で線形代数の単位をとっていたことがあるならば問題は無いと思う。

[プログラミングのための線形代数](https://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)という本が、courseraの機械学習うけるならこれ読んどけとおすすめされていることがちょくちょくある。

実際この本を買ってみたが、最初読んだ時は正直自分にはちょっと難しかった。300ページ以上と結構ボリュームもある。courseraの講義を受け、それ以降も勉強を続けていくのであればこの本は読んで理解しておくべきかもしれないが、この講義をうける段階ではここまで読まなくてもいいのではと思う。

とはいいつつもやっぱりちょっと心配なので何か読んでおくべきだろうと思ったので、自分はこの本を読んでから講義をうけた。
[まずはこの一冊から-意味がわかる線形代数](https://www.amazon.co.jp/まずはこの一冊から-意味がわかる線形代数-BERET-SCIENCE-石井/dp/4860642880/)
なんだかんだでこの本もボリュームはあるが、プログラミングのための線形代数よりは読みやすいし、平易。計算演習もある程度できる。

### 微積
偏微分が至る所ででてくるので、これは少し理解しておいたほうがいいかもしれないが、これも大学初頭レベルの微積が分かってれば十分。合成関数の微分とかも一瞬出てきたけど、これも「気になったら自分で計算してみるといいけど、別にこれわかんなくても大丈夫だよ〜」とAndrew先生は甘やかしてくれるので、そこまで考えなくてもいい。

# 英語はどれくらいできたほうがいい？
講義ビデオについては日本語字幕があるため特に気にしなくてもいい。だが、実は日本語があるのは講義ビデオだけで、残りの復習テキスト、5問中4問以上(80%以上)正解しないといけない復習クイズ、プログラミング課題、そしてプログラミング課題の問題設定と説明が書かれた15ページ程度のPDFは全て英語で、日本語訳されたものはない。
これだけ聞くと、「クイズの問題文が英語、しかも毎週15ページの英文読むとか絶対無理！」と思ってしまうかもしれないが、案外そんなことはない。

というのも、復習テキストも復習クイズもプログラミング課題のPDFも、どれも日本語訳のある講義ビデオの内容のことだけが書いてあるからだ。当然表現は変えていたり出て来る例が変わっていたりはするものの、それらが表しているトピックはビデオのものと変わらない。ある程度どういう方向性のことが書かれているかが分かっていれば、そこまで理解は難しくない。
また、英文自体もそこまで難解なものではない。僕自身英検3級しか持っていないけれど、多少よくわからない文にも出くわしたものの進めなくなるくらい困ることはなかった。
単語も調べればすぐ分かるようなものばかりだから、調べることさえできれば大量の英文にビビることもない。

あとは副作用として英語に対する自信がちょっとだけついた。そこそこ平易で文章の方向性のわかっているものを読んでいるだけでも、英語を読めている自分を自覚してちょっと楽しくなる。そして別の所で英語を見てもビビることがかなり減った。思わぬ収穫だったと思う。

ちなみに自分はこのchrome拡張を使いながら英語を読んでいた。

[Google Dictionary](https://chrome.google.com/webstore/detail/google-dictionary-by-goog/mgijmajocgfcbeboacabfgobmjgjcoja)
英単語をダブルクリックすれば、単語のすぐ上にその意味を書いたポップアップが出てくる。
![スクリーンショット 2017-02-15 0.49.20.png](https://qiita-image-store.s3.amazonaws.com/0/2164/d5bd7245-af05-bfae-a52d-5eb4b1b6bf2b.png)
タブを開いて検索して…ということをいちいちしなくていいので楽ちん。

# octaveはどれくらいできたほうがいい？
プログラミング課題はoctaveというMATLABクローン的な言語をつかって解く必要がある。
が、これも実はそこまで出来る必要はない。第二週でoctaveのチュートリアルがビデオ講義に含まれている。それをみていれば大体どういうものかは理解できる。

プログラミング課題自体もそこまで大量ではない。
というのも、プログラミング課題はベースとなるコードがすでに用意されていて、それを穴埋め形式で解いていくものだ。いきなり最急降下法を使ってデータ予測をするwebアプリケーションを1000行以上のコードを使って書け、というような課題は出ない。関数とその仮引数はこっちで決めてあるから、あとはこの中に今回のチャプターで扱ったアルゴリズムを実装してね、という程度のものが週に4つ5つあるくらいだ。そしてそれらはどれも数行で書けるものばかり。

ベースとなるコードは用意されたデータを勝手に読んでくれて、勝手にグラフをプロットしてくれる。こちらで穴埋めをしてそのベースとなるコードを実行すれば、こちらが実装したアルゴリズムによって予測した点をさらにプロットしてくれる。グラフのプロットなど面倒な部分は全部提供されているので、大事な部分にのみ取り組める。しかも実際にデータと出力を見ながらどういう仕組で動いているのかとか、どこを変えるとどう値が変化するのかという実験も簡単にできるので、コードを実際に書く量は少なくても、しっかり学ぶことができる。

なんにしても、チュートリアルレベルのoctaveの理解ができていればどうにかなる。

### 解けなかったら？
復習クイズの場合は3回まで挑戦可能、3回挑戦して80%以上正解できないと8時間あけないと再挑戦ができなくなる。プログラミング課題は何度間違えてもペナルティはない。ベースとなるコードと一緒に送信用スクリプトがzipに入って落とせるようになっているので、それを使って送信できる。

週ごとにフォーラムが用意されているため、分からない部分があればそこでどうやって実装するのかを聞くことができる。（英語だけど）
また、コースのページ内から「Programming Exercise Tutorials」という各プログラミング課題のかなり詳細なヒントが書かれたリンクもこっそり用意されている。そこを見ればある程度は何を実装すればいいかはわかるだろう。
最悪、「octave coursera」とかでググると先人たちのgithubのリポジトリが見つかるのでそこを参考にすることも出来る。ただし、コードのコピペについては初週でかなり注意されるのでコピペは厳禁。

他人が解いた回答をみてみると、こういう実装で簡単に書けるのか！と感動できるので、クリア後に見るのがいいかもしれない。
特に、行列を行ごとに処理しなければならないような処理にはforループを使ってダラダラと書いてしまいがちだけど、octaveはそれを1行で処理できるようなパワーを持っているので、そこら辺が理解できるようになると楽しくなる。

#　どれくらいの時間が必要？
動画は全部で20時間弱。クイズはうまく行けば10分程度。プログラミング課題はものにもよるが、courseraでは1週間分の課題につき3時間位と見積もられている。なので8週分で24時間くらい。

ものすごく時間がかかりそうに見えるが、動画については1本5分から15分位に区切られている。なので、電車の中とか空いた時間でちょこちょこ見られるので、そこまで腰を落ち着けて予めたっぷり時間をとって見なければならないようなものではない。
プログラミング課題は、最初はoctaveでどう処理するのか、行列をどう扱えばいいのかとか、問題文の書いてあるPDF読むのに時間かかったりとかで、3時間位はかかってしまうかもしれない。
ただ、後半になるにつれて大体何をやればいいのか、どういうコードを書けば実装できそうかという勘所がわかってくるし、英語も慣れてくるので、3時間もかからなくなるようになる。

というわけで最初はちょっと時間とらないといけないかもしれないが、最初雰囲気を掴んでしまえばあとはそこまで気負わずにこなすことができる。３ヶ月という期間を聞くと長そうに聞こえるが、最悪のペースで３ヶ月なので、もっとサクサク終わらせられる人は自分のように１ヶ月２ヶ月でできるだろう。頑張れば1週間分の動画とプログラミング課題を土日で終わらせられるようにはなる。自分は２週目だけ丸々1週間かけてやったけど、あとは平日に１週間分、土日に１週間分くらいのペースでこなしていた。

# わからなかった時に参考にしたサイト

それでも講義内でよく理解できない部分は別のサイトを見ることで補っていた。
特に最初の最急降下法とニューラルネットワーク周りがよく分からない部分が多かったので、以下のサイトを見て理解した。

[やる夫で学ぶ機械学習シリーズ](http://tkengo.github.io/blog/2016/06/06/yaruo-machine-learning0/)

単回帰、重回帰、ロジスティック回帰が分からなかったらここを見るといい。デザインもグラフもスッキリしていて見やすく、話も分かりやすい。

[誤差逆伝播法を宇宙一わかりやすく解説してみる](http://www.yukisako.xyz/entry/backpropagation)

ニューラルネットワークのバックプロパゲーションの解説。バックプロパゲーションの実装課題が出るけど、これが一番難しかった。この話自体が難しいのでよく理解しないと解けないと思う。

講義で踏み込む範囲が浅いせいか、それとも講義がわかり易すぎるせいなのか、１１週の中でもこれくらいしか他のサイトを見て自分で補わなければいけないところはなかった。

# まとめ
色々考えておくべきこと、用意しておくべきこと、覚悟しておくべきことを書き出してはみたが、実際はそこまで大したことない。英語や数式を見た途端に引きつけを起こして泡をふいて倒れてしまうというような人じゃなければ、高校レベルの知識＋基本的な行列演算ができれば余裕で理解できるはず。時間的にも１日１時間も割かずともできるだろう。

### 実際機械学習できるようになるのか？
じゃあこの講義を受けたらたちまちそこら辺のライブラリとかつかいまくってアプリケーションをガンガン作れるようになれるかというと、そんなことはない。少なくとも自分は機械学習の知識を活かして何かを作れるようになるにはまだまだ時間がかかる。講義を１つ受けたくらいでそこまで変わりはしないというのは当然だ。が、いい足がかりにはなると思うし、機械学習関連の記事なんかを見てなんとなく話が分かる程度にはなれる。

タダなんだし、変に気負わず気楽にやってみるのが一番いいのかもしれない。