神經網絡的提升方法(2)——正則化

過擬合
過擬合是一個普遍存在的問題,尤其是在神經網絡領域,神經網絡模型動輒都有上萬個參數,現代的深度網絡參數則更是上百萬的參數,所以深度網絡更容易出現過擬合現象。
過擬合現象主要體現在accuracy rate和cost兩方面:
1.模型在測試集上的準確率趨於飽和而訓練集上的cost仍處於下降趨勢
2.訓練集數據的cost趨於下降但測試集數據的cost卻趨於飽和或上升
我們經常用test data來測試模型的質量和測試過擬合現象,但是其實也可以把數據集分成訓練集(training data),測試數據(test data)以及驗證數據(validation data)並且使用驗證數據來代勞。跟測試數據的做法一樣,我們使用驗證數據對訓練過程進行監督,只要驗證數據準確率達到飽和了,訓練就停止,這種方法叫做early stopping。
那麼爲什麼要用驗證數據而不是測試數據呢?這個問題似乎沒辦法解答。其實這是一個很普遍的做法,因爲驗證數據經常被用於模型選取超參數,而測試數據通常被用於測試訓練了權值並且設定好超參數的模型。原文作者的說法是因爲,如果測試數據測試了模型效果,並且又基於這個數據集去調整超參數,這樣很容易會使得模型去特別測試數據從而降低泛化能力。因此,通常我們都使用驗證數據集去測試超參數的影響而使用測試數據集去評判最終模型的結果,這種方法又稱爲hold out,因爲驗證數據集可以被視爲從訓練數據hold out出去的一部分專門用於調參的數據。

正則化
過擬合現象很普遍,根本原因還是數據量不足以支撐複雜度高的模型,因此最直接的解決過擬合問題的辦法是增加訓練數據量。但要獲得帶標籤的數據成本是很高的。另一種直接的辦法是降低模型複雜度,這看起來可行,但是複雜度高的模型往往有很大的潛力去解決更復雜的問題,或者比簡單的模型有更好的效果,這一點,resNet似乎已經證明過了。所以,增加數據量和降低模型複雜度都不是很好的辦法。
如果我們能在固定訓練集大小和固定模型複雜度的情況下解決過擬合問題,那就真是太好了,幸運的是我們已經找到了這種辦法,它就是正則化。首先要介紹的就是最常用的L2正則化或者叫權值衰減(weights decay),就是在原本的損失函數基礎上加上一個懲罰項。

C0可以是任意的普通損失函數,w是模型裏面的所有權值,而 λ是正則化參數,它必須大於0(當然也可以認爲等於0就是純粹經驗風險損失的情況)。
正則化損失函數(通常也叫結構化損失)綜合考慮了模型效果和模型複雜度,這兩者的權衡由正則化參數λ來衡量,即如果λ很小,那麼結構化損失更傾向考慮模型效果,相反,則更傾向於懲罰複雜的模型。結構化損失函數的目的是要使模型裏面的權值變小從而達到避免過擬合現象發生。
那麼,帶有懲罰項的損失函數怎麼訓練呢?要解決這個問題,我們先要知道結構化損失函數關於權值和偏置值的偏導數∂C/∂w和∂C/∂b。

這個求導不難理解,∂C/∂w相當於在原來的基礎上加上了個λ/n*w,而∂C/∂b則沒有任何變化。那麼,權值和偏置值的更新規則就分別是


這個更新規則跟非正則化的情況沒啥特別——偏置值的更新是一樣的,因爲它的偏導數沒有變化;而權值則是相當於乘上了一個1−ηλ/n,這也是爲什麼說正則化情況下權值會變小。
更新規則我們知道了,但是SGD中怎麼處理呢?
考慮我們是通過一個大小爲m的mini-batch,跟非正則化的情況一樣,我們會對m個訓練集的偏導數求平均,再乘上η作爲Δw:

我們已經知道,正則化是減輕過擬合現象的一個好方法,但這並不是它唯一的好處。如果我們使用非正則損失函數,模型表現可能會卡在一個局部極小值裏,並且我們可能會從不同的初始化權值獲得截然不同的結果,但如果使用L2正則化,這樣訓練出來的結果往往有魯棒性。
正則化對減輕過擬合現象的原因可能很不明顯,但如果要簡要的去說明,那麼我們只能說:由於正則項的存在,使得模型的權值趨於衰減,由於權值普遍的衰減,甚至有部分的權值接近於0,這樣就相當於模型的複雜度得到降低。
那麼問題又來了,爲什麼模型複雜度低就會減輕過擬合現象呢?
舉個很簡單的例子,我們用一些如下圖很簡單數據去擬合一個模型。我們可以選擇用一個簡單的線性迴歸模型或一個9次多項式模型。我們雖然很難從擬合出來的結果去說明哪個模型更好——直觀上,因爲9次多項式幾乎完美的擬合了所有數據點,但線性迴歸方程也有很不錯的表現,不能完美擬合可能只是隨機變動的噪音造成的。但是,9次多項式迴歸過於充分得考慮每個數據點的情況了,甚至乎它已經把局部噪音的特徵都學習到了,以致它很難推廣到別的數據集中。相對之下,簡單得多的線性迴歸模型不僅已經很不錯的擬合了數據集,還可以有對其他數據有很好的泛化能力。

讓我們回到神經網絡,如果我們用L2正則化去壓縮權值,很小的權值就意味着輸入數據的改變並不會對網絡輸出有很大的影響,這樣的網絡也很難會受局部噪音的影響,相反,較大的權值則會對很小的輸入變化有較敏感的改變。因此,非正則化網絡會通過較大的權值去學習更復雜的模型(相對較小權值模型來說)從而考慮了訓練數據中的噪音成分,而正則化網絡因其更小的權值,避免訓練數據中噪音的影響,專注於數據現象的學習從而有更好的推廣能力。
人們通常把傾向於簡單模型的準則成爲“奧卡姆剪刀”,但這在科學研究中並不成文,因爲我們沒有很好的邏輯去解釋簡單比複雜要好,而有時,複雜真的會比簡單要好。·這一點,作者用了好幾個故事去說明,這裏就不介紹了。
既然我們也沒辦法知道到底模型是複雜好還是簡單的好,那麼正則化爲什麼通過降低模型複雜度就能獲得更好的泛化能力呢?這點看起來是沒有很好的道理,但很多學者正在致力於探究這個問題背後的原因。而我們其實只需要把它作爲一種經驗就好了,因爲通常正則化的神經網絡都會比非正則化的有更好的表現。
我們把權值的平方和用作爲懲罰項,爲什麼不用偏置值呢?這是因爲從經驗上來說,偏置值的大小對模型表現沒有很顯著的影響,換句話說,即便把偏置值加入到懲罰項裏面做正則化,最後模型的泛化能力也不會得到很明顯的提升。所以,即便網絡中採用了很大的偏置值,我們也不必擔心網絡會去學習到訓練數據中的噪音。
除了L2正則化之外,其實還要很多種正則化方法,但接下來,我們只會專注於其中三種除L2以外的正則化方法:L1正則化、DropOut和人工增加訓練數據大小。
L1正則化是一種與L2正則化很相似的方法,在正則化損失函數中唯一區別在於懲罰項是網絡所有權值的絕對值之和而不是平方和。

直觀上,它的目的跟L2正則化也是一致的:懲罰過大的權值,把網絡權值儘量往小的修改。但是L2和L1畢竟是兩種不同的正則化,它們的表現也是會有所不同的。
首先,L1正則化C對w的偏導數爲:

注:abs(w)的導數爲sign(w),即上式的sgn(w)——當w爲正時,偏導數爲1,w爲負時則爲-1
通過這個表達式,我們可以得到在梯度下降算法中權值更新規則:

對比一下L2正則化中的更新規則:

就很明顯可以看出,兩者還是有較爲明顯的區別,但直觀上,兩者共同點是都在壓縮着權值。
然而,兩者對權值的壓縮是不一樣的:L2正則化只是對權值以一定的比例打折,而L1正則化卻是使權值通過減去一個常數去朝着0削減。而當|w|很大時,L2對權值減少的幅度要遠大於L1,相反,當|w|很小時,L1對權值的衰減又遠大於L2。通過L1正則化,網絡最終的結果會變爲只保留對模型結果很重要的權值,而其他不重要的權值變爲0。
另外有一點值得注意,由於函數|w|在w=0的時候是一個尖角,因此∂C/∂w在此時不可導,所以,在SGD訓練過程中,w一旦被縮減到0就不能繼續縮減了。更精確一點說,當|w|在w=0時,其導數sign(w)=0,因此權值不會被更新。
Dropout相對於L1,L2而言,則是一種更爲暴力的正則化方法。L1,L2根本方式都是在損失函數上增加一個懲罰項,使得模型在訓練的過程中對高模型複雜度也進行懲罰,但Dropout是不通過損失而直接對網絡本身進行修改。下面我們來用網絡結構圖說明Dropout的工作方式。
假設我們要訓練一個這樣的網絡:

在訓練的開始,我們隨機的並臨時的以某一個概率讓部分神經元激活值直接設置爲0:

我們就這樣利用輸入數據前向通過這個被修改的網絡,再反饋誤差信號,結果只有被保留下來的權值和偏置值會被更新。在每個mini-batch,我們都重設要dropout的神經元,並再用數據通過網絡估計出梯度,再修改響應的權值、偏置值。
通過一個一個mini-batch的執行這樣的網絡訓練,我們最後會得到一些基於dropout訓練出來的權值和偏置值,而我們在使用全連接網絡的時候,假如dropout概率爲0.5,實質上我們激活了相當於兩倍數量的神經元。由於訓練過程中我們只需要用大約一半的神經元就能得到期望輸出接近的結果,如果使用兩倍神經元的話則輸出值會大大偏離了我們的期望輸出,因此需要對權值進行減半。當然這裏只舉了dropout概率爲0.5的情況,其他概率的情況也大致如此。
Dropout看起來很奇怪,當然一開始接受也很難理解其中的道理。首先我們把dropout放在一邊,假設我們用同一批數據去訓練五個不同的網絡,因爲初始化的隨機性,所以五個網絡從開始到結束都會有所不同,最後我們會通過多數表決或者對輸出的各個類的概率取平均的方法得到最終的結果。因爲不同網絡可能會有不同的過擬合問題,但把它們綜合到一起考慮,這種問題可能會被弱化甚至消除。
那Dropout跟這個有什麼關係呢?事實上,當我們每個mini-batch隨機的丟棄一些神經元,我們就相當於在訓練不一樣的網絡,dropout方法就相當於我們綜合考慮大量網絡的情況,所以我們可以通過dropout來減少過擬合的影響。
Dropout是一種很成功的神經網絡提升技術,尤其是在龐大的、深度的神經網絡訓練任務中——因爲過擬合問題特別嚴重。這種技術也被實證過是有效提升網絡效果的,並且被廣泛用於不用的場合以及不同的任務中。
最後,我們討論一下人工擴展訓練數據
其實我們都應該清楚,所謂的“模型複雜度高”都是相對於訓練集而言的,其本身並沒有一個標準。假如用只有150條樣本的iris數據集作爲模型訓練,那麼使用一個只有200個權值的網絡也會過擬合,而這個網絡假如能被應用到擁有5萬條記錄的MNIST數據集的話,則很大可能是過於簡單了。
其實並不難想象,對於一個固定的網絡而言,更大量的訓練數據通常會獲得更好的結果——因爲更大量的訓練數據意味着考慮到更多的信息。就以MNIST爲例,數字可以有無數種手寫體寫法,我們僅以其中的1萬種作爲訓練很可能考慮不到更多的情況,尤其是對於有特殊寫作癖好的人。但隨着訓練數據的增多也就意味着網絡考慮了更多種手寫字體的寫法,網絡的泛化能力也就更強。
所以增加訓練數據是最直接的解決過擬合問題的方法。但不幸的是,增加真實的帶標籤的訓練數據是需要很高成本的,因此很少在實踐中直接去尋找更多的訓練數據。我們雖然很難獲得更多很好的訓練數據,但我們可以通過人工的方法去擴展數據量。
例如我們在MNIST數據集中有一個“5”:

然後我們通過對其旋轉15°,它依然是那個“5”:

即便如此,兩張圖在像素點灰度值的分佈上確實有很大的區別,這樣就變成了一張新的圖片。利用這種方法,我們可以對訓練集上所有的樣本都作不同角度的選擇,這樣就可以獲得大量的訓練數據,從而提高模型分類準確率。增加訓練樣本可以通過很多其他辦法,並不單只是角度的旋轉,還可以通過扭曲或者添加隨機噪音等方法,不管怎樣,通常增加訓練樣本量都是一個不錯的方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章