autoencoder的目的在于訓練一個神經網絡,用于信號降維,同時降維之后的信號能夠很好地重建原信號。如下圖所示:
第一層L1表示輸入信號,它是一個6維的向量。第二層L2得到的3維的信號,就是降維后的信號,也就是編碼之后的信號,我們把它表示為a=(a1,a2,a3)。第三層L3輸出的是6維信號,表示重建信號。第一層和第二層的+1表示偏置。整個autoencoder其實就是一個人工神經網絡,它的輸出和輸入近似相等,中間為降維后的編碼信號。各層信號之間滿足如下關系:
![][auto]
W1,W2分別為第一層和第二層的權值矩陣,b1,b2為偏置。f和h表示非線性激活函數。\hat{x}為重建信號,應該使重建誤差盡量小。除此之外,我們希望編碼信號a是稀疏的。為了達到這一目的,我們可以使a的平均值盡量小。假設a_i的平均值為p_i(i=1,2,3),我們希望它接近一個常數p0(p0通常很小,比如0.05)。要達到上述目的,我們通過最小化下面的目標函數實現:
上式稱為KL divergence,是用來衡量兩個隨機分布的相近程度的。如果某個隨機分布的均值為p0,而我們令a_i的分布與這個隨機分布盡量接近,那么a_i的平均值也會接近p0,從而達到稀疏的目的。再加上重建誤差小這一約束條件,則整個autoencoder的目標函數為:
用梯度下降法迭代求解網絡參數。
參考資料
[1] http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/
[auto]: http://latex.codecogs.com/svg.latex?\left{\begin{array}{ll}a&=f(W{(1)}x+b{(1)})\\hat{x}&=h(W{(2)}a+b{(2)})\end{array}\right.