博客內容取材於:http://www.cnblogs.com/tornadomeet/archive/2012/06/24/2560261.htmlphp
Deep learning:三十五(用NN實現數據降維練習) Deep learning:三十四(用NN實現數據的降維) Deep learning:三十三(ICA模型) Deep learning:三十二(基礎知識_3) Deep learning:三十一(數據預處理練習) Deep learning:三十(關於數據預處理的相關技巧) Deep learning:二十九(Sparse coding練習) Deep learning:二十八(使用BP算法思想求解Sparse coding中矩陣範數導數) Deep learning:二十七(Sparse coding中關於矩陣的範數求導) Deep learning:二十六(Sparse coding簡單理解) Deep learning:十二(PCA和whitening在二天然圖像中的練習) Deep learning:十一(PCA和whitening在二維數據中的練習) Deep learning:十(PCA和whitening) Deep learning:九(Sparse Autoencoder練習) Deep learning:八(Sparse Autoencoder)
參考資料:html
在此將降維相關的內容所有集中在本篇。ios
NB: 稀疏表達(sparse representation)和降維(dimensionality reduction)算法
Here, we should note that these two concepts are different! Remeber to distinguish! api
十二(PCA和whitening在二天然圖像中的練習)dom
三十(關於數據預處理的相關技巧)機器學習
歸一化 Data Normalizationide
數據的歸一化通常包括函數
數據尺度歸一化的緣由是:數據中每一個維度表示的意義不一樣,因此有可能致使該維度的變化範圍不一樣,所以有必要將他們都歸一化到一個固定的範圍,通常狀況下是歸一化到[0 1]或者[-1 1]。
這種數據歸一化還有一個好處是對後續的一些默認參數(好比白化操做)不須要從新過大的更改。
逐樣本的均值相減主要應用在那些具備穩定性的數據集中,也就是那些數據的每一個維度間的統計性質是同樣的。好比說,在天然圖片中,這樣就能夠減少圖片中亮度對數據的影響,由於咱們通常不多用到亮度這個信息。不過逐樣本的均值相減這隻適用於通常的灰度圖,在rgb等色彩圖中,因爲不一樣通道不具有統計性質相同性因此基本不會經常使用。
特徵標準化是指對數據的每一維進行均值化和方差相等化。這在不少機器學習的算法中都很是重要,好比SVM等。
在使用PCA前須要對數據進行預處理,[This is 特徵標準化]
可是比較奇怪的是,在對天然圖像進行均值處理時並非減去該維的平均值,而是減去這張圖片自己的平均值。由於PCA的預處理是按照不一樣應用場合來定的。
Whitening
*Purpose
Whitening的目的是去掉數據之間的相關聯度,是不少算法進行預處理的步驟。
好比說當訓練圖片數據時,因爲圖片中相鄰像素值有必定的關聯,因此不少信息是冗餘的。這時候去相關的操做就能夠採用白化操做。
*Before whitening
數據的whitening必須知足兩個條件:
在對數據進行白化前要求先對數據進行特徵零均值化,不過通常只要 咱們作了(數據歸一化)'s 特徵標準化,那麼這個條件必須就知足了。
*How to do whitening
在數據白化過程當中,最主要的仍是參數epsilon的選擇,由於這個參數的選擇對deep learning的結果起着相當重要的做用。
常見的白化操做有PCA whitening和ZCA whitening。
ZCA whitening公式爲:
Ref: 實現主成分分析和白化
-- 參數epsilon的選擇 --
爲計算PCA白化後的數據 ,能夠用
xPCAwhite = diag(1./sqrt(diag(S) + epsilon)) * U' * x;
由於 S 的對角線包括了特徵值 ,這其實就是同時爲全部樣本計算 的簡潔表達。
最後,你也能夠這樣計算ZCA白化後的數據:
xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x;
在基於重構的模型中(好比說常見的RBM,Sparse coding, autoencoder都屬於這一類,由於他們基本上都是重構輸入數據),一般是選擇一個適當的epsilon值使得可以對輸入數據進行低通濾波。
可是何謂適當的epsilon呢?這仍是很難掌握的,
所以通常的方法是畫出變化後數據的特徵值分佈圖,若是那些小的特徵值基本都接近0,則此時的epsilon是比較合理的。
以下圖所示,讓那個長長的尾巴接近於x軸。
該圖的橫座標表示的是第幾個特徵值,已經將數據集的特徵值從大到小排序過。
文章中給出了個小小的實用技巧:
若是數據已被縮放到合理範圍(如[0,1]),能夠從epsilon = 0.01或epsilon = 0.1開始調節epsilon。
基於正交化的ICA模型中,應該保持參數epsilon儘可能小,由於這類模型須要對學習到的特徵作正交化,以解除不一樣維度之間的相關性。
*Result:
Origianl photo --> left figure --> pca with 99% --> PCA Whitening --> 協方差矩陣 right figure
Thus, only main features remain after Whitening.
Ref: http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
from sklearn.decomposition import PCA pca = PCA(whiten=True) pca.fit(X)
Replace with scikit api here.
Goto: [Bayesian] 「我是bayesian我怕誰」系列 - Continuous Latent Variables
8、九主要仍是稀疏約束部分,在稀疏表達中再詳解。
十五就是效果等價於pca,降維並且識別率還高。
Self-taught learning or Semi-supervised learning 半監督學習
Self-taught learning是徹底無監督的。
好比說咱們須要設計一個系統來分類出轎車和摩托車。
該ML方法在特徵提取方面是徹底用的無監督方法,在上面的基礎上再用有監督的方法繼續對網絡的參數進行微調,這樣就能夠獲得更好的效果了。
由於有了剛剛的初始化參數【等效pca的輸入層的權重們】,此時的優化結果通常都能收斂到比較好的局部最優解
梯度擴散問題
先訓練網絡的第一個隱含層,而後接着訓練第二個,第三個…最後用這些訓練好的網絡參數值做爲總體網絡參數的初始值。
前面的網絡層次基本都用無監督的方法得到,只有最後一個輸出層須要有監督的數據。
另外因爲無監督學習其實隱形之中已經提供了一些輸入數據的先驗知識,因此此時的參數初始化值通常都能獲得最終比較好的局部最優解。
最終還在於理解下面這個權重初始化的式子,從而防止梯度消失和爆炸。
補充:stacked autoencoders - 比較常見的一種層次貪婪訓練方法 【見下文詳情】
單自動編碼器,充其量也就是個強化補丁版PCA,只用一次好不過癮。
因而Bengio等人在2007年的 Greedy Layer-Wise Training of Deep Networks 中,
仿照stacked RBM構成的DBN,提出Stacked AutoEncoder,爲非監督學習在深度網絡的應用又添了猛將。
十七(Linear Decoders,Convolution和Pooling)
convolution是爲了解決前面無監督特徵提取學習計算複雜度的問題;
pooling方法是爲了後面有監督特徵分類器學習的,也是爲了減少須要訓練的系統參數;
[ 固然這是在廣泛例子中的理解,也就是說咱們採用無監督的方法提取目標的特徵,而採用有監督的方法來訓練分類器 ]
假如對一張大圖片Xlarge的數據集,r*c大小,則首先須要對這個數據集隨機採樣大小爲a*b的小圖片,而後用這些小圖片patch進行學習(好比說sparse autoencoder),此時的隱含節點爲k個。所以最終學習到的特徵數爲:
此時的convolution移動是有重疊的。
PCA Whitening是保證數據各維度的方差爲1,而ZCA Whitening是保證數據各維度的方差相等便可,不必定要惟一。
而且這兩種whitening的通常用途也不同,PCA Whitening主要用於降維且去相關性,而ZCA Whitening主要用於去相關性,且儘可能保持原數據。
由於目前tensorflow的出現,使用MATLAB的練習題貌似用處不大了。
stacked autoencoder貌似也沒說什麼,至於文中提到的反捲積顯示問題,當下已經有了解決方案。
還有就是DBM多是有必須學習stacked autoencoder的惟一理由了吧,畢竟隨機初始化能夠替代這些個繁瑣的預處理過程。
一個隱含層的網絡結構
本文是讀Ng團隊的論文」 An Analysis of Single-Layer Networks in Unsupervised Feature Learning」後的分析,主要是針對一個隱含層的網絡結構進行分析的。
分別對比了4種網絡結構,k-means, sparse autoencoder, sparse rbm, gmm。
最後做者得出了下面幾個結論:
1. 網絡中隱含層神經元節點的個數,採集的密度(也就是convolution時的移動步伐)和感知區域大小對最終特徵提取效果的影響很大,甚至比網絡的層次數,deep learning學習算法自己還要重要。
2. Whitening在預處理過程當中頗有必要!
3. 在以上4種實驗算法中,k-means效果居然最好。所以在最後做者給出結論時的建議是,儘可能使用whitening對數據進行預處理,每一層訓練更多的特徵數,採用更密集的方法對數據進行採樣。
【感知區域大小當前可經過」」小卷積核+多層「來實現,這樣參數少】
即根本就無需經過那些複雜且消耗大量時間去訓練網絡的參數的deep learning算法,咱們只需隨機給網絡賦一組參數值,其最終取得的特徵好壞不比那些預訓練和仔細調整後獲得的效果些,並且這樣還能夠減小大量的訓練時間。
當採用無監督的方法分層預訓練深度網絡的權值時,爲了學習到較魯棒的特徵,能夠在網絡的可視層(即數據的輸入層)引入隨機噪聲,
這種方法稱爲Denoise Autoencoder(簡稱dAE),由Bengio在08年提出,見其文章Extracting and composing robust features with denoising autoencoders.
denoise後右圖學習到的特徵更具備表明性,給人印象深入。右圖同時也給人一種overfitting的感受。
可見,特徵這個東西,是越簡單越好,表現出的樣子就是右圖所示。
四十八(Contractive AutoEncoder簡單理解)
Contractive autoencoder是autoencoder的一個變種,其實就是在autoencoder上加入了一個規則項,它簡稱CAE。
是隱含層輸出值關於權重的雅克比矩陣,
表示的是該雅克比矩陣的F範數的平方,即雅克比矩陣中每一個元素求平方
而後求和,更具體的數學表達式爲:
關於雅克比矩陣的介紹可參考雅克比矩陣&行列式——單純的矩陣和算子,
關於F範數可參考前面的博文Sparse coding中關於矩陣的範數求導中的內容。
有了loss函數的表達式,採用常見的mini-batch隨機梯度降低法訓練便可。
關於爲何contrative autoencoder效果這麼好?
好的特徵表示大體有2個衡量標準:
1. 能夠很好的重構出輸入數據;
2.對輸入數據必定程度下的擾動具備不變形。
普通的autoencoder和sparse autoencoder主要是符合第一個標準。
deniose autoencoder和contractive autoencoder則主要體如今第二個,尤爲是對於分類任務。
總之,Contractive autoencoder主要是抑制訓練樣本(處在低維流形曲面上)在全部方向上的擾動。
Goto: [UFLDL] Generative Model 【--> 重點反而不是降維,而是能量傳播與全局最優】