1.介紹
在自動編碼器一文中,我們已經簡單介紹了基于隐藏神經元數量較小的假設,本文主要基于隐藏神經元數量較大的假設。此時,我們仍然通過給自編碼神經網絡施加一些其他的限制條件來發現輸入資料中的結構。比如我們給隐藏神經元加入稀疏性限制。
稀疏性可以被簡單地解釋如下:假設神經元的激活函數時sigmoid函數,那麼當神經元的輸出接近于1的時候我們認為它被激活,而輸出接近于0的時候認為它被抑制,那麼使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。如果使用tanh作為激活函數的話,當神經元輸出為-1的時候,我們認為神經元是被抑制的。
2.KL散度
在介紹自動編碼器之前,我們先看下KL散度:

,這個是離散機率分布的公式
,這個是連續機率分布的公式
KL散度可以很好地測量兩個機率分布之間的距離,比如公式中的p和q。如果兩個分布越接近,那麼KL散度越小;如果越遠,KL散度就會越大。
KL散度的實戰——1維高斯分布
我們先來一個相對簡單的例子。假設我們有兩個随機變量x1,x2,各自服從一個高斯分布
,那麼這兩個分布的KL散度該怎麼計算呢?
我們知道:
那麼KL(p1,p2)就等于
同理:多元高斯分布的KL散度
首先給出多元高斯分布的公式:
3.稀疏 based on KL散度
圖1
注意到圖1中
表示隐藏神經元 j 的激活度,但是這一表示方法中并未明确指出哪一個輸入x 帶來了這一激活度。是以我們将使用
來表示在給定輸入為x 情況下,自編碼神經網絡隐藏神經元 j 的激活度。 進一步,讓
表示隐藏神經元 j 的平均活躍度(在訓練集上取平均)。我們可以近似的加入一條限制
,即其中,
是稀疏性參數,通常是一個接近于0的較小的值(比如
= 0.05 )。換句話說,我們想要讓隐藏神經元 j 的平均活躍度接近0.05。為了滿足這一條件,隐藏神經元的活躍度必須接近于0。
為了實作這一限制,我們将會在我們的優化目标函數中加入一個額外的懲罰因子,而這一懲罰因子将懲罰那些
和
有顯著不同的情況進而使得隐藏神經元的平均活躍度保持在較小範圍内。懲罰因子的具體形式有很多種合理的選擇,我們将會選擇以下這一種(KL散度):
是以,總體代價函數:
另外還有一種稀疏方式:加L0、L1、L2正則項,可以看參考文獻2
基于正則化稀疏的keras實作:
from keras import regularizers
encoding_dim = 32
input_img = Input(shape=(784,))
# add a Dense layer with a L1 activity regularizer
encoded = Dense(encoding_dim, activation='relu',
activity_regularizer=regularizers.activity_l1(10e-5))(input_img)
decoded = Dense(784, activation='sigmoid')(encoded)
autoencoder = Model(input=input_img, output=decoded)
參考文獻:
(1)http://deeplearning.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity
(2)http://deeplearning.stanford.edu/wiki/index.php/Sparse_Coding
(3)Bengio Y,Lamblin P,Popovici D,et al. Greedy layerwise training of deep networks[C]. Proc. of the 20th Annual Conference on Neural Information Processing System.2006: 153-160.
(4)https://zhuanlan.zhihu.com/p/22464760