Stanford UFLDL教程 稀疏编码自编码表达
稀疏編碼自編碼表達
Contents[hide]
|
稀疏編碼
在稀疏自編碼算法中,我們試著學習得到一組權重參數 W(以及相應的截距 b),通過這些參數可以使我們得到稀疏特征向量 σ(Wx + b) ,這些特征向量對于重構輸入樣本非常有用。
稀疏編碼可以看作是稀疏自編碼方法的一個變形,該方法試圖直接學習數據的特征集。利用與此特征集相應的基向量,將學習得到的特征集從特征空間轉換到樣本數據空間,這樣我們就可以用學習得到的特征集重構樣本數據。
確切地說,在稀疏編碼算法中,有樣本數據 x 供我們進行特征學習。特別是,學習一個用于表示樣本數據的稀疏特征集s, 和一個將特征集從特征空間轉換到樣本數據空間的基向量 A, 我們可以構建如下目標函數:
(是x的Lk范數,等價于。L2 范數即大家熟知的歐幾里得范數,L1 范數是向量元素的絕對值之和)
上式前第一部分是利用基向量將特征集重構為樣本數據所產生的誤差,第二部分為稀疏性懲罰項(sparsity penalty term),用于保證特征集的稀疏性。
但是,如目標函數所示,它的約束性并不強――按常數比例縮放A的同時再按這個常數的倒數縮放s,結果不會改變誤差大小,卻會減少稀疏代價(表達式第二項)的值。因此,需要為 A 中每項 Aj 增加額外約束。問題變為:
遺憾的是,因為目標函數并不是一個凸函數,所以不能用梯度方法解決這個優化問題。但是,在給定 A 的情況下,最小化J(A,s) 求解 s 是凸的。同理,給定 s 最小化 J(A,s) 求解 A 也是凸的。這表明,可以通過交替固定s和 A 分別求解 A和s。實踐表明,這一策略取得的效果非常好。
但是,以上表達式帶來了另一個難題:不能用簡單的梯度方法來實現約束條件 。因此在實際問題中,此約束條件還不足以成為“權重衰變”("weight decay")項以保證 A 的每一項值夠小。這樣我們就得到一個新的目標函數:
(注意上式中第三項, 等價于,是A各項的平方和)
這一目標函數帶來了最后一個問題,即 L1 范數在 0 點處不可微影響了梯度方法的應用。盡管可以通過其他非梯度下降方法避開這一問題,但是本文通過使用近似值“平滑” L1 范數的方法解決此難題。使用 代替, 對 L1 范數進行平滑,其中ε 是“平滑參數”("smoothing parameter")或者“稀疏參數”("sparsity parameter") (如果ε遠大于x, 則 x + ε 的值由 ε 主導,其平方根近似于ε)。在下文提及拓撲稀疏編碼時,“平滑”會派上用場。
因此,最終的目標函數是:
( 是 的簡寫)
該目標函數可以通過以下過程迭代優化:
觀察修改后的目標函數 J(A,s),給定 s 的條件下,目標函數可以簡化為 (因為s 的 L1 范式不是 A 的函數,所以可以忽略)。簡化后的目標函數是一個關于A 的簡單二次項式,因此對 A 求導是很容易的。這種求導的一種快捷方法是矩陣微積分( 相關鏈接部分列出了跟矩陣演算有關的內容)。遺憾的是,在給定A 的條件下,目標函數卻不具備這樣的求導方法,因此目標函數的最小化步驟只能用梯度下降或其他類似的最優化方法。
理論上,通過上述迭代方法求解目標函數的最優化問題最終得到的特征集(A 的基向量)與通過稀疏自編碼學習得到的特征集是差不多的。但是實際上,為了獲得更好的算法收斂性需要使用一些小技巧,后面的 稀疏編碼實踐 稀疏編碼實踐章節會詳細介紹這些技巧。用梯度下降方法求解目標函數也略需技巧,另外使用矩陣演算或 反向傳播算法則有助于解決此類問題。
拓撲稀疏編碼
通過稀疏編碼,我們能夠得到一組用于表示樣本數據的特征集。不過,讓我們來找些靈感,我們希望學習得到一組有某種“秩序”的特征集。舉個例子,視覺特征,如前面所提到的,大腦皮層 V1 區神經元能夠按特定的方向對邊緣進行檢測,同時,這些神經元(在生理上)被組織成超柱(hypercolumns),在超柱中,相鄰神經元以相似的方向對邊緣進行檢測,一個神經元檢測水平邊緣,其相鄰神經元檢測到的邊緣就稍微偏離水平方向,沿著超柱,神經元就可以檢測到與水平方向相差更大的邊緣了。
受該例子的啟發,我們希望學習到的特征也具有這樣“拓撲秩序”的性質。這對于我們要學習的特征意味著什么呢?直觀的講,如果“相鄰”的特征是“相似”的,就意味著如果某個特征被激活,那么與之相鄰的特征也將隨之被激活。
具體而言,假設我們(隨意地)將特征組織成一個方陣。我們就希望矩陣中相鄰的特征是相似的。實現這一點的方法是將相鄰特征按經過平滑的L1范式懲罰進行分組,如果按 3x3 方陣分組,則用 代替, 其分組通常是重合的,因此從第 1 行第 1 列開始的 3x3 區域是一個分組,從第 1 行第 2 列開始的 3x3 區域是另一個分組,以此類推。最終,這樣的分組會形成環繞,就好像這個矩陣是個環形曲面,所以每個特征都以同樣的次數進行了分組。于是,將經過平滑的所有分組的 L1 懲罰值之和代替經過平滑的 L1 懲罰值,得到新的目標函數如下:
實際上,“分組”可以通過“分組矩陣”V 完成,于是矩陣 V 的第 r 行標識了哪些特征被分到第 r 組中,即如果第 r 組包含特征 c 則 Vr,c = 1。通過分組矩陣實現分組使得梯度的計算更加直觀,使用此分組矩陣,目標函數被重寫為:
(令 , 等價于
| ∑ | ∑ | Dr,c |
| r | c | ? |
)
該目標函數能夠使用之前部分提到的迭代方法進行求解。拓撲稀疏編碼得到的特征與稀疏編碼得到的類似,只是拓撲稀疏編碼得到的特征是以某種方式有“秩序”排列的。
稀疏編碼實踐
如上所述,雖然稀疏編碼背后的理論十分簡單,但是要寫出準確無誤的實現代碼并能快速又恰到好處地收斂到最優值,則需要一定的技巧。
回顧一下之前提到的簡單迭代算法:
這樣信手拈來地執行這個算法,結果并不會令人滿意,即使確實得到了某些結果。以下是兩種更快更優化的收斂技巧:
將樣本分批為“迷你塊”
如果你一次性在大規模數據集(比如,有10000 個patch)上執行簡單的迭代算法,你會發現每次迭代都要花很長時間,也因此這算法要花好長時間才能達到收斂結果。為了提高收斂速度,可以選擇在迷你塊上運行該算法。每次迭代的時候,不是在所有的 10000 個 patchs 上執行該算法,而是使用迷你塊,即從 10000 個 patch 中隨機選出 2000 個 patch,再在這個迷你塊上執行這個算法。這樣就可以做到一石二鳥――第一,提高了每次迭代的速度,因為現在每次迭代只在 2000 個 patch 上執行而不是 10000個;第二,也是更重要的,它提高了收斂的速度(原因見TODO)。
良好的s初始值
另一個能獲得更快速更優化收斂的重要技巧是:在給定 A 的條件下,根據目標函數使用梯度下降(或其他方法)求解s 之前找到良好的特征矩陣 s 的初始值。實際上,除非在優化A 的最優值前已找到一個最佳矩陣 s,不然每次迭代過程中隨機初始化s 值會導致很差的收斂效果。下面給出一個初始化 s 的較好方法:
無疑,這樣的初始化有助于算法的改進,因為上述的第一步希望找到滿足 的矩陣s;第二步對 s 作規范化處理是為了保持較小的稀疏懲罰值。這也表明,只采用上述步驟的某一步而不是兩步對s 做初始化處理將嚴重影響算法性能。(TODO: 此鏈接將會對為什么這樣的初始化能改進算法作出更詳細的解釋)
可運行算法
有了以上兩種技巧,稀疏編碼算法修改如下:
通過上述方法,可以相對快速的得到局部最優解。
中英文對照
局部最優解 local optima
總結
以上是生活随笔為你收集整理的Stanford UFLDL教程 稀疏编码自编码表达的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stanford UFLDL教程 稀疏编
- 下一篇: Stanford UFLDL教程 独立成