起源:PCA、特征提取....
隨着一些奇怪的高維數據出現,比如圖像、語音,傳統的統計學-機器學習方法遇到了前所未有的挑戰。
數據維度過高,數據單調,噪聲分布廣,傳統方法的“數值游戲”很難奏效。數據挖掘?已然挖不出有用的東西。
為了解決高維度的問題,出現的線性學習的PCA降維方法,PCA的數學理論確實無懈可擊,但是卻只對線性數據效果比較好。
於是,尋求簡單的、自動的、智能的特征提取方法仍然是機器學習的研究重點。比如LeCun在1998年CNN總結性論文中就概括了今后機器學習模型的基本架構。
當然CNN另辟蹊徑,利用卷積、降采樣兩大手段從信號數據的特點上很好的提取出了特征。對於一般非信號數據,該怎么辦呢??
Part I 自動編碼器(AutoEncoder)
自動編碼器基於這樣一個事實:原始input(設為x)經過加權(W、b)、映射(Sigmoid)之后得到y,再對y反向加權映射回來成為z。
通過反復迭代訓練兩組(W、b),使得誤差函數最小,即盡可能保證z近似於x,即完美重構了x。
那么可以說正向第一組權(W、b)是成功的,很好的學習了input中的關鍵特征,不然也不會重構得如此完美。結構圖如下:
從生物的大腦角度考慮,可以這么理解,學習和重構就好像編碼和解碼一樣。
這個過程很有趣,首先,它沒有使用數據標簽來計算誤差update參數,所以是無監督學習。
其次,利用類似神經網絡的雙隱層的方式,簡單粗暴地提取了樣本的特征。
這個雙隱層是有爭議的,最初的編碼器確實使用了兩組(W,b),但是Vincent在2010年的論文中做了研究,發現只要單組W就可以了。
即W'=WT, W和W’稱為Tied Weights。實驗證明,W'真的只是在打醬油,完全沒有必要去做訓練。
逆向重構矩陣讓人想起了逆矩陣,若W-1=WT的話,W就是個正交矩陣了,即W是可以訓成近似正交陣的。
由於W'就是個醬油,訓練完之后就沒它事了。正向傳播用W即可,相當於為input預先編個碼,再導入到下一layer去。所以叫自動編碼器,而不叫自動編碼解碼器。
Part II 降噪自動編碼器(Denoising Autoencoder)
Vincent在2008年的論文中提出了AutoEncoder的改良版——dA。推薦首先去看這篇paper。
論文的標題叫 "Extracting and Composing Robust Features",譯成中文就是"提取、編碼出具有魯棒性的特征"
怎么才能使特征很魯棒呢?就是以一定概率分布(通常使用二項分布)去擦除原始input矩陣,即每個值都隨機置0, 這樣看起來部分數據的部分特征是丟失了。
以這丟失的數據x'去計算y,計算z,並將z與原始x做誤差迭代,這樣,網絡就學習了這個破損(原文叫Corruputed)的數據。
這個破損的數據是很有用的,原因有二:
其之一,通過與非破損數據訓練的對比,破損數據訓練出來的Weight噪聲比較小。降噪因此得名。
原因不難理解,因為擦除的時候不小心把輸入噪聲給×掉了。
其之二,破損數據一定程度上減輕了訓練數據與測試數據的代溝。由於數據的部分被×掉了,因而這破損數據
一定程度上比較接近測試數據。(訓練、測試肯定有同有異,當然我們要求同舍異)。
這樣訓練出來的Weight的魯棒性就提高了。圖示如下:
關鍵是,這樣胡亂擦除原始input真的很科學?真的沒問題? Vincent又從大腦認知角度給了解釋:
paper中這么說到:人類具有認知被阻擋的破損圖像能力,此源於我們高等的聯想記憶感受機能。
我們能以多種形式去記憶(比如圖像、聲音,甚至如上圖的詞根記憶法),所以即便是數據破損丟失,我們也能回想起來。
另外,就是從特征提取的流形學習(Manifold Learning)角度看:
破損的數據相當於一個簡化的PCA,把特征做一個簡單的降維預提取。
Part III 自動編碼器的奇怪用法
自動編碼器相當於創建了一個隱層,一個簡單想法就是加在深度網絡的開頭,作為原始信號的初級filter,起到降維、提取特征的效果。
關於自動編碼器取代PCA的基本用法,參考 http://www.360doc.com/content/15/0324/08/20625606_457576675.shtml
當然Bengio在2007年論文中仿照DBN較之於RBM做法:作為深度網絡中各個layer的參數初始化值,而不是用隨機小值。
即變成了Stacked AutoEncoder。
當然,這種做法就有一個問題,AutoEncoder可以看作是PCA的非線性補丁加強版,PCA的取得的效果是建立在降維基礎上的。
仔細想想CNN這種結構,隨着layer的推進,每層的神經元個數在遞增,如果用了AutoEncoder去預訓練,豈不是增維了?真的沒問題?
paper中給出的實驗結果認為AutoEncoder的增維效果還不賴,原因可能是非線性網絡能力很強,盡管神經元個數增多,但是每個神經元的效果在衰減。
同時,隨機梯度算法給了后續監督學習一個良好的開端。整體上,增維是利大於弊的。
Part IV 代碼與實現
具體參考 http://deeplearning.net/tutorial/dA.html
有幾個注意點說下:
①cost函數可以使用交錯熵(Cross Entroy)設計,對於定義域在[0,1]這類的數據,交錯熵可用來設計cost函數。
其中Logistic回歸的似然函數求導結果可看作是交錯熵的特例。參考 http://en.wikipedia.org/wiki/Cross_entropy
也可以使用最小二乘法設計。
②RandomStreams函數存在多個,因為要與非Tensor量相乘,必須用shared版本。
所以是 from theano.tensor.shared_randomstreams import RandomStreams
而不是 from theano.tensor import RandomStreams