機器學習之正則化(Regularization)
1. The Problem of Overfitting
1
還是來看預測房價的這個例子,我們先對該資料做線性迴歸,也就是左邊第一張圖。
如果這麼做,我們可以獲得擬合數據的這樣一條直線,但是,實際上這並不是一個很好的模型。我們看看這些資料,很明顯,隨著房子面積增大,住房價格的變化趨於穩定或者說越往右越平緩。因此線性迴歸並沒有很好擬合訓練資料。
我們把此類情況稱為欠擬合(underfitting),或者叫作叫做高偏差(bias)。
這兩種說法大致相似,都表示沒有很好地擬合訓練資料。高偏差這個詞是 machine learning 的研究初期傳下來的一個專業名詞,具體到這個問題,意思就是說如果用線性迴歸這個演算法去擬合訓練資料,那麼該演算法實際上會產生一個非常大的偏差或者說存在一個很強的偏見。
第二幅圖,我們在中間加入一個二次項,也就是說對於這幅資料我們用二次函式去擬合。自然,可以擬合出一條曲線,事實也證明這個擬合效果很好。
另一個極端情況是,如果在第三幅圖中對於該資料集用一個四次多項式來擬合。因此在這裡我們有五個引數θ0到θ4,這樣我們同樣可以擬合一條曲線,通過我們的五個訓練樣本,我們可以得到如右圖的一條曲線。
一方面,我們似乎對訓練資料做了一個很好的擬合,因為這條曲線通過了所有的訓練例項。但是,這實際上是一條很扭曲的曲線,它不停上下波動。因此,事實上我們並不認為它是一個預測房價的好模型。
所以,我們把這類情況叫做過擬合(overfitting),也叫高方差(variance)。
與高偏差一樣,高方差同樣也是一個歷史上的叫法。從第一印象上來說,如果我們擬合一個高階多項式,那麼這個函式能很好的擬合訓練集(能擬合幾乎所有的訓練資料),但這也就面臨函式可能太過龐大的問題,變數太多。
同時如果我們沒有足夠的資料集(訓練集)去約束這個變數過多的模型,那麼就會發生過擬合。
2
過度擬合的問題通常發生在變數(特徵)過多的時候。這種情況下訓練出的方程總是能很好的擬合訓練資料,也就是說,我們的代價函式可能非常接近於 0 或者就為 0。
但是,這樣的曲線千方百計的去擬合訓練資料,這樣會導致它無法泛化到新的資料樣本中,以至於無法預測新樣本價格。在這裡,術語"泛化"指的是一個假設模型能夠應用到新樣本的能力。
之前,我們看到了線性迴歸情況下的過擬合。類似的情況也適用於邏輯迴歸。
3
那麼,如果發生了過擬合問題,我們應該如何處理?
過多的變數(特徵),同時只有非常少的訓練資料,會導致出現過度擬合的問題。因此為了解決過度擬合,有以下兩個辦法。
方法一:儘量減少選取變數的數量
具體而言,我們可以人工檢查每一項變數,並以此來確定哪些變數更為重要,然後,保留那些更為重要的特徵變數。至於,哪些變數應該捨棄,我們以後在討論,這會涉及到模型選擇演算法,這種演算法是可以自動選擇採用哪些特徵變數,自動捨棄不需要的變數。這類做法非常有效,但是其缺點是當你捨棄一部分特徵變數時,你也捨棄了問題中的一些資訊。例如,也許所有的特徵變數對於預測房價都是有用的,我們實際上並不想捨棄一些資訊或者說捨棄這些特徵變數。
方法二:正則化
正則化中我們將保留所有的特徵變數,但是會減小特徵變數的數量級(引數數值的大小θ(j))。
這個方法非常有效,當我們有很多特徵變數時,其中每一個變數都能對預測產生一點影響。正如我們在房價預測的例子中看到的那樣,我們可以有很多特徵變數,其中每一個變數都是有用的,因此我們不希望把它們刪掉,這就導致了正則化概念的發生。
接下來我們會討論怎樣應用正則化和什麼叫做正則化均值,然後將開始討論怎樣使用正則化來使學習演算法正常工作,並避免過擬合。
2. Cost Function
1
在前面的介紹中,我們看到了如果用一個二次函式來擬合這些資料,那麼它給了我們一個對資料很好的擬合。然而,如果我們用一個更高次的多項式去擬合,最終我們可能會得到一個曲線,它能很好地擬合訓練集,但卻並不是一個好的結果,因為它過度擬合了資料,因此,一般性並不是很好。
讓我們考慮下面的假設,我們想要加上懲罰項,從而使引數 θ3 和 θ4 足夠的小。
這裡我的意思就是,上圖的式子是我們的優化目標,也就是說我們需要儘量減少代價函式的均方誤差。
對於這個函式我們對它新增一些項,加上 1000 乘以 θ3 的平方,再加上 1000 乘以 θ4 的平方,
1000 只是我隨便寫的某個較大的數字而已。現在,如果我們要最小化這個函式,那麼為了最小化這個新的代價函式,我們要讓 θ3 和 θ4 儘可能小。因為,如果你在原有代價函式的基礎上加上 1000 乘以 θ3 這一項 ,那麼這個新的代價函式將變得很大,所以,當我們最小化這個新的代價函式時, 我們將使 θ3 的值接近於 0,同樣 θ4 的值也接近於 0,就像我們忽略了這兩個值一樣。如果我們做到這一點( θ3 和 θ4 接近 0 ),那麼我們將得到一個近似的二次函式。
因此,我們最終恰當地擬合了資料,我們所使用的正是二次函式加上一些非常小,貢獻很小項(因為這些項的 θ3、 θ4 非常接近於0)。顯然,這是一個更好的假設。
2
更一般地,這裡給出了正規化背後的思路。這種思路就是,如果我們的引數值對應一個較小值的話(引數值比較小),那麼往往我們會得到一個形式更簡單的假設。
在我們上面的例子中,我們懲罰的只是 θ3 和 θ4 ,使這兩個值均接近於零,從而我們得到了一個更簡單的假設,實際上這個假設大抵上是一個二次函式。
但更一般地說,如果我們像懲罰 θ3 和 θ4 這樣懲罰其它引數,那麼我們往往可以得到一個相對較為簡單的假設。
實際上,這些引數的值越小,通常對應于越光滑的函式,也就是更加簡單的函式。因此 就不易發生過擬合的問題。
我知道,為什麼越小的引數對應於一個相對較為簡單的假設,對你來說現在不一定完全理解,但是在上面的例子中使 θ3 和 θ4 很小,並且這樣做能給我們一個更加簡單的假設,這個例子至少給了我們一些直觀感受。
來讓我們看看具體的例子,對於房屋價格預測我們可能有上百種特徵,與剛剛所講的多項式例子不同,我們並不知道 θ3 和 θ4 是高階多項式的項。所以,如果我們有一百個特徵,我們並不知道如何選擇關聯度更好的引數,如何縮小引數的數目等等。
因此在正則化裡,我們要做的事情,就是把減小我們的代價函式(例子中是線性迴歸的代價函式)所有的引數值,因為我們並不知道是哪一個或哪幾個要去縮小。
因此,我們需要修改代價函式,在這後面新增一項,就像我們在方括號裡的這項。當我們新增一個額外的正則化項的時候,我們收縮了每個引數。
順便說一下,按照慣例,我們沒有去懲罰 θ0,因此 θ0 的值是大的。這就是一個約定從 1 到 n 的求和,而不是從 0 到 n 的求和。但其實在實踐中
這隻會有非常小的差異,無論你是否包括這 θ0 這項。但是按照慣例,通常情況下我們還是隻從 θ1 到 θn 進行正則化。
下面的這項就是一個正則化項
λ 要做的就是控制在兩個不同的目標中的平衡關係。
第一個目標就是我們想要訓練,使假設更好地擬合訓練資料。我們希望假設能夠很好的適應訓練集。
而第二個目標是我們想要保持引數值較小。(通過正則化項)
而 λ 這個正則化引數需要控制的是這兩者之間的平衡,即平衡擬合訓練的目標和保持引數值較小的目標。從而來保持假設的形式相對簡單,來避免過度的擬合。
對於我們的房屋價格預測來說,我們之前所用的非常高的高階多項式來擬合,我們將會得到一個非常彎曲和複雜的曲線函式,現在我們只需要使用正則化目標的方法,那麼你就可以得到一個更加合適的曲線,但這個曲線不是一個真正的二次函式,而是更加的流暢和簡單的一個曲線。這樣就得到了對於這個資料更好的假設。
再一次說明下,這部分內容的確有些難以明白,為什麼加上引數的影響可以具有這種效果?但如果你親自實現了正規化,你將能夠看到這種影響的最直觀的感受。
3
在正則化線性迴歸中,如果正則化引數值 λ 被設定為非常大,那麼將會發生什麼呢?
我們將會非常大地懲罰引數θ1 θ2 θ3 θ4 … 也就是說,我們最終懲罰θ1 θ2 θ3 θ4 … 在一個非常大的程度,那麼我們會使所有這些引數接近於零。
如果我們這麼做,那麼就是我們的假設中相當於去掉了這些項,並且使我們只是留下了一個簡單的假設,這個假設只能表明房屋價格等於 θ0 的值,那就是類似於擬合了一條水平直線,對於資料來說這就是一個欠擬合 (underfitting)。這種情況下這一假設它是條失敗的直線,對於訓練集來說這只是一條平滑直線,它沒有任何趨勢,它不會去趨向大部分訓練樣本的任何值。
這句話的另一種方式來表達就是這種假設有過於強烈的"偏見" 或者過高的偏差 (bais),認為預測的價格只是等於 θ0 。對於資料來說這只是一條水平線。
因此,為了使正則化運作良好,我們應當注意一些方面,應該去選擇一個不錯的正則化引數 λ 。當我們以後講到多重選擇時我們將討論一種方法來自動選擇正則化引數 λ ,為了使用正則化,接下來我們將把這些概念應用到到線性迴歸和邏輯迴歸中去,那麼我們就可以讓他們避免過度擬合了。
3. Regularized Linear Regression
之前我們已經介紹過,嶺迴歸的代價函式如下:
對於線性迴歸(的求解),我們之前運用了兩種學習演算法,一種基於梯度下降,一種基於正規方程。
1
梯度下降,如下:
2
正規方程,如下:
3
現在考慮 M(即樣本量), 比 N(即特徵的數量)小或等於N。
通過之前的博文,我們知道如果你只有較少的樣本,導致特徵數量大於樣本數量,那麼矩陣 XTX 將是不可逆矩陣或奇異(singluar)矩陣,或者用另一種說法是這個矩陣是退化(degenerate)的,那麼我們就沒有辦法使用正規方程來求出 θ 。
幸運的是,正規化也為我們解決了這個問題,具體的說只要正則引數是嚴格大於零,實際上,可以證明如下矩陣:
將是可逆的。因此,使用正則還可以照顧任何 XTX 不可逆的問題。
所以,你現在知道如何實現嶺迴歸,利用它,你就可以避免過度擬合,即使你在一個相對較小的訓練集裡有很多特徵。這應該可以讓你在很多問題上更好的運用線性迴歸。
在接下來的視訊中,我們將把這種正則化的想法應用到 Logistic 迴歸,這樣我們就可以讓 logistic 迴歸也避免過度擬合,從而表現的更好。
4. Regularized Logistic Regression
Regularized Logistic Regression 實際上與 Regularized Linear Regression 是十分相似的。
同樣使用梯度下降:
如果在高階優化演算法中,使用正則化技術的話,那麼對於這類演算法我們需要自己定義costFunction。
For those methods what we needed to do was to define the function that's called the cost function.
這個我們自定義的 costFunction 的輸入為向量 θ ,返回值有兩項,分別是代價函式 jVal 以及 梯度gradient。
總之我們需要的就是這個自定義函式costFunction,針對Octave而言,我們可以將這個函式作為引數傳入到 fminunc 系統函式中(fminunc 用來求函式的最小值,將@costFunction作為引數代進去,注意 @costFunction 類似於C語言中的函式指標),fminunc返回的是函式 costFunction 在無約束條件下的最小值,即我們提供的代價函式 jVal 的最小值,當然也會返回向量 θ 的解。
上述方法顯然對正則化邏輯迴歸是適用的。
5. 尾聲
通過最近的幾篇文章,我們不難發現,無論是線性迴歸問題還是邏輯迴歸問題都可以通過構造多項式來解決。但是,你將逐漸發現其實還有更為強大的非線性分類器可以用來解決多項式迴歸問題。下篇文章中,我們將會討論。
相關推薦
機器學習之正則化(Regularization)
1. The Problem of Overfitting 1 還是來看預測房價的這個例子,我們先對該資料做線性迴歸,也就是左邊第一張圖。 如果這麼做,我們可以獲得擬合數據的這樣一條直線,但是,實際上這並不是一個很好的模型。我們看看這些資料,很明顯,隨著房子面積增大,住房價格的變化趨於穩定或者說越往右越平緩
機器學習筆記——正則化(regularization)
正則化 過擬合 我們在利用資料來進行曲線擬合的時候會出現三種情況,欠擬合(underfitting),合適(just right),過擬合(overfitting)。欠擬合的情況一般是由於變數太少,而過擬合的原因一般是變數太多 下面我們主要考慮過擬合的問題。過擬合的解決方法一
系統學習機器學習之正則化(二)
監督機器學習問題無非就是“minimizeyour error while regularizing your parameters”,也就是在規則化引數的同時最小化誤差。最小化誤差是為了讓我們的模型擬合我們的訓練資料,而規則化引數是防止我們的模型過分擬合我們的訓練資料。多麼簡約的哲學啊!因為引數太多,會導致
機器學習中的正則化(Regularization)
參考知乎回答:https://www.zhihu.com/question/20924039 以及部落格 https://blog.csdn.net/jinping_shi/article/details/52433975 定義&用途 經常能在L
機器學習筆記4:正則化(Regularization)
機器學習筆記4:正則化(Regularization) Andrew Ng機器學習課程學習筆記4 過擬合與欠擬合 線性擬合時,有兩種擬合效果不好的情況,分別是過擬合與欠擬合。 過擬合(overfitting),也叫高方差(variance)。主要是擬合曲線過於彎曲,雖然
為什麼正則化(Regularization)可以減少過擬合風險
在解決實際問題的過程中,我們會傾向於用複雜的模型來擬合複雜的資料,但是使用複雜模型會產生過擬合的風險,而正則化就是常用的減少過擬合風險的工具之一。過擬合過擬合是指模型在訓練集上誤差很小,但是在測試集上表現很差(即泛化能力差),過擬合的原因一般是由於資料中存在噪聲或者用了過於複
正則化(regularization)
一、過擬合(overfitting)問題 上圖是房價(Price)與房子面積(Size)的關係的例項。我們的目標是利用多項式迴歸來根據房子面積來預測房價。 左邊的模型僅用了一次項,此時模型引數有倆θ0、θ1,是一條直線;直觀的觀察樣本點(紅色×)的趨勢,我們發現該模型並不
資料預處理中歸一化(Normalization)與損失函式中正則化(Regularization)解惑
背景:資料探勘/機器學習中的術語較多,而且我的知識有限。之前一直疑惑正則這個概念。所以寫了篇博文梳理下 摘要: 1.正則化(Regularization) 1.1 正則化的目的 1.2 結構風險最小化(SRM)理論 1.3 L1範數
深度學習之正則化系列(2):資料集增強(資料增廣)
讓機器學習模型泛化得更好的最好辦法是使用更多的資料進行訓練。當然,在實踐中,我們擁有的資料量是很有限的。解決這個問題的一種方法是建立假資料並新增到訓練集中。對於一些機器學習任務,建立新的假資料相當簡單。對分類來說這種方法是最簡單的。分類器需要一個複雜的高維輸入
機器學習5 正則化的線性迴歸(Regularized Linear Regression)和偏差對方差(Bias v.s. Variance)
在這篇博文中我們將會實現正則化的線性迴歸以及利用他去學習模型,不同的模型會具有不同的偏差-方差性質,我們將研究正則化以及偏差和方差之間的相互關係和影響。 這一部分的資料是關於通過一個水庫的水位來預測水庫的流水量。為了進行偏差和方差的檢驗,這裡用12組資料進行迴
機器學習基礎(三十) —— 線性迴歸、正則化(regularized)線性迴歸、區域性加權線性迴歸(LWLR)
1. 線性迴歸 線性迴歸根據最小二乘法直接給出權值向量的解析解(closed-form solution): w=(XTX)−1XTy 線性迴歸的一個問題就是有可能出現欠擬合現象,因為它求的是具有最小均方誤差(LSE,Least Square Erro
機器學習:正則化技術
正則化(regularization)技術是機器學習中十分常用的技術,它在不同的模型或者情景中以不同的名字出現,比如以L2正則化為例,如果將L2正則化用於linear regression,那麼這就對應了ridge regression;如果將L2正則化用於神經網路(neural network),
【機器學習】正則化方法
正則化方法:L1和L2 regularization、資料集擴增、dropout 正則化方法:防止過擬合,提高泛化能力,減少部分特徵的權重,進而忽略部分無關緊要的特徵。因為考慮全部特徵會將噪聲加入進去,也就導致過擬合。 在訓練資料不夠多時,或者overtraining時,常常會導致overf
深度學習:正則化(L2、dropout)
一、在瞭解正則化之前,先引入一個概念“過擬合” 定義 給定一個假設空間H,一個假設h屬於H,如果存在其他的假設h’屬於H,使得在訓練樣例上h的錯誤率比h’小,但在整個例項分佈上h’比h的錯誤率小,那麼就說假設h過度擬合訓練資料。 也就是說 一個假設在訓練資料上能夠獲
[work*] 機器學習中正則化項L1和L2的直觀理解
正則化(Regularization) 機器學習中幾乎都可以看到損失函式後面會新增一個額外項,常用的額外項一般有兩種,一般英文稱作-norm和-norm,中文稱作L1正則化和L2正則化,或者L1範數和L2範數。 L1正則化和L2正則化可以看做是損失函式的懲罰項。所謂『懲罰
【機器學習】正則化的線性迴歸 —— 嶺迴歸與Lasso迴歸
注:正則化是用來防止過擬合的方法。在最開始學習機器學習的課程時,只是覺得這個方法就像某種魔法一樣非常神奇的改變了模型的引數。但是一直也無法對其基本原理有一個透徹、直觀的理解。直到最近再次接觸到這個概念,經過一番苦思冥想後終於有了我自己的理解。 0. 正則化(
theano學習之正則化
先上程式碼: from __future__ import print_function import theano from sklearn.datasets import load_boston#波士頓房價資料 import theano.tensor as T import numpy a
機器學習中正則化項L1和L2的直觀理解
正則化(Regularization) 機器學習中幾乎都可以看到損失函式後面會新增一個額外項,常用的額外項一般有兩種,一般英文稱作ℓ1ℓ1-norm和ℓ2ℓ2-norm,中文稱作L1正則化和L2正則化,或者L1範數和L2範數。 L1正則化和L2正則化可以看做
斯坦福大學機器學習筆記——正則化的邏輯迴歸模型
在上面部落格中我們討論了正則化的線性迴歸模型,下面我們來討論一下正則化的邏輯迴歸模型。 前面我們講述了兩種常用於邏輯迴歸的方法: 基於梯度下降法的邏輯迴歸模型 基於高階優化的邏輯迴歸模型 基於
機器學習 LogsticRegression 正則化(matlab實現)
仍然使用之前的根據學生兩學期分數,預測錄取情況主程式:X = load('ex4x.dat'); y = load('ex4y.dat'); plotData(X,y); [m,n] = size(X)