# 一天搞懂深度學習-心得- :::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`