天天看點

L0,L1,L2正則化淺析

機器學習中的範數規則化之(一)L0、L1與L2範數

[email protected]

http://blog.csdn.net/zouxy09

       今天我們聊聊機器學習中出現的非常頻繁的問題:過拟合與規則化。我們先簡單的來了解下常用的L0、L1、L2和核範數規則化。最後聊下規則化項參數的選擇問題。這裡因為篇幅比較龐大,為了不吓到大家,我将這個五個部分分成兩篇博文。知識有限,以下都是我一些淺顯的看法,如果了解存在錯誤,希望大家不吝指正。謝謝。

       監督機器學習問題無非就是“minimizeyour error while regularizing your parameters”,也就是在規則化參數的同時最小化誤差。最小化誤差是為了讓我們的模型拟合我們的訓練資料,而規則化參數是防止我們的模型過分拟合我們的訓練資料。多麼簡約的哲學啊!因為參數太多,會導緻我們的模型複雜度上升,容易過拟合,也就是我們的訓練誤差會很小。但訓練誤差小并不是我們的最終目标,我們的目标是希望模型的測試誤差小,也就是能準确的預測新的樣本。是以,我們需要保證模型“簡單”的基礎上最小化訓練誤差,這樣得到的參數才具有好的泛化性能(也就是測試誤差也小),而模型“簡單”就是通過規則函數來實作的。另外,規則項的使用還可以限制我們的模型的特性。這樣就可以将人對這個模型的先驗知識融入到模型的學習當中,強行地讓學習到的模型具有人想要的特性,例如稀疏、低秩、平滑等等。要知道,有時候人的先驗是非常重要的。前人的經驗會讓你少走很多彎路,這就是為什麼我們平時學習最好找個大牛帶帶的原因。一句點撥可以為我們撥開眼前烏雲,還我們一片晴空萬裡,醍醐灌頂。對機器學習也是一樣,如果被我們人稍微點撥一下,它肯定能更快的學習相應的任務。隻是由于人和機器的交流目前還沒有那麼直接的方法,目前這個媒介隻能由規則項來擔當了。

       還有幾種角度來看待規則化的。規則化符合奧卡姆剃刀(Occam's razor)原理。這名字好霸氣,razor!不過它的思想很平易近人:在所有可能選擇的模型中,我們應該選擇能夠很好地解釋已知資料并且十分簡單的模型。從貝葉斯估計的角度來看,規則化項對應于模型的先驗機率。民間還有個說法就是,規則化是結構風險最小化政策的實作,是在經驗風險上加一個正則化項(regularizer)或懲罰項(penalty term)。

       一般來說,監督學習可以看做最小化下面的目标函數:

L0,L1,L2正則化淺析

       其中,第一項L(yi,f(xi;w)) 衡量我們的模型(分類或者回歸)對第i個樣本的預測值f(xi;w)和真實的标簽yi之前的誤差。因為我們的模型是要拟合我們的訓練樣本的嘛,是以我們要求這一項最小,也就是要求我們的模型盡量的拟合我們的訓練資料。但正如上面說言,我們不僅要保證訓練誤差最小,我們更希望我們的模型測試誤差小,是以我們需要加上第二項,也就是對參數w的規則化函數Ω(w)去限制我們的模型盡量的簡單。

        OK,到這裡,如果你在機器學習浴血奮戰多年,你會發現,哎喲喲,機器學習的大部分帶參模型都和這個不但形似,而且神似。是的,其實大部分無非就是變換這兩項而已。對于第一項Loss函數,如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是exp-Loss,那就是牛逼的 Boosting了;如果是log-Loss,那就是Logistic Regression了;還有等等。不同的loss函數,具有不同的拟合特性,這個也得就具體問題具體分析的。但這裡,我們先不究loss函數的問題,我們把目光轉向“規則項Ω(w)”。

       規則化函數Ω(w)也有很多種選擇,一般是模型複雜度的單調遞增函數,模型越複雜,規則化值就越大。比如,規則化項可以是模型參數向量的範數。然而,不同的選擇對參數w的限制不同,取得的效果也不同,但我們在論文中常見的都聚集在:零範數、一範數、二範數、迹範數、Frobenius範數和核範數等等。這麼多範數,到底它們表達啥意思?具有啥能力?什麼時候才能用?什麼時候需要用呢?不急不急,下面我們挑幾個常見的娓娓道來。

一、L0範數與L1範數

       L0範數是指向量中非0的元素的個數。如果我們用L0範數來規則化一個參數矩陣W的話,就是希望W的大部分元素都是0。這太直覺了,太露骨了吧,換句話說,讓參數W是稀疏的。OK,看到了“稀疏”二字,大家都應該從當下風風火火的“壓縮感覺”和“稀疏編碼”中醒悟過來,原來用的漫山遍野的“稀疏”就是通過這玩意來實作的。但你又開始懷疑了,是這樣嗎?看到的papers世界中,稀疏不是都通過L1範數來實作嗎?腦海裡是不是到處都是||W||1影子呀!幾乎是擡頭不見低頭見。沒錯,這就是這節的題目把L0和L1放在一起的原因,因為他們有着某種不尋常的關系。那我們再來看看L1範數是什麼?它為什麼可以實作稀疏?為什麼大家都用L1範數去實作稀疏,而不是L0範數呢?

       L1範數是指向量中各個元素絕對值之和,也有個美稱叫“稀疏規則算子”(Lasso regularization)。現在我們來分析下這個價值一個億的問題:為什麼L1範數會使權值稀疏?有人可能會這樣給你回答“它是L0範數的最優凸近似”。實際上,還存在一個更美的回答:任何的規則化算子,如果他在Wi=0的地方不可微,并且可以分解為一個“求和”的形式,那麼這個規則化算子就可以實作稀疏。這說是這麼說,W的L1範數是絕對值,|w|在w=0處是不可微,但這還是不夠直覺。這裡因為我們需要和L2範數進行對比分析。是以關于L1範數的直覺了解,請待會看看第二節。

       對了,上面還有一個問題:既然L0可以實作稀疏,為什麼不用L0,而要用L1呢?個人了解一是因為L0範數很難優化求解(NP難問題),二是L1範數是L0範數的最優凸近似,而且它比L0範數要容易優化求解。是以大家才把目光和萬千寵愛轉于L1範數。

L0,L1,L2正則化淺析

       OK,來個一句話總結:L1範數和L0範數可以實作稀疏,L1因具有比L0更好的優化求解特性而被廣泛應用。

       好,到這裡,我們大概知道了L1可以實作稀疏,但我們會想呀,為什麼要稀疏?讓我們的參數稀疏有什麼好處呢?這裡扯兩點:

1)特征選擇(Feature Selection):

       大家對稀疏規則化趨之若鹜的一個關鍵原因在于它能實作特征的自動選擇。一般來說,xi的大部分元素(也就是特征)都是和最終的輸出yi沒有關系或者不提供任何資訊的,在最小化目标函數的時候考慮xi這些額外的特征,雖然可以獲得更小的訓練誤差,但在預測新的樣本時,這些沒用的資訊反而會被考慮,進而幹擾了對正确yi的預測。稀疏規則化算子的引入就是為了完成特征自動選擇的光榮使命,它會學習地去掉這些沒有資訊的特征,也就是把這些特征對應的權重置為0。

2)可解釋性(Interpretability):

       另一個青睐于稀疏的理由是,模型更容易解釋。例如患某種病的機率是y,然後我們收集到的資料x是1000維的,也就是我們需要尋找這1000種因素到底是怎麼影響患上這種病的機率的。假設我們這個是個回歸模型:y=w1*x1+w2*x2+…+w1000*x1000+b(當然了,為了讓y限定在[0,1]的範圍,一般還得加個Logistic函數)。通過學習,如果最後學習到的w*就隻有很少的非零元素,例如隻有5個非零的wi,那麼我們就有理由相信,這些對應的特征在患病分析上面提供的資訊是巨大的,決策性的。也就是說,患不患這種病隻和這5個因素有關,那醫生就好分析多了。但如果1000個wi都非0,醫生面對這1000種因素,累覺不愛。

二、L2範數

       除了L1範數,還有一種更受寵幸的規則化範數是L2範數: ||W||2。它也不遜于L1範數,它有兩個美稱,在回歸裡面,有人把有它的回歸叫“嶺回歸”(Ridge Regression),有人也叫它“權值衰減weight decay”。這用的很多吧,因為它的強大功效是改善機器學習裡面一個非常重要的問題:過拟合。至于過拟合是什麼,上面也解釋了,就是模型訓練時候的誤差很小,但在測試的時候誤差很大,也就是我們的模型複雜到可以拟合到我們的所有訓練樣本了,但在實際預測新的樣本的時候,糟糕的一塌糊塗。通俗的講就是應試能力很強,實際應用能力很差。擅長背誦知識,卻不懂得靈活利用知識。例如下圖所示(來自Ng的course):

L0,L1,L2正則化淺析

       上面的圖是線性回歸,下面的圖是Logistic回歸,也可以說是分類的情況。從左到右分别是欠拟合(underfitting,也稱High-bias)、合适的拟合和過拟合(overfitting,也稱High variance)三種情況。可以看到,如果模型複雜(可以拟合任意的複雜函數),它可以讓我們的模型拟合所有的資料點,也就是基本上沒有誤差。對于回歸來說,就是我們的函數曲線通過了所有的資料點,如上圖右。對分類來說,就是我們的函數曲線要把所有的資料點都分類正确,如下圖右。這兩種情況很明顯過拟合了。

L0,L1,L2正則化淺析

       OK,那現在到我們非常關鍵的問題了,為什麼L2範數可以防止過拟合?回答這個問題之前,我們得先看看L2範數是個什麼東西。

       L2範數是指向量各元素的平方和然後求平方根。我們讓L2範數的規則項||W||2最小,可以使得W的每個元素都很小,都接近于0,但與L1範數不同,它不會讓它等于0,而是接近于0,這裡是有很大的差別的哦。而越小的參數說明模型越簡單,越簡單的模型則越不容易産生過拟合現象。為什麼越小的參數說明模型越簡單?我也不懂,我的了解是:限制了參數很小,實際上就限制了多項式某些分量的影響很小(看上面線性回歸的模型的那個拟合的圖),這樣就相當于減少參數個數。其實我也不太懂,希望大家可以指點下。

       這裡也一句話總結下:通過L2範數,我們可以實作了對模型空間的限制,進而在一定程度上避免了過拟合。

       L2範數的好處是什麼呢?這裡也扯上兩點:

1)學習理論的角度:

       從學習理論的角度來說,L2範數可以防止過拟合,提升模型的泛化能力。

2)優化計算的角度:

       從優化或者數值計算的角度來說,L2範數有助于處理 condition number不好的情況下矩陣求逆很困難的問題。哎,等等,這condition number是啥?我先google一下哈。

       這裡我們也故作高雅的來聊聊優化問題。優化有兩大難題,一是:局部最小值,二是:ill-condition病态問題。前者俺就不說了,大家都懂吧,我們要找的是全局最小值,如果局部最小值太多,那我們的優化算法就很容易陷入局部最小而不能自拔,這很明顯不是觀衆願意看到的劇情。那下面我們來聊聊ill-condition。ill-condition對應的是well-condition。那他們分别代表什麼?假設我們有個方程組AX=b,我們需要求解X。如果A或者b稍微的改變,會使得X的解發生很大的改變,那麼這個方程組系統就是ill-condition的,反之就是well-condition的。我們具體舉個例子吧:

L0,L1,L2正則化淺析

       咱們先看左邊的那個。第一行假設是我們的AX=b,第二行我們稍微改變下b,得到的x和沒改變前的差别很大,看到吧。第三行我們稍微改變下系數矩陣A,可以看到結果的變化也很大。換句話來說,這個系統的解對系數矩陣A或者b太敏感了。又因為一般我們的系數矩陣A和b是從實驗資料裡面估計得到的,是以它是存在誤差的,如果我們的系統對這個誤差是可以容忍的就還好,但系統對這個誤差太敏感了,以至于我們的解的誤差更大,那這個解就太不靠譜了。是以這個方程組系統就是ill-conditioned病态的,不正常的,不穩定的,有問題的,哈哈。這清楚了吧。右邊那個就叫well-condition的系統了。

       還是再啰嗦一下吧,對于一個ill-condition的系統,我的輸入稍微改變下,輸出就發生很大的改變,這不好啊,這表明我們的系統不能實用啊。你想想看,例如對于一個回歸問題y=f(x),我們是用訓練樣本x去訓練模型f,使得y盡量輸出我們期待的值,例如0。那假如我們遇到一個樣本x’,這個樣本和訓練樣本x差别很小,面對他,系統本應該輸出和上面的y差不多的值的,例如0.00001,最後卻給我輸出了一個0.9999,這很明顯不對呀。就好像,你很熟悉的一個人臉上長了個青春痘,你就不認識他了,那你大腦就太差勁了,哈哈。是以如果一個系統是ill-conditioned病态的,我們就會對它的結果産生懷疑。那到底要相信它多少呢?我們得找個标準來衡量吧,因為有些系統的病沒那麼重,它的結果還是可以相信的,不能一刀切吧。終于回來了,上面的condition number就是拿來衡量ill-condition系統的可信度的。condition number衡量的是輸入發生微小變化的時候,輸出會發生多大的變化。也就是系統對微小變化的敏感度。condition number值小的就是well-conditioned的,大的就是ill-conditioned的。

       如果方陣A是非奇異的,那麼A的conditionnumber定義為:

L0,L1,L2正則化淺析

       也就是矩陣A的norm乘以它的逆的norm。是以具體的值是多少,就要看你選擇的norm是什麼了。如果方陣A是奇異的,那麼A的condition number就是正無窮大了。實際上,每一個可逆方陣都存在一個condition number。但如果要計算它,我們需要先知道這個方陣的norm(範數)和Machine Epsilon(機器的精度)。為什麼要範數?範數就相當于衡量一個矩陣的大小,我們知道矩陣是沒有大小的,當上面不是要衡量一個矩陣A或者向量b變化的時候,我們的解x變化的大小嗎?是以肯定得要有一個東西來度量矩陣和向量的大小吧?對了,他就是範數,表示矩陣大小或者向量長度。OK,經過比較簡單的證明,對于AX=b,我們可以得到以下的結論:

L0,L1,L2正則化淺析

       也就是我們的解x的相對變化和A或者b的相對變化是有像上面那樣的關系的,其中k(A)的值就相當于倍率,看到了嗎?相當于x變化的界。

       對condition number來個一句話總結:conditionnumber是一個矩陣(或者它所描述的線性系統)的穩定性或者敏感度的度量,如果一個矩陣的condition number在1附近,那麼它就是well-conditioned的,如果遠大于1,那麼它就是ill-conditioned的,如果一個系統是ill-conditioned的,它的輸出結果就不要太相信了。

       好了,對這麼一個東西,已經說了好多了。對了,我們為什麼聊到這個的了?回到第一句話:從優化或者數值計算的角度來說,L2範數有助于處理 condition number不好的情況下矩陣求逆很困難的問題。因為目标函數如果是二次的,對于線性回歸來說,那實際上是有解析解的,求導并令導數等于零即可得到最優解為:

L0,L1,L2正則化淺析

       然而,如果當我們的樣本X的數目比每個樣本的次元還要小的時候,矩陣XTX将會不是滿秩的,也就是XTX會變得不可逆,是以w*就沒辦法直接計算出來了。或者更确切地說,将會有無窮多個解(因為我們方程組的個數小于未知數的個數)。也就是說,我們的資料不足以确定一個解,如果我們從所有可行解裡随機選一個的話,很可能并不是真正好的解,總而言之,我們過拟合了。

       但如果加上L2規則項,就變成了下面這種情況,就可以直接求逆了:

L0,L1,L2正則化淺析

       這裡面,專業點的描述是:要得到這個解,我們通常并不直接求矩陣的逆,而是通過解線性方程組的方式(例如高斯消元法)來計算。考慮沒有規則項的時候,也就是λ=0的情況,如果矩陣XTX的 condition number 很大的話,解線性方程組就會在數值上相當不穩定,而這個規則項的引入則可以改善condition number。

       另外,如果使用疊代優化的算法,condition number 太大仍然會導緻問題:它會拖慢疊代的收斂速度,而規則項從優化的角度來看,實際上是将目标函數變成λ-strongly convex(λ強凸)的了。哎喲喲,這裡又出現個λ強凸,啥叫λ強凸呢?

       當f滿足:

L0,L1,L2正則化淺析

       時,我們稱f為λ-stronglyconvex函數,其中參數λ>0。當λ=0時退回到普通convex 函數的定義。

       在直覺的說明強凸之前,我們先看看普通的凸是怎樣的。假設我們讓f在x的地方做一階泰勒近似(一階泰勒展開忘了嗎?f(x)=f(a)+f'(a)(x-a)+o(||x-a||).):

L0,L1,L2正則化淺析

       直覺來講,convex 性質是指函數曲線位于該點處的切線,也就是線性近似之上,而 strongly convex 則進一步要求位于該處的一個二次函數上方,也就是說要求函數不要太“平坦”而是可以保證有一定的“向上彎曲”的趨勢。專業點說,就是convex 可以保證函數在任意一點都處于它的一階泰勒函數之上,而strongly convex可以保證函數在任意一點都存在一個非常漂亮的二次下界quadratic lower bound。當然這是一個很強的假設,但是同時也是非常重要的假設。可能還不好了解,那我們畫個圖來形象的了解下。

L0,L1,L2正則化淺析

       大家一看到上面這個圖就全明白了吧。不用我啰嗦了吧。還是啰嗦一下吧。我們取我們的最優解w*的地方。如果我們的函數f(w),見左圖,也就是紅色那個函數,都會位于藍色虛線的那根二次函數之上,這樣就算wt和w*離的比較近的時候,f(wt)和f(w*)的值差别還是挺大的,也就是會保證在我們的最優解w*附近的時候,還存在較大的梯度值,這樣我們才可以在比較少的疊代次數内達到w*。但對于右圖,紅色的函數f(w)隻限制在一個線性的藍色虛線之上,假設是如右圖的很不幸的情況(非常平坦),那在wt還離我們的最優點w*很遠的時候,我們的近似梯度(f(wt)-f(w*))/(wt-w*)就已經非常小了,在wt處的近似梯度∂f/∂w就更小了,這樣通過梯度下降wt+1=wt-α*(∂f/∂w),我們得到的結果就是w的變化非常緩慢,像蝸牛一樣,非常緩慢的向我們的最優點w*爬動,那在有限的疊代時間内,它離我們的最優點還是很遠。

       是以僅僅靠convex 性質并不能保證在梯度下降和有限的疊代次數的情況下得到的點w會是一個比較好的全局最小點w*的近似點(插個話,有地方說,實際上讓疊代在接近最優的地方停止,也是一種規則化或者提高泛化性能的方法)。正如上面分析的那樣,如果f(w)在全局最小點w*周圍是非常平坦的情況的話,我們有可能會找到一個很遠的點。但如果我們有“強凸”的話,就能對情況做一些控制,我們就可以得到一個更好的近似解。至于有多好嘛,這裡面有一個bound,這個 bound 的好壞也要取決于strongly convex性質中的常數α的大小。看到這裡,不知道大家學聰明了沒有。如果要獲得strongly convex怎麼做?最簡單的就是往裡面加入一項(α/2)*||w||2。

       呃,講個strongly convex花了那麼多的篇幅。實際上,在梯度下降中,目标函數收斂速率的上界實際上是和矩陣XTX的 condition number有關,XTX的 condition number 越小,上界就越小,也就是收斂速度會越快。

這一個優化說了那麼多的東西。還是來個一句話總結吧:L2範數不但可以防止過拟合,還可以讓我們的優化求解變得穩定和快速。

       好了,這裡兌現上面的承諾,來直覺的聊聊L1和L2的差别,為什麼一個讓絕對值最小,一個讓平方最小,會有那麼大的差别呢?我看到的有兩種幾何上直覺的解析:

1)下降速度:

       我們知道,L1和L2都是規則化的方式,我們将權值參數以L1或者L2的方式放到代價函數裡面去。然後模型就會嘗試去最小化這些權值參數。而這個最小化就像一個下坡的過程,L1和L2的差别就在于這個“坡”不同,如下圖:L1就是按絕對值函數的“坡”下降的,而L2是按二次函數的“坡”下降。是以實際上在0附近,L1的下降速度比L2的下降速度要快。是以會非常快得降到0。不過我覺得這裡解釋的不太中肯,當然了也不知道是不是自己了解的問題。

L0,L1,L2正則化淺析

       L1在江湖上人稱Lasso,L2人稱Ridge。不過這兩個名字還挺讓人迷糊的,看上面的圖檔,Lasso的圖看起來就像ridge,而ridge的圖看起來就像lasso。

2)模型空間的限制:

       實際上,對于L1和L2規則化的代價函數來說,我們可以寫成以下形式:

L0,L1,L2正則化淺析

       也就是說,我們将模型空間限制在w的一個L1-ball 中。為了便于可視化,我們考慮兩維的情況,在(w1, w2)平面上可以畫出目标函數的等高線,而限制條件則成為平面上半徑為C的一個 norm ball 。等高線與 norm ball 首次相交的地方就是最優解:

L0,L1,L2正則化淺析

       可以看到,L1-ball 與L2-ball 的不同就在于L1在和每個坐标軸相交的地方都有“角”出現,而目标函數的測地線除非位置擺得非常好,大部分時候都會在角的地方相交。注意到在角的位置就會産生稀疏性,例如圖中的相交點就有w1=0,而更高維的時候(想象一下三維的L1-ball 是什麼樣的?)除了角點以外,還有很多邊的輪廓也是既有很大的機率成為第一次相交的地方,又會産生稀疏性。

       相比之下,L2-ball 就沒有這樣的性質,因為沒有角,是以第一次相交的地方出現在具有稀疏性的位置的機率就變得非常小了。這就從直覺上來解釋了為什麼L1-regularization 能産生稀疏性,而L2-regularization 不行的原因了。

       是以,一句話總結就是:L1會趨向于産生少量的特征,而其他的特征都是0,而L2會選擇更多的特征,這些特征都會接近于0。Lasso在特征選擇時候非常有用,而Ridge就隻是一種規則化而已。

       OK,就聊到這裡。下一篇博文我們聊聊核範數和規則化項參數選擇的問題。全篇的參考資料也請見下一篇博文,這裡不重複列出。謝謝

閱讀原文

繼續閱讀