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.