正則化與過擬合


1. 正則化的一些概念

   1)概念

  L0正則化的值是模型參數中非零參數的個數。

  L1正則化表示各個參數絕對值之和。

  L2正則化標識各個參數的平方的和的開方值。

   2)正則化後會導致參數稀疏,一個好處是可以簡化模型,避免過擬合。因爲一個模型中真正重要的參數可能並不多,如果考慮所有的參數起作用,那麼可以對訓練數據可以預測的很好,但是對測試數據就只能呵呵了。另一個好處是參數變少可以使整個模型獲得更好的可解釋性。

且參數越小,模型就會越簡單,這是因爲越複雜的模型,越是會嘗試對所有的樣本進行擬合,甚至包括一些異常樣本點,這就容易造成在較小的區間裏預測值產生較大的波動,這種較大的波動也反映了在這個區間裏的導數很大,而只有較大的參數值才能產生較大的導數。因此複雜的模型,其參數值會比較大。

   3)三種正則概述

    l  L0正則化

      根據上面的討論,稀疏的參數可以防止過擬合,因此用L0範數(非零參數的個數)來做正則化項是可以防止過擬合的。

      從直觀上看,利用非零參數的個數,可以很好的來選擇特徵,實現特徵稀疏的效果,具體操作時選擇參數非零的特徵即可。但因爲L0正則化很難求解,是個NP難問題,因此一般採用L1正則化。L1正則化是L0正則化的最優凸近似,比L0容易求解,並且也可以實現稀疏的效果。

   l  L1正則化

      L1正則化在實際中往往替代L0正則化,來防止過擬合。在江湖中也人稱Lasso

      L1正則化之所以可以防止過擬合,是因爲L1範數就是各個參數的絕對值相加得到的,我們前面討論了,參數值大小和模型複雜度是成正比的。因此複雜的模型,其L1範數就大,最終導致損失函數就大,說明這個模型就不夠好。

   l  L2正則化

      L2正則化可以防止過擬合的原因和L1正則化一樣,只是形式不太一樣。

      L2範數是各參數的平方和再求平方根,我們讓L2範數的正則項最小,可以使W的每個元素都很小,都接近於0。但與L1範數不一樣的是,它不會是每個元素爲0,而只是接近於0。越小的參數說明模型越簡單,越簡單的模型越不容易產生過擬合現象。

      L2正則化江湖人稱Ridge,也稱“嶺迴歸”

2.L2L1正則化

   l  L2 regularization(權重衰減)

      L2正則化就是在代價函數後面再加上一個正則化項:

                 

     C0代表原始的代價函數,後面那一項就是L2正則化項,它是這樣來的:所有參數w的平方的和,除以訓練集的樣本大小nλ就是正則項係數,權衡正則項與C0項的比重。另外還有一個係數1/2,1/2經常會看到,主要是爲了後面求導的結果方便,後面那一項求導會產生一個2,與1/2相乘剛好湊整。

    L2正則化項是怎麼避免overfitting的呢?我們推導一下看看,先求導:

               

   可以發現L2正則化項對b的更新沒有影響,但是對於w的更新有影響:

                 

    在不使用L2正則化時,求導結果中w前係數爲1,現在w前面係數爲 1−ηλ/n ,因爲ηλn都是正的,所以 1−ηλ/n小於1,它的效果是減小w,這也就是權重衰減(weight decay)的由來。當然考慮到後面的導數項,w最終的值可能增大也可能減小。

   另外,需要提一下,對於基於mini-batch的隨機梯度下降,wb更新的公式跟上面給出的有點不同:

    

    對比上面w的更新公式,可以發現後面那一項變了,變成所有導數加和,乘以η再除以mm是一個mini-batch中樣本的個數。

    到目前爲止,我們只是解釋了L2正則化項有讓w“變小”的效果,但是還沒解釋爲什麼w“變小”可以防止overfitting?一個所謂“顯而易見”的解釋就是:更小的權值w,從某種意義上說,表示網絡的複雜度更低,對數據的擬合剛剛好(這個法則也叫做奧卡姆剃刀),而在實際應用中,也驗證了這一點,L2正則化的效果往往好於未經正則化的效果。當然,對於很多人(包括我)來說,這個解釋似乎不那麼顯而易見,所以這裏添加一個稍微數學一點的解釋(引自知乎):

    過擬合的時候,擬合函數的係數往往非常大,爲什麼?如下圖所示,過擬合,就是擬合函數需要顧忌每一個點,最終形成的擬合函數波動很大。在某些很小的區間裏,函數值的變化很劇烈。這就意味着函數在某些小區間裏的導數值(絕對值)非常大,由於自變量值可大可小,所以只有係數足夠大,才能保證導數值很大。


   而正則化是通過約束參數的範數使其不要太大,所以可以在一定程度上減少過擬合情況。

   l  L1 regularizationL1正則化)

    在原始的代價函數後面加上一個L1正則化項,即所有權重w的絕對值的和,乘以λ/n(這裏不像L2正則化項那樣,需要再乘以1/2,具體原因上面已經說過。)

               

    同樣先計算導數:

             

   上式中sgn(w)表示w的符號。那麼權重w的更新規則爲:

             

   比原始的更新規則多出了η * λ * sgn(w)/n這一項。當w爲正時,更新後的w變小。當w爲負時,更新後的w變大——因此它的效果就是讓w往0靠,使網絡中的權重儘可能爲0,也就相當於減小了網絡複雜度,防止過擬合。

   另外,上面沒有提到一個問題,當w爲0時怎麼辦?當w等於0時,|W|是不可導的,所以我們只能按照原始的未經正則化的方法去更新w,這就相當於去掉η*λ*sgn(w)/n這一項,所以我們可以規定sgn(0)=0,這樣就把w=0的情況也統一進來了。(在編程的時候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)

   l  DropOut

    L1、L2正則化是通過修改代價函數來實現的,而Dropout則是通過修改神經網絡本身來實現的,它是在訓練網絡時用的一種技巧(trike)。它的流程如下:


  

   假設我們要訓練上圖這個網絡,在訓練開始時,我們隨機地“刪除”一半的隱層單元,視它們爲不存在,得到如下的網絡:


   保持輸入輸出層不變,按照BP算法更新上圖神經網絡中的權值(虛線連接的單元不更新,因爲它們被“臨時刪除”了)。

   以上就是一次迭代的過程,在第二次迭代中,也用同樣的方法,只不過這次刪除的那一半隱層單元,跟上一次刪除掉的肯定是不一樣的,因爲我們每一次迭代都是“隨機”地去刪掉一半。第三次、第四次……都是這樣,直至訓練結束。

   以上就是Dropout,它爲什麼有助於防止過擬合呢?可以簡單地這樣解釋,運用了dropout的訓練過程,相當於訓練了很多個只有半數隱層單元的神經網絡(後面簡稱爲“半數網絡”),每一個這樣的半數網絡,都可以給出一個分類結果,這些結果有的是正確的,有的是錯誤的。隨着訓練的進行,大部分半數網絡都可以給出正確的分類結果,那麼少數的錯誤分類結果就不會對最終結果造成大的影響。

二、過擬合

   爲了防止overfitting,可以用的方法有很多,下文就將以此展開。有一個概念需要先說明,在機器學習算法中,我們常常將原始數據集分爲三部分:training datavalidation datatesting data。這個validation data是什麼?它其實就是用來避免過擬合的,在訓練過程中,我們通常用它來確定一些超參數(比如根據validation data上的accuracy來確定early stoppingepoch大小、根據validation data確定learning rate等等)。那爲啥不直接在testing data上做這些呢?因爲如果在testing data做這些,那麼隨着訓練的進行,我們的網絡實際上就是在一點一點地overfitting我們的testing data,導致最後得到的testing accuracy沒有任何參考意義。因此,training data的作用是計算梯度更新權重,validation data如上所述,testing data則給出一個accuracy以判斷網絡的好壞。

    避免過擬合的方法有很多:early stopping、數據集擴增(Data augmentation)、正則化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout

   1.過擬合問題

    還是來看預測房價的這個例子,我們先對該數據做線性迴歸,也就是左邊第一張圖。

    如果這麼做,我們可以獲得擬合數據的這樣一條直線,但是,實際上這並不是一個很好的模型。我們看看這些數據,很明顯,隨着房子面積增大,住房價格的變化趨於穩定或 者說越往右越平緩。因此線性迴歸並沒有很好擬合訓練數據。

    我們把此類情況稱爲欠擬合(underfitting),或者叫作叫做高偏差(bias)。

    這兩種說法大致相似,都表示沒有很好地擬合訓練數據。高偏差這個詞是machine learning 的研究初期傳下來的一個專業名詞,具體到這個問題,意思就是說如果用線性迴歸這個算法去擬合訓練數據,那麼該算法實際上會產生一個非常大的偏差或者說存在一個很強的偏見。

    第二幅圖,我們在中間加入一個二次項,也就是說對於這幅數據我們用二次函數去擬合。自然,可以擬合出一條曲線,事實也證明這個擬合效果很好。

    另一個極端情況是,如果在第三幅圖中對於該數據集用一個四次多項式來擬合。因此在這裏我們有五個參數θ0θ4,這樣我們同樣可以擬合一條曲線,通過我們的五個訓練樣本,我們可以得到如右圖的一條曲線。

    一方面,我們似乎對訓練數據做了一個很好的擬合,因爲這條曲線通過了所有的訓練實例。但是,這實際上是一條很扭曲的曲線,它不停上下波動。因此,事實上我們並不認爲它是一個預測房價的好模型。

    所以,我們把這類情況叫做過擬合(overfitting),也叫高方差(variance)。

    與高偏差一樣,高方差同樣也是一個歷史上的叫法。從第一印象上來說,如果我們擬合一個高階多項式,那麼這個函數能很好的擬合訓練集(能擬合幾乎所有的訓練數據),但這也就面臨函數可能太過龐大的問題,變量太多。   

    同時如果我們沒有足夠的數據集(訓練集)去約束這個變量過多的模型,那麼就會發生過擬合。

2過度擬合的問題通常發生在變量(特徵)過多的時候。這種情況下訓練出的方程總是能很好的擬合訓練數據,也就是說,我們的代價函數可能非常接近於 0 或者就爲 0

   但是,這樣的曲線千方百計的去擬合訓練數據,這樣會導致它無法泛化到新的數據樣本中,以至於無法預測新樣本價格。在這裏,術語"泛化"指的是一個假設模型能夠應用到新樣本的能力。新樣本數據是指沒有出現在訓練集中的數據。


   之前,我們看到了線性迴歸情況下的過擬合。類似的情況也適用於邏輯迴歸。

3那麼,如果發生了過擬合問題,我們應該如何處理?

    過多的變量(特徵),同時只有非常少的訓練數據,會導致出現過度擬合的問題。因此爲了解決過度擬合,有以下兩個辦法。


方法一:儘量減少選取變量的數量

    具體而言,我們可以人工檢查每一項變量,並以此來確定哪些變量更爲重要,然後,保留那些更爲重要的特徵變量。至於,哪些變量應該捨棄,我們以後在討論,這會涉及到模型選擇算法,這種算法是可以自動選擇採用哪些特徵變量,自動捨棄不需要的變量。這類做法非常有效,但是其缺點是當你捨棄一部分特徵變量時,你也捨棄了問題中的一些信息。例如,也許所有的特徵變量對於預測房價都是有用的,我們實際上並不想捨棄一些信息或者說捨棄這些特徵變量。

方法二:正則化

    正則化中我們將保留所有的特徵變量,但是會減小特徵變量的數量級(參數數值的大小θ(j))。

    這個方法非常有效,當我們有很多特徵變量時,其中每一個變量都能對預測產生一點影響。正如我們在房價預測的例子中看到的那樣,我們可以有很多特徵變量,其中每一個變量都是有用的,因此我們不希望把它們刪掉,這就導致了正則化概念的發生。

    接下來我們會討論怎樣應用正則化和什麼叫做正則化均值,然後將開始討論怎樣使用正則化來使學習算法正常工作,並避免過擬合。

4.損失函數(Cost Function


    在前面的介紹中,我們看到了如果用一個二次函數來擬合這些數據,那麼它給了我們一個對數據很好的擬合。然而,如果我們用一個更高次的多項式去擬合,最終我們可能會得到一個曲線,它能很好地擬合訓練集,但卻並不是一個好的結果,因爲它過度擬合了數據,因此,一般性並不是很好。

讓我們考慮下面的假設,我們想要加上懲罰項,從而使參數θ3θ4 足夠的小。

    這裏我的意思就是,上圖的式子是我們的優化目標,也就是說我們需要儘量減少代價函數的均方誤差。

對於這個函數我們對它添加一些項,加上 1000 乘以 θ3 的平方,再加上 1000乘以 θ4 的平方,

    1000 只是我隨便寫的某個較大的數字而已。現在,如果我們要最小化這個函數,那麼爲了最小化這個新的代價函數,我們要讓θ3  和θ4儘可能小。因爲,如果你在原有代價函數的基礎上加上 1000 乘以θ3  這一項 ,那麼這個新的代價函數將變得很大,所以,當我們最小化這個新的代價函數時,我們將使θ3  的值接近於 0,同樣θ4的值也接近於 0,就像我們忽略了這兩個值一樣。如果我們做到這一點(θ3  和θ4  接近 0 ),那麼我們將得到一個近似的二次函數。

    因此,我們最終恰當地擬合了數據,我們所使用的正是二次函數加上一些非常小,貢獻很小項(因爲這些項的θ3θ4  非常接近於0)。顯然,這是一個更好的假設。

    更一般地,這裏給出了正規化背後的思路。這種思路就是,如果我們的參數值對應一個較小值的話(參數值比較小),那麼往往我們會得到一個形式更簡單的假設。

    面的例子中,我們懲罰的只是θ3θ4,使這兩個值均接近於零,從而我們得到了一個更簡單的假設,實際上這個假設大抵上是一個二次函數。

 

    但更一般地說,如果我們像懲罰θ3θ4 這樣懲罰其它參數,那麼我們往往可以得到一個相對較爲簡單的假設。

    實際上,這些參數的值越小,通常對應于越光滑的函數,也就是更加簡單的函數。因此 就不易發生過擬合的問題。

    我知道,爲什麼越小的參數對應於一個相對較爲簡單的假設,對你來說現在不一定完全理解,但是在上面的例子中使θ3θ4 很小,並且這樣做能給我們一個更加簡單的假設,這個例子至少給了我們一些直觀感受。

    來讓我們看看具體的例子,對於房屋價格預測我們可能有上百種特徵,與剛剛所講的多項式例子不同,我們並不知道θ3θ4 是高階多項式的項。所以,如果我們有一百個特徵,我們並不知道如何選擇關聯度更好的參數,如何縮小參數的數目等等。

    因此在正則化裏,我們要做的事情,就是把減小我們的代價函數(例子中是線性迴歸的代價函數)所有的參數值,因爲我們並不知道是哪一個或哪幾個要去縮小。

    因此,我們需要修改代價函數,在這後面添加一項,就像我們在方括號裏的這項。當我們添加一個額外的正則化項的時候,我們收縮了每個參數。

    順便說一下,按照慣例,我們沒有去懲罰 θ0,因此θ0 的值是大的。這就是一個約定從 1 到 n 的求和,而不是從 0 到 n 的求和。但其實在實踐中

    這隻會有非常小的差異,無論你是否包括這θ0 這項。但是按照慣例,通常情況下我們還是隻從 θ1θn 進行正則化。

   下面的這項就是一個正則化項

    並且 λ 在這裏我們稱做正則化參數。λ 要做的就是控制在兩個不同的目標中的平衡關係。第一個目標就是我們想要訓練,使假設更好地擬合訓練數據。我們希望假設能夠很好的適應訓練集。而第二個目標是我們想要保持參數值較小。(通過正則化項)

    而 λ 這個正則化參數需要控制的是這兩者之間的平衡,即平衡擬合訓練的目標和保持參數值較小的目標。從而來保持假設的形式相對簡單,來避免過度的擬合。

對於我們的房屋價格預測來說,我們之前所用的非常高的高階多項式來擬合,我們將會得到一個非常彎曲和複雜的曲線函數,現在我們只需要使用正則化目標的方法,那麼你就可以得到一個更加合適的曲線,但這個曲線不是一個真正的二次函數,而是更加的流暢和簡單的一個曲線。這樣就得到了對於這個數據更好的假設。

    再一次說明下,這部分內容的確有些難以明白,爲什麼加上參數的影響可以具有這種效果?但如果你親自實現了正規化,你將能夠看到這種影響的最直觀的感受。

    在正則化線性迴歸中,如果正則化參數值 λ 被設定爲非常大,那麼將會發生什麼呢?

    我們將會非常大地懲罰參數θ1,θ2,θ3,θ4 … 也就是說,我們最終懲罰θ1,θ2,θ3,θ4… 在一個非常大的程度,那麼我們會使所有這些參數接近於零。

    如果我們這麼做,那麼就是我們的假設中相當於去掉了這些項,並且使我們只是留下了一個簡單的假設,這個假設只能表明房屋價格等於θ0 的值,那就是類似於擬合了一條水平直線,對於數據來說這就是一個欠擬合 (underfitting)。這種情況下這一假設它是條失敗的直線,對於訓練集來說這只是一條平滑直線,它沒有任何趨勢,它不會去趨向大部分訓練樣本的任何值。

    這句話的另​​一種方式來表達就是這種假設有過於強烈的"偏見" 或者過高的偏差 (bais),認爲預測的價格只是等於θ0 。對於數據來說這只是一條水平線。

    因此,爲了使正則化運作良好,我們應當注意一些方面,應該去選擇一個不錯的正則化參數λ 。當我們以後講到多重選擇時我們將討論一種方法來自動選擇正則化參數 λ  ,爲了使用正則化,接下來我們將把這些概念應用到到線性迴歸和邏輯迴歸中去,那麼我們就可以讓他們避免過度擬合了。

 

    最後回答爲什麼正則化能夠避免過擬合:因爲正則化就是控制模型空間的一種辦法。

 

 

    過擬合是一種現象。當我們提高在訓練數據上的表現時,在測試數據上反而下降,這就被稱爲過擬合,或過配。過擬合發生的本質原因,是由於監督學習問題的不適定:在高中數學我們知道,從n個(線性無關)方程可以解n個變量,解n+1個變量就會解不出。在監督學習中,往往數據(對應了方程)遠遠少於模型空間(對應了變量)。因此過擬合現象的發生,可以分解成以下三點:

    l  有限的訓練數據不能完全反映出一個模型的好壞,然而我們卻不得不在這有限的數據上挑選模型,因此我們完全有可能挑選到在訓練數據上表現很好而在測試數據上表現很差的模型,因爲我們完全無法知道模型在測試數據上的表現。

    l  如果模型空間很大,也就是有很多很多模型可以給我們挑選,那麼挑到對的模型的機會就會很小。

    l  與此同時,如果我們要在訓練數據上表現良好,最爲直接的方法就是要在足夠大的模型空間中挑選模型,否則如果模型空間很小,就不存在能夠擬合數據很好的模型。

由上3點可見,要擬合訓練數據,就要足夠大的模型空間;用了足夠大的模型空間,挑選到測試性能好的模型的概率就會下降。因此,就會出現訓練數據擬合越好,測試性能越差的過擬合現象。過擬合現象有多種解釋:

    l  經典的是bias-variance decomposition,但個人認爲這種解釋更加傾向於直觀理解;

    l  PAC-learning泛化界解釋,這種解釋是最透徹,最fundamental

    l  Bayes先驗解釋,這種解釋把正則變成先驗,在我看來等於沒解釋。

   另外值得一提的是,不少人會用“模型複雜度”替代上面我講的“模型空間”。這其實是一回事,但“模型複雜度”往往容易給人一個誤解,認爲是一個模型本身長得複雜。例如5次多項式就要比2次多項式複雜,這是錯的。因此我更願意用“模型空間”,強調“複雜度”是候選模型的“數量”,而不是模型本事的“長相”。


參考資料:

http://www.cnblogs.com/jianxinzhou/p/4083921.html

http://www.cnblogs.com/ooon/p/4964441.html


發佈了110 篇原創文章 · 獲贊 65 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章