Deep learning:二十六(Sparse coding簡單理解)


 

  Sparse coding:

  本節將簡單介紹下sparse coding(稀疏編碼),因為sparse coding也是deep learning中一個重要的分支,同樣能夠提取出數據集很好的特征。本文的內容是參考斯坦福deep learning教程:Sparse CodingSparse Coding: Autoencoder Interpretation,對應的中文教程見稀疏編碼稀疏編碼自編碼表達

  在次之前,我們需要對凸優化有些了解,百度百科解釋為:”凸優化“ 是指一種比較特殊的優化,是指目標函數為凸函數且由約束條件得到的定義域為凸集的優化問題,也就是說目標函數和約束條件都是”凸”的。

  好了,現在開始簡單介紹下sparse coding, sparse coding是將輸入的樣本集X分解為多個基元的線性組合,然后這些基前面的系數表示的是輸入樣本的特征。其分解公式表達如下:

   

  而一般情況下要求基的個數k非常大,至少要比x中元素的個數n要大,因為這樣的基組合才能更容易的學到輸入數據內在的結構和特征。其實在常見的PCA算法中,是可以找到一組基來分解X的,只不過那個基的數目比較小,所以可以得到分解后的系數a是可以唯一確定,而在sparse coding中,k太大,比n大很多,其分解系數a不能唯一確定。一般的做法是對系數a作一個稀疏性約束,這也就是sparse coding算法的來源。此時系統對應的代價函數(前面的博文都用損失函數表示,以后統一改用代價函數,感覺這樣翻譯更貼切)表達式為:

   

  其中的第一項是重構輸入數據X的代價值,第二項的S(.)為分解系數的系數懲罰,lamda是兩種代價的權重,是個常量。但是這樣還是有一個問題,比如說我們可以將系數a減到很小,且將每個基的值增加到很大,這樣第一項的代價值基本保持不變,而第二項的稀疏懲罰依舊很小,達不到我們想要的目的——分解系數中只有少數系數遠遠大於0,而不是大部分系數都比0大(雖然不會大太多)。解決這個問題的通用方法是是對基集合中的值也做了一個約束,約束后的系統代價函數為:

   

 

  Sparse coding的概率解釋:

  主要是從概率的角度來解釋sparse coding方法,不過這一部分的內容還真沒太看明白,只能講下自己的大概理解。如果把誤差考慮進去后,輸入樣本X經過sparse coding分解后的表達式則如下:

   

  而我們的目標是找到一組基Ф,使得輸入樣本數據出現的概率與輸入樣本數據的經驗分布概率 最相近,如果用KL距離來衡量其相似度的話,就是滿足他們的KL距離最小,即下面表達式值最小:

   

  由於輸入數據的經驗分布函數概率是固定值,所以求上式值最小相當等價於求最大。

  經過對參數a的先驗估計和函數積分值估計等推導步驟,最后等價於求下面的能量函數值最小:

   

  而這就很好的和sparse coding的代價函數公式給聯系起來了。

  到目前為止我們應該知道sparse coding的實際使用過程中速度是很慢的,因為即使我們在訓練階段已經把輸入數據集的基Ф學習到了,在測試階段時還是要通過凸優化的方法去求得其特征值(即基組合前面的系數值),所以這比一般的前向神經網絡速度要慢(一般的前向算法只需用矩陣做一下乘法,然后做下加法,求個函數值等少數幾步即可完成)。

 

  Sparse coding的autoencoder解釋:

  首先來看看向量X的Lk規范數,其值為:  由此可知,L1范數為各元素之和,L2范數為該向量到遠點的歐式距離。 

  用矩陣的形式來表達sparse coding的代價函數如下:

   

  和前面所講的一樣,這里也對基值s做了稀疏性懲罰,用的是L1范數來約束,同時也防止系數矩陣A過大,對其用的是L2范數的平方來約束。但是基值處的L1范數在0點是無法求導的,所以不能用梯度下降等類似的方法來對上面的代價函數求最優參數,於是為了在0處可導,可將公式變成如下:

   

 

  拓撲sparse coding:

  拓撲sparse coding主要是模仿人體大腦皮層中相鄰的神經元對能提取出某一相近的特征,因此在deep learning中我們希望學習到的特征也具有這樣“拓撲秩序”的性質。如果我們隨意的將特征排列成一個矩陣,則我們希望矩陣中相鄰的特征是相似的。也就是把原先那些特征系數的稀疏性懲罰項L1范數更改為不同小組L1范數懲罰之和,而這些相鄰小組之間是有重疊值的,因此只要重疊的那一部分值改變就意味着各自組的懲罰值也會改變,這也就體現出了類似人腦皮層的特性,因此此時系統的代價函數為:

   

  改成矩陣的形式后如下:

   

 

  總結:

  在實際編程時,為了寫出准確無誤的優化函數代碼並能快速又恰到好處地收斂到最優值,可以采用下面的技巧:

  1. 將輸入樣本集分成多個小的mini-batches,這樣做的好處是每次迭代時輸入系統的樣本數變少了,運行的時間也會變短很多,並且也提高了整體收斂速度。(暫時還沒弄明白原因)。
  2. S的初始化值不能隨機給。一般都是按照下面的方法進行:

             

  最后,在實際優化該代價函數時步驟大致如下: 

  1. 隨機初始化A
  2. 重復以下步驟直至收斂
    1. 隨機選取一個有小的mini-batches。
    2. 按照前面講的方法來s
    3. 根據上一步給定的A,求解能夠最小化J(A,s)的s
    4. 根據上一步得到的s,求解能夠最小化J(A,s)的A

 

  參考資料:

     Sparse Coding

     Sparse Coding: Autoencoder Interpretation

     稀疏編碼

     稀疏編碼自編碼

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM