淺談機器學習中的規則化範數(轉)

1、監督學習簡介

  監督機器學習問題無非就是「minimizeyour error while regularizing your parameters」,也就是在規則化參數的同時最小化偏差。最小化偏差是爲了讓咱們的模型擬合咱們的訓練數據,而規則化參數是防止咱們的模型過度擬合咱們的訓練數據。多麼簡約的哲學啊!由於參數太多,會致使咱們的模型複雜度上升,容易過擬合,也就是咱們的訓練偏差會很小。但訓練偏差小並非咱們的最終目標,咱們的目標是但願模型的測試偏差小,也就是能準確的預測新的樣本。因此,咱們須要保證模型「簡單」的基礎上最小化訓練偏差,這樣獲得的參數才具備好的泛化性能(也就是測試偏差也小),而模型「簡單」就是經過規則函數來實現的。另外,規則項的使用還能夠約束咱們的模型的特性。這樣就能夠將人對這個模型的先驗知識融入到模型的學習當中,強行地讓學習到的模型具備人想要的特性,例如稀疏、低秩、平滑等等。要知道,有時候人的先驗是很是重要的。前人的經驗會讓你少走不少彎路,這就是爲何咱們平時學習最好找個大牛帶帶的緣由。一句點撥能夠爲咱們撥開眼前烏雲,還咱們一片晴空萬里,醍醐灌頂。對機器學習也是同樣,若是被咱們人稍微點撥一下,它確定能更快的學習相應的任務。只是因爲人和機器的交流目前尚未那麼直接的方法,目前這個媒介只能由規則項來擔當了。html

1.1 規則化

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

1.2 監督學習的通常形式

       通常來講,監督學習能夠看作最小化下面的目標函數:數據庫

  其中,第一項L(yi,f(xi;w)) 衡量咱們的模型(分類或者回歸)對第i個樣本的預測值f(xi;w)和真實的標籤yi以前的偏差。由於咱們的模型是要擬合咱們的訓練樣本的嘛,因此咱們要求這一項最小,也就是要求咱們的模型儘可能的擬合咱們的訓練數據。但正如上面說言,咱們不只要保證訓練偏差最小,咱們更但願咱們的模型測試偏差小,因此咱們須要加上第二項,也就是對參數w的規則化函數Ω(w)去約束咱們的模型儘可能的簡單。機器學習

1.3 正則化函數的選擇

  規則化函數Ω(w)也有不少種選擇,通常是模型複雜度的單調遞增函數,模型越複雜,規則化值就越大。好比,規則化項能夠是模型參數向量的範數。然而,不一樣的選擇對參數w的約束不一樣,取得的效果也不一樣,但咱們在論文中常見的都彙集在:零範數、一範數、二範數、跡範數、Frobenius範數和核範數等等。這麼多範數,到底它們表達啥意思?具備啥能力?何時才能用?何時須要用呢?不急不急,下面咱們挑幾個常見的娓娓道來。ide

2、L0和L1範數

2.1 L0範數

  L0範數是指向量中非0的元素的個數。若是咱們用L0範數來規則化一個參數矩陣W的話,就是但願W的大部分元素都是0。這太直觀了,太露骨了吧,換句話說,讓參數W是稀疏的。OK,看到了「稀疏」二字,你們都應該從當下風風火火的「壓縮感知」和「稀疏編碼」中醒悟過來,原來用的漫山遍野的「稀疏」就是經過這玩意來實現的。但你又開始懷疑了,是這樣嗎?看到的papers世界中,稀疏不是都經過L1範數來實現嗎?腦海裏是否是處處都是||W||1影子呀!幾乎是擡頭不見低頭見。沒錯,這就是這節的題目把L0和L1放在一塊兒的緣由,由於他們有着某種不尋常的關係。那咱們再來看看L1範數是什麼?它爲何能夠實現稀疏?爲何你們都用L1範數去實現稀疏,而不是L0範數呢?函數

2.2 L1範數

  L1範數是指向量中各個元素絕對值之和,也有個美稱叫「稀疏規則算子」(Lasso regularization)。如今咱們來分析下這個價值一個億的問題:爲何L1範數會使權值稀疏?有人可能會這樣給你回答「它是L0範數的最優凸近似」。實際上,還存在一個更美的回答:任何的規則化算子,若是他在Wi=0的地方不可微,而且能夠分解爲一個「求和」的形式,那麼這個規則化算子就能夠實現稀疏。這說是這麼說,W的L1範數是絕對值,|w|在w=0處是不可微,但這仍是不夠直觀。這裏由於咱們須要和L2範數進行對比分析。因此關於L1範數的直觀理解,請待會看看第二節。性能

  對了,上面還有一個問題:既然L0能夠實現稀疏,爲何不用L0,而要用L1呢?我的理解一是由於L0範數很難優化求解(NP難問題),二是L1範數是L0範數的最優凸近似,並且它比L0範數要容易優化求解。因此你們才把目光和萬千寵愛轉於L1範數。學習

  OK,來個一句話總結:L1範數和L0範數能夠實現稀疏,L1因具備比L0更好的優化求解特性而被普遍應用。測試

  好,到這裏,咱們大概知道了L1能夠實現稀疏,但咱們會想呀,爲何要稀疏?讓咱們的參數稀疏有什麼好處呢?這裏扯兩點:大數據

2.3 稀疏的好處

  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」。這用的不少吧,由於它的強大功效是改善機器學習裏面一個很是重要的問題:過擬合。至於過擬合是什麼,上面也解釋了,就是模型訓練時候的偏差很小,但在測試的時候偏差很大,也就是咱們的模型複雜到能夠擬合到咱們的全部訓練樣本了,但在實際預測新的樣本的時候,糟糕的一塌糊塗。通俗的講就是應試能力很強,實際應用能力不好。擅長背誦知識,卻不懂得靈活利用知識。例以下圖所示(來自Ng的course):

  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的。咱們具體舉個例子吧:

  我們先看左邊的那個。第一行假設是咱們的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定義爲:

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

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

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

  好了,對這麼一個東西,已經說了好多了。對了,咱們爲何聊到這個的了?回到第一句話:從優化或者數值計算的角度來講,L2範數有助於處理 condition number很差的狀況下矩陣求逆很困難的問題。由於目標函數若是是二次的,對於線性迴歸來講,那其實是有解析解的,求導並令導數等於零便可獲得最優解爲:

                           (我的理解這是解析解,xw=y,不過用到了廣義逆)

  然而,若是當咱們的樣本X的數目比每一個樣本的維度還要小的時候,矩陣XTX將會不是滿秩的,也就是XTX會變得不可逆,因此w*就沒辦法直接計算出來了。或者更確切地說,將會有無窮多個解(由於咱們方程組的個數小於未知數的個數)。也就是說,咱們的數據不足以肯定一個解,若是咱們從全部可行解裏隨機選一個的話,極可能並非真正好的解,總而言之,咱們過擬合了。

  但若是加上L2規則項,就變成了下面這種狀況,就能夠直接求逆了:

   這裏面,專業點的描述是:要獲得這個解,咱們一般並不直接求矩陣的逆,而是經過解線性方程組的方式(例如高斯消元法)來計算。考慮沒有規則項的時候,也就是λ=0的狀況,若是矩陣XTX的 condition number 很大的話,解線性方程組就會在數值上至關不穩定,而這個規則項的引入則能夠改善condition number。

    另外,若是使用迭代優化的算法,condition number 太大仍然會致使問題:它會拖慢迭代的收斂速度,而規則項從優化的角度來看,其實是將目標函數變成λ-strongly convex(λ強凸)的了。哎喲喲,這裏又出現個λ強凸,啥叫λ強凸呢?

  當f知足:

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

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

  直觀來說,convex 性質是指函數曲線位於該點處的切線,也就是線性近似之上,而 strongly convex 則進一步要求位於該處的一個二次函數上方,也就是說要求函數不要太「平坦」而是能夠保證有必定的「向上彎曲」的趨勢。專業點說,就是convex 能夠保證函數在任意一點都處於它的一階泰勒函數之上,而strongly convex能夠保證函數在任意一點都存在一個很是漂亮的二次下界quadratic lower bound。固然這是一個很強的假設,可是同時也是很是重要的假設。可能還很差理解,那咱們畫個圖來形象的理解下。

  你們一看到上面這個圖就全明白了吧。不用我囉嗦了吧。仍是囉嗦一下吧。咱們取咱們的最優解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。不過我以爲這裏解釋的不太中肯,固然了也不知道是否是本身理解的問題。

  2)模型空間的限制:

       實際上,對於L1和L2規則化的代價函數來講,咱們能夠寫成如下形式:

       也就是說,咱們將模型空間限制在w的一個L1-ball 中。爲了便於可視化,咱們考慮兩維的狀況,在(w1, w2)平面上能夠畫出目標函數的等高線,而約束條件則成爲平面上半徑爲C的一個 norm ball 。等高線與 norm ball 首次相交的地方就是最優解:

       能夠看到,L1-ball 與L2-ball 的不一樣就在於L1在和每一個座標軸相交的地方都有「角」出現,而目標函數的測地線除非位置擺得很是好,大部分時候都會在角的地方相交。注意到在角的位置就會產生稀疏性,例如圖中的相交點就有w1=0,而更高維的時候(想象一下三維的L1-ball 是什麼樣的?)除了角點之外,還有不少邊的輪廓也是既有很大的機率成爲第一次相交的地方,又會產生稀疏性。

       相比之下,L2-ball 就沒有這樣的性質,由於沒有角,因此第一次相交的地方出如今具備稀疏性的位置的機率就變得很是小了。這就從直觀上來解釋了爲何L1-regularization 能產生稀疏性,而L2-regularization 不行的緣由了。

       所以,一句話總結就是:L1會趨向於產生少許的特徵,而其餘的特徵都是0,而L2會選擇更多的特徵,這些特徵都會接近於0。Lasso在特徵選擇時候很是有用,而Ridge就只是一種規則化而已。

4、核範數

  核範數||W||*是指矩陣奇異值的和,英文稱呼叫Nuclear Norm。這個相對於上面火熱的L1和L2來講,可能你們就會陌生點。那它是幹嗎用的呢?霸氣登場:約束Low-Rank(低秩)。OK,OK,那咱們得知道Low-Rank是啥?用來幹啥的?

  對上面的線性方程組,第一個方程和第二個方程有不一樣的解,而第2個方程和第3個方程的解徹底相同。從這個意義上說,第3個方程是「多餘」的,由於它沒有帶來任何的信息量,把它去掉,所得的方程組與原來的方程組同解。爲了從方程組中去掉多餘的方程,天然就導出了「矩陣的秩」這一律念。

   還記得咱們怎麼手工求矩陣的秩嗎?爲了求矩陣A的秩,咱們是經過矩陣初等變換把A化爲階梯型矩陣,若該階梯型矩陣有r個非零行,那A的秩rank(A)就等於r。從物理意義上講,矩陣的秩度量的就是矩陣的行列之間的相關性。若是矩陣的各行或列是線性無關的,矩陣就是滿秩的,也就是秩等於行數。回到上面線性方程組來講吧,由於線性方程組能夠用矩陣描述嘛。秩就表示了有多少個有用的方程了。上面的方程組有3個方程,實際上只有2個是有用的,一個是多餘的,因此對應的矩陣的秩就是2了。

   OK。既然秩能夠度量相關性,而矩陣的相關性實際上有帶有了矩陣的結構信息。若是矩陣之間各行的相關性很強,那麼就表示這個矩陣實際能夠投影到更低維的線性子空間,也就是用幾個向量就能夠徹底表達了,它就是低秩的。因此咱們總結的一點就是:若是矩陣表達的是結構性信息,例如圖像、用戶-推薦表等等,那麼這個矩陣各行之間存在這必定的相關性,那這個矩陣通常就是低秩的。

  若是X是一個m行n列的數值矩陣,rank(X)是X的秩,假如rank (X)遠小於m和n,則咱們稱X是低秩矩陣。低秩矩陣每行或每列均可以用其餘的行或列線性表出,可見它包含大量的冗餘信息。利用這種冗餘信息,能夠對缺失數據進行恢復,也能夠對數據進行特徵提取。

好了,低秩有了,那約束低秩只是約束rank(w)呀,和咱們這節的核範數有什麼關係呢?他們的關係和L0與L1的關係同樣。由於rank()是非凸的,在優化問題裏面很難求解,那麼就須要尋找它的凸近似來近似它了。對,你沒猜錯,rank(w)的凸近似就是核範數||W||*

       好了,到這裏,我也沒什麼好說的了,由於我也是稍微翻看了下這個東西,因此也尚未深刻去看它。但我發現了這玩意還有不少頗有意思的應用,下面咱們舉幾個典型的吧。

  1)矩陣填充(Matrix Completion):

       咱們首先說說矩陣填充用在哪。一個主流的應用是在推薦系統裏面。咱們知道,推薦系統有一種方法是經過分析用戶的歷史記錄來給用戶推薦的。例如咱們在看一部電影的時候,若是喜歡看,就會給它打個分,例如3顆星。而後系統,例如Netflix等知名網站就會分析這些數據,看看到底每部影片的題材究竟是怎樣的?針對每一個人,喜歡怎樣的電影,而後會給對應的用戶推薦類似題材的電影。但有一個問題是:咱們的網站上面有很是多的用戶,也有很是多的影片,不是全部的用戶都看過說有的電影,不是全部看過某電影的用戶都會給它評分。假設咱們用一個「用戶-影片」的矩陣來描述這些記錄,例以下圖,能夠看到,會有不少空白的地方。若是這些空白的地方存在,咱們是很難對這個矩陣進行分析的,因此在分析以前,通常須要先對其進行補全。也叫矩陣填充。

       那到底怎麼填呢?如何才能無中生有呢?每一個空白的地方的信息是否蘊含在其餘已有的信息之上了呢?若是有,怎麼提取出來呢?Yeah,這就是低秩生效的地方了。這叫低秩矩陣重構問題,它能夠用以下的模型表述:已知數據是一個給定的m*n矩陣A,若是其中一些元素由於某種緣由丟失了,咱們可否根據其餘行和列的元素,將這些元素恢復?固然,若是沒有其餘的參考條件,想要肯定這些數據很困難。但若是咱們已知A的秩rank(A)<<m且rank(A)<<n,那麼咱們能夠經過矩陣各行(列)之間的線性相關將丟失的元素求出。你會問,這種假定咱們要恢復的矩陣是低秩的,合理嗎?其實是十分合理的,好比一個用戶對某電影評分是其餘用戶對這部電影評分的線性組合。因此,經過低秩重構就能夠預測用戶對其未評價過的視頻的喜愛程度。從而對矩陣進行填充。

  2)魯棒PCA:

       主成分分析,這種方法能夠有效的找出數據中最「主要"的元素和結構,去除噪音和冗餘,將原有的複雜數據降維,揭示隱藏在複雜數據背後的簡單結構。咱們知道,最簡單的主成分分析方法就是PCA了。從線性代數的角度看,PCA的目標就是使用另外一組基去從新描述獲得的數據空間。但願在這組新的基下,能儘可能揭示原有的數據間的關係。這個維度即最重要的「主元"。PCA的目標就是找到這樣的「主元」,最大程度的去除冗餘和噪音的干擾。

       魯棒主成分分析(Robust PCA)考慮的是這樣一個問題:通常咱們的數據矩陣X會包含結構信息,也包含噪聲。那麼咱們能夠將這個矩陣分解爲兩個矩陣相加,一個是低秩的(因爲內部有必定的結構信息,形成各行或列間是線性相關的),另外一個是稀疏的(因爲含有噪聲,而噪聲是稀疏的),則魯棒主成分分析能夠寫成如下的優化問題:

       與經典PCA問題同樣,魯棒PCA本質上也是尋找數據在低維空間上的最佳投影問題。對於低秩數據觀測矩陣X,假如X受到隨機(稀疏)噪聲的影響,則X的低秩性就會破壞,使X變成滿秩的。因此咱們就須要將X分解成包含其真實結構的低秩矩陣和稀疏噪聲矩陣之和。找到了低秩矩陣,實際上就找到了數據的本質低維空間。那有了PCA,爲何還有這個Robust PCA呢?Robust在哪?由於PCA假設咱們的數據的噪聲是高斯的,對於大的噪聲或者嚴重的離羣點,PCA會被它影響,致使沒法正常工做。而Robust PCA則不存在這個假設。它只是假設它的噪聲是稀疏的,而無論噪聲的強弱如何。

  因爲rank和L0範數在優化上存在非凸和非光滑特性,因此咱們通常將它轉換成求解如下一個鬆弛的凸優化問題:

       說個應用吧。考慮同一副人臉的多幅圖像,若是將每一副人臉圖像當作是一個行向量,並將這些向量組成一個矩陣的話,那麼能夠確定,理論上,這個矩陣應當是低秩的。可是,因爲在實際操做中,每幅圖像會受到必定程度的影響,例如遮擋,噪聲,光照變化,平移等。這些干擾因素的做用能夠看作是一個噪聲矩陣的做用。因此咱們能夠把咱們的同一我的臉的多個不一樣狀況下的圖片各自拉長一列,而後擺成一個矩陣,對這個矩陣進行低秩和稀疏的分解,就能夠獲得乾淨的人臉圖像(低秩矩陣)和噪聲的矩陣了(稀疏矩陣),例如光照,遮擋等等。至於這個的用途,你懂得。

  3)背景建模:

       背景建模的最簡單情形是從固定攝相機拍攝的視頻中分離背景和前景。咱們將視頻圖像序列的每一幀圖像像素值拉成一個列向量,那麼多個幀也就是多個列向量就組成了一個觀測矩陣。因爲背景比較穩定,圖像序列幀與幀之間具備極大的類似性,因此僅由背景像素組成的矩陣具備低秩特性;同時因爲前景是移動的物體,佔據像素比例較低,故前景像素組成的矩陣具備稀疏特性。視頻觀測矩陣就是這兩種特性矩陣的疊加,所以,能夠說視頻背景建模實現的過程就是低秩矩陣恢復的過程。

  4)變換不變低秩紋理(TILT):

       以上章節所介紹的針對圖像的低秩逼近算法,僅僅考慮圖像樣本之間像素的類似性,卻沒有考慮到圖像做爲二維的像素集合,其自己所具備的規律性。事實上,對於未加旋轉的圖像,因爲圖像的對稱性與自類似性,咱們能夠將其看作是一個帶噪聲的低秩矩陣。當圖像由端正發生旋轉時,圖像的對稱性和規律性就會被破壞,也就是說各行像素間的線性相關性被破壞,所以矩陣的秩就會增長。

       低秩紋理映射算法(TransformInvariant Low-rank Textures,TILT)是一種用低秩性與噪聲的稀疏性進行低秩紋理恢復的算法。它的思想是經過幾何變換τ把D所表明的圖像區域校訂成正則的區域,如具備橫平豎直、對稱等特性,這些特性能夠經過低秩性來進行刻畫。

       低秩的應用很是多,你們有興趣的能夠去找些資料深刻了解下。

5、規則化參數的選擇

       如今咱們回過頭來看看咱們的目標函數:

       裏面除了loss和規則項兩塊外,還有一個參數λ。它也有個霸氣的名字,叫hyper-parameters(超參)。你不要看它勢單力薄的,它很是重要。它的取值很大時候會決定咱們的模型的性能,事關模型生死。它主要是平衡loss和規則項這兩項的,λ越大,就表示規則項要比模型訓練偏差更重要,也就是相比於要模型擬合咱們的數據,咱們更但願咱們的模型能知足咱們約束的Ω(w)的特性。反之亦然。舉個極端狀況,例如λ=0時,就沒有後面那一項,代價函數的最小化所有取決於第一項,也就是集全力使得輸出和期待輸出差異最小,那何時差異最小啊,固然是咱們的函數或者曲線能夠通過全部的點了,這時候偏差就接近0,也就是過擬合了。它能夠複雜的表明或者記憶全部這些樣本,但對於一個新來的樣本泛化能力就不行了。畢竟新的樣本會和訓練樣本有差異的嘛。

       那咱們真正須要什麼呢?咱們但願咱們的模型既能夠擬合咱們的數據,又具備咱們約束它的特性。只有它們二者的完美結合,才能讓咱們的模型在咱們的任務上發揮強大的性能。因此如何討好它,是很是重要。在這點上,你們可能深有體會。還記得你復現了不少論文,而後復現出來的代碼跑出來的準確率沒有論文說的那麼高,甚至還差之萬里。這時候,你就會懷疑,究竟是論文的問題,仍是你實現的問題?實際上,除了這兩個問題,咱們還須要深刻思考另外一個問題:論文提出的模型是否具備hyper-parameters?論文給出了它們的實驗取值了嗎?經驗取值仍是通過交叉驗證的取值?這個問題是逃不掉的,由於幾乎任何一個問題或者模型都會具備hyper-parameters,只是有時候它是隱藏着的,你看不到而已,但一旦你發現了,證實你倆有緣,那請試着去修改下它吧,有可能有「奇蹟」發生哦。

       OK,回到問題自己。咱們選擇參數λ的目標是什麼?咱們但願模型的訓練偏差和泛化能力都很強。這時候,你有可能還反映過來,這不是說咱們的泛化性能是咱們的參數λ的函數嗎?那咱們爲何按優化那一套,選擇能最大化泛化性能的λ呢?Oh,sorry to tell you that,由於泛化性能並非λ的簡單的函數!它具備不少的局部最大值!並且它的搜索空間很大。因此你們肯定參數的時候,一是嘗試不少的經驗值,這和那些在這個領域摸爬打滾的大師是沒得比的。固然了,對於某些模型,大師們也整理了些調參經驗給咱們。例如Hinton大哥的那篇A Practical Guide to Training RestrictedBoltzmann Machines等等。還有一種方法是經過分析咱們的模型來選擇。怎麼作呢?就是在訓練以前,咱們大概計算下這時候的loss項的值是多少?Ω(w)的值是多少?而後針對他們的比例來肯定咱們的λ,這種啓發式的方法會縮小咱們的搜索空間。另一種最多見的方法就是交叉驗證Cross validation了。先把咱們的訓練數據庫分紅幾份,而後取一部分作訓練集,一部分作測試集,而後選擇不一樣的λ用這個訓練集來訓練N個模型,而後用這個測試集來測試咱們的模型,取N模型裏面的測試偏差最小對應的λ來做爲咱們最終的λ。若是咱們的模型一次訓練時間就很長了,那麼很明顯在有限的時間內,咱們只能測試很是少的λ。例如假設咱們的模型須要訓練1天,這在深度學習裏面是屢見不鮮了,而後咱們有一個星期,那咱們只能測試7個不一樣的λ。這就讓你遇到最好的λ那是上輩子積下來的福氣了。那有什麼方法呢?兩種:一是儘可能測試7個比較靠譜的λ,或者說λ的搜索空間咱們儘可能廣點,因此通常對λ的搜索空間的選擇通常就是2的多少次方了,從-10到10啊什麼的。但這種方法仍是不大靠譜,最好的方法仍是儘可能讓咱們的模型訓練的時間減小。例如假設咱們優化了咱們的模型訓練,使得咱們的訓練時間減小到2個小時。那麼一個星期咱們就能夠對模型訓練7*24/2=84次,也就是說,咱們能夠在84個λ裏面尋找最好的λ。這讓你碰見最好的λ的機率就大多了吧。這就是爲何咱們要選擇優化也就是收斂速度快的算法,爲何要用GPU、多核、集羣等來進行模型訓練、爲何具備強大計算機資源的工業界能作不少學術界也作不了的事情(固然了,大數據也是一個緣由)的緣由了。

       努力作個「調參」高手吧!祝願你們都能「調得一手好參」!

6、補充知識

  矩陣A的條件數等於A的範數與A的逆的範數的乘積,即cond(A)=‖A‖·‖A^(-1)‖,對應矩陣的3種範數,相應地能夠定義3種條件數。
  函數 cond(A,1)、cond(A)或cond(A inf) 是判斷矩陣病態與否的一種度量,條件數越大矩陣越病態。條件數事實上表示了矩陣計算對於偏差的敏感性。對於線性方程組Ax=b,若是A的條件數大,b的微小改變就能引發解x較大的改變,數值穩定性差。若是A的條件數小,b有微小的改變,x的改變也很微小,數值穩定性好。它也能夠表示b不變,而A有微小改變時,x的變化狀況。好比線性方程組

  的解是(x,y)=(0.0,0.1),
  而
的解是(x,y)=(-0.17,0.22),可見b很小的擾動就引發了x很大的變化,這就是A矩陣條件數大的表現。
  一個極端的例子,當A奇異時,條件數爲無窮,這時即便不改變b,x也能夠改變。奇異的本質緣由在於矩陣有0特徵值,x在對應特徵向量的方向上運動不改變Ax的值。若是一個特徵值比其它特徵值在數量級上小不少,x在對應特徵向量方向上很大的移動才能產生b微小的變化,這就解釋了爲何這個矩陣爲何會有大的條件數,事實上,正規陣在二範數下的條件數就能夠表示成 abs(最大特徵值/最小特徵值)。

7、參考文獻

  http://www.cnblogs.com/TenosDoIt/p/3708996.html?utm_source=tuicool&utm_medium=referral

  http://fastml.com/large-scale-l1-feature-selection-with-vowpal-wabbit/

  http://www.stat.purdue.edu/~vishy/introml/notes/Optimization.pdf

  http://www.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf

  http://nm.mathforcollege.com/mws/gen/04sle/mws_gen_sle_spe_adequacy.pdf

相關文章
相關標籤/搜索