---
# System prepended metadata

title: 一天搞懂深度學習-心得-
tags: [self-study, ai, deep learning]

---

# 一天搞懂深度學習-心得-
:::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)獲得輸出，如下圖所示。

![](https://i.imgur.com/vPROHQI.png =400x)
將眾多神經元串接在一起之後，我們會大致上看到input layer、hidden layer和output layer三部分，而deep learning的`deep`便代表多層的**hidden layer**。

![](https://i.imgur.com/I27nj1B.png =400x)

神經網路中的weight和bias是決定神經網路好壞的關鍵(**以下通稱$\theta$**)，將兩者最佳化便是訓練神經網路的目標。

### 2. Learning Target 針對目標學習
今天要將一個256x256的手寫字矩陣進行辨識，我們便將矩陣送入神經網路，接著得出最接近的字元，將之視為預測結果。

![](https://i.imgur.com/uWbMgf1.png =400x)

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

![](https://i.imgur.com/bkBiKPW.png =400x)

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

![](https://i.imgur.com/M6MGzJa.png =400x)

### 訓練完成
透過以上的訓練學習，我們就可以將完成的神經網路拿來預測未知目標囉!

### Why Deep (not Fat)?
越多層架構--> $\theta$參數越多--> 可以獲得越高的準確率
:::warning
:question: 那為什麼不要將神經網路變"胖"，而是要一層層遞"深"呢?
A:原因是藉由一層層辨識的效果，可以達成模組化(modularization)，也就是每一層layer可以專注於訓練特定項目的辨識，而非將眾多特徵辨識交付於單一的分類器上，導致對於較少出現的案例判定失準的情形(下圖為兩者之比較)。
![](https://i.imgur.com/WPw9xGt.png =400x)
![](https://i.imgur.com/Cuh3Jxi.png =400x)


:::
因此在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效果明顯不同。

![](https://i.imgur.com/S8GfVts.png =400x)

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

![](https://i.imgur.com/n2xbQMp.png =400x)

* 優缺點
    * 不穩定(多組資料測試)
    * 會有較好的效能表現(一次epoch就會更新多次)
        * 平行運算時則不一定

#### 3. New activation function
layer數越多時，激勵函數的結果值會有越來越小的情形，導致較多層數的神經網路準確率下降
![](https://i.imgur.com/aevhoDR.png =400x)
此時若是採用**ReLU**或是**Maxout**作為激勵函數，便可以挑選較具影響力的值作為輸出，避免失準情形出現。

![](https://i.imgur.com/LbReV8m.png =400x)

![](https://i.imgur.com/DNqIDB9.png =400x)

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

![](https://i.imgur.com/bmHtdrV.jpg =400x)

![](https://i.imgur.com/0X2HzVs.png =400x)

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

![](https://i.imgur.com/vqG8tN8.png =400x)

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

![](https://i.imgur.com/LeQyOM2.png =400x)

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

![](https://i.imgur.com/jxChtYq.png =400x)

這也是在test階段準確率下降的主要原因，解決方法有以下

#### 1. Early Stopping
在訓練時透過validation set，確保梯度下降時不會完全只依照training data改變參數，而是停在一個最佳位置。

![](https://i.imgur.com/F07qSVf.png =400x)

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

![](https://i.imgur.com/pF7BvMc.png =400x)

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

![](https://i.imgur.com/4FZIsZC.png =400x)

#### 4. Network Structure
將在下一章介紹。

## Variants of NN
### CNN (for image)
一張圖片的像素非常多，資訊量也很大，代表第一層layer的輸入量會非常巨大，那要如何利用CNN便是圖片內的物體呢?

利用我們要找的物體所具有的特徵，例如要辨識鳥類，我們可以利用"鳥喙"這樣一個**在整張圖片中占比非常小的特徵**來達成，因此不需要輸入整張圖片。
![](https://i.imgur.com/U7qnSg9.png =400x)

我們也可以將圖片縮小，減少輸入CNN的值。
![](https://i.imgur.com/urr8OuG.png =400x)

#### 圖像處理
針對不同的需求，我們會對圖片做前置處理，再進行辨識，如前面所述的特徵擷取或是縮小圖片，詳細方法如下
![](https://i.imgur.com/d3yUSdj.png =400x)

##### Convolution
卷積的目的在於將圖片套上濾鏡(fliter)，凸顯特定資訊(如物件邊緣、形狀等)，實際作法如圖
![](https://i.imgur.com/ql4K6C8.png =400x)
![](https://i.imgur.com/N1ZTyJa.png =400x)

##### Max Pooling
max pooling的目的在於將圖片縮小(subsample)，但仍保留重要資訊，實際作法如圖
![](https://i.imgur.com/wTajyel.png =400x)

##### Flatten
將圖片矩陣展開，帶入NN計算。
![](https://i.imgur.com/SUaJtKO.png =400x)

### RNN
我們先舉個例子說明，比如今天有一乘客訂票，說出``I would like to arrive Taipei on Nov 2nd``，那我們會知道`Taipei`是目的地，而非出發地，因此若今天一個NN要清楚辨識乘客說的話並做出決策，它需要記憶前面所說的話(狀態)，也就是需要memory。
![](https://i.imgur.com/ueCViKr.png =400x)
RNN有以下特性:
* 需要memory
* hidden layer的輸出會被記憶，並當作另一個輸出
* 同樣的架構會被重複使用
![](https://i.imgur.com/c4oWq98.png =400x)


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