Coursera機械学習入門コース(4週目 - ニューラルネットワーク)

[Courseraの機械学習コース](https://www.coursera.org/learn/machine-learning/home/welcome)の4週目です。[3週目](https://qiita.com/FukuharaYohei/items/270c629fd74a7da4b9da)はロジスティック回帰による分類を学びましたが、4週目では、より複雑な問題に対応できるニューラルネットワークについて学びます。演習にMNISTっぽいやつも出てきて内容が実践に近づいてきた感があります。
記事[「Coursera機械学習入門オンライン講座虎の巻(文系社会人にオススメ)」](https://qiita.com/FukuharaYohei/items/b2143413063376e97948)を最初に読むことをお勧めします。

# サマリ
実績時間：4約時間
目安時間：約4.5時間(正確には279分)
※コースに各章の時間目安が書かれていて、それを足しただけです。

## 一覧
|No.|章|目安時間|内容|
|:-:|:--|:-:|:--|
|1.1|Motivations|16分|ニューラルネットワークを学習する動機|
|1.2|Neural Networks|35分|ニューラルネットワークのモデル計算式|
|1.3|Applications|28分|ニューラルネットワークの使用例|
|1.4|Review|200分|講義内容PDFとクイズとプログラム演習|

## 1. Neural Networks: Representation
### 1.1. Motivations
#### 1.1.1. Non-linear Hypotheses
Video:9分
非線形の仮説に対するアプローチ。
多項ロジスティック回帰を使うことで非線形の分類問題にも対応できるが、特徴量の数が増えるにつれ、計算量が多くなりすぎる難点がある。それに対応するためのニューラルネットワーク。画像分類は特にその例が当てはまる。

#### 1.1.2. Neurons and the Brain
Video:7分
ニューラルネットワークは脳を模倣したネットワーク。

### 1.2. Neural Networks
#### 1.2.1. Model Representation I
Video:12分, Reading:6分
ニューラルネットワークのモデルについてです。
まずはシンプルなモデルの例で3つの入力$x$に対して$h_\theta (x)$を出力するニューラルネットワークです。

```math
\begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline \end{bmatrix}\rightarrow\begin{bmatrix}\ \ \ \newline \end{bmatrix}\rightarrow h_\theta(x) \\
```

その場合の隠れ層(真ん中)ニューロン$a$とパラメータ(重み)$\theta$です。

```math
\begin{align*}& a_i^{(j)} = \text{"activation" of unit $i$ in layer $j$} \newline& \Theta^{(j)} = \text{matrix of weights controlling function mapping from layer $j$ to layer $j+1$}\end{align*}
```

では、隠れ層が3ニューロンの例です。

```math
\begin{bmatrix}x_0 \newline x_1 \newline x_2 \newline x_3\end{bmatrix}\rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \newline a_3^{(2)} \newline \end{bmatrix}\rightarrow h_\theta(x)
```

隠れ層および出力レイヤーの値は以下のように計算します。

```math
\begin{align*} a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3) \newline a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3) \newline a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3) \newline h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)}) \newline \end{align*}
```

レイヤー$j$に$s_j$個ユニットがあって、レイヤー$j+1$に$s_{j+1}$個ユニットがあった場合、$\Theta ^{(j)}$の次元(dimension)は$ s_{j+1}\times (s_j+1) $($s$はSubscriptionの略)。

#### 1.2.2. Model Representation II
Video:11分, Reading:6分
ニューラルネットワークのモデルの続きです。
前回の式を$z_k^{(j)}$を使って簡略化します。 
​

```math
\begin{align*} a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3) = g(z_1^{(2)})
\newline a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3)  = g(z_2^{(2)})
\newline a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3)  = g(z_3^{(2)})
\newline h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)}) \newline \end{align*}
```

2つ目のレイヤーのノード$k$である$z$は、以下の式で表せます。

```math
z_k^{(2)} = \Theta_{k,0}^{(1)}x_0 + \Theta_{k,1}^{(1)}x_1 + \cdots + \Theta_{k,n}^{(1)}x_n
```

ベクトルで表現し、ベクトル化した計算だと以下の式です。

```math
\begin{align*}x = \begin{bmatrix}x_0 \newline x_1 \newline\cdots \newline x_n\end{bmatrix} &z^{(j)} = \begin{bmatrix}z_1^{(j)} \newline z_2^{(j)} \newline\cdots \newline z_n^{(j)}\end{bmatrix}\end{align*} \\
z^{(j)} = \Theta^{(j-1)}a^{(j-1)}
```

これを順に計算していきます。このようにレイヤーの前から計算を進めていくことを、フォワードプロパゲーション(Forward Propagation：順方向伝搬)といいます。

### 1.3. Applications
#### 1.3.1. Examples and Intuitions I
Video:7分, Reading:2分
ニューラルネットワークを使って`and`演算ができます。
下記のような式の例で考えます($x_0$はbiasなので常に値が1です)。

```math
\begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}g(z^{(2)})\end{bmatrix} \rightarrow h_\Theta(x)\end{align*}
```

パラメータ$\theta$を以下と仮定した場合、`and`演算ができます。ちなみに$g(z)$はシグモイド関数です。

```math
\Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \\

\begin{align*}& h_\Theta(x) = g(-30 + 20x_1 + 20x_2) \newline \newline & x_1 = 0 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-30) \approx 0 \newline & x_1 = 0 \ \ and \ \ x_2 = 1 \ \ then \ \ g(-10) \approx 0 \newline & x_1 = 1 \ \ and \ \ x_2 = 0 \ \ then \ \ g(-10) \approx 0 \newline & x_1 = 1 \ \ and \ \ x_2 = 1 \ \ then \ \ g(10) \approx 1\end{align*}

```

#### 1.3.2. Examples and Intuitions II
Video:10分, Reading:3分
ニューラルネットワークを使って`and`だけでなくNORやORも演算可能。その場合のパラメータは下記のとおり。

```math
\begin{align*}AND:\newline\Theta^{(1)} &=\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \newline NOR:\newline\Theta^{(1)} &= \begin{bmatrix}10 & -20 & -20\end{bmatrix} \newline OR:\newline\Theta^{(1)} &= \begin{bmatrix}-10 & 20 & 20\end{bmatrix} \newline\end{align*}
```

下記のニューラルネットワークでは`XNOR`も演算できる。

```math
\begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \end{bmatrix} \rightarrow\begin{bmatrix}a^{(3)}\end{bmatrix} \rightarrow h_\Theta(x)\end{align*}
```

その時のパラメータは以下の通り。

```math
\Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20 \newline 10 & -20 & -20\end{bmatrix}
\Theta^{(2)} =\begin{bmatrix}-10 & 20 & 20\end{bmatrix}
```

#### 1.3.3. Multiclass Classification
Video:3分, Reading:3分
多クラス分類時のOne-hot Encoding表現についてでした。One-hot Encodingについては[リンク先](https://ensekitt.hatenablog.com/entry/2018/02/05/200000)に詳しく書いてあります。
最後の結果がこんな感じになるやつです。

```math
h_\Theta(x) =\begin{bmatrix}0 \newline 0 \newline 1 \newline 0 \newline\end{bmatrix}
```

### 1.4. Review
#### 1.4.1. Lecture Slides
Reading:10分
ここまでの講義スライドPDF。

#### 1.4.2. Neural Networks Representation
Quiz:5問, Reading:10分
2回間違えてしまいました。3回目は時間かけてやったら100点でした。
そんなに難しくないです。

#### 1.4.3. Multi-class Classification and Neural Networks
Programming Assignment:180分
3週目の多クラス分類と今回のニューラルネットワークに関する演習。今回はOptionalなしでした。
前回に引き続き、[GitHub](https://github.com/atinesh-s/Coursera-Machine-Learning-Stanford/tree/master/Week%204)をカンニングをしました。だから時間としては1時間程度で終了。内容の大雑把な理解レベルにとどめています。とにかく早く終わらせることに注力しています。

# 感想
ニューラルネットワークはある程度知っていてプログラミングの経験もあったため、難しいとは感じませんでした。

# 関連記事
私より詳しくまとめてくれています。

- [【機械学習】Stanford University Machine Learning / Week4【学習メモ】](http://forgetzimbnot.com/2014/04/post-243.html)
- [Coursera Machine Learning (4): ニューラルネットワーク入門](https://qiita.com/katsu1110/items/cc54c258f2533f8a0149)
- [カンニング用GitHub](https://github.com/atinesh-s/Coursera-Machine-Learning-Stanford/tree/master/Week%204)

他の週のリンクです。

- [Coursera機械学習入門コース(1週目 - 線形回帰と線形代数)](https://qiita.com/FukuharaYohei/items/44d97f411f0b1baaa42c)
- [Coursera機械学習入門コース(2週目 - 重回帰、多項式回帰、正規方程式)](https://qiita.com/FukuharaYohei/items/bcd676691f61dac8d0c8)
- [Coursera機械学習入門コース(3週目 - ロジスティック回帰、正則化)](https://qiita.com/FukuharaYohei/items/270c629fd74a7da4b9da)
- Coursera機械学習入門コース(4週目 - ニューラルネットワーク) <- 本記事
- [Coursera機械学習入門コース(5週目 - ニューラルネットワークと誤差逆伝播法)](https://qiita.com/FukuharaYohei/items/e7d60e371c076a0c215a)
- [Coursera機械学習入門コース(6週目 - 様々なアドバイス)](https://qiita.com/FukuharaYohei/items/25a76132b420cea901f2)
- [Coursera機械学習入門コース(7週目 - SVM)](https://qiita.com/FukuharaYohei/items/a67a8ae381b54e4ee0ea)
- [Coursera機械学習入門コース(8週目 - 教師なし学習(K-MeansとPCA))](https://qiita.com/FukuharaYohei/items/7a71be58818719cdf73c)
- [Coursera機械学習入門コース(9週目 - 異常検知、レコメンデーション)](https://qiita.com/FukuharaYohei/items/32caeaca6f77bf6f92dd)
- [Coursera機械学習入門コース(10週目 - ビッグデータ対応)](https://qiita.com/FukuharaYohei/items/1e33cb05a5833d22fe4b)
- [Coursera機械学習入門コース(11週目 - 写真OCR)] (https://qiita.com/FukuharaYohei/items/46c60cf591223915e6b4)