前言:
這節課來學習下Deep learning領域比較出名的一類算法——sparse autoencoder,即稀疏模式的自動編碼。我們知道,deep learning也叫做unsupervised learning,所以這里的sparse autoencoder也應是無監督的。按照前面的博文:Deep learning:一(基礎知識_1),Deep learning:七(基礎知識_2)所講,如果是有監督的學習的話,在神經網絡中,我們只需要確定神經網絡的結構就可以求出損失函數的表達式了(當然,該表達式需對網絡的參數進行”懲罰”,以便使每個參數不要太大),同時也能夠求出損失函數偏導函數的表達式,然后利用優化算法求出網絡最優的參數。應該清楚的是,損失函數的表達式中,需要用到有標注值的樣本。那么這里的sparse autoencoder為什么能夠無監督學習呢?難道它的損失函數的表達式中不需要標注的樣本值(即通常所說的y值)么?其實在稀疏編碼中”標注值”也是需要的,只不過它的輸出理論值是本身輸入的特征值x,其實這里的標注值y=x。這樣做的好處是,網絡的隱含層能夠很好的代替輸入的特征,因為它能夠比較准確的還原出那些輸入特征值。Sparse autoencoder的一個網絡結構圖如下所示:
損失函數的求法:
無稀疏約束時網絡的損失函數表達式如下:
稀疏編碼是對網絡的隱含層的輸出有了約束,即隱含層節點輸出的平均值應盡量為0,這樣的話,大部分的隱含層節點都處於非activite狀態。因此,此時的sparse autoencoder損失函數表達式為:
后面那項為KL距離,其表達式如下:
隱含層節點輸出平均值求法如下:
其中的參數一般取很小,比如說0.05,也就是小概率發生事件的概率。這說明要求隱含層的每一個節點的輸出均值接近0.05(其實就是接近0,因為網絡中activite函數為sigmoid函數),這樣就達到稀疏的目的了。KL距離在這里表示的是兩個向量之間的差異值。從約束函數表達式中可以看出,差異越大則”懲罰越大”,因此最終的隱含層節點的輸出會接近0.05。
損失函數的偏導數的求法:
如果不加入稀疏規則,則正常情況下由損失函數求損失函數偏導數的過程如下:
而加入了稀疏性后,神經元節點的誤差表達式由公式:
變成公式:
梯度下降法求解:
有了損失函數及其偏導數后就可以采用梯度下降法來求網絡最優化的參數了,整個流程如下所示:
從上面的公式可以看出,損失函數的偏導其實是個累加過程,每來一個樣本數據就累加一次。這是因為損失函數本身就是由每個訓練樣本的損失疊加而成的,而按照加法的求導法則,損失函數的偏導也應該是由各個訓練樣本所損失的偏導疊加而成。從這里可以看出,訓練樣本輸入網絡的順序並不重要,因為每個訓練樣本所進行的操作是等價的,后面樣本的輸入所產生的結果並不依靠前一次輸入結果(只是簡單的累加而已,而這里的累加是順序無關的)。
參考資料:
http://deeplearning.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity