今天要介紹的是,假設你已經在訓練資料上得到很好的結果,但是在測試資料上卻得到不好的結果的3種解決方法。
假設你的Learning rate調得很好,隨著訓練增加,你的Loss就會越來越小,但是在訓練資料跟測試資料上的表現不會是一樣的,可能你的訓練資料的Loss是下降的,但你的測試資料上的Loss卻反而上升了。
所以我們應該要在測試資料上Loss最小的地方停下來,不要繼續訓練下去,而這邊的測試資料指的是有label的測試資料,也就可能是我們自己切出來的驗證資料,因為我們不會知道真正的測試資料長什麼樣子。
Regularization會將原本的Loss function再加上一個Regularization term,它可以是model裡面的每一個參數的平方和(L2 norm),而在我們做Regularization的時候是不會考慮bias的。
我們把新的Loss function做Gradient,再整理一下更新參數的式子就會得到下圖的公式,也就是說,每次在更新參數之前,就會先把參數乘上 ,所以你會讓你的參數越來越接近 0,而通常 會很小。而因為我們使用L2 Regularization,每次都會讓weight越來越小,所以我們就把這個方法稱為權重衰減(Weight Decay)。
剛剛是使用L2 Regularization,但你也可以使用L1 Regularization,也就是把剛剛每一個參數的平方和那一項換成每一個參數的絕對值的和,接著我們一樣把新的Loss function做Gradient,那大於 0 的值微分會是 +1,小於 0 的值為分會是 -1,於是我們寫乘 的sign function ,再整理一下更新參數的式子就會得到下圖的公式。
也就是說我們每次在更新參數的時候,我們就會去扣掉 ,而如果 是正的,就等於是扣掉一個正數,會讓你的參數變小,如果 是負的,就等於是加一個值,會讓你的參數變大。
所以我們再重新看一下L1跟L2的式子就會發現,當今天 很大的時候,L2的參數就會下降的很快,而L1不管 多大,它都是扣掉固定的值。也就是說,用L1訓練出來的結果就可能會有很大也會有很小的的值,但L2訓練出來的結果可能就會都是很小的值。
Dropout是在訓練的時候,每一次要更新參數之前,我們對每一個Neuron做sampling,而每一個Neuron都有 的機率會被丟掉。
接著再去訓練你sampling完的Network,要注意的是,每一次更新參數之前都要做一次sampling,而做Dropout會讓你的訓練結果變差,因為你會一直去拿掉你的Neuron,但是在測試的結果會變好。
在測試的時候要注意的是不要Dropout,還有就是假設你在訓練的時候,Dropout rate是 ,那在測試的時候所有weight都要乘上 。
而為什麼要這樣做,用比較直觀的解釋來說,Dropout在訓練的時候會丟掉一些Neuron,就可以想像是你在訓練的時候腳上綁重物,然後實際在戰鬥的時候,也就是測試的時候,沒有Dropout,就等於是把重物拿下來就會變得很強。
還有一個是為什麼測試的時候要乘上 。假設你的Dropout rate是50%,那我們就是期望有一半的Neuron會被拿掉,而在測試的時候沒有Dropout,也就是說我們訓練好的weight,那去測試的時候結果會幾乎是訓練結果的2倍,所以我們就需要把所有weight乘上0.5。
Ensemble就是我們有一組很大的訓練資料,每次只從裡面取樣一部分的資料,而我們之前提到如果你的資料很大,它往往是variance很大,但如果你有很多個很大的資料,最後平均起來的結果就會很好,所以它就是去利用這個特性,把原本的訓練資料取樣出很多個subset,然後訓練很多個model。
在測試的時候,就把測試資料丟進model裡的結果平均起來當作最後的結果,很適合用在模型很複雜的時候。
而Dropout是每次要更新參數就會做一次sampling去訓練一個Network,假設你有 個Neuron,你可能就會有 個Network,然後你每次都只用一個minibatch的資料去訓練一個Network,而這些不同Network之間的參數是共用的,也就是說一個weight是用很多個batch訓練的。
在測試的時候,按照剛剛Ensemble的方法,就是把全部的Network拿出來,然後把測試資料丟進去,最後把結果平均起來就得到最後的結果,但實際上並沒有辦法這麼做,因為Network太多。
所以Dropout是當你把一個完整的network不做Dropout,但是把所有的weight乘上 ,然後把測試資料丟進去得到最後的結果,實際上它的結果是會近似於Ensemble方法得到的結果。