Coursera Machine Learning: 概要とWeek1-Week5までを振り返って


本記事は[ジーズアカデミー Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gsacademy)の12/3分です。

ジーズアカデミー4期の浜谷と申します。すでにジーズアカデミーDEVコースを卒業したのですが、現在はジーズアカデミーにて機械学習勉強会を開催しています。

機械学習勉強会では、機械学習の授業で最も人気があるCoursera Machine Learningのコースを利用することにしました。何番煎じかわからないのですが、ここではCoursera Machine Learningコースの概要と前半のWeek1-Week5までの振り返りについて書いていきます。

##Coursera Machine Learningコースとは
Courseraとは大学レベルの講義をオンラインで受けられるwebサービス(MOOCs)の一つです。講師はStandord大学准教授であり、百度(Baidu)のChief Scientistでもある Andrew Ng氏です。
https://www.coursera.org/learn/machine-learning

本コースの特徴は以下の通りです。

###日本語字幕付きのビデオがある
授業は動画を見て進めていきます。動画はCourseraのwebサイトでも見られますし、スマホの場合はCourseraの専用アプリを利用して見ることもできます。アプリの場合は、wifi環境下でビデオをあらかじめダウンロードしておくことができるため、通勤時間中などでもパケット使用量を気にせずに動画を視聴することができます。

説明はすべて英語なのですが、日本語字幕がついているため、英語のリスニングができなくても内容を理解することが出来ます。

###小テスト(Quiz)がある
毎週、小テストがあり、80%以上正答しないと合格になりません。合格しなくても先に進めるのですが、内容の理解のためには小テストを解くことをオススメします。

###プログラミングの実装の課題(Programming assignment)がある
Week2以降ではプログラミングの課題があり、自分で手を動かしてプログラミングする必要があります。Courseraの機械学習コースでは、実装したプログラムをコマンドライン上でsubmitすると、正解かどうか即座に判定してくれます。

なお、小テストとプログラミング課題をすべて合格し、お金($79)を払うと卒業認定書をもらうことが出来ます。認定が必要ない場合は無料です。


##Octave vs Python どっちが良い？
Coursera Machine Learningコースは、機械学習の入門コースとしてはかなり有名なコースであるようなのですが、実装にOctaveを使います。機械学習といえばPythonというイメージがあるため、Octaveを使うことに抵抗感を感じる方が多いように感じます(私自身がそうでした...)。

本コースを進めてきて分かってきたOctaveのメリットは、行列の積をそのままの形で実装できることです。以下では行列の演算について、Octaveでの実装とPythonでの実装を比較してみます。

###行列の各要素同士の四則演算

Octaveの場合

```octave
A = [1 2; 3 4]
B = [5 6; 7 8]
A+B
A-B
A.*B
```

Pythonの場合

```python
import numpy as np
A = np.matrix('1 2; 3 4')
B = np.matrix('5 6; 7 8')
A+B
A-B
A*B
```

###行列の積

Octaveの場合

```octave
A*B
```

Pythonの場合

```python
np.dot(A,B)
#もしくは下記でも良い
A.dot(B)
```

###行列の転置
Octaveの場合

```octave
A'
```

Pythonの場合

```python
A.T
```


###行列から一列抜き出す
Octaveの場合

```octave
A(:,1)
```

Pythonの場合

```python
A[:,0] #numpyで１列抜き出すと、横ベクトルになってしまうことに注意
```

PythonとOctaveの行列計算の実装はそれほど大差ないのですが、Octaveのほうが数式で表されている行列の演算に近い形で実装できます。Courseraのコース内でAndrew先生がOctaveの使用を勧めているのですが、私個人としてもOctaveを使用することがアルゴリズムの理解のために適していると感じます。


##Week1 - Week5の概要、プログラミング課題と振り返り

各Weekのプログラミング課題に取り組んできたので、ポイントとなりそうなところだけピックアップしていきます。課題回答そのものについては伏せておきます(ここには記載しません)。

###Week1 1変数の線形回帰
散布図を1次関数でフィッティングする方法を学びます。Excelでよくあるような状況です。
動画のボリュームはWeek1が最も多く、2.5時間ほどあります。根気よく進めてください。Week1にはプログラミング課題はありません。

###Week2 多変数の線形回帰
変数が1つではなく、多変数になったときにフィッティングする方法を学びます。

####プログラミング課題のポイント
[1]入力データ(特徴ベクトル)$x$は縦ベクトル、パラメータ(重み)$\theta$も縦ベクトルと定義します。
[2]コスト関数を最小化するのとき：
コスト関数をベクトル化する必要があり、入力データ$X$がベクトルではなく行列になります。このとき、$X$の各行は、特徴ベクトル$x$を転置した横ベクトルになっています。ややこしいのですが、入力データ$X$は
　行：各データサンプル
　列：各特徴量
となります。ここで私はつまづいたのですが、上記を抑えておけばが大丈夫です。以降のWeek3のロジスティック回帰やWeek4-5のニューラルネットワークの実装でも、データの並び順はすべてこの形で進めていきます。

###Week3 ロジスティック回帰
データの結果が連続的な値ではなく、0か1かという場合分けであるときの分類方法を学びます。

####プログラミング課題のポイント
コスト関数の中に$\log(h_\theta(x^{(i)}))$が入ってきます。Octaveで実装する際にはLog関数は、行列を入れた場合には各要素のLogを計算することに注意が必要です。

###Week4 ニューラルネットワーク 前編
ニューラルネットワークは、ロジスティック回帰の多クラス版について、さらに階層増やしていくイメージです。

####プログラミング課題のポイント
[1]多クラスの場合のロジスティック回帰：one vs all法
パラメータが行列$\Theta$になります。このとき、$\Theta$の各行は、パラメータベクトル$\theta$を転置した横ベクトルになっています。

[2]ニューラルネットワークの順伝播
実装としてはが深くなるだけで、単なる行列の積になります。

###Week5 ニューラルネットワーク 後編
いままでと同様に、コスト関数を最小になるようなパラメータを見つけます。ニューラルネットワークの場合は階層毎にパラメータ行列$\Theta$が現れてきます。それらをまとめて「逆誤差伝播法」によって処理し、最適なパラメータを探し出すことになります。

Coursera機械学習コース内のForumでもWeek5のプログラミング課題がもっともChallengingだと記載されていました。ここが最大の山場のようです。(私は現在まさに課題に取り組んでいる最中です)。


##おわりに：勉強会を開催しよう
動画による学習は、基本的には一人で進めるため、どうしても挫けそうになります。私の場合、Week2とWeek5でつまづき、進みが停滞しがちになってしまいました。

Courseraコースでは、学習者同士の意見交換を奨励していて、実際にCoursera内に議論の場(Discussion Forum)が設けられています。しかし英語であるため、なかなか気軽にコメントが入れられません。

そこで、独自に勉強会を開催することにしました。日程を決めて他人に見られる状況を作ることで、ほんのすこしだけ自分自身にプレッシャーをかけていこうかという目論見です。勉強会はジーズアカデミー内にて開催しているため、会場に入れる人間はジーズアカデミーのメンバーのみとなってしまいますが、進捗ありましたら別途ご報告したいと思います。