稀疏自编码器及TensorFlow实现
自動編碼機更像是一個識別網絡,只是簡單重構了輸入。而重點應是在像素級重構圖像,施加的唯一約束是隱藏層單元的數量。
有趣的是,像素級重構并不能保證網絡將從數據集中學習抽象特征,但是可以通過添加更多的約束確保網絡從數據集中學習抽象特征。
稀疏自編碼器(又稱稀疏自動編碼機)中,重構誤差中添加了一個稀疏懲罰,用來限定任何時刻的隱藏層中并不是所有單元都被激活。如果 m 是輸入模式的總數,那么可以定義一個參數 ρ_hat,用來表示每個隱藏層單元的行為(平均激活多少次)。基本的想法是讓約束值 ρ_hat 等于稀疏參數 ρ。具體實現時在原始損失函數中增加表示稀疏性的正則項,損失函數如下:
如果 ρ_hat 偏離 ρ,那么正則項將懲罰網絡,一個常規的實現方法是衡量 ρ 和 ρ_hat 之間的 Kullback-Leiber(KL) 散度。
準備工作
在開始之前,先來看一下 KL 散度 DKL的概念,它是衡量兩個分布之間差異的非對稱度量,本節中,兩個分布是 ρ 和 ρ_hat。當 ρ 和 ρ_hat 相等時,KL 散度是零,否則會隨著兩者差異的增大而單調增加,KL 散度的數學表達式如下:
下面是 ρ=0.3 時的 KL 的散度 DKL的變化圖,從圖中可以看到,當 ρ_hat=0.3時,DKL=0;而在 0.3 兩側都會單調遞增:
具體做法
導入必要的模塊:
從 TensorFlow 示例加載 MNIST 數據集:
定義 SparseAutoEncoder 類,除了引入 KL 散度損失之外,它與前面的自動編碼機類非常相似:
將 KL 約束條件添加到損失函數中,如下所示:
其中,alpha 是稀疏約束的權重。該類的完整代碼如下所示:
聲明 SparseAutoEncoder 類的一個對象,調用 fit() 訓練,然后計算重構的圖像:
重構損失均方誤差隨網絡學習的變化圖:
查看重構的圖像:
結果如下:
解讀分析
必須注意到,稀疏自編碼器的主要代碼與標準自動編碼機完全相同,稀疏自編碼器只有一個主要變化——增加了KL散度損失以確保隱藏(瓶頸)層的稀疏性。如果將兩者的重構結果進行比較,則可以看到即使隱藏層中的單元數量相同,稀疏自動編碼機也比標準自動編碼機好很多:
在 MNIST 數據集上,標準自動編碼機訓練后的重構損失是 0.022,而稀疏自編碼器是 0.006,由此可見稀疏自編碼器對數據的內在表示學習得更好一些。
總結
以上是生活随笔為你收集整理的稀疏自编码器及TensorFlow实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标准自编码器(TensorFlow实现)
- 下一篇: NVIDIA DeepStream 5.