UFLDL Tutorial系列关于Autoencoder的理解

关于Autoencoder的讲解参考Andrew ng 的UFLDL Tutorial下面两章即可

http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity

http://ufldl.stanford.edu/wiki/index.php/Visualizing_a_Trained_Autoencoder

去年大概这时候,deeplearning已经火的相当成熟了,于是我开始跟风自学这个deeplearning教程,当时,说实话,真心没看懂,倒不是说不懂文章讲的什么,是不知道这样做的缘由是什么。就在去年年末,当我接触到sparsity的时候,学到字典学习的时候,突然回忆起了autoencoder,这才对这个算法有了比较浅显的了解(P.S.大家有不同意见的欢迎指正)。下面谈一谈我对autoencoder的理解,首先上图:

UFLDL Tutorial系列关于Autoencoder的理解_第1张图片

如果想从稀疏性角度解释,那么用教程里面的这个图来说稀疏表达是不正确的。因为networks中的hidden layer也就是图中的中的神经元个数小于input与output layer中神经元个数。这个我稍后将会解释,这里我们不妨就认为中间层的神经元个数比其他两层多,如果输入图片是10x10,那么就假想隐含层有200个神经元吧。

autoencoder的目的是将输入通过隐含层再次重构出与输入样本一样的输出,这就是我当时不明白的地方了,这有什么用?首先毋庸质疑,这是无监督学习。

然后再看,我们是不是以hidden layer的200个神经元为基底重构出了输入图像呢?再看我们的cost function


划红线的稀疏正则项是为了使得最后尽可能少的神经元参与到输出的重建工作中去,这跟稀疏编码中的稀疏表达的本质很像,即为稠密表达的样本找到合适的字典,将样本转化为合适的稀疏表达形式。这也是我为什么说hidden layer中的神经元个数应该高于输入输出,因为以字典中的原子为基底的表达应该是过完备的,10x10的输入想要进行完备的表达,则至少需要100个正交基底,那么稀疏表达的基底应该是大于100的。

这样就有人会问,我也没看到字典中的原子在那儿啊,我们训练神经网络得到的可都是神经元之间的weight,你hidden层就是有200个神经元又有什么用呢?

我想大家应该有人思考过这个问题,的确,字典中的atom确实不是hidden的隐藏层,那是什么呢,下面我在上一张图,估计大家就会明白了:

UFLDL Tutorial系列关于Autoencoder的理解_第2张图片

上图的每个小方块都给出了一个(带有有界范数 的)输入图像\textstyle x,它可使这100个隐藏单元中的某一个获得最大激励。这个每一个使得某个hidden layer的神经元获得最大激励的图像patch就可以就可以看做是字典中的atom。想不明白?可以这样看,加入上图中左上角3个patch,暂且命名为patch1,patch2,patch3,那么如果我先在有一个输入(也就是输出)image可以表达为:

image=a1*patch1+a2*patch2+a3*patch3

的形式,完全没用到其他的patch,那么也就是说,在隐含层,我只有3个神经元被激活了,即用了3个神经元重构出了输入,这种表达无疑是稀疏的。

这些atom怎么求解呢,Andrew ng 在教程中写的是


如果大家没try出来,可以参考一下俺的想法,首先hidden layer中神经元的激活值可以表达为以下形式


因为f是sigmoid函数,单调递增,我们要求解最大相应值,那么只要看里面的式子就行。然后里面的bias项放进去,就可以写成超简单的,对于这个函数求极值,想必大家都能想到cauchy-Schwarz不等式,这个不等式等号成立的条件是W与x成比例关系的,即x=kW,有人说f理论上f可以无限变大,只要x的范数足够大就行,但这样那么这样如何体现我这个x是该神经元的‘最爱’呢,所以为了公平起见,我们我们加入constraint,即。再由x=kW,教程中的这个解大家就应该知道怎么来的了吧。


你可能感兴趣的:(machine,learning,sparse,coding,deeplearning)