[ML筆記] Tips for Training DNN

ML Lecture 9: Tips for Training DNN
本篇為台大電機系李宏毅老師 Machine Learning (2016) 課程筆記
上課影片:
https://www.youtube.com/watch?v=xki61j7z-30
課程網 (投影片出處):
http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML16.html

做 Deep Learning 的流程
step 1 定義 set of funcion
step 2 定義 goodness of function
step 3 挑選 best function
→ training
先檢查 training set 的 performance
→ 結果不錯的話
在檢查 testing set 的結果
→ 結果不好 (overfitting)
→ 結果不錯 bingo !
螢幕快照 2017-07-04 下午4.57.43.png


Deep Learning 的方法要看的面向有兩個點:
  • trainning 結果不好
  • testing 結果不好
這兩個問題要分開討論


螢幕快照 2017-07-04 下午5.01.02.png
讀到一個方法時,要先知道他在解哪個症狀
training 結果不好 或是  testing 結果不好!
螢幕快照 2017-07-04 下午5.01.10.png
針對 trainning 結果不好 的討論
可能是架構設計上的問題


Vanishing Gradient Problem:
input 還是 random 的時候 output 的地方已經收斂了,得到的結果是很差的
為什麼會有這樣的現象發生呢?
因為使用 sigmoid function 有缺點:他會把資料壓縮在 0 ~  1 之間
就算  input 端的兩個數據差異很大,經過 sigmoid function 後,他們的差距大幅被降低,經過多層後,到達  output 端,他們的差距變得超級小
解決方案:改用新的activation function ,例如使用 ReLU


螢幕快照 2017-07-04 下午5.06.34.png
螢幕快照 2017-07-04 下午5.06.41.png


ReLU : Rectified(糾正) Linear Unit
螢幕快照 2017-04-13 下午1.54.40.png


簡介:input <= 0 的時候,就是 0 。 input > 0 的時候 input 就是 output !
螢幕快照 2017-04-13 下午1.56.05.png
問題:
當我們把 output 是 0 的部分拿掉,整個 network 看起來是一個瘦長的 linear function
雖然 ReLU 是個 Linear function,但是整個 Network 還是 non-linear 的:
當input端沒什麼大的改變時,每一個 neutron 的 operation 是一樣的時候,他是 linear 的,但是input 端出現比較大的改變,neutron 之間的 operation region出現很大的差異時,整體看起來就是 non-linear 的
螢幕快照 2017-07-04 下午5.12.20.png
問題2:
ReLU不可微分 怎麼辦?
簡單觀察,當 ReLU 結果 = 0 微分就是 0
當 ReLU 結果 > 0 微分就是 1


ReLU 的變形
想法:
設計成 input < 0 的時候,output 還是要有微小的值
螢幕快照 2017-04-14 上午10.53.38.png
上圖右邊的倍數 可以透過data學出來
更進階的變形:Maxout network
螢幕快照 2017-04-14 上午10.56.32.png
想法:
我們改用新的策略自動 “學” 出 activation function
例如 input 端 x1,x2分別乘上不同 weight 相加後產生若干組數據 group 起來,從每一組當中挑選最大的傳到下一層,依此類推...。在此,哪些 value 要被 group 起來是事先決定的!
當然,一組可以不止 2 個  element 依NN設計者的設計來訂定
Maxout Network 是有辦法做到像 ReLU 做的事情,可以模仿 ReLU activation function
螢幕快照 2017-04-14 上午11.14.26.png
例如上圖右,我們設計z1,z2
z1前面的 weight 跟 bias 分別為 w, b
z2前面的 weight 跟 bias 都為 0,所以 z2=0
則跟去取 Max 的條件下,當z1>z2就取 z1,當z1>z2就為 0
達到 ReLU 的效果
Maxout Network 也可以做出更多不同的 activation function
螢幕快照 2017-04-14 上午11.21.22.png
例如
z1前面的 weight 跟 bias 分別為 w, b
z2前面的 weight 跟 bias 不是 0,設計成 w ', b '


這個 activation function 可以根據不同的 w, b , w ', b ' 針對每一個 neutron 跟 data 去 Learn 出合適組合!


所以這個 activation function 是可以學習出來的!
螢幕快照 2017-07-04 下午6.12.12.png



接下來要面對的問題就是,這個東西怎麼  Train ?
螢幕快照 2017-04-14 上午11.24.54.png
因為是 maxout 都是選比較大的值,上圖紅色匡起來部分,所以沒被選到的先不看,得到下圖,呈現一個細長的 linear network
螢幕快照 2017-04-14 上午11.26.10.png
則我們 tain 到一個細長的 linear network 上的參數
問題:那沒被 train 到的那些怎麼辦呢?
這不是個問題,因為當我們 input 不同的 data 丟進去,經過 weight 跟 bias 運算得到 max 值,maxout 選出來組合的也會不同,network structure 不斷地變換,所以每一次都可能 train 到不同的組合






Adaptive Learning Rate


Adagrad
螢幕快照 2017-04-18 上午11.18.43.png


每一個 parameter 都有不同的 learning rate
把一個固定的 learning rate 除以[ 過去所有 gradiant 值的平方和開根號 ]
就可以得到新的 parameter


考慮兩個參數 w1 w2
w1 平常 gradiant 比較小,代表他比較平坦,所以給他比較大的 Learning rate
w2 平常 gradiant 比較大,代表他比較陡峭,所以給他比較小的 Learning rate


我們之前在做 linear regression 時看到的 optimazation 的 function (loss function) 是 convex 的形狀,
但是實際上在做 deep learning 時,Loss function 可以是任何形狀
就算在同一個方向上,我們的  learning rate 也必須要快速的變動
可能在一個區域很平緩,需要比較小的 Learning rate,但是到另一個區域就變得很陡峭,需要比較大的 Learning rate。
此時我們需要一個比 adagrad 更有彈性的方法 → RMSProp

螢幕快照 2017-04-18 上午11.29.15.png






RMSProp 是這樣做的


第一個時間點時,得到 g0
第二個時間點時,要把第一個時間點得到的 sigma () 做平方比例調配開根號
的值可以自己設定
螢幕快照 2017-04-18 上午11.32.59.png
跟 adagrad 最大的不同就在於可以手動調整
如果 條小一點 例如 0.1 代表我們比較相信新的 gradiant 值,比較少參考過去的  gradiant
另一個問題:
在做 Learing 時,有可能會卡在 local minimum  或是  saddle point
→ 可以用 Momentum 來解!


Momentum
概念:想像有一顆球從左上角上坡上滾下來
因為有慣性,就算走到 local minimum 的地方,也會衝上坡,然後可以到達下一個下坡!
所以我們要做的事情就是把 momentum 的特性塞到 gradient descent 裡面!
螢幕快照 2017-04-18 上午11.40.15.png


想法:讓原來走的方向對於參數有一定的影響力!


每次移動的方向為前一個時間點的 movement V0 + gradinet 的結果!


螢幕快照 2017-07-04 下午6.24.08.png螢幕快照 2017-04-20 上午12.16.44.png


螢幕快照 2017-04-20 上午12.18.45.png
在 local minimum 得地方,gradiant = 0 但是 momentum 是往右走,所以最後總和是往右走
所以加上 momentum 的機制有機會讓我們跳出 local minimum 找到 global minimum
Adam 就是 RMSProp + Momentum
螢幕快照 2017-04-20 上午12.20.49.png
剛才講的都是 traning data 上結果不好怎麼辦
接著我們來探討在 training data 夠好,但是在 testing data 上結果不好的話該怎麼辦
螢幕快照 2017-04-20 上午12.22.06.png
螢幕快照 2017-04-20 上午12.23.52.png


常常在 train 時,training set loss可以調得很低,但是低到某個時間點時,testing set 的  loss 就開始又上升了
Early Stopping 的機智就是,找出 testing set loss function的最低點 停在那邊!


我們這裡在討論的所謂 testing set 並不是實際的 testing set ,因為我們不會知道真正的 testing set 的變化,所以實作上這裡指的 testing set 是我們自己從切出來的 validation set
KEY: 從 training set 當中先切出一部分當成 validation set 來做 Early Stopping


另一個做法是 Regularization
重新定義了 loss function
螢幕快照 2017-04-20 上午12.28.42.png
加上一項 regularization,不考慮 bias,因為我們加上這個是為了讓我們的 function 更平滑
L2 的意思是 我們加上的 Regularization 項裡面,是取過去所有的 weight 平方和
所以也會有 L1,指的就是單純的取絕對值後相加
螢幕快照 2017-04-20 上午12.32.05.png
把上述的 loss function 微分得到 update  的式子
整理後發現,前面這一項 接近零,1 - 接近零的數值就變成接近1 的值;譬如說 0.99
每次在 update 參數就先乘個 0.99  左右的倍數,所以越到後面,我們的 weight 越來越接近 0
後面那一項是關鍵


如果我們使用 L1 Regularization 會得到這麼式子呢
取絕對值 → 大於零的微分 = 1
小於零的 → 微分結果就是 = -1
螢幕快照 2017-04-20 上午12.41.32.png sgn = sin function
如果 W 是正的,後面藍色那一項就是 +1
如果 W 是負的,後面藍色那一項就是 -1
不管 W 多大多小,對於 L1 來說,減掉/增加的值都是固定的!


使用 L1  training 得到的結果會比較  sparse


Comment & Discussion:
Regularization 做的事情,要達到的目的,其實就是讓我們的參數不要離 0 太遠
這件事情也可以透過 減少參數更新 (update) 的次數來達到
所以 Regularization 的重要性沒有很高


螢幕快照 2017-07-06 下午12.03.21.png
人腦面的神經元,發育時會長出很多連結,但是隨著歲數的增長,使用與學習的狀況,沒有用到的連結就會漸漸 decay 掉, regularization 就是在模擬這樣的情況!
Dropout
螢幕快照 2017-04-20 下午1.00.54.png
Training 時每次  update 參數之前,都會 sample 一次
所以沒有取到的神經元不看,得到一個比較瘦長的 network,再去 train 比較細長的 network
螢幕快照 2017-04-20 下午1.01.20.png
每一次 update 參數之前都要重新 sample 一次
所以每一次丟掉的神經元都不一樣,得到的神經網路的路線都不一樣!


每個神經元有 p% 的機率會被丟掉!
加上  dropout 的時候,training 上的 performance 會變差,因為neutron沒有全部用到,但是用 dropout 的目的就是想提升 testing 的 performance


螢幕快照 2017-04-20 下午1.02.42.png
Testing 要注意兩件事:
1. Testing 時不做  Dropout,所有 Neutron 都要使用!
2. 假設 Training Dropout rate 是 p% ,在 testing 時的所有 weight 乘以 (1-p)%
→ 假設 Dropout rate 是  50%, 在 training 的時候 learn 出來的 weight = 1,Testing 的時候,使用的 weight 是 50%


[NOTE]
在 Training 的時候做 Dropout 來訓練,但是在 Testing 的時候不做 dropout 用全部的神經元一起去 testing


Dropout 為什麼有用?
直觀的理解:


螢幕快照 2017-07-06 下午2.43.54.png
螢幕快照 2017-07-06 下午2.42.34.png
訓練時在腳上綁些重物練習,在實際比賽戰鬥時,拿下重物,就會變強
每一個 Neuron 就想像成一個學生,再一起做 Final Project 時,我們會 carry 擺爛的人
但是考試時,大家都會卯起來做,就會變得很強 @@|||
解釋:為什麼Dropout 時 training 跟  testing 用的 weight 不一樣
螢幕快照 2017-04-20 下午1.23.54.png
螢幕快照 2017-07-06 下午2.42.55.png
如果 dropout rate 50%
Training 的時候 期望會丟掉一半的 Neutron
Testing 的時候,他是沒有  dropout ,所以會全用
所以才要把所有在 Training 使用的 weight 全部乘以 0.5 這樣 Training 跟 testing 才會 match


Dropout 是一個終極的 ensemble 的方式
螢幕快照 2017-04-20 下午1.25.44.png
我們從 Training Set 裡面拿出很多 subset 出來 train 很多 model,分別得到很多 Network 個結果,雖說每一個  model variance 可能很大,但是把很多  Model 平均起來 bias 就很小
螢幕快照 2017-04-20 下午1.24.20.png
我們拿出很多個 minibatch 各產生一組 Network 來 Train
雖然說一個 Network Structure 只用一個 batch 來 train
但是一個 Weight 可能被很多不同的batch train 到!
螢幕快照 2017-04-20 下午3.14.15.png


Dropout 的機制下我們總共 Train 了 2M 這麼多組一大把的 Network


Testing 的時候,可以把 data 分別丟到每一個 Network 然後把結果取平均


但是實作上無法這麼做,因為 Network 太多了,運算量太大
螢幕快照 2017-04-20 下午3.19.05.png
所以在實作上,我們把完整的 Network 不做 Dropout 然後把 Weight 乘上 (1-p) %
神奇的是在於,這樣的結果跟我們 一個一個分別丟進 dropout network 後在算平均的結果是相近的!
為什麼這樣結果會相近呢?
舉個例子說明:
假設我們有個 Neutron 長這樣
螢幕快照 2017-07-06 下午3.03.49.png
根據 Dropout 的機制
兩個 input 有選跟不選的可能,共有四種,我們把算出來的結果平均起來
恰好跟不做 dropout 的情況下,直接把 weigth 乘上我們 dropout 機率 ½ 的結果是一樣的!


上式只有在 linear network 的情況下才成立!
如果 neutron 裡面的 function 是 sigmoid function 的話,就不相等
所以當我們的 function 接近 linear 的時候,Dropout 的效果最好!


結論 Dropout 用於使用  ReLU 或是 Maxout 這種 Linear 的 Network 上效果較好!

留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking