李宏毅深度学习——Tips for Deep Learning
目錄
一、神經網絡的表現?
二、改進神經網絡
(一)梯度消失以及改進辦法
(二)Adaptive Learning Rate
(三)Local minimize問題
三、解決overfitting
(一)Early Stopping
(二)Regulation
(三)Dropout
一、神經網絡的表現?
建立deep learning的三個步驟
- define a set function
- goodness of function
- pick the best function
做完這些事之后我們可以得到一個neural network。在得到neural network之后,我們需要判斷神經網絡的表現。
首先我們需要檢查,這個神經網絡在我們的training set上有沒有好的結果(是否陷入局部最優),沒有的話,回頭看,是那個步驟出了什么問題,我們可以做一些修改來保證在training data上取得好的解。
- New Activation Function
- Adaptive Learning Rate
假如我們在training set上得到了一個好的結果,然后再把nerual network放在testing set,testing set上的performance才是我們關心的結果。如果在testing data上的performance不好,才是ovefitting。(注意:如果在training set上結果就不好,不能說是overfitting的問題)
- Early Stopping
- Regalarization
- Dropout
如果training set上的結果變現不好,那么就要去neural network在一些調整,如果在testing set表現的很好,就意味成功了。
在testing data上看到一個56-layer和20-layer,顯然20-layer的error較小,那么你就說是overfitting,那么這是錯誤的。首先你要檢查你在training data上的結果。
在training data上56-layer的performance本來就比20-layer變現的要差很多,在做neural network時,有很多的問題使你的train不好,比如local mininmize等等,56-layer可能卡在一個local minimize上,得到一個不好的結果,這樣看來,56-layer并不是overfitting,只是沒有train的好。
二、改進神經網絡
當我們在training data上的performance不好時,我們應該考慮是不是我們的nerual的架構不好,是不是我們選擇的激活函數不好。
例如:上圖中,在2006年以前,如果將網絡疊很多層,往往會得到下圖的結果。上圖,是手寫數字識別的訓練準確度的實驗,使用的是sigmoid function。可以發現當層數越多,訓練結果越差,特別是當網絡層數到達9、10層時,訓練集上準確度就下降很多。但是這個不是當層數多了以后就overfitting,因為這個是在training set上的結果。
在之前可能常用的activation function是sigmoid function,今天我們如果用sigmoid function,那么deeper usually does not imply better,這個不是overfitting
(一)梯度消失以及改進辦法
當網絡比較深的時候,會出現梯度消失問題,比較靠近input的幾層Gradient值十分小,靠近output的幾層Gradient會很大,當你設定相同的learning rate時,靠近input layer的參數updata會很慢,靠近output layer的參數updata會很快。當前幾層都還沒有更動參數的時候(還是隨機的時候),隨后幾層的參數就已經收斂了。
為什么靠近前幾層的參數會特別小呢?
怎么樣來算一個參數對total loss做偏微分,實際上就是對參數做一個小小的變化,對loss的影響,就可以說,這個參數gradient的值有多大。給第一個layer的某個參數加上△w時,對output與target之間的loss有什么樣的變化。現在我們的△w很大,通過sigmoid function時這個output會很小(一個large input,通過sigmoid function,得到small output),每通過一次sogmoid function就會衰減一次(因為sogmoid function會將值壓縮到0到1之間,將參數變化衰減),hidden layer很多的情況下,最后對loss的影響非常小(對input修改一個參數其實對output是影響是非常小)。理論上我們可以設計dynamic的learning rate來解決這個問題,確實這樣可以有機會解決這個問題,但是直接改activation function會更好,直接從根本上解決這個問題。
如何解決?
ReLU Activation Function作用于兩個不同的range,一個range是當activation input大于0時,input等于output,另外一個是當activation function小于0時,output等于0
那么對那些output等于0的neural來說,對我們的network一點的影響都沒。加入有個output等于0的話,你就可以把它從整個network拿掉。(下圖所示) 剩下的input等于output是linear時,你整個network就是a thinner linear network。
我們之前說,gradient descent遞減,是通過sigmoid function,sigmoid function會把較大的input變為小的output,如果是linear的話,input等于output,你就不會出現遞減的問題。
我們需要的不是linear network(就像我們之所以不使用邏輯回歸,就是因為邏輯回歸是線性的),所以我們才用deep learning ,就是不希望我們的function不是linear,我們需要它不是linear function,而是一個很復雜的function。對于ReLU activation function的神經網絡,只是在小范圍內是線性的,在總體上還是非線性的。
如果你只對input做小小的改變,不改變neural的activation range,它是一個linear function,但是你要對input做比較大的改變,改變neural的activation range,它就不是linear function。
改進1:leaky ReLU:ReLU在input小于0時,output為0,這時微分為0,你就沒有辦法updata你的參數,所有我們就希望在input小于0時,output有一點的值(input小于0時,output等于0.01乘以input),這被叫做leaky ReLU。
改進2:Parametric ReLU:在input小于0時,output等于zα為neural的一個參數,可以通過training data學習出來,甚至每個neural都可以有不同的α值。
改進3:Maxout:ReLU是一個特殊的Maxout,Maxout可以讓一個網絡去自動學習它的Activation Function
input是x1,x2,x1,x2乘以weight得到5,7,-1,1。這些值本來是通過ReLU或者sigmoid function等得到其他的一些value。現在在Maxout里面,在這些value group起來(哪些value被group起來是事先決定的,如上圖所示),在組里選出一個最大的值當做output(選出7和1,這是一個vector 而不是一個value),7和1再乘以不同的weight得到不同的value,然后group,再選出max value。
怎么分組是我們自己決定的。
對比ReLu和Maxout
- ReLu:input乘以w,b,再經過ReLU得a。
- Maxout:input中x和1乘以w和b得到z1,z2,x和1乘以w和b得到z2,z2(現在假設第二組的w和b等于0,那么z2,z2等于0),在兩個中選出max得到a(如上圖所示) 現在只要第一組的w和b等于第二組的w和b,那么Maxout做的事就是和ReLU是一樣的。
當然在Maxout選擇不同的w和b做的事也是不一樣的(如上圖所示),每一個Neural根據它不同的wight和bias,就可以有不同的activation function。這些參數都是Maxout network自己學習出來的,根據數據的不同Maxout network可以自己學習出不同的activation function。???????????????????????
?Maxout中的激活函數可以被分段為多個線性的凸函數,多少段取決于之前我們分組后一組元素的個數。
max operation用方框圈起來,當我們知道一組值中的哪一個比較大的時候,max operation其實在這邊就是一個linear operation,只不過是在選取前一個group的element。把group中不是max value拿掉。
沒有被training到的element,那么它連接的w就不會被training到了,在做BP時,只會training在圖上顏色深的實線,不會training不是max value的weight。這表面上看是一個問題,但實際上不是一個問題。
當你給到不同的input時(training data有很多),得到的z的值是不同的,max value是不一樣的,因為我們有很多training data,而neural structure不斷的變化,實際上每一個weight都會被training。?
(二)Adaptive Learning Rate
在前面我們在學習Regression的時候介紹過一個自適應的Learning Rate的方法Adagrad,但是這是不夠的,這里介紹了一個進階版本RMSProp。
同一方向上,考慮同一個參數w1,參數在綠色箭頭處,可能會需要learning rate小一些,參數在紅色箭頭處,可能會需要learning rate大一些。
一個固定的learning rate除以一個σ(在第一個時間點,σ就是第一個算出來GD的值),在第二個時間點,你算出來一個g1,σ1(你可以去手動調一個α值,把α值調整的小一點,說明你傾向于相信新的gradient)告訴你的這個error surface的平滑或者陡峭的程度。
(三)Local minimize問題
除了learning rate問題以外,我們在做deep learning的時候,有可能會卡在local minimize,也有可能會卡在saddle point,甚至會卡在plateau的地方。
其實在error surface上沒有太多的local minimize,所以不用太擔心。因為,你要是一個local minimize,你在一個dimension必須要是一個山谷的谷底,假設山谷的谷底出現的幾率是P,因為我們的neural有非常多的參數(假設有1000個參數,每一個參數的dimension出現山谷的谷底就是各個P相乘),你的Neural越大,參數越大,出現的幾率越低。所以local minimize在一個很大的neural其實沒有你想象的那么多。
使用現實世界的一個方法處理上述問題:在真實的世界中,在如圖所示的山坡中,把一個小球從左上角丟下,滾到plateau的地方,不會去停下來(因為有慣性),就到了山坡處,只要不是很陡,會因為慣性的作用去翻過這個山坡,就會走到比local minimize還要好的地方,所以我們要做的事情就是要把這個慣性加到GD里面(Mometum)。
我們每次移動的方向,不再只有考慮gradient,而是現在的gradient加上前一個時間點移動的方向。
?
加上Momentum之后,每一次移動的方向是negative gardient加上Momentum的方向(現在這個Momentum就是上一個時間點的Moveing)。現在假設我們的參數是在這個位置(左上角),gradient建議我們往右走,現在移動到第二個黑色小球的位置,gradient建議往紅色箭頭的方向走,而Monentum也是會建議我們往右走(綠的箭頭),所以真正的Movement是藍色的箭頭(兩個方向合起來)。現在走到local minimize的地方,gradient等于0(gradient告訴你就停在這個地方),而Momentum告訴你是往右邊的方向走,所以你的updata的參數會繼續向右。如果local minimize不深的話,可以借Momentum跳出這個local minimize。
Adam =(RMSProp + Momentum)
三、解決overfitting
(一)Early Stopping
隨著你的training,你的total loss會越來越小(learning rate沒有設置好,total loss變大也是有可能的),training data和testing data的distribute是不一樣的,在training data上loss逐漸減小,而在testing data上loss逐漸增大。理想上,假如你知道testing set上的loss變化,你應該停在不是training set最小的地方,而是testing set最小的地方(如圖所示),可能training到這個地方就停下來。但是你不知道你的testing set(有label的testing set)上的error是什么。所以我們會用validation集解決
會validation set模擬testing set,什么時候validation set最小,你的training會停下來
(二)Regulation
重新去定義要去minimize的那個loss function。在原來的loss function(minimize square error, cross entropy)的基礎上加一個regularization term(L2-Norm),在做regularization時是不會加bias這一項的,加regularization的目的是為了讓線更加的平滑(bias跟平滑這件事情是沒有任何關系的)。
在update參數的時候,其實是在update之前就已近把參數乘以一個小于1的值(ηλ都是很小的值),這樣每次都會讓weight小一點。最后會慢慢變小趨近于0,但是會與后一項梯度的值達到平衡,使得最后的值不等于0。L2的Regularization又叫做Weight Decay,就像人腦將沒有用的神經元去除。regularization term當然不只是平方,也可以用L1-Norm。
w是正的微分出來就是+1,w是負的微分出來就是-1,可以寫為sgn(w)。
每一次更新時參數時,我們一定要去減一個ηλsgn(wt)(w值是正的,就是減去一個值;若w是負的,就是加上一個值,讓參數變大)。
L2、L1都可以讓參數變小,但是有所不同的,若w是一個很大的值,L2乘以一個小于1的值,L2下降的很快,很快就會變得很小,在接近0時,下降的很慢,會保留一些接近0的值;L1的話,減去一個固定的值(比較小的值),所以下降的很慢。所以,通過L1-Norm training 出來的model,參數會有很大的值。
(三)Dropout
怎么訓練
在train的時候,每一次update參數之前,對network里面的每個neural(包括input),做sample(抽樣)。 每個neural會有p%會被丟掉,跟著的weight也會被丟掉。
為什么Dropout會有用
training的時候會丟掉一些neural,就好像使在練習輕功一樣在腳上綁上一些重物,然后實際上戰斗的時候把重物拿下來就是testing時(沒有進行dropout),那時候你就會變得很強。
另外一個很直覺的理由是:在一個團隊里面,總是會有人擺爛(擺爛,指事情已經無法向好的方向發展,于是就干脆不再采取措施加以控制而是任由其往壞的方向繼續發展下去),這是會dropout的。
假設你覺得你的隊友會擺爛,所以這個時候你就想要好好做,你想要去carry他。但實際上在testing的時候,大家都是有在好好做,沒有需要被carry,因為每個人做的很努力,所以結果會更好。
testing時為什么要乘以(1-p)%
假設dropout rate是50 percent,那在training的時候總是會丟掉一般的neural。假設在training時learning好一組weight(w1,w2,w3,w4),但是在testing時沒有dropout,對同一組weights來說:在training時得到z,在testing是得到z′。但是training和testing得到的值是會差兩倍的,所以在做testing時都乘以0.5,這樣得到的結果是比較match:z=z′。
其實dropout還是有很多的理由,這個問題還是可以探討的問題,你可以在文獻上找到很多不同的觀點來解釋dropout。我覺得我比較能接受的是:dropout是一個終極的ensemble方法。ensemble的意思是:我們有一個很大的training set,每次從training set里面只sample一部分的data。我們之前在講bias和variance時,打靶有兩種狀況:一種是bias很大,所以你打準了;一種是variance很大,所以你打準了。如果今天有一個很復雜的model,往往是bias準,但variance很大。若很復雜的model有很多,雖然variance很大,但最后平均下來結果就很準。所以ensemble做的事情就是利用這個特性。我們可以training很多的model(將原來的training data可以sample很多的set,每個model的structures不一樣)。雖然每個model可能variance很大,但是如果它們都是很復雜的model時,平均起來時bias就很小。
在training時train了很多的model,在testing時輸入data x進去通過所有的model(Network1, Network2, Network3, Network4),得到結果(y1?,y2?,y3?,y4?),再將這些結果做平均當做最后的結果。
第一個、第二個、第三個、第四個minibatch如圖所示,所以在進行dropout時,是一個終極ensemble的方式。假設有M個neurons,每個neuron可以dropout或者不dropout,所以可能neurons的數目為2^M,但是在做dropout時,你在train2^Mneurons。
每次只用one mini-batch去train一個neuron,總共有可能的neuron。最后可能update的次數是有限的,你可能沒有辦法把的neuron都train一遍,但是你可能已經train好多的neurons。每個neuron都用one mini-batch來train,每個neuron用一個batch來train可能會讓人覺得很不安(一個batch只有100筆data,怎么可能train整個neuron呢)。這是沒有關系的,因為這些不同neuron的參數是共享的。
在testing的時候,按照ensemble方法,把之前的network拿出來,然后把train data丟到network里面去,每一個network都會給你一個結果,這些結果的平均值就是最終的結果。但是實際上沒有辦法這樣做,因為network太多了。所以dropout最神奇的是:當你把一個完整的network不進行dropout,但是將它的weights乘以(1-p)percent,然后將train data輸入,得到的output y。神奇的是:之前做average的結果跟output y是approximated
解釋為什么是approximated
w1*2/4=(w1)/2???w2*2/4=(w2)/2,在線性模型中ensemble和weight乘以一個系數是equivalent。非線性模型不是equivalent的,但是結果依然是work的。
總結
以上是生活随笔為你收集整理的李宏毅深度学习——Tips for Deep Learning的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李宏毅深度学习——Backpropaga
- 下一篇: 李宏毅深度学习——Why Deep?