機器學習中的正則化技術
正則化(regularization)技術是機器學習中十分常用的技術,它在不同的模型或者情景中以不同的名字出現,比如以L2正則化為例,如果將L2正則化用于linear regression,那么這就對應了ridge regression;如果將L2正則化用于神經網絡(neural network),那么L2對應為權重衰減(weight decay)。
正則化的作用實際上就是防止模型過擬合,提高模型的泛化能力。正則化的種類有很多,這里主要介紹在工程中用得較多的兩類正則化,一個是L1正則化,另一個則是L2正則化。為了配合闡述,本文用linear regression的正則化作為例子來貫穿全文。
當我們用linear regression在訓練數據集上訓練模型時,我們定義一個最優化目標函數:
(1)
式中(x(i), y(i))為訓練數據,w為線性模型的參數向量,為了使得模型能夠充分擬合訓練樣本點,我們希望上述目標函數的值盡可能小,即:
(2)
但是由于實際中的訓練數據量往往并不大,如果讓模型完美擬合訓練數據的話,很可能造成模型過擬合,從而使得模型的泛化能力較差。這一點可以從得到的模型參數向量w的各個分量中看出,其中大部分分量的絕對值都非常大,這種現象直觀表現在圖上就是曲線(曲面)不光滑,凹凸不平,很復雜;相反,如果w的各個分量的絕對值都很小,在0附近,那么曲線(曲面)就會顯得很平滑。很顯然,在機器學習中,我們更希望擬合出的曲線(曲面)更為平滑,因為這樣的曲線(曲面)是具有較好的泛化能力的。那么如何將w各個分量的絕對值降低呢?這就要用到正則化技術了。在用正則化技術估計參數w時,引入了我們對參數的先驗認知,即我們認為參數的絕對值應該很小。
正則化技術就是使得式(2)的值盡可能小,與此同時,要保證||w||的值也盡可能小,即:
(3)
在上式中,優化函數的目標變成了兩個,w的取值不僅要使得L(w)的值最小,也要使得||w||的值最小。從上式我們可以看出,一方面要使得L(w)的取值最小,必然w的絕對值會取到很大,這樣模型才能完美擬合訓練樣本點;另一方面,當w的絕對值很大時,||w||的值又會變得很大,因此為了權衡,只有使得w取值適當,才能保證式(3)的值取到最優。這樣得到的曲線(曲面)比式(2)得到的曲線(曲面)平滑很多,因此具有泛化能力。值得注意的是,式中的t是L(w)與||w||之間的一個trade-off,如果t過大,那么表明對模型參數w的懲罰越狠,這樣得到的模型處于欠擬合狀態,如果t過小,那么表明對模型參數w的懲罰越小,這樣得到的模型處于過擬合狀態,只有選擇合適的t,才能使得到的模型具有很好地泛化能力。關于如何選擇t的值,工程上一般采取交叉驗證的方式來確定一個較合理的t。
我們先來看L2正則化。
(4)
式中,||w||2為w的2范式,平方是為了求解的方便。
我們來看看L2正則化的性質。
1. 從式(4)中可以看出,L2正則化對于絕對值較大的權重予以很重的懲罰,對于絕對值很小的權重予以非常非常小的懲罰,當權重絕對值趨近于0時,基本不懲罰。這個性質與L2的平方項有關系,即越大的數,其平方越大,越小的數,比如小于1的數,其平方反而越小。
2. 從貝葉斯推導的角度看,我們可以認為式(4)中的第二項為參數w的一個均值為0的高斯先驗分布,即,w~N(0, b2)。這也符合我們對于參數w的先驗認知:w的絕對值不是很大。
3. 從性質2可知,既然w的先驗分布服從高斯分布,那么L2正則化的作用實際上就是使得參數向量w的大部分分量的值趨近于0,而不是等于0。這一點在處理具有共線性特征的特征集時非常重要,也是L2在這種情況下勝過L1的原因。
4. 由于式(4)是個凸函數,并且函數可微,因此w的值具有解析解:
從解的解析表達式可以看出,w的求解不需要對X-1是否存在作任何假設,因為I為單位矩陣,因此解析式中的逆始終存在。
接下來我們看看L1正則化。
隨著海量數據處理的興起,工程上對于模型稀疏化的要求也隨之出現了。這時候,L2正則化已經不能滿足需求,因為它只是使得模型的參數值趨近于0,而不是等于0,這樣就無法丟掉模型里的任何一個特征,因此無法做到稀疏化。這時,L1的作用隨之顯現。L1正則化的作用是使得大部分模型參數的值等于0,這樣一來,當模型訓練好后,這些權值等于0的特征可以省去,從而達到稀疏化的目的,也節省了存儲的空間,因為在計算時,值為0的特征都可以不用存儲了。
(5)
式(5)為L1正則化的linear regression,也叫lasso regression。式中||w||1為w的1范式,即 。
同樣,我們來看看L1正則化的性質。
1. 從式(5)中可以看出,L1正則化對于所有權重予以同樣的懲罰,也就是說,不管模型參數的大小,對它們都施加同等力度的懲罰,因此,較小的權重在被懲罰后,就會變成0。因此,在經過L1正則化后,大量模型參數的值變為0或趨近于0,當然也有一部分參數的值飆得很高(這一點在性質2解釋)。由于大量模型參數變為0,這些參數就不會出現在最終的模型中,因此達到了稀疏化的作用,這也說明了L1正則化自帶特征選擇的功能,這一點十分有用。
2. 從貝葉斯推導的角度看,我們可以認為式(5)中的第二項為參數w的一個均值為0的拉普拉斯先驗分布。從高斯概率密度函數和拉普拉斯概率密度函數的圖形中可以看出,拉普拉斯概率密度函數的截尾比高斯概率密度函數的截尾更長,也就是說L1正則化更能夠接受絕對值較大的參數值。
3. 從性質2可知,既然拉普拉斯分布比高斯分布有更長的截尾,那么可以推知L1正則化的魯棒性要好于L2正則化,也就是說,L1正則化對于絕對值較大的參數沒有L2正則化那么敏感,從而能夠容忍一些這樣的參數留下。
4. 由1范式的定義可知,L1正則化在任意權值為0的時候不可導,因此式(5)不能求出w的解析解,同時,基于梯度的優化算法也無法高效地計算出w的值,因此對于L1正則化,一般可以采取坐標下降法求解。
L1正則化和L2正則化在實際應用中的比較。
L1在確實需要稀疏化模型的場景下,才能發揮很好的作用并且效果遠勝于L2。在模型特征個數遠大于訓練樣本數的情況下,如果我們事先知道模型的特征中只有少量相關特征(即參數值不為0),并且相關特征的個數少于訓練樣本數,那么L1的效果遠好于L2。比如在文本分類中,如果我們將一篇文章的所有詞語作為它的特征,那么很顯然,其中絕大部分特征是無關特征,只有很少量的特征是相關特征。這時,如果我們將每篇文章作為訓練樣本,直接扔進L1正則化的模型,那么可以通過L1的稀疏化性質去掉無關特征,只留下相關特征。從而L1在這里起到了特征選擇的作用,也就省去了特征工程這一步,因為特征工程往往還是需要人工干預的,L1的做法則直接讓數據說話,避免人工干預。然而,如果模型的特征服從高斯分布,那么從貝葉斯的觀點來看,即便特征數遠超訓練樣本數,L2也要優于L1。
然而,需要注意的是,當相關特征數遠大于訓練樣本數時,無論是L1還是L2,都無法取得很好的效果。
從上面的觀點可以看出,L1似乎總是好于L2,那么L2還有什么存在的價值呢?然而在實際工程中,L1不總是像萬金油一樣,隨處可用。對于上面文本分類的例子,結合我實際的工程經驗談談L1的弊端。
在最開始做文本分類的時候,我也是依然毫不猶豫地選擇了L1來做特征選擇,以此訓練出分類模型,但得到的分類模型效果卻不盡如人意,訓練誤差和泛化誤差都較高。后來經過分析得知,在進行模型訓練時,沒有對數據的特征作分析,而盲目地運用L1正則化,從而導致失敗。在經過分析后發現,訓練數據里的特征很多是共線性的,比方說,有幾個特征的共線性很高,并且它們對于分類都很重要,這時L1的做法是隨機選擇其中一個特征,而扔掉其它的特征。試想,如果訓練數據中有很多這樣類似的特征,那么經過L1正則化后的模型將會失去很多有用的特征,進而導致模型誤差較大。這個時候,我們不得不選擇L2正則化了,但由于L2正則化在面對大量無關特征并且特征不是由高斯分布產生時,誤差依然很大,因此我們需要在訓練模型之前,先進行特征選擇,然后再用L2正則化,L2正則化的特點是,在面對幾個存在共線性的特征時,它會將權值平分給這些特征,從而使得這些有用的特征都得以留下,從而改進了文本分類的準確率。
也許讀者認為,加入了特征工程的L2正則化稍顯麻煩,確實是這樣的。實踐中也可以采取L1+L2結合的方式,即elastic net。這種方式同時兼顧特征選擇(L1)和權重衰減(L2)。其公式如下
(6)
上式中,t為正則項與L(w)之間的trade-off系數,和之前的描述一致,p是elastic net里獨有的參數,它是L1和L2之間的一個trade-off,如果p為0,那么上式退化為L2正則化,如果p為1,那么上式退化為L1正則化。所以當p取值為0到1時(不包含端點),上式兼顧了L1和L2的特點。又由于L1為1范式,L2為2范式,那么elastic net就介于1范式和2范式之間。
關于elastic net的詳細內容將不在本文描述。