1. 程式人生 > >深度學習 --- 優化入門六(正則化、引數範數懲罰L0、L1、L2、Dropout)

深度學習 --- 優化入門六(正則化、引數範數懲罰L0、L1、L2、Dropout)

      前面幾節分別從不同的角度對梯度的優化進行梳理,本節將進行正則化的梳理,所謂正則化,簡單來說就是懲罰函式,在機器學習中的SVM中引入拉格朗日乘子法即引入懲罰項解決了約束問題,在稀疏自編碼器中我們引入了懲罰因子去自動調整隱層的神經元的個數,以此達到壓縮率和失真度的平衡,其實這些都是使用正則思想進行實現的,因此掌握正則化很重要,本節就係統的講解正則化和資料擴充以及降其實有些知識在前面的學習中都穿插了,這裡在單獨拿出來的原因就是整理成系統性的知識,以後遇到相似問題能夠想到,因此多總結多思考就會進步很快,廢話不多說,下面開始:

引數範數懲罰

機器學習中常使用的正則化措施是去限制模型的能力,最常用的方法就是L0,L1和L2範數懲罰。下面就詳細的講解這三個範數懲罰

L0範數懲罰:

       假設我們要擬合一群二次函式分佈的資料,但並不知道其真實的分佈規律(知道也就不用學習了)。學習的本質其實就是不停地嘗試,先從一次函式進行嘗試,然後是五次函式,九次函式,三次函式,二次數等,然後選出其中效果最好的一個,那便是最
佳模型。以上方法有些令人失望,但未嘗不是一個好方法。當然,為了顯得“高階”些,我們需要將上面的內容粉飾一下。我們知道九次多項式包含了前八次多項式,那麼為了節省力氣,我們想要八次多項式時,只需要將九次項係數設定為0就可以了。有了這種想法,多項式函式的模型選擇,其實就變成了高次多項式係數的限制。從高次多項式數一直到二次多項式函式的嘗試

,其實就是在限制引數的個數,如下式所示的九次多項式。  

                                     \ large f(x)= 0x ^ 9 + 0x ^ 8 + .... + 0x ^ 3 + w_8x ^ 2 + w_9x ^ 1 + w_ {10} x ^ 0

只保留前三階的的多項式如下:

                                     \ large f(x)= w_1x ^ 9 + w_2x ^ 8 + .... + w_8x ^ 2 + w_9x ^ 1 + w_ {10} x ^ 0

簡單來說就是高階的係數為零,使用數學表示即使用約束條件進行表示如下:

                                      \ min min(J(w))

                                      \ large stw_1 = w_2 = ... = 0

這是一個思路,但是實際使用中還是不實用,因為一個網路擁有上百萬個引數,按照上面的還需要都標記,開銷很大,因此在基礎上需要繼續簡化,如何簡化呢?從不為零的引數出發進行限制,即使不等於0的個數限制在一定的範圍內以此達到限制模型的目的,而這種方法就稱為L0範數懲罰,如下:

                                        \ min min(J(w))

                                         \ large st \ sum_ {i = 1} ^ {m} I \ left \ {w_i \ neq 0 \ right \} \ leq c

                                         其中\大我的英文不為零的個數狀語從句:

L1範數懲罰

      雖然我們簡化了問題,但是上面的式子還是不太完美,對於實際問題的處理還是不友好,還需要繼續簡化,如何簡化呢?這樣簡化,上面我們是使用引數不為零的個數做約束條件,這裡改變的是要求引數數值的總和限制在某個範圍內即引數的總和要小於某個值,這種對引數總和的限制就被稱為L1範數懲罰,被也。稱為引數稀疏懲罰性如下式:

                                          \ min min(J(w))  

                                           \ large st \ sum_ {i = 1} ^ {m} \ left |  w_i \ right |  \ leq c

雖然這樣做會使得的高階項的係數不為0了,但是如果下式的情況也是可以接受的,因為高階項基本上可以被忽略了

                      f(x)= 0.0001x ^ 9 + 0.0002x ^ 8 + .... + 0.0004x ^ 3 + w_8x ^ 2 + w_9x ^ 1 + w_ {10} x ^ 0

L2範數懲罰

       上式雖然可以應用,同時把問題變為求極值的問題,但是還是不完美,因為約束條件帶有絕對值,這在數學中不好處理,最簡單的方法和損失函式一樣就是加入平方項就避免正負抵消問題,這就是L2範數懲罰,也是我們非常熟悉的權重衰減懲罰,如下式:

                                            \ min min(J(w)) 

                                             \ large st \ sum_ {i = 1} ^ {m}(w_i)^ 2 \ leq c

通過Ç值來控制學習演算法的模型的能力,C越大模型能力越強,C越小模型能力越小。那麼的上面的求解其實就可以按照SVM的求解進行即引入拉格朗日乘法(去除約束項),然後是轉換成對偶問題,在通過SMO演算法進行求解即可,這個需要大家對支援向量機有一個深入清晰的認識,下面我們在深入的探討一下權重衰減正則化:

L2引數正則化:

下面的內容需要一些概念上的知識如等高線,看不懂的建議看我的這篇文章,那裡詳細介紹了什麼是等高線,他的來龍去脈都講的很詳細,下面就不細說他是怎麼來的,而是直接使用了。

        代價函式的梯度如下圖虛線等高線橢圓所示,而梯度的最小值為其中心點,如果沒有任何限制,學習的過程就是每次沿著梯度等高線垂直的方向尋找極值。而圖中的實線所示就是權重衰減項,虛線圓的半徑便是權重衰減項中的常數C ^

這就如同一個帶線的小球的一端被固定在原點,而我們拿著小球盡力的靠近橢圓的中心點。如果該小球的繩過長(C值過大),小球幾乎就沒被限制,輕易地就到達了最小值,但也造成了過度擬合現象。如果繩了過短,那我們距離訓練資料的最優值處就很遠,也就造成了欠擬合現象。我們假設一種狀態,繩長適中,那該狀態下的最優效果是什麼呢
有興趣的讀者可以自己動手畫一畫,做一下試驗,但其實這並不難想象,最近的點就在橢圓中心與原點連線上。此時又是一個什麼狀態呢?非常巧,此時代價函式的負梯度與固定一端的帶繩小球的法向量是平行的,我們用數學符號刻畫,如下式所示:

                                                        \ large \ bigtriangledown(J(w))+ 2 \ lambda w = 0
需要說明的的英文帶繩小球可以用向量\大w ^ Tw <c表示,因此該圓的法向量就為向量\大W¯¯,其中常數2是我刻意新增的,只是為了建構函式方便,而\ large \ lambda為一個使得代價函式梯度與法向量平行的引數,而該引數便是大名鼎鼎的拉格朗日乘子,並且就如同繩長不能為負數,也需要大於0。現在問題似乎變得有些複雜了,以前我們只需求解代價函式的梯度,然後通過梯度下降法去慢慢接近梯度為零的區域,但現在引入新的引數又如何解決呢
       在實際應用中,\ large \ lambda通常作為超引數,人為進行選擇,其值需要通過具體的驗證資料測試結果進行經驗性選擇。現在我們把\ large \ lambda當作一個常數處理,但是代價函式的梯度依然無法求解。我們不妨這樣思考,最小化代價函式等價於代價函式的梯度為0。那代價函式梯度加上某個數為0,那也等價於原代價函式加上某個函式。那我們不妨將其積分,如下式 所示,這就是新的代價函式。

                                                                \ large J_ {new}(w)= J_ {old}(w)+ \ lambda w ^ Tw

如果使用最小均方誤差函式作為代價函式,那麼式子變為如下:

                                                              \ large J_ {new}(w)=(yf(w ^ Tw))^ 2 + \ lambda w ^ Tw

其中\ large \ lambda控制關係著機器學習演算法的能力,如果\ large \ lambda= 0,則退化成原模型。\ large \ lambda越大,則懲罰越嚴重,模型的能力越弱,\ large \ lambda越小,易發生過擬合,而\ large \ lambda過大以發生否擬合,計算梯度時,只需求偏導即可,如下:

                                                             \ large \ frac {\ partial J_ {new}(w)} {\ partial w_i} = \ frac {\ partial J_ {old}(w)} {\ partial w_i} + \ lambda w_i

L1正則化

       權重衰減是最常用的正則化措施,其優點在於可導並且容易優化。但正如開始時介紹範數懲罰方法時,我們一次一次放鬆限制推出了權重衰減,如果想要更加嚴格地限制,凵正則化便是一個不錯的選擇。如下式所示,便是加入L1懲罰的代價函式。
                                                              \ large J_ {new}(w)= J_ {old}(w)+ \ lambda ||  w ||  _1
其中\ large ||  w ||  _1表示所有引數的絕對值求和,並不是求向量模長。如果不太習慣,我們也可以將上式寫成下式所示的表示式。
                                                               \ large J_ {new}(w)= J_ {old}(w)+ \ lambda \ sum_ {i = 1} ^ {m} \ left |  w_i \ right |
在計算引數梯度時,如下式所示,也非常簡單,由於絕對值不可導,我們其實只是在原代價函式梯度的基礎上再加上與引數本身的符號乘積
                                                              \ large \ frac {\ partial J_ {new}(w)} {\ partial w_i} = \ frac {\ partial J_ {old}(w)} {\ partial w_i} + \ lambda sign(w_i)
其中符號(x)的表示取X的符號,比如符號(-5)= - 1,而登入(5)= 1需要注意的是,相比於權重衰減,L1正則化的限制更為嚴格,因此。也就更加的稀疏(稀疏),稀疏性也就是我們最終優化到的引數中有許多0稀疏性的一大好處是有利於特徵(FeatureSelection,由於大多數引數都為0,而這些0引數對應的特徵就沒有被使用,實際上我們就選擇出了一些重要特徵對資料進行預測,並自動篩選掉一些無用的特徵,這些無用特徵很大程度上也有可能是噪聲特徵。

好,上面就是正則化方面的內容,下面我們看看引數繫結和引數共享。

引數繫結與引數共享
        目前為止,我們討論的正則化措施都是通過限制模型引數的方法來限制模型的能力,但這種通用的限制太過寬泛,這裡再次提起“沒免費午餐理論“,機器學習演算法沒有好壞之分,所謂的好壞只是針對的資料集與問題域而言,遷移到正則化措施中,如果我們在特定領域對引數進行特定的限制,可能效果會更好。因此,我們經常需要新增一些先驗知識去限制模型引數。雖然我們並不能精確地知道引數需要什麼值,但對於特定的領域與特定的模型結構,模型引數之間存在著某些依賴。
假設某個同學數學非常有大賦,那他學習物理,化學和計算機等內容也會變得非常輕鬆
        某個同學文學功底紮實,出凵成章,那她在英語及藝術方面也可能高人一籌。在機器學習中,某個模型可以完美地識別“貓”,那通過訓練,它也可以非常好地識別 “狗”。更具體些,識別“貓”使用的引數和識別“狗”使用的引數會比較接近。因此我們在訓練其識別“狗”時,就可以利用識別“貓”的引數進行訓練,任務多重學習
        在影象識別領域,影象應該具有平移,旋轉等空間不變性特徵;而對於時間序列資料,資料與資料之間應該具有時間不變性特徵例如,一幅圖中有一隻小貓,如果將該圖中的每個畫素都向右平移一個畫素點,這隻小貓依然在圖中,對於人而言,平移一個畫素點根本分辨不出區別,但對於機器學習演算法而言,所有的畫素特徵對應的引數都發生了偏移,而機器學習演算法很可能就認為這是兩幅影象。為了提取到這種不變性特徵,我們迫使相鄰資料特徵引數相同,而這種正則化方法也稱為引數共享(ParameterSharing)。
卷積神經網路(Convolutional Neural Network,CNN)是目前最流行的一種神經網路,廣泛應用於計算機視覺領域。而該網路的核心一一卷積操作,其實就是引數共享。引數共享使得卷積網路極大地降低了引數的規模,並且在不增加訓練資料量的前提下,增加了網路的尺寸。前面幾節我們詳細地介紹卷積網路的各項工作原理,這裡不再敘述。

噪聲注入與資料擴充
       在機器學習中,想要降低泛化錯誤率最好的方法是訓練更多的資料,但在現實中,資料總是有限的,並且還需要大量的成本。那麼問題就來了,更多的資料使得模型效能更好,但我們又沒有更多的資料,那該怎麼辦呢?其中一個有用而高效的方法就是生成偽造資料(fakedata),然後將這些資料新增到訓練集中進行資料擴充(DataAugmentation)。雖然聽上去似乎在教大家“造假”,但對於某些機器學習任務而言,創造新的偽造資料是非常合理的
       在分類任務中,分類器需要使用複雜高維的輸入資料X以及資料所對應的類標進行關聯學習。這也意味著,分類器面臨的主要任務是從各種變化的資料中獲得某種穩定分佈的不變性。既然平移,旋轉後的影象都是同一個物件,那麼在訓練資料中扭曲一定程度的輸入資料X,分類器也應該將該資料 ÿ進關聯,但這一方法的應用範圍還比較窄。例如在密度估計任務中,要生成新的偽造資料是非常困難的,因為生成新資料的前提是我們己經解決了密度估計問題
        生成偽造資料最佳的應用場景是一類特定的分類任務。 - 物件識別圖片是一種高維複雜的資料“並且有著平移,旋轉不變性等特點在上面,介紹瞭如果一幅圖片全部向右平移一個畫素,那對於機器學習演算法來說,便徹底成了一幅新冬像,因此我們需要先驗地加入引數共享等措施來學習網路。那我們不妨換個角度,我們將這些先驗知識加入到資料中去,即平移,旋轉,拉伸之後的影象資料依然是原資料物件。我們將這些生成的“新影象資料”加入訓練集中訓練,那訓練資料就可能增加十餘倍的資料量,這樣訓練出來的模型同樣也可以其備這種空間不變效能力,但我們必須謹慎地去變換這些 據。例如在字元識別中,將B,和d,水平翻轉,圖6,和圖9中,旋轉180°,那就都成了同一個資料。此時的偽造資料,就真的變成了錯誤資料。
         比較機器學習基準結果時,需要注意資料擴充的影響。有時手工設計的資料擴充方法能夠顯著地降低泛化錯誤率,因此比較兩種演算法的效能時,執行控制試驗就是非常有必要的。比較演算法阿與演算法乙時,我們需要確保這兩種演算法使用相同的手工設計資料擴充,假設演算法甲在沒有資料擴充時表現糟糕,而演算法乙在加入人工合成數據後效能優越,這其實說明不了什麼。在這樣的例子中很有可能是合成數據造成了效能的提高,而不是演算法乙本身擁有更好的效能。但是否在試驗中注入噪聲或擴充資料是一種非常主觀的判斷,例如,在機器學習演算法的輸入中注入高斯噪聲被認為是機器學習演算法的一部分,然而對圖片進行隨機剪裁卻被認
為的英文單獨地預處理步驟。

在輸入中注入噪聲

        資料擴充也可以看作是在輸入資料中注入噪聲,從而迫使演算法擁有更強的健壯性(也可以將注入噪聲看作是一種資料擴充)。神經網路容易過擬合的原因之一就是對於噪聲沒有太好的抗噪能力。正所謂“你怕什麼,就應該勇敢地去面對什麼。”最簡單的提高網路抗噪聲能力方法,就是在訓練時加入隨機噪聲一起訓練。比如在非監督學習演算法降噪自動編碼器(DenoisingAutoencoder)中,在輸入層進行噪聲注入然後學習無噪聲的冬片,便是一種很好的提高網路健壯性的方式。


在隱藏層注入噪聲
        對於某些模型,注入噪聲也相當於對引數進行範數懲罰。通常而言,注入噪聲要比簡單地收縮引數更有效,尤其是將噪聲注入到隱藏層中。而隱藏層注入噪聲是一個重要的主題,我們將在差演算法中重點介紹,該方法也可以看作是通過加入噪聲重構新輸入的一種正則化策略
除了在資料以及隱藏層輸入中注入噪聲,在權重(引數)中注入噪聲也是一種有效的正則化措施。這種方法在某種程度上可以等價地解釋為傳統的範數懲罰,該方法鼓勵引數找到一個引數空間,而該空間對於微小的引數變化所引起的輸出變化的影響很小。換而言之,就是將模型送進了一個對於微小變化不敏感的區域,我們不僅找到了最小值,我們還找到了一個寬扁的最小值區域。


在類標中注入噪聲
       資料集中或多或少都帶有錯誤的類標,如果我們使用這些資料進行訓練,那這就好比一個專心聽講且對老師十分尊敬的好學生,認真學習老師教給他的所有知識,但老師教給他的卻是錯誤的知識。最不幸的是,學生還對老師深信不疑,即使發現了錯誤,也只會認為是自己愚鈍,不斷地否定自己,不斷地在痛苦中掙扎。雖然我們竭盡全力地避免錯誤標記資料,但這並不如我們想象得那麼美好,人為地新增錯誤在所難免。與其小心翼翼地標記資料做個完美的“老師”,還不如直接就告訴學生“老師”並不完美,“老師”也會犯錯。而解決這種問題的具體措施就是在類標中加入一定的噪聲,例如可以設定一個很小的常數\ large \ varepsilon,我們將訓練資料的類標Ÿ正確的概率設定為\大1- \ varepsilon

稀疏表徵


       在上面引數範數懲罰中,我們通過直接限制可用引數規模,如L1,L2引數懲罰,來限制模型的能力,從而降低過擬合風險。接下來,我們介紹一種通過作用在神經網路啟用單元的懲罰策略,來提高隱藏層的稀疏性,該方法可算作是一種間接的模型引數懲罰
       生物進化的一個重要趨勢就是儘可能地節約能源,而我們的大腦也符合節能的原則大腦。中每個神經元都連線著成千上萬的神經元,但其實大部分神經元都是處於抑制狀態,只有少部分的神經元接受刺激會處於啟用狀態,因此我們需要將特定的資訊交給特定的神經元進行處理。受此啟發,我們就期望使用某種懲罰措施來抑制大部分神經元。當資訊輸入進神經網路時,只有關鍵部分神經元才能夠處於啟用狀態,這就是稀疏表徵(稀疏表示)
       我們已經討論過凵範數如何致使引數稀疏化,這就意著大多 引數都為零或接近於零,而表徵稀疏化描述的其實就是隱藏層的輸出大多數為零或接近零。為了簡明地闡述這些區別我們以一個線性迴歸為例,如式(1)所示,是一個引數稀疏化的線性迴歸模型:而式(2)是使用稀疏表徵的線性迴歸。         

 雖然表徵正則化與引數正則化(一個使得輸出稀疏,一個使得引數稀疏)有些區別,但幸運的是它們都使用相同的機理來實現。如下式所示,表徵範數懲罰也是通過在代價函式中新增一項懲罰表徵項\ Omega(h)來實現表徵稀疏化。  

                                                           \ large J_ {new}(w)= J_ {old}(w)+ \ alpha \ Omega(h)

其中\ large \ alpha控制關係著懲罰項的懲罰力度,如果\ large \ alpha= 0,則相當於沒有任何懲罰,\ large \ alpha越大,懲罰力度越大。就如同在引數中使用的L1懲罰,通過限制引數的總數值來誘使引數稀疏化一樣。在表徵懲罰中我們也使用和L1懲罰相同的方式:\ Omega(h)= \ left \ |  h \ right \ |  = \ sum \ left |  h_i \ right |。來誘使表徵稀化表然的方法,其中KL散度(KLdivergence),又稱相對熵( RelativeEntropy)也是一種十分常用的方法,這個我會在強化學習或者自然語言處理進行介紹,這裡就不再介紹。 

早停

       目前為止,我們針對過擬合現象所做的正則化措施總結起來有兩點:一是限制模型的能力,就如同“孤已天下無敵(訓練錯誤率很低),讓你雙手又如何(引數,表徵懲罰)”。二是不斷地加入噪聲,給自己增加麻煩,就如同'放一碗水在頭頂扎馬步,穿著加沙的背心去奔跑,最終目的是使自己更強壯'。而下面,我們介紹的這種正則化方法就非常簡單了,那就是“當個懶漢早些停下來“。這似乎和我們的哲學意境不太相符,在我們的思想中,我們接受的傳統薰陶總是這樣:?。?。“弟子勤奮看書,師傅問弟子懂否弟子撓頭羞愧道不知師傅輕捻長鬚道,再看幾日之後,再問弟子懂否弟子顫驚道,徒兒依舊愚昧師傅小嘆,再看,,,。我們的哲學意境總是讓我們在重複中自我醒悟,發覺渺茫的慧根。但我們介紹的深度學習正則化策略卻恰恰相反,我們將 習如何適可而止,我們不允許演算法重複地學習太多次。
      基於梯度下降的深度學習演算法都存在一個訓練週期的問題,訓練的次數越多,訓練錯誤率就越低。由於我們真正目的是降低測試錯誤率,因此我們期望驗證錯誤率也與訓練錯誤率有相似的曲線。但期望總是事與願違,真實環境中的驗證錯誤率並沒有隨著訓練次數的增多而減少,而是形成了一種“ U型“曲線,驗證錯誤率先減小後上升。那很自然地,我們就期望能在驗證錯誤率的最低點(或最低點附近)停止訓練演算法,這就是所謂的早停(EarlyStopping),這裡就不細講了,感興趣的自行查閱資料。

Dropout在我的這篇文章詳細講了。

到這裡優化系列就展示結束,因為還有很多我還不知道的優化策略,等以後遇到在持續更新優化系列,本次先到這裡,這些優化策略,不能只看和只知道,需要我們實踐去感受內涵,因為有些東西只有自己去做了才能感受的深,好,深度學習優化到此結束,下面就進入RNN學習,然後開始自然語言系列的更新。