http://blog.csdn.net/zouxy09/article/details/24972869算法
上一篇博文,咱們聊到了L0,L1和L2範數,這篇咱們絮叨絮叨下核範數和規則項參數選擇。知識有限,如下都是我一些淺顯的見解,若是理解存在錯誤,但願你們不吝指正。謝謝。數據庫
3、核範數ide
核範數||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所表明的圖像區域校訂成正則的區域,如具備橫平豎直、對稱等特性,這些特性能夠經過低秩性來進行刻畫。
低秩的應用很是多,你們有興趣的能夠去找些資料深刻了解下。
4、規則化參數的選擇
如今咱們回過頭來看看咱們的目標函數:
裏面除了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、多核、集羣等來進行模型訓練、爲何具備強大計算機資源的工業界能作不少學術界也作不了的事情(固然了,大數據也是一個緣由)的緣由了。
努力作個「調參」高手吧!祝願你們都能「調得一手好參」!
5、參考資料
[1] http://fastml.com/large-scale-l1-feature-selection-with-vowpal-wabbit/
[2] http://www.stat.purdue.edu/~vishy/introml/notes/Optimization.pdf
[3] http://www.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf
[4] GradientDescent, Wolfe's Condition and Logistic Regression
[5] http://nm.mathforcollege.com/mws/gen/04sle/mws_gen_sle_spe_adequacy.pdf