---
# System prepended metadata

title: 第二章|Deep Learning 學習基礎 Nikhil Buduma
tags: [Deep Learning]

---

---
title: 第二章|Deep Learning 學習基礎 Nikhil Buduma
tags: Deep Learning
---

# 誤差函數 / 目標函數

i 代表第 i 個訓練範例

$t^{(i)}$ 是第 i 個訓練範例的正確答案

$$
E=\frac{1}{2} {\textstyle \sum_{i}^{}}(t^{(i)}-y^{(i)})^{2}
$$

目的就是挑出讓 E 最接近 0 的最佳 $\mathbf{\theta}$

# 梯度遞減 

# Delta 規則 和 學習率

## 超參數 hyperparameters

權重就是一種超參數；而學習率就是另一種超參數

## 學習率 Learning rate

每次都會讓梯度值乘上他，決定每步的大小

代號：
$$
{\Huge \epsilon} 
$$

第三章會介紹自動調整學習率的技巧

## Delta 規則 / Delta rule

每次權重應該變動多少，這裡的 k 指第 k 個權重

$$
\Delta w_{k}=-\epsilon \frac{\partial E}{\partial w_{k}} 
$$

下面是線性神經元的結果，就只有一個神經元

$$
y^{(i)}=w_{1}x_{1}^{(i)}+...+w_{k}x_{k}^{(i)}
$$

$$
\Delta w_{k}={\textstyle -\epsilon\sum_{i}^{}}(t^{(i)}-y^{(i)})\frac{\partial y^{(i)}}{\partial w_{k}}  = {\textstyle \sum_{i}^{}}\epsilon x^{(i)}_{k}(t^{(i)}-y^{(i)})
$$

### S 神經元

自己推，簡單的微分運算，一樣只有一個神經元，結論：

$$
z^{(i)}=w_{1}x_{1}^{(i)}+...+w_{k}x_{k}^{(i)}
$$

$$
\Delta w_{k} = {\textstyle \sum_{i}^{}}\epsilon x^{(i)}_{k}y^{(i)}(1-y^{(i)})\frac{\partial E}{\partial y^{(i)}}
$$

# 反向傳播演算法 Backpropagation

由於權重的變化量可以由誤差函數的導函數算出來，那現在的問題就是要怎麼知道每一層中每個權重的變化量

這裡使用 Dynamic Programming ：假設目前知道第 j 層的誤差函數的導函數

想要知道前一層，第 i 層的誤差函數的導函數，可以藉由第 j 層的誤差函數的導函數來敘述
>畢竟是先有第 i 層的結果才有第 j 層

這邊一樣用 S 型神經元舉例

其實就是使用上面 S 神經元 Delta rule 的結果，只不過 $x^{(i)}_{k}$ 就是前一層的輸出 y 而已

$$
\Delta w_{ij} = {\textstyle \sum_{k\in 整組資料}^{}}\epsilon y^{(k)}_{i}y^{(k)}_{j}(1-y^{(k)}_{j})\frac{\partial E^{(k)}}{\partial y^{(k)}_{j}}
$$

也就是說知道了最尾端的誤差函數，就可以一路推回來了
:::warning
那個 k 很重要，上面的式子代表會將每筆資料的訓練結果納入考量
:::
# 批量梯度遞減 batch gradient descent

$$
\Delta w_{ij} = {\textstyle \sum_{k\in 整組資料}^{}}\epsilon y^{(k)}_{i}y^{(k)}_{j}(1-y^{(k)}_{j})\frac{\partial E^{(k)}}{\partial y^{(k)}_{j}}
$$

也就是採用每筆資料的結果，會沿著梯度遞減最劇烈的路徑前進，但是容易掉入區域極值或是鞍點，就會卡住


# 隨機梯度遞減 stochastic gradient descent / SGD

每次只採用其中一筆資料的訓練結果，可以顯著提高在平緩區域內找出方向繼續前進的能力
但是因為每次都只看其中一筆，所以採用的誤差曲面可能不是恰當的誤差曲面，反而可能更花時間

# 小批量梯度遞減 mini-batch gradient descent

就是上面兩種方法的折衷版本，只採用所有訓練結果中的一部份作為考量

而這個「小批量 minibatch」也是其中一個超參數

$$
\Delta w_{ij} = {\textstyle \sum_{k\in 小批量資料}^{}}\epsilon y^{(k)}_{i}y^{(k)}_{j}(1-y^{(k)}_{j})\frac{\partial E^{(k)}}{\partial y^{(k)}_{j}}
$$

# 過度套入 overfitting

神經網路中，連接數量的增加，或是深度(層數)的增加都會更容易產生過度套入

# 資料的分組

## 訓練組

拿來訓練的組別

## 測試組

用來測試的組別；如果訓練跟測試的資料都是同一筆的話根本看不出結果的好壞，所以才需要測試組

## 驗證組

為了避免訓練的過程產生嚴重的過度套入，所以「每個階段 Epoch」都會跟驗證組比對
如果訓練組的準確性持續增加，但是驗證組的沒有改變或變差，就表示已經訓練過度該停止訓練了

### 階段 Epoch

假設訓練組有 d 筆資料，然後小批量的的取樣數是 b ，那一次 Epoch，或者說一個階段
是指資料經過$\frac{d}{b}$次的更新

# 地毯式搜索

作者說前面提到了這麼多超參數，像是學習速率，小批量等等，但是到目前還沒有找出最佳值得做法
而可能的作法是使用地毯式搜索，也就是給超參數設定有限的選項，然後進行排列組合並訓練

# 防止過度套入的方法

## 正則化 regularization

修改誤差函數：誤差函數 + $\lambda f(\theta)$ 其中 $f(\theta)$ 會隨著 $\theta$ 變大而變大

$\lambda$ 也是其中一個超參數；如果設為 0 就是不做任何預防

## L2 正則化

修改誤差函數：誤差函數 + ${\textstyle \sum_{k}^{}} \frac{1}{2}\lambda w^{2}_{k}$

這樣的話，會「嚴厲懲罰」極端的權重值，偏袒中庸的權重值

也就是多鼓勵採用每個輸入值，不要只採用特定幾個輸入值

## L1 正則化

修改誤差函數：誤差函數 + ${\textstyle \sum_{k}^{}} \lambda |w_{k}|$

作用剛好跟 L2 相反，會讓權重變得稀疏，也就是只傾向使用特定幾個輸入，也因此不易受雜訊干擾

因此如果特徵分析很重要，就用 L1 ，反之就用 L2

## 最大範數約數 Max norm contraint

也是不要讓權重太大

對每個權重向量的大小設定一個絕對的上限，使用投射梯度遞減達到約束的效果

只要梯度遞減步驟使得 $||w||_{2}>c$ 就把向量投射到半徑為 c 的球體

好處是權重向量不會失控

## 隨機拋棄 Dropout

最受青睞的方法之一

設定神經元只有在機率大於 p 的時候才會輸出值，不然就輸出 0

這樣可以讓神經網絡即使缺少特定資訊，還是可以得到正確的結果，不會過度依賴特定的幾個神經元

### 反向隨機拋棄 inverted dropout

上面是在測試期間，要對輸出值進行比例的調整，也就是呈上機率值，這樣才能獲得跟訓練期一樣的預期結果

但是模型在測試期間的表現對於模型的評估很重要，所以最好改在訓練期間進行比例調整，不要在測試期間調整

而調整方法就是未失效的輸出值除以機率 p 在送到下一層