贪婪深度字典学习
貪婪深度字典學習
原文地址:http://blog.csdn.net/hjimce/article/details/50876891
作者:hjimce
一、相關理論
近幾年深度學習聲名鵲起,一個又一個AI領域被深度學習攻破,然而現在大部分深度學習所采用的算法都是有監督學習的方法;有監督學習需要大量的標注數據,需要耗費大量的人力物力。因此當有監督學習算法達到瓶頸的時候,無監督學習必將成為未來深度學習領域的研究焦點,使得深度學習更接近于人類;畢竟無標簽數據一抓一大把、到處都是,如果我們可以搞好無監督學習,這才是牛逼人工智能。
無監督表征學習,除了自編碼、受限玻爾茲曼機之外,k-means、稀疏編碼等也是無監督表征學習的重要算法。無監督表征學習算法的應用主要分兩種:
(1)用于神經網絡的無監督預訓練。這個我們在深度學習里面經常遇到,比如自編碼、RBM就可以分別用于SAE、DBN深度網絡的預訓練;
(2)無監督特征抽取,然后用抽取到的特征做分類任務;這個說白了就是先用無監督算法抽取高層特征,然后再用SVM來訓練特征分類器,像稀疏編碼、k-means表征學習一般是這么使用的,當然AE、RBM也可以這樣使用。
本篇博文主要講解我最近所學的一篇paper:《Greedy?Deep?Dictionary?Learning》。這篇文獻主要提出了一個深度字典學習方法,字典學習也可以簡單的稱之為稀疏編碼。文獻算法主要是受了棧式自編碼、DBN訓練方法的啟發,提出逐層貪婪深度字典學習。
二、貪婪深層字典學習
之前人們所研究的算法都是針對單層字典學習(淺層字典學習),然而我們知道深層模型具有更抽象、更牛逼的表征能力。既然單層自編碼對應的DL模型“棧式自編碼”;RBM也有對應的DL模型“深度信念網絡”;于是文獻借助于這思想,也提出了單層字典學習的對應DL算法:深度字典學習。
1、字典學習相關概念
從矩陣分解角度看字典學習過程:給定樣本數據集X,X的每一列表示一個樣本;字典學習的目標是把X矩陣分解成D、Z矩陣:
X≈DZ
同時滿足約束條件:X盡可能稀疏,同時D的每一列是一個歸一化向量。這樣就相當于求解目標函數:
D稱之為字典,D的每一列稱之為原子;Z稱之為編碼矢量、特征、系數矩陣。除了上面這個損失函數之外,字典學習還有另外兩種形式的損失函數,比如k-svd字典學習算法,求解的目標函數就是:
?
具體字典學習相關概念,可以參考我的另外一篇博文《k-svd字典學習》,這邊不再啰嗦。
2、深層字典學習
我們前面講到字典學習說白了就是矩陣分解:
X=DZ
這是一個單層矩陣分解,就相當于單層神經網絡一樣。而文獻所提出的算法是多層字典學習,也就是多層矩陣分解:
X=D1*D2*Z
首先字典學習它是個非凸優化問題,多層字典學習將會變得更加復雜;另外多層字典學習的所要求解的參數大大增加,在有限的訓練樣本下,容易引起過擬合問題。因此文獻提出類似于SAE、DBN一樣,采用逐層訓練學習的思想,這樣可以保證網絡的每一層都是收斂的。算法其實非常簡單,以雙層分解為例進行逐層分解,具體示意圖如下:
(1)我們首先訓練學習出第一層特征Z1、權重D1:
X=D1*Z1
(2)然后對特征Z1進行分解,求解第二層權重D2、特征Z2:
Z1=D2*Z2
以此類推,就可以實現更深層的字典學習。OK,這就是文獻的算法,沒了……(感覺啥也沒學到的樣子,給我的感覺很low,跟文獻《A deep matrix factorization method for learning attribute representations》沒得比呀,這篇文獻至少還有整體微調階段)
3、paper使用方法
在每一層字典學習的時候,我們可以通過添加約束項,選擇稠密特征或者是稀疏特征。
(1)如果要求解稠密特征,那我們就直接求解目標函數:
?
也就是沒有了稀疏約束項。求解方法采用類似lasso,即對兩個變量Z、D交替迭代的方法:
?
(2)如果要求解稀疏特征,那么我們就用L1正則約束項:
?
然后迭代公式就是:
?
對于第二個公式Dk的求解,也是求解一個最小二乘問題。對于稀疏編碼Zk的求解采用ISAT算法,如下公式:
以前字典學習,一般字典的初始化都是從樣本中隨機抽取的,然而本文采用的是QR分解,從Q矩陣中按順序,提取出正交向量,作為初始字典。另外文獻最后采用的網絡模型是,除了最后一層采用稀疏編碼之外,其它層都采用的稠密特征。
三、與RBM、自編碼的區別、聯系
1、與RBM的聯系
RBM是損失函數是采用數據分布相似性度量,而字典學習是采用歐式距離損失函數。RBM要求數據介于0~1之間,如果數據超過這個范圍,那么就需要做歸一化處理。在大部分情況下,歸一化對于我們所要的性能可能沒啥影響,但是在某些特定的情況下它會抑制一些重要的信息。然而字典學習可以讓我們輸入任意復雜的數據。
2、與自編碼的聯系
從我們的分析來看,自編碼是學習W,使得W*X=Z,然而字典學習的目標是學習D使得X=DZ。也難怪文獻中的字典學習網絡的線是畫相反的方向。
四、試驗結果
1、淺層學習與深層學習對比
文獻對比了淺層表征學習和深層表征學習的結果,采用兩種方法進行特征Z的學習,然后采用k近鄰進行分類測試,結果如表一所示。
2、與SAE、DBN的對比
三個網絡模型都采用3層網絡,每層網絡神經元一次減半。同樣的我們利用這兩個算法進行表征學習提取高層特征,然后利用高層特征進行分類:KNN,SVM,測試結果得到表格2、3
最后再采用fune-tuning后的DBN、SAE,與本文的算法做出了對比,得到結果表格IV。可以看到,在某些情況下,即使是fine-tuning的DBN、SAE,精度也比不上文獻的算法DDL:
個人總結:這篇文獻其實非常簡單,就僅僅是講解X=D1*D2*Z的一個求解方法,然而文獻竟然啰嗦了將近10頁;而我竟讓這篇博文也寫了這么多,感覺自己快成了說書的了,越來越能扯……不過文獻所提出的算法雖然簡單,但是作者通過驗證對比,確實是非常牛逼的效果,在無監督的條件下,比自編碼、RBM都要牛逼,甚至連fine-tuning的自編碼、RBM在某些任務下,都無法與之匹敵。不過這個還是比較喜歡另外一篇文獻:《A deep matrix factorization method for learning attribute representations》,這篇文獻講的是深度非負矩陣分解,里面的創新點非常多,這樣可以學到更多的知識,感覺才比較充實。
參考文獻:
1、《Greedy?Deep?Dictionary?Learning》
2、《A deep matrix factorization method for learning attribute representations》
總結
- 上一篇: CentOS 6.X启动流程
- 下一篇: 技术人员为什么应该参加社区活动?