Lasso迴歸演算法: 座標軸下降法與最小角迴歸法小結

劉建平Pinard發表於2016-11-01

    前面的文章對線性迴歸做了一個小結,文章在這: 線性迴歸原理小結。裡面對執行緒迴歸的正則化也做了一個初步的介紹。提到了執行緒迴歸的L2正則化-Ridge迴歸,以及執行緒迴歸的L1正則化-Lasso迴歸。但是對於Lasso迴歸的解法沒有提及,本文是對該文的補充和擴充套件。以下都用矩陣法表示,如果對於矩陣分析不熟悉,推薦學習張賢達的《矩陣分析與應用》。

1. 回顧線性迴歸 

    首先我們簡要回歸下線性迴歸的一般形式: 

    \(h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}\)

    需要極小化的損失函式是: 

    \(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})\)

    如果用梯度下降法求解,則每一輪\(\theta\)迭代的表示式是: 

    \(\mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)

    其中\(\alpha\)為步長。

    如果用最小二乘法,則\(\theta\)的結果是:

    \( \mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y} \)

2. 回顧Ridge迴歸

    由於直接套用線性迴歸可能產生過擬合,我們需要加入正則化項,如果加入的是L2正則化項,就是Ridge迴歸,有時也翻譯為脊迴歸。它和一般線性迴歸的區別是在損失函式上增加了一個L2正則化的項,和一個調節線性迴歸項和正則化項權重的係數\(\alpha\)。損失函式表示式如下:

    \(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2\)

    其中\(\alpha\)為常數係數,需要進行調優。\(||\theta||_2\)為L2範數。

    Ridge迴歸的解法和一般線性迴歸大同小異。如果採用梯度下降法,則每一輪\(\theta\)迭代的表示式是:

    \(\mathbf\theta= \mathbf\theta - (\beta\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha\theta)\)

    其中\(\beta\)為步長。

    如果用最小二乘法,則\(\theta\)的結果是:

    \(\mathbf{\theta = (X^TX + \alpha E)^{-1}X^TY}\) 

    其中E為單位矩陣。

    Ridge迴歸在不拋棄任何一個變數的情況下,縮小了迴歸係數,使得模型相對而言比較的穩定,但這會使得模型的變數特別多,模型解釋性差。有沒有折中一點的辦法呢?即又可以防止過擬合,同時克服Ridge迴歸

模型變數多的缺點呢?有,這就是下面說的Lasso迴歸。

3. 初識Lasso迴歸 

    Lasso迴歸有時也叫做線性迴歸的L1正則化,和Ridge迴歸的主要區別就是在正則化項,Ridge迴歸用的是L2正則化,而Lasso迴歸用的是L1正則化。Lasso迴歸的損失函式表示式如下: 

    \(J(\mathbf\theta) = \frac{1}{2n}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1\)

    其中n為樣本個數,\(\alpha\)為常數係數,需要進行調優。\(||\theta||_1\)為L1範數。   

    Lasso迴歸使得一些係數變小,甚至還是一些絕對值較小的係數直接變為0,因此特別適用於引數數目縮減與引數的選擇,因而用來估計稀疏引數的線性模型。
 
    但是Lasso迴歸有一個很大的問題,導致我們需要把它單獨拎出來講,就是它的損失函式不是連續可導的,由於L1範數用的是絕對值之和,導致損失函式有不可導的點。也就是說,我們的最小二乘法,梯度下降法,牛頓法與擬牛頓法對它統統失效了。那我們怎麼才能求有這個L1範數的損失函式極小值呢?
 
    OK,本章主角,兩種全新的求極值解法座標軸下降法(coordinate descent)和最小角迴歸法( Least Angle Regression, LARS)該隆重出場了。          

4. 用座標軸下降法求解Lasso迴歸

    座標軸下降法顧名思義,是沿著座標軸的方向去下降,這和梯度下降不同。梯度下降是沿著梯度的負方向下降。不過梯度下降和座標軸下降的共性就都是迭代法,通過啟發式的方式一步步迭代求解函式的最小值。

    座標軸下降法的數學依據主要是這個結論(此處不做證明):一個可微的凸函式\(J(\theta)\), 其中\(\theta\)是nx1的向量,即有n個維度。如果在某一點\(\overline\theta\),使得\(J(\theta)\)在每一個座標軸\(\overline\theta_i\)(i = 1,2,...n)上都是最小值,那麼\(J(\overline\theta_i)\)就是一個全域性的最小值。

    於是我們的優化目標就是在\(\theta\)的n個座標軸上(或者說向量的方向上)對損失函式做迭代的下降,當所有的座標軸上的\(\theta_i\)(i = 1,2,...n)都達到收斂時,我們的損失函式最小,此時的\(\theta\)即為我們要求的結果。

    下面我們看看具體的演算法過程:

    1. 首先,我們把\(\theta\)向量隨機取一個初值。記為\(\theta^{(0)}\) ,上面的括號裡面的數字代表我們迭代的輪數,當前初始輪數為0.

    2. 對於第k輪的迭代。我們從\(\theta_1^{(k)}\)開始,到\(\theta_n^{(k)}\)為止,依次求\(\theta_i^{(k)}\)。\(\theta_i^{(k)}\)的表示式如下:

    \( \theta_i^{(k)}  \in \underbrace{argmin}_{\theta_i} J(\theta_1^{(k)}, \theta_2^{(k)}, ... \theta_{i-1}^{(k)}, \theta_i, \theta_{i+1}^{(k-1)}, ..., \theta_n^{(k-1)})\) 

    也就是說\( \theta_i^{(k)} \)是使\(J(\theta_1^{(k)}, \theta_2^{(k)}, ... \theta_{i-1}^{(k)}, \theta_i, \theta_{i+1}^{(k-1)}, ..., \theta_n^{(k-1)})\)最小化時候的\(\theta_i\)的值。此時\(J(\theta)\)只有\( \theta_i^{(k)} \)是變數,其餘均為常量,因此最小值容易通過求導求得。

    如果上面這個式子不好理解,我們具體一點,在第k輪,\(\theta\)向量的n個維度的迭代式如下:

    \( \theta_1^{(k)}  \in \underbrace{argmin}_{\theta_1} J(\theta_1, \theta_2^{(k-1)}, ... , \theta_n^{(k-1)})\) 

    \( \theta_2^{(k)}  \in \underbrace{argmin}_{\theta_2} J(\theta_1^{(k)}, \theta_2, \theta_3^{(k-1)}... , \theta_n^{(k-1)})\) 

    ...

    \( \theta_n^{(k)}  \in \underbrace{argmin}_{\theta_n} J(\theta_1^{(k)}, \theta_2^{(k)}, ... , \theta_{n-1}^{(k)}, \theta_n)\) 

    3. 檢查\(\theta^{(k)}\)向量和\(\theta^{(k-1)}\)向量在各個維度上的變化情況,如果在所有維度上變化都足夠小,那麼\(\theta^{(k)}\)即為最終結果,否則轉入2,繼續第k+1輪的迭代。

    以上就是座標軸下降法的求極值過程,可以和梯度下降做一個比較:

    a) 座標軸下降法在每次迭代中在當前點處沿一個座標方向進行一維搜尋 ,固定其他的座標方向,找到一個函式的區域性極小值。而梯度下降總是沿著梯度的負方向求函式的區域性最小值。
    b) 座標軸下降優化方法是一種非梯度優化演算法。在整個過程中依次迴圈使用不同的座標方向進行迭代,一個週期的一維搜尋迭代過程相當於一個梯度下降的迭代。
    c) 梯度下降是利用目標函式的導數來確定搜尋方向的,該梯度方向可能不與任何座標軸平行。而座標軸下降法法是利用當前座標方向進行搜尋,不需要求目標函式的導數,只按照某一座標方向進行搜尋最小值。
    d) 兩者都是迭代方法,且每一輪迭代,都需要O(mn)的計算量(m為樣本數,n為係數向量的維度)

5. 用最小角迴歸法求解Lasso迴歸

    第四節介紹了座標軸下降法求解Lasso迴歸的方法,此處再介紹另一種常用方法, 最小角迴歸法(Least Angle Regression, LARS)。

    在介紹最小角迴歸前,我們先看看兩個預備演算法,好吧,這個演算法真沒有那麼好講。

5.1 前向選擇(Forward Selection)演算法

    第一個預備演算法是前向選擇(Forward Selection)演算法。

    前向選擇演算法的原理是是一種典型的貪心演算法。要解決的問題是對於:

    \(\mathbf{Y = X\theta}\)這樣的線性關係,如何求解係數向量\(\mathbf{\theta}\)的問題。其中\(\mathbf{Y}\)為 mx1的向量,\(\mathbf{X}\)為mxn的矩陣,\(\mathbf{\theta}\)為nx1的向量。m為樣本數量,n為特徵維度。

    把 矩陣\(\mathbf{X}\)看做n個mx1的向量\(\mathbf{X_i}\)(i=1,2,...n),在\(\mathbf{Y}\)的\(\mathbf{X}\)變數\(\mathbf{X_i}\)(i =1,2,...m)中,選擇和目標\(\mathbf{Y}\)最為接近(餘弦距離最大)的一個變數\(\mathbf{X_k}\),用\(\mathbf{X_k}\)來逼近\(\mathbf{Y}\),得到下式:

    \(\overline{\mathbf{Y}} = \mathbf{X_k\theta_k}\)

    其中: \(\mathbf{\theta_k}= \mathbf{\frac{<X_k, Y>}{||X_k||_2}}\)
    即:\(\overline{\mathbf{Y}}\) 是 \(\mathbf{Y}\)在 \(\mathbf{X_k}\)上的投影。那麼,可以定義殘差(residual):   \(\mathbf{Y_{yes}} = \mathbf{Y - \overline{Y}}\)。由於是投影,所以很容易知道 \(\mathbf{Y_{yes}} 和\mathbf{X_k}\)是正交的。再以\(\mathbf{Y_{yes}}\)為新的因變數,去掉\(\mathbf{X_k}\)後,剩下的自變數的集合\(\mathbf{X_i}\),i=1,2,3...k−1,k+1,...n}為新的自變數集合,重複剛才投影和殘差的操作,直到殘差為0,或者所有的自變數都用完了,才停止演算法。
    當\(\mathbf{X}\)只有2維時,例子如上圖,和\(\mathbf{Y}\)最接近的是\(\mathbf{X_1}\),首先在\(\mathbf{X_1}\)上面投影,殘差如上圖長虛線。此時\(X_1\theta_1\)模擬了\(\mathbf{Y}\),\(\theta_1\)模擬了\(\mathbf{ \theta}\)(僅僅模擬了一個維度)。接著發現最接近的是\(\mathbf{X_2}\),此時用殘差接著在\(\mathbf{X_2}\)投影,殘差如圖中短虛線。由於沒有其他自變數了,此時\(X_1\theta_1+X_2\theta_2\)模擬了\(\mathbf{Y}\),對應的模擬了兩個維度的\(\theta\)即為最終結果,此處\(\theta\)計算設計較多矩陣運算,這裡不討論。
    此演算法對每個變數只需要執行一次操作,效率高,速度快。但也容易看出,當自變數不是正交的時候,由於每次都是在做投影,所有演算法只能給出一個區域性近似解。因此,這個簡單的演算法太粗糙,還不能直接用於我們的Lasso迴歸。
 

5.2 前向梯度(Forward Stagewise)演算法

    第二個預備演算法是前向梯度(Forward Stagewise)演算法。

    前向梯度演算法和前向選擇演算法有類似的地方,也是在\(\mathbf{Y}\)的\(\mathbf{X}\)變數\(\mathbf{X_i}\)(i =1,2,...n)中,選擇和目標\(\mathbf{Y}\)最為接近(餘弦距離最大)的一個變數\(\mathbf{X_k}\),用\(\mathbf{X_k}\)來逼近\(\mathbf{Y}\),但是前向梯度演算法不是粗暴的用投影,而是每次在最為接近的自變數\(\mathbf{X_t}\)的方向移動一小步,然後再看殘差\(\mathbf{Y_{yes}}\)和哪個\(\mathbf{X_i}\)(i =1,2,...n)最為接近。此時我們也不會把\(\mathbf{X_t}\) 去除,因為我們只是前進了一小步,有可能下面最接近的自變數還是\(\mathbf{X_t}\)。如此進行下去,直到殘差\(\mathbf{Y_{yes}} \)減小到足夠小,演算法停止。

    
    當\(\mathbf{X}\)只有2維時,例子如上圖,和\(\mathbf{Y}\)最接近的是\(\mathbf{X_1}\),首先在\(\mathbf{X_1}\)上面走一小段距離,此處\(\varepsilon\)為一個較小的常量,發現此時的殘差還是和\\(\mathbf{X_1}\)最接近。那麼接著沿\(\mathbf{X_1}\)走,一直走到發現殘差不是和\(\mathbf{X_1}\)最接近,而是和\(\mathbf{X_2}\)最接近,此時殘差如上圖長虛線。接著沿著\(\mathbf{X_2}\)走一小步,發現殘差此時又和\(\mathbf{X_1}\)最接近,那麼開始沿著\(\mathbf{X_1}\)走,走完一步後發現殘差為0,那麼演算法停止。此時\(\mathbf{Y}\)由剛才所有的所有步相加而模擬,對應的算出的係數\(\theta\)即為最終結果。此處\(\theta\)計算設計較多矩陣運算,這裡不討論。
    當演算法在\(\varepsilon\)很小的時候,可以很精確的給出最優解,當然,其計算的迭代次數也是大大的增加。和前向選擇演算法相比,前向梯度演算法更加精確,但是更加複雜。

    有沒有折中的辦法可以綜合前向梯度演算法和前向選擇演算法的優點,做一個折中呢?有!這就是終於要出場的最小角迴歸法。

5.3  最小角迴歸(Least Angle Regression, LARS)演算法

    好吧,最小角迴歸(Least Angle Regression, LARS)演算法終於出場了。最小角迴歸法對前向梯度演算法和前向選擇演算法做了折中,保留了前向梯度演算法一定程度的精確性,同時簡化了前向梯度演算法一步步迭代的過程。具體演算法是這樣的: 

    首先,還是找到與因變數\(\mathbf{Y}\)最接近或者相關度最高的自變數\(\mathbf{X_k}\),使用類似於前向梯度演算法中的殘差計算方法,得到新的目標\(\mathbf{Y_{yes}}\),此時不用和前向梯度演算法一樣小步小步的走。而是直接向前走直到出現一個\(\mathbf{X_t}\),使得\(\mathbf{X_t}\)和\(\mathbf{Y_{yes}}\)的相關度和\(\mathbf{X_k}\)與\(\mathbf{Y_{yes}}\)的相關度是一樣的,此時殘差\(\mathbf{Y_{yes}}\)就在\(\mathbf{X_t}\)和\(\mathbf{X_k}\)的角平分線方向上,此時我們開始沿著這個殘差角平分線走,直到出現第三個特徵\(\mathbf{X_p}\)和\(\mathbf{Y_{yes}}\)的相關度足夠大的時候,即\(\mathbf{X_p}\)到當前殘差\(\mathbf{Y_{yes}}\)的相關度和\(\theta_t\),\(\theta_k\)與\(\mathbf{Y_{yes}}\)的一樣。將其也叫入到\(\mathbf{Y}\)的逼近特徵集合中,並用\(\mathbf{Y}\)的逼近特徵集合的共同角分線,作為新的逼近方向。以此迴圈,直到\(\mathbf{Y_{yes}}\)足夠的小,或者說所有的變數都已經取完了,演算法停止。此時對應的係數\(\theta\)即為最終結果。

 

    當\(\theta\)只有2維時,例子如上圖,和\(\mathbf{Y}\)最接近的是\(\mathbf{X_1}\),首先在\(\mathbf{X_1}\)上面走一段距離,一直到殘差在\(\mathbf{X_1}\)和\(\mathbf{X_2}\)的角平分線上,此時沿著角平分線走,直到殘差最夠小時停止,此時對應的係數\(\beta\)即為最終結果。此處\(\theta\)計算設計較多矩陣運算,這裡不討論。

    最小角迴歸法是一個適用於高維資料的迴歸演算法,其主要的優點有:

    1)特別適合於特徵維度n 遠高於樣本數m的情況。

    2)演算法的最壞計算複雜度和最小二乘法類似,但是其計算速度幾乎和前向選擇演算法一樣

    3)可以產生分段線性結果的完整路徑,這在模型的交叉驗證中極為有用

    主要的缺點是:

    由於LARS的迭代方向是根據目標的殘差而定,所以該演算法對樣本的噪聲極為敏感。

6. 總結

    Lasso迴歸是在ridge迴歸的基礎上發展起來的,如果模型的特徵非常多,需要壓縮,那麼Lasso迴歸是很好的選擇。一般的情況下,普通的線性迴歸模型就夠了。

    另外,本文對最小角迴歸法怎麼求具體的\(\theta\)引數值沒有提及,僅僅涉及了原理,如果對具體的算計推導有興趣,可以參考Bradley Efron的論文《Least Angle Regression》,網上很容易找到。     

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com) 

相關文章