ML Lecture 9-1- Tips for Training DNN 學習筆記

ML Lecture 9-1- Tips for Training DNN

這一次的課程介紹許多讓類神經網路表現更好的手法

  • 改變激發函數
  • 改變參數更新的演算法
  • early stopping
  • 正則化
  • dropout

SVM、決策樹這種超參數比較少的模型跟NN有些不同,訓練NN時會先評估training set上的結果,再檢視testing set上的表現,因為參數那麼多訓練很難一次到位。如果training結果好,但是testing反而不好,就是overfitting了。

Do Not Always Blame Overfitting

影片中提到一個例子:在testing set上,56層比20層的表現還要差,這樣就是overfitting嗎?後來發現在training set上,56層的表現就已經比20層還要差了。

NN有太多因素可以影響訓練結果,不同的方法需要對症下藥,如果只有testing表現不好,用Dropout或許可以改善,但是如果已經在training不盡人意,用dropout只會越用越糟而已。

Training Set表現不好的解決方案

新的激發函數

用sigmoid作為激發函數的話,靠近input的節點梯度比較小,參數更新得很慢;靠近output的節點梯度比較大,更新得比較快,這個直覺意涵可由神經網路的反向傳播去思考。

直觀來說,在sigmoid中,很大的input之變化,可能讓output的變化只有一點點,可以說變化是會衰減的,經過越多層,這個衰減越多,但ReLU是不錯的解決方法。

ReLU的好處有:

  • 計算快
  • 論文指出跟生物學上的觀察類似
  • 無窮多不同bias的sigmoid疊加起來近似於ReLu
  • 解決梯度消失問題

通過ReLU後,如果大於0就是原本的值,反之為0,所以如果把0的節點拿掉,很像是一個瘦長的線性模型。

這樣就不會有梯度消失的問題了,因為大的輸入值,仍有大的輸出值,不會只被壓縮到0到1之間。這時問題來了,這樣不就是線性模型嗎?我們用NN不就是要解決非線性問題嗎?

影片與底下留言說:「operation region是指被activate的那些neuron(就是沒被刪掉的neuron),不同的input可能就有不同的neuron被activate,就會有不同的operation region,故整體還是nonlinear。」

我的理解是,各個節點隨著input的不同,就可能有不一樣的節點不小於0,就好像不同的閘門被「開啟」。換句話說,不一樣的input會產生不一樣的神經網路。

再來是ReLU函數如果等於0不可微怎麼辦?實作上不太可能input為0,所以就讓它去吧,如果真的input為0再塞一些接近0的數即可。

ReLU也發展其他變形:

img

還有maxout這個激發函數,自己先決定要幾個數為一個group,然後每個group取最大值進入下一個節點。

img

厲害的是,maxout這個激發函數,是有辦法模仿出ReLU的。

img

左邊是ReLU,右邊是maxout某個特定情況,左右是等價的,亦即maxout是可以創造(或學習)ReLU的效果,不得不說李老師的教學真的很直觀。

不僅如此,maxout可以創造出很多不同形狀的激發函數,因為它的形狀是根據「權重」得來的,所以實質上這是learnable activation function(太酷了)!

假如3個element一個group,更可以是一個凹的激發函數。

img

但是max不可微,我們該怎麼訓練?

img

跟ReLU情況有點類似,給定某一個樣本,紅框是max值,它的NN結構就像這樣:

img

這樣來看又是一個瘦長線性網路,去做backpropagation,只訓練連接到脫穎而出的element的權重。

但是其他的權重怎麼辦?就像剛剛的思考一樣,不同樣本會有不同的NN結構,也會開啟到不同的「大門」,這樣大致來說每個權重都可以被訓練到的。

Adaptive Learning Rate

之前課程有提到Adagrad梯度下降法:

img

梯度下降過程中,會對以前得到的梯度做平方和。

直觀意義是如果第t次以前的梯度都比較小,這樣就會得到比較大的learning rate,以免梯度下降過於緩慢,反之,如果以前的梯度都比較大,他就會讓learning rate收斂得比較小,以免跳得過快。

這個方法另外一個意義是用第一導數去估計第二導數。

在這一個圖片中,某些方向比較平坦的話就是一直平坦下去,但是如果error surface是彎月型的,同一個方向會有些區域很陡峭,有些區域又很平坦,那該怎麼自適應呢?於是有了RMSProp。

img

這個想法很精妙,沒有paper,只有出現在Hinton大神的線上課程。直觀上是以前的梯度都會透過遞迴過程影響現在,但是越到後面,以往梯度的影響力會逐漸變弱,$\alpha$則可以調整是否要給現在的梯度更大的權重。腦袋一拍,這跟EMA(指數平滑平均)的精神真的很像——現在的值會比較重要,故給予比較大的權重。

接下來的課題是,大家都很怕訓練過程中卡在local minima出不去,或是碰到Plateau、鞍點這些導數幾乎為0的地方。但是2007年有位學者(待補充)提出一個特別的想法:「其實Error Surface沒有太多local minima,因為你要每一個維度都剛好卡在local minima才有問題,Network的參數可以到上千個,每一個參數都剛好碰上local minima,這機會真的不大。」

不過我們可以從真實世界的啟發來得到一些解決local minima的方法——momentum(慣性)。

img

如果有動能的話,碰到plateau會依循動能繼續下降下去,甚至碰到山谷的時候還是能依照慣性一躍而上。

img

這個概念可以從幾何意義來分析,藍色是我們決定要走的方向,紅色虛線是原本gradient向量決定出的方向,綠色虛線是 ${\theta}_{1}$ 走的向量(慣性),兩個相加起來之後決定出${\theta}_{2}$,並依此規則下去。

以下放上比較科普的版本。

img

那RMSprop加上momentum,就是Adam。

img

Testing(or Validation) Set 表現不好的解決方案

Early Stopping

我們知道testing set和training set的分配不一定一樣,如果訓練集train得過多,可能導致過擬合的問題,那如果我們停在一個最佳點(testing的error正要上升時),不是皆大歡喜嗎?

img

但我們不會知道testing set,所以會在已有的training set切出一組資料不加入訓練,而是作為驗證(validation)。

Regularization

正則項是在損失函數中加入L1或是L2範數,L1範數用絕對值衡量,L2範數用平方和衡量,通常不考慮bias項。正則項可以讓模型更加平滑,也可以減少overfitting。

img

img

把梯度運用結合律一下,每一次更新參數都會先直接把權重乘上一個小於1的數,讓權重更往0靠近,但事實上不會每一個數都接近0,因為會跟$\eta \frac{\partial L}{\partial w}$這一項取得平衡

但是影片中李老師提到,正則項在NN的重要性沒有比在SVM中來得高(幫助沒有那麼顯著)。

可能的原因是從early stopping中,可以知道什麼時候參數更新該停下來,且NN的初始參數都是從很小的值開始,梯度下降是讓參數離0越來越遠。換個角度來看,正則項的目的是「讓參數不要離0太遠」,這跟「不要更新那麼多次參數」是有相同作用的。

但是SVM不一樣,它沒有early stopping這回事,因為它是一次到位,解出最好的結果,所以需要正則化加入模型控制複雜度。

再來我們可以有L1正則化:

img

絕對值怎麼微分呢?權重是負的就是-1,反之。再來把梯度分析一下,有L1的梯度每更新一次參數就會先減掉一個固定的值。

假設L1正則化後,每次更新就會不分青紅皂白先把權重減1,L2則是假設乘上0.9。

某個權重為1000,含L2項的梯度,更新一次後會變成900,相當於減去100,含L2項的梯度只會變成999。不過!如果權重是1,做一次含L2項的梯度下降,就會變成0.9,做一次含L1的梯度下降則會直接變成0。

由此可知,L2正則可以讓參數更「平均、平滑」一點,但是L1有能力直接把比較小的權重變成0,但是比較大的權重還是比較大,讓整個模型更sparse(稀疏)。

Dropout

在尾聲介紹的是dropout,這個想法實在也是很精妙,以下先講解如何運作,再來理解其背後的意義。

img

在training的時候,每個mini-batch,會從完整網路隨機捨去p%的neuron,所以整體來看結構變得比較瘦長的,並用這個NN結構來更新參數,到下一個mini-batch的時候,完整的網路又進行另一次隨機捨去,再進行一次參數更新,這樣來看,每一次更新參數的時候NN結構都是不太一樣的。

使用dropout的話在training set的效果是會變差的,因為計算誤差的時候有些neuron是不見的,但是dropout可以使testing set的結果變好,所以training的效果已經不好的話,做dropout反而是沒有用的,這也代表問題不是overfitting。

img

訓練好的模型運用在testing (or validation) set時,有幾點要注意:

  • 用完整沒dropout網路
  • 如果每次更新參數都dropout p%,每個權重要乘上(1-p)%

img

為什麼要rescale?假設今天我們用w1、w2、w3、w4這一組權重,input是(5,4,8,7),先簡單給定正確答案是10。某次訓練只用w1、w3,學到了$0+0.4\times5+1\times 8=10$,再來用w2、w4學到$-1+1\times4+1\times7=10$,但是如果w1、w2、w3、w4全部結合在一起的話,就會變成20啊,所以還要把每個權重都乘回0.5。

就好像每次訓練模型的時候都少一些組員,所以要多出一點力才能達到正確的力道,但是實際用模型的時候是沒有dropout的,可以想成大家都回來一起幫忙出力,所以每個人要少出一點力,不然力道會太過猛烈。

就其背後意義,dropout的精神就像ensemble,但又不完全是。ensemble是各別獨立的模型再合在一起投票。dropout則是每次都拿不一樣的結構和樣本(mini-batch)訓練模型,最後融合在一起,也可以說是一種ensemble的終極形式。

img

如果是普通的ensemble,可能是把訓練集分成10份,再用這10份去train不同結構的NN,最後將輸出平均。

但實際上這樣的方法可能會有樣本太少的問題,這在dropout應該是不用擔心的,因為這次mini batch可能更新了w1,在下次mini-batch時,w1很幸運的沒有被捨棄掉,被更新的w1還是被保留著。(換句話說,一個權重有機會被很多mini-batch訓練到)

img

在ensemble中,會把testing set或validation set丟入一大把不同結構的模型,再把結果平均起來,但是這樣做實在太耗效能了(如右圖)。神奇的是,把dropout訓練後的節點與參數全部拼回原本完整的nn,並把每個參數乘上(1-p)%,這跟ensemble的平均法,是不可思議地接近等效。

img

在一個簡單線性的NN作為範例,把左邊四個網路平均起來(ensemble),會跟右邊(dropout後結合)是一樣的,但是這只有在linear的時候才會等價,如果是sigmoid,就不會太相等了。

所以有些文獻也發現在Maxout或ReLU這些比較接近線性的NN,使用dropout提升的效果會比gigmoid還要好。

如果我的文章有幫到你的話,歡迎用街口支付給我一些鼓勵