1. 程式人生 > >範數規則化

範數規則化

作為一個非理工科的經管學生,在數學基礎有限的情況的,理解難免不足。文章多有copy。

參考部落格:

https://blog.csdn.net/zouxy09/article/details/24971995

 

 

1.前言

為什麼探討L0,L1,L2範數,機器學習中出現的非常頻繁的問題:過擬合與規則化。

機器學習的問題是“minimize  your error while regularizing your parameters”。規則化引數的同時最小化誤差。最小化誤差是為了讓模型擬合我們的訓練資料,而規則化引數是防止我們的模型過分擬合我們的訓練資料。

因為引數太多,會導致我們的模型複雜度上升,容易過擬合,也就是我們的訓練誤差會很小。但訓練誤差小並不是我們的最終目標,我們的目標是希望模型的測試誤差小,也就是能準確的預測新的樣本。

所以,我們需要保證模型“簡單”的基礎上最小化訓練誤差,這樣得到的引數才具有好的泛化效能(也就是測試誤差也小),而模型“簡單”就是通過規則函式來實現的。另外,規則項的使用還可以約束我們的模型的特性。

這樣就可以將人對這個模型的先驗知識融入到模型的學習當中,強行地讓學習到的模型具有人想要的特性,例如稀疏、低秩、平滑等等。

有時候人的先驗是非常重要的,好的先驗肯定能使機器更快的學習相應的任務。人和機器的交流目前還沒有那麼直接的方法,這個媒介只能由規則項來擔當。

其他角度來看待規則化的。規則化符合奧卡姆剃刀(Occam's razor)原理。它的思想是:在所有可能選擇的模型中,我們應該選擇能夠很好地解釋已知資料並且十分簡單的模型。

從貝葉斯估計的角度來看,規則化項對應於模型的先驗概率。規則化是結構風險最小化策略的實現,是在經驗風險上加一個正則化項(regularizer)或懲罰項(penalty term)。

監督學習可以看做最小化下面的目標函式:

   其中,第一項L(yi,f(xi;w)) 衡量我們的模型(分類或者回歸)對第i個樣本的預測值f(xi;w)和真實的標籤yi之前的誤差。

因為我們的模型是要擬合我們的訓練樣本的嘛,所以我們要求這一項最小,也就是要求我們的模型儘量的擬合我們的訓練資料。

但正如上面說言,我們不僅要保證訓練誤差最小,我們更希望我們的模型測試誤差小,所以我們需要加上第二項,也就是對引數w的規則化函式Ω(w)去約束我們的模型儘量的簡單。

機器學習的大部分帶參模型都和這個相似。其實大部分無非就是變換這兩項而已。

對於第一項Loss函式,如果是Square loss,那就是最小二乘了;

如果是Hinge Loss,那就是著名的SVM了;

如果是exp-Loss,那就是 Boosting了;

如果是log-Loss,那就是Logistic Regression了;

還有等等。不同的loss函式,具有不同的擬合特性,這個也得就具體問題具體分析的。

但這裡,我們先不究loss函式的問題,我們把目光轉向“規則項Ω(w)”。

  規則化函式Ω(w)也有很多種選擇,一般是模型複雜度的單調遞增函式,模型越複雜,規則化值就越大。比如,規則化項可以是模型引數向量的範數。

  然而,不同的選擇對引數w的約束不同,取得的效果也不同,但我們在論文中常見的都聚集在:零範數、一範數、二範數、跡範數、Frobenius範數和核範數等等。

2.L0範數與L1範數

L0範數是指向量中非0的元素的個數。如果我們用L0範數來規則化一個引數矩陣W的話,就是希望W的大部分元素都是0,讓引數W是稀疏的。

“壓縮感知”和“稀疏編碼”都用到了引數稀疏,“稀疏”就是通過這類範數實現的。但是是這樣嗎?看到大多數的papers中,稀疏不是都通過L1範數來實現嗎,更多用到的都是||W||1!

下面把L0和L1放在一起的原因,因為他們有著某種不尋常的關係。那我們再來看看L1範數是什麼?它為什麼可以實現稀疏?為什麼大家都用L1範數去實現稀疏,而不是L0範數呢?

L1範數是指向量中各個元素絕對值之和,也有個美稱叫“稀疏規則運算元”(Lasso regularization)。

為什麼L1範數會使權值稀疏?有人可能會這樣給你回答“它是L0範數的最優凸近似”。

回答:任何的規則化運算元,如果他在Wi=0的地方不可微,並且可以分解為一個“求和”的形式,那麼這個規則化運算元就可以實現稀疏。這說是這麼說,W的L1範數是絕對值,|w|在w=0處是不可微,但這還是不夠直觀。

但不幸的是,L0範數的最優化問題是一個NP hard問題,而且理論上有證明,L1範數是L0範數的最優凸近似,因此通常使用L1範數來代替。

 

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種因素,難以做出分析。

3.L2範數

       除了L1範數,還有一種更受寵幸的規則化範數是L2範數: ||W||2。它也不遜於L1範數,它有兩個美稱,在迴歸裡面,有人把有它的迴歸叫“嶺迴歸”(Ridge Regression),有人也叫它“權值衰減weight decay”。

這用的很多吧,因為它的強大功效是改善機器學習裡面一個非常重要的問題:過擬合。過擬合,就是模型訓練時候的誤差很小,但在測試的時候誤差很大,也就是我們的模型複雜到可以擬合到我們的所有訓練樣本了,但在實際預測新的樣本的時候,糟糕的一塌糊塗。

 

 

為什麼L2範數可以防止過擬合?回答這個問題之前,我們得先看看L2範數是個什麼東西。

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

程式碼實現:

# 根據l2公式定義函式
def l2_normalize(v, axis=-1, order=2):
    l2 = np.linalg.norm(v, ord = order, axis=axis, keepdims=True)
    l2[l2==0] = 1
    return v/l2

# 生成隨機資料
Z = np.random.randint(10, size=(5,5))
print(Z)

l2_normalize(Z)

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

1)學習理論的角度:

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

2)優化計算的角度:

       從優化或者數值計算的角度來說,L2範數有助於處理 condition number不好的情況下矩陣求逆很困難的問題。這condition number是啥?這涉及到優化問題。優化有兩大難題,一是:區域性最小值,二是:ill-condition病態問題。前者是,我們要找的是全域性最小值,如果區域性最小值太多,那我們的優化演算法就很容易陷入區域性最小而不能自拔,ill-condition對應的是well-condition。那他們分別代表什麼?假設我們有個方程組AX=b,我們需要求解X。如果A或者b稍微的改變,會使得X的解發生很大的改變,那麼這個方程組系統就是ill-condition的,反之就是well-condition的。

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