李弘毅機器學習筆記:第十二章—Recipe of Deep Learning

在這裏插入圖片描述
當你的模型表現不好,應該怎麼處理?

如上圖建立deep learning的三個步驟

• define a set function

• goodness of function

• pick the best function

做完這些事情後,你會得到一個neural network。在得到neural network後。

神經網絡的表現

(1)首先你要檢查的是,這個neural network在你的training set有沒有得到好的結果(是否陷入局部最優),沒有的話,回頭看,是哪個步驟出了什麼問題,你可以做什麼樣的修改,在training set得到好的結果。

(2)假如說你在training set得到了一個好的結果了,然後再把neural network放在你的testing data,testing set的performance纔是我們關心的結果。

如果在testing data performance不好,纔是overfitting(注:training set上結果就不好,不能說是overfitting的問題)。

小結:如果training set上的結果變現不好,那麼就要去neural network在一些調整,如果在testing set表現的很好,就意味成功了。

(tips:很多人容易忽視查看在training set上結果,是因爲在機器學習中例如是用SVM等模型,很容易使得training set得到一個很好的結果,但是在深度學習中並不是這樣的。所以一定要記得查看training set 上的結果。不要看到所有不好的performance都是overfitting。)

在這裏插入圖片描述

例如:在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的好。
在這裏插入圖片描述
在deep learning文件上,當你看到一個方式的時候,你首先要想一下說,它是要解什麼樣的問題,是解決在deep learning 中一個training data的performance不好,還是解決testing data performance不好。

當一個方法要被approaches時,往往都是針對這兩個其中一個做處理,比如,你可能會聽到這個方法(dropout),dropout是在training data表現好,testing data上表現不好的時候纔會去使用,當training data 結果就不好的時候用dropout 往往會越訓練越差。

如何改進神經網絡?

新的激活函數

在這裏插入圖片描述
現在你的training data performance不好的時候,是不是你在做neural的架構時設計的不好,舉例來說,你可能用的activation function不夠好。
在這裏插入圖片描述
在2006年以前,如果將網絡疊很多層,往往會得到上圖的結果。上圖,是手寫數字識別的訓練準確度的實驗,使用的是sigmoid function。可以發現當層數越多,訓練結果越差,特別是當網絡層數到達9、10層時,訓練集上準確度就下降很多。但是這個不是當層數多了以後就overfitting,因爲這個是在training set上的結果。

(在之前可能常用的activation function是sigmoid function,今天我們如果用sigmoid function,那麼deeper usually does not imply better,這個不是overfitting)

梯度消失

在這裏插入圖片描述
當網絡比較深的時候會出現vanishing Gradient problem

比較靠近input 的幾層Gradient值十分小,靠近output的幾層Gradient會很大,當你設定相同的learning rate時,靠近input layer 的參數updata會很慢,靠近output layer的參數updata會很快。當前幾層都還沒有更動參數的時候(還是隨機的時候),隨後幾層的參數就已經收斂了。

在這裏插入圖片描述
爲什麼靠近前幾層的參數會特別小呢?

怎麼樣來算一個參數w對 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會更好,直接從根本上解決這個問題。

怎麼樣去解決梯度消失?

在這裏插入圖片描述
修改activation function,ReLU input 大於0時,input 等於 output,input小於0時,output等於0

選擇這樣的activation function有以下的好處:

• 比sigmoid function比較起來是比較快的

• 生物上的原因

• 無窮多的sigmoid function疊加在一起的結果(不同的bias)

• 可以處理 vanishing gradient problem
在這裏插入圖片描述

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。

在這裏插入圖片描述
我們之前說,GD遞減,是通過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、改進1 leaky ReLU
ReLU在input小於0時,output爲0,這時微分爲0,你就沒有辦法updata你的參數,所有我們就希望在input小於0時,output有一點的值(input小於0時,output等於0.01乘以input),這被叫做leaky ReLU。

2、改進2 Parametric ReLU

Parametric ReLU在input小於0時,output等於αzαzαα\alpha zαz\alphaα爲neural的一個參數,可以通過training data學習出來,甚至每個neural都可以有不同的αα\alphaα值。

那麼除了ReLU就沒有別的activation function了嗎,所以我們用Maxout來根據training data自動生成activation function。

3、改進3Exponential linear Unit (ELU)
在這裏插入圖片描述
讓network自動去學它的activation function,因爲activation function是自動學出來的,所有ReLU就是一種特殊的Maxout case。

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。

在這裏插入圖片描述
Maxout network 是怎麼樣產生不同的activation function,Maxout有辦法做到跟ReLU一樣的事情。

對比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 network中有兩個pieces,如果Maxout network中有三個pieces,Maxout network會學習到不同的activation function如下圖。

在這裏插入圖片描述
面對另外一個問題,怎麼樣去training,因爲max函數無法微分。但是其實只要可以算出參數的變化,對loss的影響就可以用梯度下降來train網絡。

在這裏插入圖片描述
max operation用方框圈起來,當你知道在一組值裏面哪一個比較大的時候,max operation其實在這邊就是一個linear operation,只不過是在選取前一個group的element。把group中不是max value拿掉。

在這裏插入圖片描述 沒有被training到的element,那麼它連接的w就不會被training到了,在做BP時,只會training在圖上顏色深的實線,不會training不是max value的weight。這表面上看是一個問題,但實際上不是一個問題。

當你給到不同的input時,得到的z的值是不同的,max value是不一樣的,因爲我們有很多training data,而neural structure不斷的變化,實際上每一個weight都會被training。

Adaptive Learning Rate

在這裏插入圖片描述
每一個parameter 都要有不同的learning rate,這個 Adagrd learning rate 就是用固定的learnin rate除以這個參數過去所有GD值的平方和開根號,得到新的parameter。

我們在做deep learnning時,這個loss function可以是任何形狀。
在這裏插入圖片描述
考慮同一個參數假設爲w1,參數在綠色箭頭處,可能會需要learning rate小一些,參數在紅色箭頭處,可能會需要learning rate大一些。

你的error surface是這個形狀的時候,learning rate是要能夠快速的變動.

在deep learning 的問題上,Adagrad可能是不夠的,這時就需要RMSProp(該方法是Hinton在上課的時候提出來的,找不到對應文獻出處)。
在這裏插入圖片描述
一個固定的learning rate除以一個σ\sigmaσ(在第一個時間點,σ\sigmaσ就是第一個算出來GD的值),在第二個時間點,你算出來一個g1g1σ1g^1g1,\sigma^1σ1(你可以去手動調一個α\alphaα值,把α\alphaα值調整的小一點,說明你傾向於相信新的gradient 告訴你的這個error surface的平滑或者陡峭的程度。
在這裏插入圖片描述
除了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)。
現在複習下一般的GD
在這裏插入圖片描述
選擇一個初始的值,計算它的gradient,G負梯度方向乘以learning rate,得到θ1,然後繼續前面的操作,一直到gradinet等於0時或者趨近於0時。

當我們加上Momentu時
在這裏插入圖片描述
我們每次移動的方向,不再只有考慮gradient,而是現在的gradient加上前一個時間點移動的方向

(1)步驟

選擇一個初始值\theta……0θ……0然後用v0v0去記錄在前一個時間點移動的方向(因爲是初始值,所以第一次的前一個時間點是0)接下來去計算在\theta0θ0上的gradient,移動的方向爲v1v1。在第二個時間點,計算gradient\theta1θ1,gradient告訴我們要走紅色虛線的方向(梯度的反方向),由於慣性是綠色的方向(這個\lambdaλ和learning rare一樣是要調節的參數,``λ\lambda`會告訴你慣性的影響是多大),現在走了一個合成的方向。以此類推…

(2)運作
在這裏插入圖片描述
加上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
在這裏插入圖片描述

如果你在training data已經得到了很好的結果了,但是你在testing data上得不到很好的結果,那麼接下來會有三個方法幫助解決。

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 會停下來。

Regularization

類似與大腦的神經,剛剛從嬰兒到6歲時,神經連接變多,但是到14歲一些沒有用的連接消失,神經連接變少。

重新去定義要去minimize的那個loss function。
在這裏插入圖片描述
在原來的loss function(minimize square error, cross entropy)的基礎上加一個regularization term(L2-Norm),在做regularization時是不會加bias這一項的,加regularization的目的是爲了讓線更加的平滑(bias跟平滑這件事情是沒有任何關係的)。

在這裏插入圖片描述
在update參數的時候,其實是在update之前就已近把參數乘以一個小於1的值(ηληλ(\eta \lambdaηλ都是很小的值),這樣每次都會讓weight小一點。最後會慢慢變小趨近於0,但是會與後一項梯度的值達到平衡,使得最後的值不等於0。L2的Regularization 又叫做Weight Decay,就像人腦將沒有用的神經元去除。

regularization term當然不只是平方,也可以用L1-Norm
在這裏插入圖片描述
w是正的微分出來就是+1,w是負的微分出來就是-1,可以寫爲sgn(w)。

每一次更新時參數時,我們一定要去減一個\eta \lambda sgn(w^t)ηλsgn(wt)值(w是正的,就是減去一個值;若w是負的,就是加上一個值,讓參數變大)。

L2、L1都可以讓參數變小,但是有所不同的,若w是一個很大的值,L2下降的很快,很快就會變得很小,在接近0時,下降的很慢,會保留一些接近01的值;L1的話,減去一個固定的值(比較小的值),所以下降的很慢。所以,通過L1-Norm training 出來的model,參數會有很大的值。

Dropout

在traning的時候,每一次update參數之前,對network裏面的每個neural(包括input),做sampling。 每個neural會有p%會被丟掉,跟着的weight也會被丟掉。

在這裏插入圖片描述
做出這個sample,network structure就等於變瘦了(thinner),然後,你在去training這個細長的network(每一次updata之前都要去做一次) 。所以每次update參數時,你拿來training network structure是不一樣的。

在這裏插入圖片描述
你在training 時,performance會變的有一點差(某些neural不見了),加上dropout,你會看到在testing set會變得有點差,但是dropout真正做的事就是讓你testing 越做越好
在這裏插入圖片描述
在testing上注意兩件事情,第一件事情就是在testing上不做dropout。另外一個是在dropout時,假設dropout rate在training 是p%, all weight都要乘以(1-p%)(假設dropout rate是p%,若在training上算出w=1,那麼在testing 時,把w設爲0.5)

爲什麼Dropout會有用。

在這裏插入圖片描述
爲什麼在訓練的時候要dropout,但是測試的時候不dropout。

training的時候,會丟掉一些neural,假如你在練習輕功的時候,你在腳上綁了一些重物(training),實際上在戰鬥把重物拿下來(testing),那麼你就會變得很強。

在這裏插入圖片描述
每個neural就是一個學生,在一個團隊中,總是會有被dropout。你的partner會做的差的,你就想着我要好好做。

爲什麼在testing時,dropout要乘以0.5(1p%) 。

在這裏插入圖片描述
假設dropout rate是50%,training的時候,你總是會期望丟掉一半的neural。假設選定一組weight(w1,w2,w3,w4)。testing時是沒有dropout的,所以對同一組的weihgt來說testing的時候和training時候的z有一個很明顯的差距,他的期望約等於training的兩倍。現在怎麼辦,把所有的weight都乘以0.5,現在變爲將差距變回來。

在這裏插入圖片描述
ensemble方法 我們有一個很大的training set,每次從training set裏只sample一部分的data,然後training 很多的model(每個model可能structure不一樣),每個model可能variance很大,但是他們都是很複雜的model的話,平均起來,bias就會很小。

在這裏插入圖片描述
Dropout的類似於ensemble的終極版本,ensemble時,放入training data,通過不同network,得到一些結果在把這些結果平均起來,當做你最後的結果。

在這裏插入圖片描述
當你做dropout是其實就是training了很多的network structure,就類似於剛剛的ensemble中將數據放進不同的模型中。但是會不會存在minibatch對結果的影響呢?其實時不會的,因爲在網絡中參數時共用的,所以在訓練參數的時候是一大堆參數合起來去訓練網絡。

在這裏插入圖片描述
在testing的時候,按照ensemble方法,把之前的network拿出來,然後把你的100筆data丟到network裏面去,每一個network都會給你一個結果,這些結果的平均值就是最終的結果。但是實際上這些network太多了,沒辦法去給索引network丟一個input。

所以,dropout最神奇的地方是,它告訴你,當一個完整的network不做dropout,而是把它的weight乘以(1-p%),把你的training data丟進去,得到的output就是average的值。
在這裏插入圖片描述
在這個最簡單的case裏面,ensemble這件事情跟我們把weight乘以1/2得到一樣的結果。但是這個結果只有是linear network纔會有這樣的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章