# [筆記] 機器學習 神經網路 ( Neural Network ) - 表層結構
### 為什麼使用神經網路
* 在特徵量多的情況下,在非線性回歸算法裡,會產生很多的特徵項,這並不是一個解決複雜非線性問題的好辦法
* 假設我們要分類 50 * 50 像素的灰階圖片 :
* 此特徵量 n = 2500 ( RBG 的話就是 n = 7500 )
* 那麼 `xᵢ * xⱼ` 的所有條件就有 2500 * 2500 / 2 ≈ 300 萬
* 這樣的計算成本太高了
* 而神經網路是個能輕鬆解決非線性問題的算法
* 神經網路最初產生的目的是模擬人類的大腦,早期不盛行的原因是,當時硬體無法支撐如此龐大的運算
### 神經網路模型的運作
#### 神經網路的模型

* 在前面輸入特徵 x₀ ~ xₙ
* x₀ 是一個偏置單元 ( bias unit ),始終為 1
* 最後的輸出則是我們假設函數的結果
* 在神經網路中最基本我們使用跟分類中相同的邏輯函數 ,有時會稱為激勵函數 ( sigmoid activation function ),之後也會有其他種的函數,例如 : TanH、ReLU
* theta 有時也被稱為權重 ( weights )

* Layer 1 為 input layer
* Layer 2 為 hidden layer,在 input layer 和 output layer 之間的都是
* Layer 3 為 output layer
`aᵢ⁽ʲ⁾` 為在 Layer j 中的 activation unit i
`Θ⁽ʲ⁾` 為控制 Layer j 到 Layer j + 1 的權重矩陣

* `Θ⁽ʲ⁾` 的維度 ( dimension ) 為 sⱼ₊₁ * (sⱼ + 1)
* sⱼ 為在 Layer j 中的 unit 個數
#### 神經網路的計算過程

* 假設 `x = a⁽¹⁾`
* `a⁽ʲ⁾ = g(z⁽ʲ⁾)`,例如 : `a⁽²⁾ = g(z⁽²⁾)`
* `z⁽ʲ⁾ = Θ⁽ʲ⁻¹⁾a⁽ʲ⁻¹⁾`,例如 : `z⁽²⁾ = Θ⁽¹⁾a⁽¹⁾`
* `hΘ(x) = a⁽ʲ⁾ = g(z⁽ʲ⁾)`,此 Layer j 為 output layer
### 神經網路的應用
#### 運算 OR

* `hΘ(x) = g(-10 + 20x₁ + 20x₂)`
1. x₁ = 0 and x₂ = 0 then g(−10) ≈ 0
2. x₁ = 0 and x₂ = 1 then g(10) ≈ 1
3. x₁ = 1 and x₂ = 0 then g(10) ≈ 1
4. x₁ = 1 and x₂ = 1 then g(30) ≈ 1
* g() 為邏輯函數 ( sigmoid function )
#### 進階運算 XNOR
* AND : `Θ⁽¹⁾ = [-30 20 20]`
* NOR : `Θ⁽¹⁾ = [10 -20 -20]`
* OR : `Θ⁽¹⁾ = [-10 20 20]`
將三個結合後 :

* 
* 
* 
1. `a⁽²⁾ = g(Θ⁽¹⁾x)`
2. `a⁽³⁾ = g(Θ⁽²⁾a⁽²⁾)`
3. `hΘ(x) = a⁽³⁾`
#### 多類別分類運算
* 在多類別分類時,並不是 `y = 1`、`y = 2`、`y = 3`、`y = 4`...這樣分類
* 而是有多個輸出來個別表示是否為此分類

* 假設這次有 4 種分類,那輸出的所有種類如上

* 神經網路的模型可以這樣設置
```Octave=
function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);
n = size(X, 2);
all_theta = zeros(num_labels, n + 1);
X = [ones(m, 1) X]; %加入 x₀
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1:num_labels
[theta] = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
all_theta(c, :) = theta';
end
end
```
* 在 Octave 上的多類別分類器函式
```Octave=
function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
p = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
predict = sigmoid(X * all_theta');
[predict_max, index_max] = max(predict, [], 2);
p = index_max;
end
```
* 在 Octave 上的預測計算函式
```Octave=
function p = predict(Theta1, Theta2, X)
m = size(X, 1);
num_labels = size(Theta2, 1);
p = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
z2 = X * Theta1';
a2 = sigmoid(z2);
a2 = [ones(size(a2, 1), 1) a2]; %加入 a₀⁽²⁾
z3 = a2 * Theta2'
a3 = sigmoid(z3)
[a3_max, index_max] = max(a3, [], 2);
p = index_max;
end
```
* 在 Octave 上的預測計算函式 ( 多層神經網路 )
###### tags: `筆記` `機器學習` `神經網路`