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