稀疏編碼系列:
---------------------------------------------------------------------------
本文的內容主要來自餘凱老師在CVPR2012上給的Tutorial。前面在總結ScSPM和LLC的時候,引用了很多Tutorial上的圖片。其實這個Tutorial感覺寫的挺好的,所以這次把它大致用自己的語言描述一下。不過稀疏編碼是前兩年比較火的東西,現在火的是deep learning了。
1、What is sparse coding?
1988年,神經稀疏編碼的概念由Mitchison提出,由牛津大學的Rolls等正式引用。靈長目動物顎葉視覺皮層和貓視覺皮層的電生理實驗報告和一些相關模型的研究結果都說明了視覺皮層複雜刺激的表達是採用稀疏編碼原則的。研究表明:初級視覺皮層V1區第四層有5000萬個(相當於基函數),而負責視覺感知的視網膜和外側膝狀體的神經細胞只有100萬個左右(理解爲輸出神經元)。說明稀疏編碼是神經信息羣體分佈式表達的一種有效策略。1996年,加州大學伯克利分校的Olshausen等在Nature雜誌發表論文指出:自然圖像經過稀疏編碼後得到的基函數類似V1區簡單細胞感受野的反應特性(空間局部性、空間方向性、信息選擇性)。
典型的sparse coding的過程分爲訓練和測試。
Training:給定一些訓練樣本(training samples)[ x1, x2, …, xm(in Rd)],學習一本字典的基(bases)[Φ1,Φ2……(also in Rd)]。可是用k-means等無監督的方法,也可以用優化的方法(這時training完了同時也得到了這些training samples的codes,這是一個LASSO和QP問題的循環迭代);
Coding:用優化的方法求解測試樣本的codes(此時字典已經學得)。經典的方法是求解LASSO:
(1)
自我學習就是在Training的時候採用大量無標註的自然圖像訓練字典,然後對帶標註的圖像進行編碼得到特徵codes。
2、Connections to RBMs, autoencoders
(1)式(經典的稀疏編碼)有幾個特點:
——係數a是稀疏的;
——a的維數一般比x的維數大;
——編碼過程a=f(x)是一個非線性的關於x的隱函數(即我們沒有f(x)的顯示錶達,因爲求解LASSO沒有解析解);
——重建過程x'=g(a)是一個線性的顯示的關於a的函數(X’=ΣaiΦi)。
而RBM和自編碼的特點則是:
——有顯示的f(x);
——不會必然得到稀疏的a,但是如果我們增加稀疏的約束(如稀疏自編碼,稀疏RBM),通常能得到更好的效果(進一步說明sparse helps learning)。
從廣義上說,滿足這麼幾個條件的編碼方式a=f(x)都可以叫稀疏編碼:
1) a是稀疏的,且通常具有比x更高的維數;
2) f(x)是一個非線性的映射;(jiang1st2010注:該條要求存疑,見下面解釋。)
3) 重建的過程x'=g(a),使得重建後的x'與x相似。
因此,sparse RBM,sparse auto-encoder,甚至VQ都可以算是一種sparse coding。(jiang1st2010注:第二條要求稱f(x)是一個非線性映射,然而SPM中用到的VQ是一個線性映射,原因可以參見這裏和這裏。餘凱老師也是LLC論文的作者,似乎存在矛盾?不過這是個小問題了,沒必要深究。)
3、Sparse activations vs. sparse models
現在可以用a=f(x)表示稀疏編碼的問題了。它可以分解成兩種情況:
1)sparse model:f(x)的參數是稀疏的
--例如:LASSO f(x)=<w,x>,其中w要求是稀疏的。(jiang1st2010注:這個例子中f(x)也是線性的!)
--這是一個特徵選擇的問題:所有的x都挑選相同的特徵子集。
--hot topic.
2)sparse activation:f(x)的輸出是稀疏的
--就是說a是稀疏的。
--這是特徵學習的問題:不同的x會激活不懂的特徵子集。
4、Sparsity vs. locality
其實這個問題在這裏已經談過了。簡單的說就是sparsity不一定導致locality,而locality肯定是sparse的。sparse不比locality好,因爲locality具有smooth的特性(即相鄰的x編碼後的f(x)也是相鄰的),而僅僅sparse不能保證smooth。smooth的特性對classification會具有更好的效果,並且設計f(x)時,應儘量保證相似的x在它們的codes中有相似的非0的維度。
Tutorial上展示了(1)中取不同的λ,字典中各項呈現的效果:
作者想說明的問題是分類效果越好的情況下,basis會更清晰地表現出屬於某幾個特定的類。但是我沒太看明白。
5、Hierarchical sparse coding
這裏圖3曾說明了SIFT本身就是一個Coding+Pooling的過程,所以SPM是一個兩層的Coding+Pooling。而Hierarchical sparse coding就是兩層的coding都是sparse coding,如下圖:
整個HSC的第一層就從pixel層級開始(不需要手動設計SIFT特徵了),經過兩層SC後,形成codes。這個過程可以從無標註的數據中學習,就是self-taught learning。從pixel層級開始,這點和DNN啥的很像了。
從結果來看,HSC的性能會比SIFT+SC稍微好些。
Tutorial的最後列舉了關於SC的其他主題,我也不懂,這裏就不廢話了。
-----------------
作者:jiang1st2010
轉載請註明出處:http://blog.csdn.net/jwh_bupt/article/details/9902949