Tips for Deep Learning-如果Testing data 的效果不好怎麼辦?

by wenwu
0 comment

Tips for Deep Learning-如果Testing data 的效果不好怎麼辦?

今日的課程來自於: https://youtu.be/5BJDJd-dzzg

上一篇提到:如果Testing data 的效果不好怎麼辦?
今天要討論的是當testing data的效果不好該如何調整?

方法有兩種:

  1. Early Stopping
  2. Regularization
  3. Dropout

Early Stopping

第一個方法很簡單,就是提前結束。通常當我們的learning rate 調的比較好,訓練下來 loss 會越來越低,但是有可能training data上的loss 逐漸變小十,在testing data上反而上升了

假設我們知道testing data的loss變化,我們就可以設定在loss最小的時候提前結束。


Regularization

regularization就是在原來的loss function上額外增加一個term,比如我們要minimize的loss function原先應該是square error或cross entropy,那在做Regularization的時候,就在後面加一個Regularization的term

L2 regularization

regularization term可以是參數的L2 norm(L2正規化),所謂的L2 norm,就是把model參數集θ裡的每一個參數都取平方然後求和,這件事被稱作L2 regularization,即

你會發現我們新加的regularization term λ/2‖θ‖₂ 有一個1/2,由於我們是要對loss function求微分的,而新加的regularization term是參數wi的平方和,對平方求微分會多出來一個係數2,我們的1/2就是用來和這個2相消的

L2 regularization具體工作流程如下:

如果把這個推導出來的式子和原式作比較,你會發現參數在每次update之前,都會乘上一個 (1-ηλ),而 η和λ通常會被設為一個很小的值,因此通常是一個接近於1的值,比如0.99;也就是說,regularization做的事情是,每次update參數wi之前,不分青紅皂白就先對原來的乘個0.99,這意味著,隨著update次數增加,參數會越來越接近於0

Q: 你可能會問,要是所有的參數都越來越靠近0,那最後豈不是通通變成0,得到的network還有什麼用?

A:其實不會出現最後所有參數變成0的情況,因為通過微分得到的η∂L/∂wi這一項是會和前面(1-ηλ)w^t_i 這一項取得平衡
使用L2 regularization 可以讓weight每次都變得小一點,這就叫做Weight Decay(權重衰退)

L1 regularization

除了L2 regularization中使用平方項作為new term之外,還可以使用L1 regularization,把平方項換成每一個參數的絕對值,即

Q: 你的第一個問題可能是,絕對值無法微分阿,該怎麼處裡?

A: 實際上絕對值就是一個V字形的函數,在V的左邊微分值是-1,在V的右邊微分值是1,只有在0的地方是不能微分的,那真的走到0的時候就胡亂給它一個值,比如0,就ok了

如果w是正的,那微分出來就是+1,如果w是負的,那微分出來就是-1,所以這邊寫了一個w的sign function,它的意思是說,如果w是正數的話,這個function output就是+1,w是負數的話,這個 function output就是-1

L1 regularization的工作流程如下:

這個式子告訴我們,每次update的時候,不管三七二十一都要減去一個ηλ sgn(w^t_i),如果w是正的,sgn是+1,就會變成減一個positive的值讓你的參數變大;如果w是負的,sgn是-1,就會變成加一個值,讓你的參數變小;總之就是讓它們的絕對值減小至接近於0

L1 v.s. L2

我們來比較一下L1 與L2 的update過程:

L1 和 L2 ,雖然他們同樣是讓參數的絕對值變小,但他們做的事情其實略有不同:

  • L1 使參數絕對值變小的方法是每次update減掉一個固定的值
  • L2 使參數絕對值變小的方法是每次update乘上一個小於1的固定值

因此,當參數w的絕對值比較小的時候,L2會讓w下降得更快,而L1每次update只讓w減去一個固定的值,train完以後可能還會有很多比較大的參數;當參數w的絕對值比較小的時候,L2的下降速度就會變得很慢,train出來的參數平均都是比較小的,而L1每次下降一個固定的value,train出來的參數是比較sparse的,這些參數有很多是接近0的值,也會有很大的值

在之前所講的CNN的task裡,用L1做出來的效果是比較合適的,是比較sparse的

Weight Decay

之前提到了Weight Decay,那實際上我們在大腦裡面也會做Weight Decay
下圖分別描述了,剛出生的時候,嬰兒的神經是比較稀疏的;6歲的時候,就會有很多很多的神經;但是到14歲的時候,神經間的連接又減少了,所以neural network也會跟我們人有一些很類似的事情,如果有一些weight你都沒有去update它,那它每次都會越來越小,最後就接近0然後不見了

這跟人腦的運作,是有異曲同工之妙


Dropout

最後一個方法就是dropout了

Dropout只適用於testing 效果不好的時候,因為Dropout要做的就是讓你在training data上的結果變差,但是testing set 的效果變好neuron都有p%的機率被丟掉,如果某個neuron被丟掉的話,跟他相連的weight也都要被丟掉

Dropout在training 上如何使用?

在training 的時侯,每次update參數之前,我們對每一個neuron(也包誇input layer的”neuron”)做sampling(抽樣),每個neuron都有p%的機率被丟掉,如果某個neuron被丟掉的話,跟他相連的weight也都要被丟掉

實際上就是每次update參數之前都通過抽樣只保留network中的一部份neuron來訓練

做完sampling之後,network structure 就會變得比較細長了,然後你再去train這細長的network

(每次update參數之前都要做一遍sampling,所以每次update參數的時候,拿來training 的network structure都是不一樣的;你可能會覺得這個方法跟之前的Maxout很像,但實際上,Maxout是每一筆data對應的network structure不同,而Dropout是每一次update的network structure都是不同的,每一次minibatch對映著一次update,而一個minibatch裡含有多筆data)

在dropout的時候training 的效果會變差,因為某些neuron在training 的時候莫名其妙消失,但是dropout會使testing 的結果變好,這就是我們的目的

Dropout在testing 上如何使用?

使用dropout做testing的時候需要注意兩件事情:

  1. testing 的時候不做dropout,所有的neuron都要被用到
  2. 假設在training 的時候,dropout rate 是p%,從training data中被learn出來的所有weight都要乘上(1-p)%才能被當作testing 的weight使用

為什麼training 和testing 使用的weight是不一樣的呢?

假設現在的dropout rate 是50% ,那在training 的時候,你總是期望每次update之前會丟掉一半的neuron,就像下圖左側所示,在這種情況下你learn好一組weight參數,然後去testing

但是testing 的時候是沒有dropout的,所以如果testing 使用的是和training 同一組weight,那左側得到的output z 和右側得到的ouput z’ ,他們的值會相差兩倍,即 z’ ≈ 2z, 這樣會導致testing 的結果與training 的結果並不match,最終的效果會變差

那這個時候,你就需要把右側testing 中所有的weight乘上0.5,然後做normalization,這樣 z 就會等於 z’ ,使得testing的結果和training 的結果是一致的

Dropout is a kind of ensemble

在文獻上有很多不同的觀點來解釋為什麼dropout會work,其中一種比較令人信服的解釋是:dropout是一種終極的ensemble的方法

ensemble精神的解釋
ensemble的方法在比賽的時候經常預覽得到,它的意思是說,我們有一個很大的training set,那你每次都只從這個training set裡面sample一部分的數據出來,像下圖一樣,取出了set1,set2,set3,set4

我們之前在講bias 和variance的trade off 的時候說過,打靶有兩種情況:

  1. 一種是因為bias大導致打不準(參數過少)
  2. 另一種是因為variance大而導致打不準(參數過多)

假設我們今天有一個很複雜的model,他往往是bias比較準,但是variance很大的情況,如果你有很多個笨重複雜的model,雖然它們的variance都很大,但是平均起來,往往就會很準

所以ensemble做的事情,就是利用這個特性,我們從原本的training data裡面sample出很多subset,然後train很多個model,每一個model的sturcture甚至都可以不一樣;在testing 的時候,丟了一筆testing data 進來,使他通過所有的model,得到一大推的結果,然後把這些結果平均起來當作最後的output(平均起來bias 就會很小)

如果你的model很複雜,這一招往往是很有用的,那著名的random forest(隨機森林)也是實踐這個精神的一個方法,也就是如果你用一個decision tree,它就會很弱,也很容易overfitting,而如果採用random forest,它就沒有那麼容易overfitting

為什麼dropout是一個終極的ensemble方法呢?

在training network的時候,每次拿一個minibatch出來就做一次update,而根據dropout的特性,每次update之前都要對所有的neuron進型sample,因此每一個minibatch所訓練的network都是不同的

假設我們有M個neuron,每個neuron都有可能drop或不drop,所以總共可能的network數量有2^M個;所以當你在做dropout的時候,相當於是在用很多個minibatch分別去訓練很多個network(一個minibatch一般設置為100筆data),由於update次數是有限的,所以做了幾次update,就相當於train
了幾個不同的network,最多可以訓練到 2^M 個network

每個network都只用一個minibatch的data來train,可能會讓人感到不安,才個batch才100筆data,怎麼train一個network呢?其實沒有關係,因為這些不同的network之間的參數是shared,也就是說,
雖然一個network只能用一個minibatch來train,但同一個weight可以在不同的network裡被不同的minibatch train,所以同一個weight實際上是被所有沒有丟掉它的network一起share的,它是拿所有這些network的minibatch合起來一起train的結果 ( 做dropout= 做一大把的network structure)

實際操作ensemble的做法

那按照ensemble這個方法的邏輯,在testing的時候,你把那train好的一大把network通通拿出來,然後把手上這一筆testing data丟到這把network裡面去,每個network都給你吐出一個結果來,然後你把
所有的結果平均起來 ,就是最後的output

但是在實際操作上,如下圖左側所示,這一把network實在太多了,你沒有辦法每一個network都丟一個input進去,再把它們的output平均起來,這樣運算量太大了

所以dropout最神奇的地方是,當你並沒有把這些network分開考慮,而是用一個完整的network,這個network的weight是用之前那一把network train出來的對應weight乘上(1-p%),然後再把手上這筆
testing data丟進這個完整的network,得到的output跟network分開考慮的ensemble的output,是驚人的相近

也就是說下圖左側ensemble的做法和右側dropout的做法,得到的結果是approximate(近似)的

舉例說明dropout和ensemble的關係

這裡用一個例子來解釋:

我們train一個下圖右上⻆所示的簡單的network,它只有一個neuron,activation function是linear的,並且不考慮bias,這個network經過dropout訓練以後得到的參數分別為w1、w2,那給它input x1、x2,得到的output就是 z=w1x1+w2x2

如果我們今天要做ensemble的話,theoretically就是像下圖這麼做,每一個neuron都有可能被drop或不drop,這裡只有兩個input的neuron,所以我們一共可以得到2²=4種network

我們⼿上這筆testing data 丟到這四個network中,分別得到4個output:w1x1+w2x2 、w1x1、w2x2、0,然後根據ensemble的精神,把這四個network的output通通都average起來,得到的結果是 1/2(w1x1+w2x2)

那根據dropout的想法,我們把從training中得到的參數w1、w2乘上(1–50%),作為testing network裡的參數,也就是 w1′ , w2′ = (1–50%)(w1,w2)=0.5w1 , 0.5 w2

這邊想要呈現的是,在這個最簡單的case裡面,用不同的network structure做ensemble這件事情,跟我們用一整個network,並且把weight乘上一個值而不做ensemble所得到的output,其實是一樣的

值得注意的是,只有是linear的network,才會得到上述的等價關係,如果network是非linear的,ensemble和dropout是不equivalent的;但是,dropout最後一個很神奇的地方是,雖然在non-linear的情況下,它是跟ensemble不相等的,但最後的結果還是會work

如果network很接近linear的話,dropout所得到的performance會比較好,而ReLU和Maxout的 network相對來說是比較接近於linear的,所以我們通常會把含有ReLU或Maxout的network與Dropout配合起來使用

Related Articles

發表迴響