Sparse Autoencoder学习总结

来源:互联网 发布:底层架空建筑面积算法 编辑:程序博客网 时间:2024/05/31 18:35

Sparse Autoencoder学习总结

昨天编写了利用神经网络实现Sparse Autoencoder的程序,感觉很是受用,简单谈谈自己对它的理解。

自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如  。下图是一个自编码神经网络的示例。


自编码神经网络尝试学习一个  的函数。换句话说,它尝试逼近一个恒等函数,从而使得输出  接近于输入  。恒等函数虽然看上去不太有学习的意义,但是当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构。举例来说,假设某个自编码神经网络的输入  是一张  图像(共100个像素)的像素灰度值,于是  ,其隐藏层  中有50个隐藏神经元。注意,输出也是100维的  。由于只有50个隐藏神经元,我们迫使自编码神经网络去学习输入数据的压缩表示,也就是说,它必须从50维的隐藏神经元激活度向量  中重构出100维的像素灰度值输入  。如果网络的输入数据是完全随机的,比如每一个输入  都是一个跟其它特征完全无关的独立同分布高斯随机变量,那么这一压缩表示将会非常难学习。但是如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。
我们刚才的论述是基于隐藏神经元数量较小的假设。但是即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。具体来说,如果我们给隐藏神经元加入稀疏性限制,那么自编码神经网络即使在隐藏神经元数量较多的情况下仍然可以发现输入数据中一些有趣的结构。

本次实现稀疏自动编码是通过UFLDL练习的帮助,自己动手写了很有限的代码,但是对稀疏学习和稀疏表示有了很好地理解。

程序中构造的神经网络参数:64个输入节点(输入为8*8的小patch,按列存储,为64*1维),25个隐含节点(可以学习到25个特征),64个输出节点(输出为输入的重构)。下面是学到的25个特征可视化的结果:

 

(结果越接近于线条,说明越成功)

程序中的输入patch共有10000组,取样于10512*512的图像。稀疏学习就是通过这10000个输入样本来学习可以重构这10幅图像的特征,要求特征越少越好(笼统来说,越少越稀疏,但是重构的误差会越大。在程序中学习到的特征个数由人为设定,即为隐含层节点数),重构输入的精度越大越好。稀疏表示就是利用学习到的特征来尽可能小误差,尽可能稀疏地表示这10幅图像(重构)

学习完特征以后,将输入的10幅图像都切割为8*8的小patch,这里的每个小patch就可以由25个特征进行稀疏表示,相当于由25个特征线性叠加来得到每个小patch。这样的话,以前的小patch8*8维)就可以表示成一个系数向量(1*25维)。相当于进行了降维,所以在压缩感知中会经常应用稀疏学习。那么,总体的512*512图像就可以表示成64*1600(64*25)维的系数矩阵,学习到的特征我们通常称为是“字典”。

顺便再提一下,李玲师姐最近的一篇有关压缩感知的TEC论文就是基于多目标来做压缩感知的。她选取的两个目标分别为稀疏性和精确度。同时优化这两个目标,达到稀疏表示的最终目标。

0 0
原创粉丝点击