機器學習中模型泛化能力和過擬合現象(overfitting)的矛盾、以及其主要緩解方法正則化技術原理初探

1. 誤差與方差 - 機器學習算法泛化性能分析

在一個項目中,咱們經過設計和訓練獲得了一個model,該model的泛化可能很好,也可能不盡如人意,其背後的決定因素是什麼呢?或者說咱們能夠從哪些方面去改進從而使下次獲得的model更加使人滿意呢?html

」誤差-方差分解(bias-variance decomposition)「是解釋學習算法泛化能力性能的一種重要工具。誤差-方差分解試圖對學習算法的指望泛化錯誤率進行拆解。git

假設測試樣本爲x,yd 爲 x 在數據集中的標記(注意,有可能出現噪聲使得 yd != y,即所謂的打標樣本不純),y 爲 x 的真實標記,f(x;D)爲在訓練集 D 上訓練獲得的模型 f 在 x 上的預測輸出。github

以迴歸任務爲例,學習算法的指望預測爲:算法

上式可被分解爲:bootstrap

整理得:vim

即,泛化偏差可分解爲:誤差、方差、噪聲之和網絡

0x1:方差:模型的預測穩定性 - 數據擾動對模型的影響

使用樣本數相同,可是不一樣批次的訓練集產生的預測方差爲:app

預測方差度量了一樣大小的訓練集的變更所致使的學習性能的變化,即刻畫了數據擾動所形成的影響。框架

筆者插入:上式中其實也蘊含告終構風險公式的內涵,即結構風險越小,模型抗擾動的能力就越強dom

一個具有良好泛化能力的模型應該有較小的擾動方差。這和算法模型採起的」概括偏好策略「有關,一個典型的例子就是SVM的支持向量最大距離策略,這種策略保證了在相同的支持向量候選集(即候選假設空間)中,選擇距離支持向量相對距離最遠的那個超分界面。同時這也符合」奧卡姆剃刀原則「,如有多個假設與觀察一致,則選最簡單的那個。

那麼在實際操做中,有幾種策略和方法能夠下降模型的方差:

1. 控制訓練輪數、提早中止訓練、學習率逐漸減少漸進逼近等策略;
2. 使用例如決策樹裏的剪枝策略,控制模型複雜度;
3. 使用正則化等手段,控制模型複雜度;
4. 使用Dropout手段,控制模型複雜度;

0x2:噪聲:模型在當前任務能達到的指望泛化偏差的下屆 - 數據決定算法的上界,算法只是在逼近這個上界

若是咱們的打標樣本中存在噪聲,即錯誤標記,則噪聲公式爲:

很顯然,若是一個訓練集中所有都是噪聲(即全部樣本都標記錯誤了),則模型的預測指望爲0。噪聲表達了在當前任務上」任何「學習算法(和具體算法無關)所能獲得的指望泛化偏差的下界,即刻畫了學習問題自己的難度。

毫無疑問,在開始機器學習的模型開發以前,一件很是重要的事情就是」樣本打標提純「,這件事很是重要,甚至某種程度上來講比特徵工程、模型選擇、模型調參等環節都重要。但有時候會遭到開發者的忽略,拿到樣本後就急匆匆開始項目,筆者本身在項目中也吃過相似的虧,須要牢記一句話:數據決定算法的上界,算法只是在逼近這個上界

0x3:誤差:考察模型自己擬合能力

指望輸出與真實標記的差異稱爲誤差(bias),即:

它體現了模型的擬合能力,這其實也就是經驗風險的計算公式。

0x4:誤差-方差窘境(bias-variance dilemma)

誤差-方差分解說明,泛化性能是由學習算法的能力、數據的充分性以及學習任務自己的難度共同決定的。給定一個學習任務,爲了取得好的泛化性能,則需使誤差較小,即可以充分擬合數據,而且使方差較小,即便得數據擾動產生的影響小。

通常來講,誤差與方差是有衝突的,這稱爲」誤差-方差窘境「,下圖中,給定學習任務,假定咱們能控制學習算法的訓練程度,則在不一樣訓練程度下,誤差-方差的取值曲線以下:

在訓練不足時,學習器的擬合能力不夠強,訓練數據的擾動不足以使學習器產生顯著變化,此時誤差主導了泛化錯誤率;

隨着訓練程度的加深,學習器的擬合能力逐漸加強,訓練數據發生的擾動漸漸能被學習器學到,方差逐漸主導了泛化錯誤率;

在訓練程度充足後,學習器的擬合能力已很是強,訓練數據發生的輕微擾動都會致使學習器發生顯著變化,若訓練數據自身的、非全局的廣泛特性被學習器學到了,則將發生過擬合。

0x5:經驗偏差與泛化能力之間的矛盾

在整個誤差-方差公式中,提升訓練樣本的數量N是咱們沒法控制的,在實際項目中,高質量的打標樣本是比較困難獲取的,即便能夠獲取也要付出比較高的成本,咱們能作的就是在現有的樣本集上,獲得一個相對最好的模型。 另外一方面,打標樣本的提純是咱們能夠作的,可是人工的成本每每巨大,可否作到100%的提純也是一個挑戰。

拋開這兩個因素不談,咱們本文重點討論一下模型預測方差和模型擬合誤差的問題,也就是經驗偏差和泛化能力之間的平衡,即兼顧overfitting和underfitting的方法,如何讓咱們的模型儘量靠近上圖中那個」交匯點「。

這裏多談一點,可能有讀者會有疑問,上圖中的交匯點爲何不在橫軸上呢?即爲何取值不能爲零?即找到一個完美的解決方案,即沒有方差也沒有誤差。

關於這一點,能夠這樣理解:機器學習面臨的問題一般是 NP 難甚至更難,而有效的學習算法必然是在多項式時間內運行完成(假設搜索空間過於龐大),若可完全避免過擬合,則經過經驗偏差最小化就能得到最優解,這就意味着咱們構造性地證實了」P=NP「,所以,主要相信」P != NP「,過擬合和欠擬合就不可徹底調和

綜上所述,在一個項目中針對算法部分,咱們須要作的最重要的工做就是防住過擬合,同時讓模型儘可能去擬合訓練樣本。咱們接下來的內容會圍繞過擬合這個話題以及如何避免過擬合展開討論。

 

2. 經驗偏差(empirical error)與過擬合(overfitting)

通常地,咱們把學習器的實際預測輸出與樣本的真實輸出之間的差別稱爲「偏差(error)」,學習器在訓練集上的偏差稱爲「訓練偏差」或「經驗偏差」,在將來的新樣本上的偏差稱爲「泛化偏差」。顯然,咱們但願獲得泛化偏差小的學習器。

然而,咱們事先不可能知道新樣本是什麼樣的(即咱們不可能知道事物的完整全貌),咱們實際能作的是努力使經驗偏差最小化,但遺憾的是,經驗最小化的學習器,未必就是泛化偏差小的學習器。

咱們實際但願的是在新樣本上能表現得很好的學習器,爲了達到這個目的,應該從訓練樣本中儘量學出適用於全部潛在樣本的「廣泛規律」,這樣才能在遇到新樣本時作出正確的判別。 

而後,當學習器把訓練樣本學得「太好」了的時候,極可能已經把訓練樣本自身的一些特色(甚至多是噪音)當作了全部樣本都會具備的通常性質,這樣就會致使泛化性能降低。這種現象在機器學習中稱爲「過擬合(overfitting)」。與過擬合相對的是」欠擬合(underfitting)「,這是指對訓練樣本的通常性質還沒有學號。

0x1:假設空間(hypothesis space)

給定學習算法 A,它所考慮的全部可能概念的集合稱爲假設空間,用符號 H 表示。對於假設空間中的任一律念,咱們用符號 h 表示,因爲並不能肯定它是否真是目標概念,所以稱爲「假設」(hypothesis)

1. 模型空間/模型搜索空間

模型空間針對的是模型結構上的定義,例如使用線性迴歸模型、高斯分佈模型、DNN複合線性模型、包含非線性激活函數的非線性DNN模型、CNN模型等。

即便是選定了線性多項式函數做爲目標函數,函數的項目有多少?每項的冪次是多少?這些都屬於模型搜索的範疇。

2. 模型參數搜索空間

模型參數搜索,也就是所謂的模型訓練過程,本質上是在作模型超參數的搜索過程,咱們本章接下來統一都叫參數搜索過程,筆者知道它們兩者是相同的便可。

參數搜索解決的最主要的問題就是「權重分配」,機器學習中的目標函數都是多元的,即由大量的「原子判別函數」組成,全部的原子判別函數共同做用於待預測數據,給出一個最終的綜合判斷結果。

參數搜索會根據訓練數據中包含的機率分佈,對全部的原子判別函數的權重進行最優化調整,使其最大程度地擬合訓練數據。

0x2:什麼是過擬合?

首先,先拋出筆者的幾個觀點:

觀點1:過擬合不是一個理論分析的結果,目前還不存在一個明確的理論,能夠量化地分析過擬合是否發生、以及過擬合的程度(數值化)有多少。過擬合是一種能夠被觀測到的現象,在具體的場景中,當觀測到某些現象的時候,咱們說,此時發生了過擬合

觀點2:不是說使用了複雜函數就必定表明了過擬合,複雜函數不等於過擬合。

1. 判斷髮生過擬合的現象 - 訓練集上獲得的模型沒法適應測試集

咱們經過一個例子來討論過擬合現象

1)數據集

假設咱們要對一個簡單的數據集創建模型:

咱們的目標是構建一個模型,獲得基於 x 的能預測 y 的函數。

2)選用複雜函數進行擬合

這裏假設咱們把 y 建模爲關於 x 的多項式,這裏多項式就是模型選擇的結果。

而且省略模型參數搜索過程,直接假設最終多項式爲

函數擬合的圖像以下:

 

能夠看到,函數精確擬合了數據

3)選用簡單函數進行擬合

使用線性模型

4)是否發生了過擬合呢?哪一個模型更容易產生過擬合呢?

嚴格來講,是否發生了過擬合,哪一個模型更可能產生過擬合,這兩個問題很是微妙。簡單來講,答案是:實踐是檢驗真理的惟一標準。

咱們說過,過擬合是一種在項目實踐中遇到的一個常見的現象,並非一種高深的理論。

筆者但願向讀者朋友傳達的一個觀點是:

上面兩種函數(複雜的和簡單的),都有可能產生過擬合,也均可能不產生過擬合,也可能複雜函數產生過擬合而簡單函數泛化能力很好,所謂的「簡單函數的泛化能力更好」不是一個有着堅實理論和數學基礎的理論定理,它只是在長久的數據科學項目中,數據科學家們發現的一個廣泛現象

能夠理解爲屬於經驗科學的一個範疇,簡單的模型不容易產生過擬合,簡單的模型泛化能力更好,甚至所謂的奧卡姆剃刀原理。這個經驗在不少時候是有效的,咱們也沒有什麼理由不去應用這個經驗。畢竟數據科學仍是一個偏向實踐和以結果說話的學科,獲得好的結果是最重要的。

只是說,筆者但願讀者朋友們不要太過於簡單粗暴地認死理,認爲說你設計的模型必定就須要遵循簡單原理,凡是複雜的模型就是很差的。

判斷髮生過擬合的方法很簡單,就是測試集。當咱們用一份新的測試集去測試模型的時候,若是precision和recall發生了很嚴重的降低,則說明發生了過擬合,無論是什麼內在緣由(咱們後面會分析可能的緣由),過擬合確定是發生了,模型在訓練集和測試集上表現不一致就是過擬合的最主要的現象

2. 過擬合產生的本質緣由

過擬合發生的本質緣由,是因爲監督學習問題的不適定。過擬合現象的發生緣由,能夠分解成如下三點:

1. 訓練集和測試機特徵分佈不一致:
假如給一羣天鵝讓機器來學習天鵝的特徵,通過訓練後,知道了天鵝是有翅膀的,天鵝的嘴巴是長長的彎曲的,天鵝的脖子是長長的有點曲度,天鵝的整個體型像一個「2」且略大於鴨子.這時候你的機器已經基本能區別天鵝和其餘動物了。可是很不巧訓練集中的天鵝全是白色的,因而機器通過學習後,會認爲天鵝的羽毛都是白的,之後看到羽毛是黑的天鵝就會認爲那不是天鵝。
能夠看到,訓練集中的規律,「天鵝的體型是全局特徵」,可是「天鵝的羽毛是白的」這實際上並非全部天鵝都有的特徵,只是局部樣本的特徵。
機器在學習全局特徵的同時,又大量學習了局部特徵,這才致使了泛化能力變產,最終致使不能識別黑天鵝的狀況.

2. 在有限的樣本中搜索過大的模型空間
在高中數學咱們知道,從 n 個(線性無關)方程必定能夠解 n 個變量,可是解 n+1 個變量就會解不出。由於有2個變量可能不在一個維度上。
在監督學習中,每每數據(對應了方程)遠遠少於模型空間(對應了變量)。
在有監督學習中,若是訓練樣本數小於模型搜索空間,則有限的訓練數據不能徹底反映出一個模型的好壞,然而咱們卻不得不在這有限的數據上挑選模型,所以咱們徹底有可能挑選到在訓練數據上表現很好而在測試數據上表現不好的模型,由於咱們徹底沒法知道模型在測試數據上的表現。
顯然,若是模型空間很大,也就是有不少不少模型能夠給咱們挑選,那麼挑到對的模型的機會就會很小。

3. 訓練過程當中函數過多吸取了噪音數據的影響
fit model的時候加的parameter太多了,致使model太精準地抓住了這組數據的全部variance,無論是主要的數據趨勢帶來的variance仍是噪音帶來的variance都一併被擬合在了模型裏。
用這個模型去預測原數據確定是準確性更高,但放在一組具備相同趨勢但細節不一樣的數據裏時,預測效果就會降低。

3. 泛化偏差評估方法

一般,咱們經過實驗測試來對學習器的泛化偏差進行評估並進而作出選擇。爲此,須要一個和訓練集互斥的數據集來測試學習器對新樣本的判別能力,而後咱們以測試集上的」測試偏差(testing error)「做爲泛化偏差的近似。有幾種方法獲得測試集

1. 留出法(hold-out)

直接將數據集D劃分爲兩個互斥的集合。須要注意的是,訓練/測試集的劃分要儘量保持原始數據分佈的一致性,避免因數據劃分過程引入額外的誤差而對最終結果產生影響,這種採樣方式一般稱爲」分層採用(stratified sampling)「。

同時,單次使用留出法獲得的估計結果每每不夠穩定可靠,在使用留出法時,通常要採用若干次隨機劃分、重複進行試驗評估取平均值做爲留出法的評估結果。

此外,讀者朋友要特別注意的是,咱們但願評估的是用整個D數據集訓練出的模型的性能,但留出法須要劃分訓練集/測試集,這就會致使一個窘境:

1. 若令訓練集S包含絕大多數樣本,則訓練出的模型可能更接近於D訓練出的模型,但因爲T比較小,評估結果可能不夠穩定準確;
2. 若令測試集T多包含一些樣本,則訓練集S與D的差異更大了,被評估的模型與用D訓練出的模型相比可能有較大的差異,從而下降了評估結果的保真性;

從」誤差-方差「的角度來理解:測試集小時,評估結果方差較大;訓練集小時,評估結果誤差較大

2. 交叉驗證法(cross validation)

交叉驗證法是先將數據集D劃分爲 k 個大小相同的互斥子集,每一個子集都儘量保持數據分佈的一致性。而後每次使用 k-1 個子集進行訓練,餘下的 1 個子集進行測試。

本質上來講,k折交叉驗證和留出法沒有區別

3. 自助法(bootstrapping)

咱們但願評估的是用D訓練出的模型,但在留出法和交叉驗證法中,因爲保留了一部分樣本用於測試,所以實際評估的模型所使用的訓練集比D小,這必然會引入一些因訓練樣本規模不一樣而致使的估計誤差。

自助法是一個比較好的解決方案,它直接以自助採樣法(bootstrap sampling)爲基礎:

1. 給定包含m個樣本的數據集D,每次隨機從D中隨機採集一個樣本,並放入D'中,並放回該樣本;
2. 這個過程重複m次後,咱們就獲得了包含m個樣本的數據集D’;

顯然,D中有一部分樣本會在D'中屢次出現,而另外一部分樣本根本不出現,能夠作一個簡單的估計,樣本在m次採樣中始終不被採到的機率爲:,取極限能夠獲得:

經過自助採樣法,初始數據集D中約有36.8%的樣本未出如今採樣數據集D'中。因而咱們可將D'用做訓練集,而另外那36.8%做爲測試集。

這樣,從機率上,實際評估的模型與指望估計的模型都使用m個訓練樣本,而咱們仍有36.%的樣本沒在訓練集中被用做測試。這樣的測試結果,被稱爲」包外估計(out-of-bag

 estimate)「

筆者插入:自助法在數據集較小、難以有效劃分訓練/測試集時頗有用。此外,自助法能從初始數據集中產生多個不一樣的訓練集,這對集成學習等方法有很大的好處。然而,自助法產生的數據集改變了原始數據集的分佈,這會引入估計額外的新的估計誤差。

所以,在初始數據量足夠時,留出法和交叉驗證法更經常使用一些

筆者插入:無論咱們採起了什麼測試集劃分方法,在評估結束後,模型參數選定後,咱們須要採用全集D進行訓練,將數據集D訓練獲得的模型交付給業務方,這纔是咱們最終的模型

0x3:複雜函數必定很差嗎?複雜函數必定會致使過擬合嗎?

咱們從介紹兩個正確結果是複雜模型的例子開始這個小節的討論。

1. 複雜函數獲得正確結果的例子

在 1940 年代物理學家馬塞爾施恩(Marcel Schein)宣佈發現了一個新的天然粒子。

他工做所在的通用電氣公司欣喜若狂並普遍地宣傳了這一發現。可是物理學家漢斯貝特(Hans Bethe)卻懷疑這一發現。貝特拜訪了施恩,而且查看了新粒子的軌跡圖表。施恩向貝特一張一張地展現,可是貝特在每一張圖表上都發現了一些問題,這些問題暗示着數據應該被丟棄。

最後,施恩向貝特展現了一張看起來不錯的圖表。貝特說它可能只是一個統計學上的巧合。施恩說「是的,可是這種統計學巧合的概率,即使是按照你本身的公式,也只有五分之一。」貝特說「可是咱們已經看過了五個圖表。」最後,施恩說道「可是在個人圖表上,每個較好的圖表,你都用不一樣的理論來解釋,然而我有一個假設能夠解釋全部的圖表,就是它們是新粒子。」貝特迴應道「你個人學說的惟一區別在於你的是錯誤的而個人都是正確的。你簡單的解釋是錯的,而我複雜的解釋是正確的。」隨後的研究證明了大天然是贊同貝特的學說的,以後也沒有什麼施恩的粒子了。

這個例子中,施恩聲稱本身發現的新粒子,就表明了一種簡單模型。

另外一個例子是,1859 年天文學家勒維耶(Urbain Le Verrier)發現水星軌道沒有按照牛頓的引力理論,造成應有的形狀。

它跟牛頓的理論有一個很小很小的誤差,一些當時被接受的解釋是,牛頓的理論或多或少是正確的,可是須要一些小小的調整。1916 年,愛因斯坦代表這一誤差能夠很好地經過他的廣義相對論來解釋,這一理論從根本上不一樣於牛頓引力理論,而且基於更復雜的數學。儘管有額外的複雜性,但咱們今天已經接受了愛因斯坦的解釋,而牛頓的引力理論,即使是調整過的形式,也是錯誤的。這某種程度上是由於咱們如今知道了愛因斯坦的理論解釋了許多牛頓的理論難以解釋的現象。此外,更使人印象深入的是,愛因斯坦的理論準確的預測了一些牛頓的理論徹底沒有預測的現象。但這些使人印象深入的優勢在早期並非顯而易見的。若是一我的僅僅是以樸素這一理由來判斷,那麼更好的理論就會是某種調整後的牛頓理論。

在這個例子中,牛頓定理,就表明了一種簡單模型。

2. 故事背後的意義

這些故事有三個意義:

第一,判斷兩個解釋哪一個纔是真正的「簡單」是一個很是微妙的事情;
第二,即使咱們能作出這樣的判斷,簡單是一個必須很是謹慎使用的指標;
第三,真正測試一個模型的不是簡單與否,更重要在於它在預測新的狀況時表現如何;

0x4:解決過擬合的一個有效的方法 - 正則化

謹慎來講,經驗代表正則化的神經網絡(在傳統機器學習算法中也同樣)一般要比未正則化的網絡泛化能力更好。

事實上,研究人員仍然在研究正則化的不一樣方法,對比哪一種效果更好,而且嘗試去解釋爲何不一樣的方法有更好或更差的效果。因此你能夠看到正則化是做爲一種「雜牌軍」存在的。雖然它常常有幫助,但咱們並無一套使人滿意的系統理解爲何它有幫助,咱們有的僅僅是沒有科學依據的經驗法則。

筆者翻閱了大量的書籍和文獻,在《機器學習導論》、《深刻理解機器學習》這兩本書的前部分章節中,介紹一些一些理論分析框架,能夠從側面對過擬合和正則化帶來泛化能力上的優化背後的原理作了一些解釋。篇幅很是長也很理論化,建議讀者自行購書閱讀。

筆者這裏作一個歸納性的總結:

1. 經典的 bias-variance decomposition;
2. PAC-learning 泛化界解釋;
3. Bayes先驗解釋,這種解釋把正則化變成先驗

1. 正則化做用一 - 減小權值參數個數

減少權值參數個數,主要是爲了解決假設空間太大的問題

先看一下二次多項式和十次多項式的區別——

二次多項式:w_0+w_1x+w_2x^2

十次多項式:w_0+w_1x+w_2x^2+...+w_{10}x^{10}

下圖能夠看出來十次項的形式很複雜,雖然能夠擬合訓練集所有數據,可是「可能」嚴重過擬合。咱們嘗試把十次項出現的機會打壓一下,即減小權值參數個數。

其實只要讓後面的w係數全等於零,那麼二次多項式和十次多項式本質上是同樣的,這樣子就客觀上把假設空間縮小了,這裏就是正則化的過程。

2. 正則化做用二 - 下降權值參數數值

擬合過程當中一般都傾向於讓權值儘量小,最後構造一個全部參數都比較小的模型。

由於通常認爲參數值小的模型比較簡單,能適應不一樣的數據集,也在必定程度上避免了過擬合現象。

能夠設想一下對於一個線性迴歸方程,若參數很大,那麼只要數據偏移一點點,就會對結果形成很大的影響;但若是參數足夠小,數據偏移得多一點也不會對結果形成什麼影響,一種流行的說法是『抗擾動能力強』。

Relevant Link:

https://www.jianshu.com/p/1aafbdf9faa6
https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s5ss2.html
https://www.zhihu.com/question/32246256 
https://www.zhihu.com/question/20700829

 

3. 從模型搜索空間限制角度看線性模型中的正則化(Regularization)

0x1:正則化簡介

在機器學習中,無論是常規的線性模式,仍是像深度學習這樣的複合線性模型,幾乎均可以看到損失函數後面會添加一個額外項。

經常使用的額外項通常有兩種,通常英文稱做ℓ1-normℓ2-norm,中文稱做L1正則化L2正則化,或者L1範數L2範數

L1正則化和L2正則化能夠看作是損失函數的懲罰項

所謂『懲罰』是指對損失函數中的某些參數作一些限制。具體是什麼限制,咱們接下來會詳細討論。

對於線性迴歸模型,使用L1正則化的模型叫作Lasso迴歸使用L2正則化的模型叫作Ridge迴歸(嶺迴歸)

0x2:Lasso迴歸 - 包含L1正則化的線性迴歸

線性迴歸模型中,Lasso迴歸的損失函數以下:

,後面一項 α||w||1 即爲L1正則化項。||w||1 是指權值向量 w 中各個元素的絕對值之和

通常都會在正則化項以前添加一個係數,Python中用 α 表示,一些文章也用 λ 表示。這個係數須要用戶指定。

1. L1正則化的做用

L1正則化能夠產生稀疏權值矩陣,即產生一個稀疏模型,能夠用於特徵選擇。

稀疏矩陣指的是不少元素爲0,只有少數元素是非零值的矩陣,即獲得的線性迴歸模型的大部分系數都是0。

咱們知道,一般機器學習中特徵數量不少(人工提取地或者由於自動編碼產生的),例如文本處理時,若是將一個詞組(term)做爲一個特徵,那麼特徵數量會達到上萬個(bigram)。

在預測或分類時,可是若是代入全部這些特徵,可能會最終獲得一個很是複雜的模型,而絕大部分特徵權重是沒有貢獻的,即該模型更容易產生過擬合(回想前面過擬合緣由的分析)。

加入L1正則化後,獲得的模型是一個稀疏模型,表示只有少數特徵對這個模型有貢獻,所以提升了模型的泛化能力。

2. 以二維損失函數幾何角度解釋 L1正則化是如何影響模型權重分配的

在項目中咱們的特徵確定都是超高維的,不利於解釋原理本質,咱們以可視化的二維函數做爲討論對象,解釋 L1正則化的原理。

假設有以下帶L1正則化的損失函數:

其中 J0 是原始的損失函數,加號後面的一項是L1正則化項,α 是正則化係數。

注意到 L1 正則化是權值的絕對值之和,J 是帶有絕對值符號的函數,所以 J 是不徹底可微的。機器學習的任務就是要經過最優化方法(例如梯度降低)求出損失函數的最小值。

當咱們在原始損失函數 J0 後添加 L1 正則化項時,至關於對 J0 作了一個約束。

,則 J = J0 + L,此時咱們的任務變成在 L 約束下求出 J0 取最小值的解。

在二維的狀況,即只有兩個權值 w1 和 w2,此時 L = a * ( ||w1| + |w2| )。L 函數在二維座標系上是一個菱形,讀者朋友能夠本身推導下。

對於梯度降低法,求解 J0 的過程能夠畫出等值線,同時 L1 正則化的函數 L 也能夠在 w1,w2 的二維平面上畫出來。以下圖:

圖中等值線是 J0 的等值線,黑色方形是某個指定懲罰係數α(例如1)時,L 函數的圖形。

在圖中,當 J0 等值線與 L 圖形首次相交的地方就是最優解

上圖中 J0 與 L在 L 的一個頂點處相交,這個頂點就是最優解。注意到這個頂點中,w1 = 0,w2 = w。

在懲罰係數 α 不一樣時,這個菱形會不斷擴大和縮小,能夠直觀想象,由於 L 函數有不少『突出的角』(二維狀況下四個,多維狀況下更多),J0 與這些角接觸的機率會遠大於與 L 其它部位接觸的機率( 隨着α縮小,L 的尖角老是最早碰到 J0 ),而在這些角上,會有不少權值等於0,這就是爲何 L1正則化能夠產生稀疏模型,進而能夠用於特徵選擇。

另外一方面,而正則化前面的係數 α,能夠控制 L 圖形的大小。

α 越小,L 的圖形越大(上圖中的黑色方框);
α 越大,L 的圖形就越小,能夠小到黑色方框只超出原點範圍一點點;

經過擴大 α 的大小,使得 w 能夠取到很小的值。

綜上能夠看到,L1正則化可以作到兩件事:

1. 使得權重向量 w 儘可能稀疏,即被選中的特徵儘可能少。且 ;
2. 即便被選中,也有能力盡可能使得 w 儘可能小;

3. L1正則化的懲罰因子參數怎麼選擇

α越大,越容易使得權值向量 w 取得稀疏狀況,同時 權值向量 w 值也越小。

0x3:Ridge迴歸 - 包含L2正則化的線性迴歸

線性迴歸模型中,Ridge迴歸的損失函數以下:

,式中加號後面一項 α||w||2 即爲L2正則化項。||w||2 是指權值向量 w 中各個元素的平方和而後再求平方根

通常都會在正則化項以前添加一個係數,Python中用 α 表示,一些文章也用 λ 表示。這個係數須要用戶指定。

1. L2正則化的做用

L2正則化能夠防止模型過擬合(overfitting)。可是這不是L2正則化的專利,L1正則化也能必定程度上防止模型過擬合。

2. 以二維損失函數可視化解釋 L2正則化是如何使模型權重分配趨向於小值

假設有以下帶L2正則化的損失函數:

分析的過程和L1正則化是同樣的,咱們省略,一樣能夠畫出他們在二維平面上的圖形,以下:

二維平面下L2正則化的函數圖形是個圓,與方形相比,被磨去了棱角。所以 J0 與 L 相交時使得 w1 w2 等於零的機率小了許多,這就是爲何L2正則化不具備稀疏性的緣由。

可是L2正則化對 w1 和 w2 的總體壓制效果仍是同樣的,咱們從數學公式上分析下,L2正則化對權值參數壓制的原理。

以線性迴歸中的梯度降低法爲例。假設要求的參數爲 θ,hθ(x) 是咱們的假設函數,那麼線性迴歸的代價函數以下:

那麼在梯度降低法中,最終用於迭代計算參數 θ 的迭代式爲(省略求導過程的推導):

其中 α 是learning rate。在原始代價函數以後添加L2正則化,則迭代公式會變成下面的樣子:

其中 λ 就是正則化參數。從上式能夠看到:

與未添加L2正則化的迭代公式相比,每一次迭代,θj 都要先乘以一個小於 1 的因子,從而使得 θj 不斷減少,所以總得來看,θ是不斷減少的;
並且 λ 越大,每次減小的程度也越大;

和 L1正則化相比,並且由於均方根的放大做用,L2對 w 的限制力要更強,所以 L2正則化更適合壓制權值w,使其儘可能取小值

3. L2正則化的懲罰因子參數怎麼選擇

λ越大,L2懲罰力度就越大,參數被小值化壓制的程度也越大。

0x4:L一、L2正則化各自適合的場景

1. ridge regression(L2) 並不具備產生稀疏解的能力,也就是說參數並不會真出現不少零。假設咱們的預測結果與兩個特徵相關,L2正則傾向於綜合二者的影響,給影響大的特徵賦予高的權重;
2. 而 L1 正則傾向於選擇影響較大的參數,而捨棄掉影響較小的那個;

實際應用中 L2正則表現每每會優於 L1正則,但 L1正則會大大下降咱們的計算量

0x5:不一樣懲罰參數下,正則化效果可視化

爲了更好的直觀體會L1和L2正則化對權重的制約過程,咱們在mnist上訓練一個經典的CNN分類器,提取出全部的權重,求出其分佈來看看。全部權重初始化爲均值0,方差0.5的正態分佈。

# -*- coding: utf-8 -*-

from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential, Model
from keras.layers import Dense, Dropout, Flatten, Input
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
from keras import initializers
import numpy as np
import matplotlib.pyplot as plt
from keras import regularizers

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255.0
x_test /= 255.0
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)


def my_reg(weight_matrix):
    #return 0    # 無正則化
    return 1.0 * K.sum(K.abs(weight_matrix))   # L1正則化
    #return 2.0 * K.sum(K.abs(weight_matrix))   # L1正則化
    #return 1.0 * K.sum(K.pow(K.abs(weight_matrix), 2))   # L2正則化
    #return 2.0 * K.sum(K.pow(K.abs(weight_matrix), 2))   # L2正則化
    #return 1.0 * K.sum(K.abs(weight_matrix)) + 1.0 * K.sum(K.pow(K.abs(weight_matrix), 2)) # L1-L2混合正則化
    #return K.sum(K.pow(K.abs(weight_matrix), 3))   # L3正則化



# 全部權重初始化爲均值0,方差0.5的正態分佈
init = initializers.random_normal(mean=0, stddev=0.25, seed=42)

input = Input(shape=(28, 28, 1))
conv1 = Conv2D(32, kernel_size=(3, 3), activation='relu', kernel_initializer=init, kernel_regularizer=my_reg)(input)
conv2 = Conv2D(64, (3, 3), activation='relu', kernel_initializer=init, kernel_regularizer=my_reg)(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv2)
conv3 = Conv2D(128, (3, 3), activation='relu', kernel_initializer=init, kernel_regularizer=my_reg)(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv3)
flat = Flatten()(pool2)
dense1 = Dense(128, activation='relu', kernel_initializer=init, kernel_regularizer=my_reg)(flat)
output = Dense(10, activation='softmax', kernel_initializer=init, kernel_regularizer=my_reg)(dense1)
model = Model(inputs=input, outputs=output)
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
model.summary()

for i in range(40):
    model.fit(x_train, y_train, batch_size=128, epochs=1, verbose=0, validation_data=(x_test, y_test))  # 每次只訓練一輪
    score = model.evaluate(x_test, y_test, verbose=0)
    weights = model.get_weights()
    all_weights = np.zeros([0, ])
    for w in weights:
        w_flatten = np.reshape(w, [-1])
        all_weights = np.concatenate([all_weights, w_flatten], axis=0)
    plt.hist(all_weights, bins=100, color="b", normed=True, range=[-1, 1])
    print("epoch=" + str(i) + " loss=%.2f ,acc=%.3f" % (score[0], score[1]))
    plt.title("epoch=" + str(i) + " loss=%.2f ,acc=%.3f" % (score[0], score[1]))
    plt.savefig("mnist_model_weights_hist_%d.png" % (i))
    plt.clf()

讀者在運行的時候能夠逐項把my_reg裏的註釋去除,逐個體驗不一樣的正則化懲罰因子,對權重參數的制約做用。代碼運行可能較慢,讀者們不要着急。

筆者在學習這部分的時候,可視化帶來了不少的有趣的思考,相信你也能夠體會到數學公式的微小改變,給optimization帶來的巨大變化;以及機器學習項目中,提取出來的特徵是如何被模型選擇,咱們如何去幹預這個特徵選擇過程等等。

代碼運行完畢後會在本地目錄產生不少.png圖片,讀者朋友能夠用這個來生成gif動圖,很是直觀。

1. 無正則化

2. L1正則化 - 懲罰因子 = 1e-4

很明顯,L1懲罰因子讓 w 朝着係數矩陣的方向優化。

3. L1正則化 - 懲罰因子 = 1e-3

能夠看到,在這個實驗中,1e-3 對權值的壓制做用就已經很是明顯了。在第一輪訓練後,權值向量的分佈就大幅度集中在均值附近,即不少 w 被置爲0。

筆者思考:在這個項目中,由於權值向量的維數不高,因此 L1懲罰因子的影響很是顯著,在具體的項目中,你的特徵feature可能高達上萬或者上百萬。相應的,L1懲罰因子能夠選擇稍微大一些,提升制約能力。

4. L2正則化 - 懲罰因子 = 1e-4

 

5. L2正則化 - 懲罰因子 = 1e-3

能夠看到,懲罰因子越大,制約能力越強。

6. L1-L2混合正則化

7. L3正則化

0x5:從不一樣正則化參數效果圖中咱們能夠獲得什麼信息

1. L1/L2正則化均可以將權重往0的方向壓制,可是L1的壓制效果更強,L2比較慢一些,相同懲罰參數的狀況下,L2要比L1花更久的時間達到相同的壓制效果。
2. 在保證準確率的前提下,L1/L2正則化可以省下更多的元素,這就意味着模型可以大大地減小其存儲空間(將矩陣變成稀疏矩陣的形式保存)
3. 從L1/L2的函數圖像來看:
    1) 元素絕對值在[0,1]之間的時候,L1對於元素的懲罰更大,L2的懲罰小,相對的容忍度更大;
    2) 元素絕對值在[1,∞]之間的時候,L1對於元素的懲罰更小,L2的懲罰大,相對的容忍度更小
4. 從斜率角度來看:
    1) L2正則化的斜率大要在[1,∞]才能發揮其功力,在[0,1]之間,往0趕的能力不是很強;
    2) 然而L1在全部地方斜率都同樣,相對而言,在[0,1]之間,其往0趕的能力強

筆者思考

這些理論理解了對咱們更好的使用機器學習進行項目開發很是有用,在實際的項目中,筆者的經驗是綜合使用L1/L2,基本上在各類垂直領域場景下,這都是最好的實踐結果

筆者思考

某種意義上來講,dropout正則化技術和亞里士多德的《政治學》觀點是一致的。
正則化經過隨機的切斷神經元之間的鏈接,從而強迫網絡中的全部神經元都」共同參與最終決策「以提升泛化能力。
可是若是咱們將正則化後的權重分配打印出來會發現,正則化的結果就是」權重集中在了少數幾個神經元上「。換句話說就是:」最終的決策由少數人來做出是最優的,也是集體的天然選擇「。
這正體現了政治學中的國家力量,國家的做用就是將廣大人民的自由權利,集中到少數精英手中進行集中決策。從這點看,自由與民主是不衝突的

Relevant Link:

https://vimsky.com/article/969.html 
https://blog.csdn.net/jinping_shi/article/details/52433975
https://blog.csdn.net/yuweiming70/article/details/81513742
https://blog.csdn.net/zouxy09/article/details/24971995
https://blog.csdn.net/yuweiming70/article/details/81513742

 

4. 從貝葉斯估計的角度看線性模型中的正則化

首先,先拋出筆者的一個觀點:從貝葉斯的角度來看,正則化等價於對模型參數引入先驗分佈

正則化參數等價於對參數引入 先驗分佈,使得 模型複雜度 變小(縮小解空間),對於噪聲以及 outliers 的魯棒性加強(泛化能力)。
整個最優化問題從貝葉斯觀點來看是一種 貝葉斯最大後驗估計(MAP)
其中正則化項對應後驗估計中的先驗信息損失函數對應後驗估計中的似然函數
二者的 乘積即對應貝葉斯最大後驗估計的形式。

0x1:不包含正則化的原始線性迴歸

咱們先看下最原始的Linear Regression:

從機率分佈的角度來看,線性迴歸對應的機率分佈爲:

1. 由最大似然估計(MLE) - 針對不包含正則項的機率分佈進行極大似然估計

取對數:

即:
w_{MLE} = \arg \underset{w}{\min} \sum_{i=1}^{m} (y^{(i)} - w^Tx^{(i)})^2

這就導出了咱們原始的 least-squares 損失函數(損失函數極小),但這是在咱們對參數 w 沒有加入任何先驗分佈的狀況下。在數據維度很高的狀況下,咱們的模型參數不少,模型複雜度高,容易發生過擬合。 

這個時候,咱們能夠對參數 w 引入先驗分佈,下降模型複雜度。

0x2:引入高斯分佈先驗的線性迴歸 - Ridge Regression

繼續上面的線性迴歸函數,咱們對參數 w 引入協方差爲 \alpha 的零均值高斯先驗

取對數:

等價於:
J_R(w) = \frac{1}{n}\lVert y- w^TX \rVert_2 + \lambda \lVert w \rVert_2。絕對值後面的下標2表示L2範數的意思。

這等價於 Ridge Regression(L2正則化) 

即:對參數引入 高斯先驗 等價於L2正則化。

0x3:引入拉普拉斯分佈(Laplace distribution)先驗的線性迴歸 - LASSO Regression

繼續上面的線性迴歸函數,咱們對參數 w 引入拉普拉斯分佈(Laplace distribution)。

LASSO - least absolute shrinkage and selection operator.

拉普拉斯分佈公式以下:

使用相同的推導過程咱們能夠獲得:

 。絕對值後面的下標1表示L1範數的意思。

該問題一般被稱爲 LASSO (least absolute shrinkage and selection operator) 。
LASSO 仍然是一個 convex optimization(凸優化) 問題,不具備解析解。它的優良性質是能產生 稀疏性,致使 w 中許多項變成零。
能夠看到: 對參數引入 拉普拉斯先驗 等價於 L1正則化

0x4:引入L1-L2先驗的線性迴歸 - Elastic Net

最終的凸優化函數以下:

。絕對值後面的下標1和下標2表示L1/L2範數的意思。

下圖展現L一、L二、Elastic Net添加的正則項在二維狀況時的約束函數。能夠看到,Elastic Net是L1和L2的一種折中方案。

筆者插入思考:

筆者在思考Elastic Net和L1/L2的關係的時候,忽然想到以前學習過的CART樹算法中的評價指標(基尼指數、熵之半、分類偏差率)時,它們有殊途同歸之妙,僅僅是經過數學公式的一些微小改變能夠帶來很是明顯的效果提高

https://www.cnblogs.com/LittleHann/p/7309511.html#_label3_4_0_2
搜索:1. 基於基尼指數來評估分類特徵的效果

Relevant Link:

https://www.zhihu.com/question/23536142/answer/90135994
https://www.jianshu.com/p/c9bb6f89cfcc
https://blog.csdn.net/zhuxiaodong030/article/details/54408786 
http://charleshm.github.io/2016/03/Regularized-Regression/#fn:5
https://ask.julyedu.com/question/150

 

5. 從經驗風險/結構風險的角度看線性模型中的正則化

筆者認爲,經驗風險/結構化風險更多地是一種指導理論,在實際的算法中,更多的是以L1/L2懲罰、引入先驗分佈、結構dropout、提早剪枝等操做來實現該目的。

https://www.cnblogs.com/LittleHann/p/7749661.html#_label3_0_2_0
搜索:0x3:正則化與交叉驗證 - 緩解過擬合的發生

李航《統計學習方法》中指出:結構風險最小化等價於正則化

筆者思考:實際上,筆者認爲,結構風險最小化等於 正則化、CART/ID3樹剪枝、深度神經網絡Dropout、CNN卷積網絡Maxpool、引入先驗分佈的貝葉斯估計,等等。它們都體現告終構化最小化的思想

但同時,筆者也但願提醒讀者:結構化風險最小是一個很是「實用」的策略,它在不少狀況下確實能發揮很好的效果。可是不必定100%全部的場景都須要簡單模型,有時候咱們偏偏就須要訓練一個複雜模型,當咱們遇到欠擬合問題的時候,就要慎重使用結構化最小化策略了

Relevant Link:

https://blog.csdn.net/zhihua_oba/article/details/78728880

 

6. 非線性模型中的正則化

0x1:決策樹中的正則化

關於決策樹的剪枝相關的討論,讀者能夠參閱relevant link中的文章,這裏就不贅述了。

Relevant Link:

https://www.cnblogs.com/LittleHann/p/7309511.html

 

7. 從概念描述空間看泛化問題

0x1:什麼是概念描述空間

概念描述空間(concept description splace)是機器學習模型學習的結果,由一組規則表示。例以下列一組有關天氣問題的規則:

帶有數值屬性的天氣數據

假設機器學習數據中提取出的規則以下:

注意,對於一組數據集來講,其中包含的規則集每每不僅一個,全部的規則集共同組成了表明特定問題域的概念描述空間

  • 記憶性規則集:最極端的狀況下,對每一個樣本生成一個對應的規則,這樣模型僅僅只是存儲和記憶了原始數據集。
  • 歸納泛化型規則集:最完美的狀況下,從全部樣本中提取出一個惟一的規則集。這個規則集能夠完美歸納訓練數據集,同時在測試集和將來的未知數據上也能有很好的表現。

0x2:訓練學習的本質 - 枚舉概念空間

機器學習模型訓練的最核心目標就是獲得一個泛化性能優良的模型。而泛化的過程能夠認爲是在一個龐大的,但有限的搜索空間中進行搜索

1. 理想狀況下的泛化訓練過程

原則上,能夠枚舉全部的描述,從中刪除一些不符合樣本的描述來解決問題:

  • 一個確定的樣本會去除全部不匹配的描述;
  • 而一個否認的樣本則會去除全部匹配的描述;

每一個樣本都會致使剩餘的描述集縮小(或保持不變),若是訓練到最後只剩下一個描述,那麼它就是目標描述(目標概念)。

2. 真實狀況下的訓練過程

在實際狀況中,整個處理過程只涵蓋惟一一個可接受的描述是不多見的,因此會產生兩種狀況:

  • 樣本在處理後,仍然存在大量的描述,模型不肯定熵依然很高
  • 或者全部的描述都被去除

出現第一種狀況的緣由是沒有充分理解樣本,因此除」正確的描述「以外,其他的描述沒有被去除。

出現第二種狀況的緣由是由於描述語言表達不充分,不能把握住真正的概念,也便是模型逼近偏差(欠擬合)。或者是由於樣本中有噪聲。

可是須要注意的是,若是剩下多個描述,仍然能夠用來對未知的事物進行分類:

  • 若是未知的事物與全部剩餘的描述集相匹配,就應該將其分到所匹配的目標
  • 若是未知的事物不能和其中任何一個相匹配,就把它分到目標概念之外
  • 若是未知的事物僅和其中一部分相匹配,就會出現模糊,也就是咱們常說的誤報和漏報的零和博弈。

0x3:從搜索角度看誤差

把泛化當作是一個在全部可能的概念空間的搜索,就能夠清楚地指出在機器學習系統裏最重要的3大決策因素:

  • 概念描述語言:例如CART4結構或線性迴歸方程結構
  • 在空間中搜索的次序:啓發式仍是梯度導向式
  • 對於特定訓練數據避免過分擬合的方法

當討論搜索的誤差時,一般提到3個屬性:

  • 語言誤差(language bias)
  • 搜索誤差(search bias)
  • 避免過分擬合誤差(overfitting-avoidance bias)

在選擇一種表達概念的語言時、在爲一個能夠接受的描述搜索一個特殊途徑時、在須要對一個複雜的概念進行簡化時,都會使學習方案產生誤差。

1. 語言誤差

對於語言誤差來講,最重要的問題是概念描述語言是否具備廣泛性,或者它是否在可以被學到的概念上加約束條件。

若是考慮一個包含全部可能性的樣本集,那麼概念就是將這個集合劃分爲多個子集的分界線。

若是概念描述語言容許包括邏輯或(析取),那麼任何一個子集都能表示。若是描述語言是基於規則的,那使用分開的規則就可以達到分離的目的。

2. 搜索誤差

在實際的數據挖掘問題中,存在一些可選的概念描述,它們都與數據相匹配,咱們每每須要根據某些標準(一般是最簡單的標準)找出」最好的「一個概念描述。

咱們使用統計學的術語擬合(fit),意味着尋找一個與數據合理擬合的最好的描述。可是,在整個空間進行搜索一般是計算不可行的,因此搜索過程是啓發式的,而且不能100%保證最終結構是最優的。

這爲產生誤差創造了空間,不一樣的搜索啓發方式以不一樣的方式在搜索過程當中產生誤差。例如:

  • 採用」貪心(greedy)「搜索策略的搜索:在每一階段找出最好的規則,而後將其加入規則集。可是問題是,1+1不必定>=2,最好的一對規則並非單獨兩個最好規則的簡單疊加。
  • 構造決策樹:最早做出的基於一個特定屬性的分割。可是問題是,在後續節點構建時會發現,父節點的選擇並非一個好的決定
  • ......

3. 避免過分擬合誤差

過分擬合是一種常見的學習現象,一般解決這個問題的辦法是從一個最簡單的概念描述出發,逐漸將它複雜化。這是一種避免過分擬合的好方法,有時候稱之爲正向剪枝(forward pruning)或先剪枝(prepruning)。

與此相對的,另外一種方法稱之爲反向剪枝(backward pruning)或後剪枝(post-pruning)。

直觀上看,」誤差「是一個貶義詞,」避免過分擬合誤差「表面上看給模型帶來了不安定的誤差因素,但反過來,也正是由於這種誤差,給模型帶來了更好的泛化能力。咱們須要對立客觀地看待這兩個概念。

相關文章
相關標籤/搜索