# 一天搞懂深度學習-心得-
:::info
學習資源:[**網友重點整理影片**](https://www.youtube.com/watch?v=ZrEsLwCjdxY)、[**PPT**](http://www.slideshare.net/tw_dsconf/ss-62245351) by [**李宏毅教授**](https://speech.ee.ntu.edu.tw/~tlkagk/index.html)
:::
## Outline
1. 深度學習簡介
2. 學習神經網路
3. 各種不同的網路架構
## Introduction of Deep Learning
### 1. Network Structure 建立網路架構
神經網路架構是由各神經元(neuron)組成,神經元的運算是由各輸入(input)乘上權重(weight),再加上偏差值(bias),最後經過激勵函數(activation function)獲得輸出,如下圖所示。

將眾多神經元串接在一起之後,我們會大致上看到input layer、hidden layer和output layer三部分,而deep learning的`deep`便代表多層的**hidden layer**。

神經網路中的weight和bias是決定神經網路好壞的關鍵(**以下通稱$\theta$**),將兩者最佳化便是訓練神經網路的目標。
### 2. Learning Target 針對目標學習
今天要將一個256x256的手寫字矩陣進行辨識,我們便將矩陣送入神經網路,接著得出最接近的字元,將之視為預測結果。

預測輸出會存在與正確結果的誤差值(loss),所以**訓練神經網路的目標便是找出可以使total loss最小化的$\theta$值**。

### 3. Learn! 開始學習
如前所述,訓練目的是要找出最佳的$\theta$值,但因為神經網路的結構十分巨大複雜,因此要找出最佳$\theta$值會非常曠日廢時且不切實際,所以我們會改由獲得**區域最佳解**來訓練網路;首先,我們先隨機選擇$\theta$值,接著在total loss-$\theta$座標圖上,觀察左右橫移(改變$\theta$)的total loss變化,從而找到區域內的最佳$\theta$值。

### 訓練完成
透過以上的訓練學習,我們就可以將完成的神經網路拿來預測未知目標囉!
### Why Deep (not Fat)?
越多層架構--> $\theta$參數越多--> 可以獲得越高的準確率
:::warning
:question: 那為什麼不要將神經網路變"胖",而是要一層層遞"深"呢?
A:原因是藉由一層層辨識的效果,可以達成模組化(modularization),也就是每一層layer可以專注於訓練特定項目的辨識,而非將眾多特徵辨識交付於單一的分類器上,導致對於較少出現的案例判定失準的情形(下圖為兩者之比較)。


:::
因此在layer順序的編排上,會將最基本的辨識項目放在前面,較為細節的項目放在後面。
## Tip for Training NN
### Bad result on traning data
有時在training data時便會發生準確率過低的問題,這時有下列幾種解決方式
#### 1.Choosing Proper Loss
改變total loss的計算方式,舉例來說,一般在計算total loss時會使用square error $\sum\limits_{i=1}^{10}{(y_i-\hat{y_i})^2}$,但在梯度下降的效果未必顯著,這時如果換成cross entropy $\sum\limits_{i=1}^{10}{\hat{y_i}lny_i}$,便可以看出兩者計算方式對於獲得最低total loss效果明顯不同。

#### 2. Mini-batch
將測試資料分為多組(batch)進行訓練,將所有mini-batch都訓練完後,這樣的過程稱為完成一組**epoch**,反覆進行多次epoch訓練,來得到想要的結果。

* 優缺點
* 不穩定(多組資料測試)
* 會有較好的效能表現(一次epoch就會更新多次)
* 平行運算時則不一定
#### 3. New activation function
layer數越多時,激勵函數的結果值會有越來越小的情形,導致較多層數的神經網路準確率下降

此時若是採用**ReLU**或是**Maxout**作為激勵函數,便可以挑選較具影響力的值作為輸出,避免失準情形出現。


#### 4. Adaptive Learning Rate
Learning rate過大過小都不好,因此最好可以依照訓練時間進行,如**Adagrad**便是隨時間遞減,參數update的變化值也越來越小。


#### 5. Momentum
在尋找區域最小值時,會發生
1. 遇到斜率極緩的區域
2. 困在saddle point
3. 困在local minima

等數種情形阻止我們尋找到global minima,此時若我們將尋找的過程類比為一顆球的滾動過程,我們便有機會找到一個較佳的值。

### Bad result on testing data
訓練資料集和測試資料集若差距過大,會發生**overfitting**

這也是在test階段準確率下降的主要原因,解決方法有以下
#### 1. Early Stopping
在訓練時透過validation set,確保梯度下降時不會完全只依照training data改變參數,而是停在一個最佳位置。

#### 2. Regularation
在此舉例**Weight Decay**方法,將特定(無用的)資訊利用weight來達到遞減萎縮的效果。

#### 3. Dropout
將一定比例的神經元去掉,獲得較小的網路,讓testing效果變好(但在traning效果會變差)。

#### 4. Network Structure
將在下一章介紹。
## Variants of NN
### CNN (for image)
一張圖片的像素非常多,資訊量也很大,代表第一層layer的輸入量會非常巨大,那要如何利用CNN便是圖片內的物體呢?
利用我們要找的物體所具有的特徵,例如要辨識鳥類,我們可以利用"鳥喙"這樣一個**在整張圖片中占比非常小的特徵**來達成,因此不需要輸入整張圖片。

我們也可以將圖片縮小,減少輸入CNN的值。

#### 圖像處理
針對不同的需求,我們會對圖片做前置處理,再進行辨識,如前面所述的特徵擷取或是縮小圖片,詳細方法如下

##### Convolution
卷積的目的在於將圖片套上濾鏡(fliter),凸顯特定資訊(如物件邊緣、形狀等),實際作法如圖


##### Max Pooling
max pooling的目的在於將圖片縮小(subsample),但仍保留重要資訊,實際作法如圖

##### Flatten
將圖片矩陣展開,帶入NN計算。

### RNN
我們先舉個例子說明,比如今天有一乘客訂票,說出``I would like to arrive Taipei on Nov 2nd``,那我們會知道`Taipei`是目的地,而非出發地,因此若今天一個NN要清楚辨識乘客說的話並做出決策,它需要記憶前面所說的話(狀態),也就是需要memory。

RNN有以下特性:
* 需要memory
* hidden layer的輸出會被記憶,並當作另一個輸出
* 同樣的架構會被重複使用

###### tags: `self-study` `deep learning` `ai`