Autoencoder ,Sparse Coding ,Sparse autoencoder 简介
最近刚刚运行完成sparse coding;才解决了自己的困惑,以前学习完Sparse autoencoder从感觉这两个东西是“一丘之貉”;但是运行完成之后才发现他们两个有很大的不同,虽然都是对数据进行变换,但是二者的变换原理是完全不同的。详细的下面纤细介绍。
1.Autoencoder介绍
Autoencdoer这个概念最早应该是出自hinton在science杂志上发表的哪一篇开启深度学习的旷世之作“rerducing thedimensionality of data with neural network”上,提取重点简单翻译之。
摘要简单翻译
……通过训练一个中心层有少数隐层节点的多层的神经网络,来重构高维输入数据,高维输入数据可以转换到一个低维数据。在这个“Autoencdoer”中,梯度下降算法可以用来fine_tuning权值矩阵。……
正文简单翻译
……我们简述一种非线性的PCA方法,这种方法应用自适应,多层编码(encoder)网络来转换高维数据到一个低维编码,并且架构一个相似的反编码“decoder”网络来复原低维编码到原始数据。在两层网络结构中,通过随机初始化权值矩阵,通过训练,最小化重构数据和原始数据的差异;通过链式法则反向传播误差,首先通过反编码网络部分,在通过编码网络部分,所需要的梯度可以很容易的获得。整个网络叫做“Autoencdoer”。……
这篇论文中,hinton通过RBM来训练每一层的初始权值,然后堆叠多个RBM得到一个中心层网络节点少,encoder和decoder部分对称的DBN网络来进行“Autoencdoer”。
Autoencoder介绍:(网上看到的梁斌博客,一个比较好的介绍就copy过来了)
copy自http://blog.sina.com.cn/s/blog_593af2a70101endk.html
简单来说autoencoder是一个压缩编码器,也就是对input的一坨东西通过变换,输出和input一样的东西。例如input是一个鸡,ouput也是一个鸡,input是一个鸭,output也是一个鸭。学术一点说就是找到一个函数能够使得Function(input) = input,叫做identity function。即学习Hw,b(x)=x。
但这和深度学习有什么关系呢? 这就要说到压缩编码,我们都知道input需要有一种编码形式,如果我们能在函数内部找到一个更简洁的编码形式,那么这个变换过程就等价于学习到了一种压缩表示的函数,能够少量的存储形式来表示原本较复杂的但信息冗余较大的表示形式。
我们下面的代码中举了一个精彩的例子(这个例子是从同学的一次实验中直接受启发,我只是按照自己的理解实现了一把,例子非原创)。在这个例子中,input是4个不同的数字,分别是
(0,0,0,1)可以看作1
(0,0,1,0)可以看作2
(0,1,0,0)可以看作3
(1,0,0,0)可以看作4
因为所有的input只有这4种,因此其实用4个bit是不经济的,存在压缩表示的可能性,比如2个bit就可以表示这4个不同的数。
那么我们设计了输入层是4+1(4个脚接受4bit编码的input,1个脚是常数项,这个用来做先验的);隐藏层2+1(因为我们实现已经知道2个bit就够了,所以2个隐藏层,具有足够的表达能力);输出层4(为了能让输出和输入保持一致)
通过数轮迭代,我们看到如下的情况
(0,0,0,1)->(0.99,0.09)->(0.06,0.00,0.01,0.91)
(0,0,1,0)->(0.85,0.99)->(0.00,0.07,0.90,0.07)
(0,1,0,0)->(0.01,0.67)->(0.06,0.87,0.11,0.00)
(1,0,0,0)->(0.12,0.00)->(0.89,0.10,0.00,0.02)
input_layer hidden_layer output_layer
hidden层的编码恰好可以看作是
(0.99,0.09) 1,0
(0.85,0.99) 1,1
(0.01,0.67) 0,1
(0.12,0.00) 0,0
也就是说输入的(0,0,0,1)可以被1,0 压缩表示,最终4bit的信息,可以用2bit表示,当然还需要保持边的权重,但这些边权重只需要一份,在输入足够复杂的时候,压缩表示是有价值的。
若用RBM堆叠的DBM来学习Autoencoder,最后fine_tuning结束之后学习到的是几个权值矩阵W1,W2……和相应的偏置项b1,b2……等;若用普通的3层神经网络(input—hiden—ouput)网络则学习到一个权值矩阵W1和偏置项b1。
最后,输入数据,通过神经网络的前馈计算就可以把数据重构为其他维度的数据,来实现特征提取。
其他相关可参见美军参考资料:
http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity
2.Sparse Coding介绍
稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。虽然形如主成分分析技术(PCA)能使我们方便地找到一组“完备”基向量,但是这里我们想要做的是找到一组“超完备”基向量来表示输入向量(也就是说,基向量的个数比输入向量的维数要大)。超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式。然而,对于超完备基来说,系数ai不再由输入向量唯一确定。
sparse coding是将输入的样本集X分解为多个基元的线性组合,然后这些基前面的系数表示的是输入样本的特征。其分解公式表达如下:
通俗的说,就是将一个信号表示为一组基的线性组合,而且要求只需要较少的几个基就可以将信号表示出来。“稀疏性”定义为:只有很少的几个非零元素或只有很少的几个远大于零的元素。要求系数ai是稀疏的意思就是说:对于一组输入向量,我们只想有尽可能少的几个系数远大于零。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线。同时,比如与初级视觉皮层的类比过程也因此得到了提升(人脑有大量的神经元,但对于某些图像或者边缘只有很少的神经元兴奋,其他都处于抑制状态)。
Sparse coding分为两个部分:
1)Training阶段:给定一系列的样本图片[x1, x 2, …],我们需要学习得到一组基[Φ1, Φ2, …],也就是字典A。
训练过程就是一个重复迭代的过程,按上面所说,我们交替的更改a和Φ使得下面这个目标函数最小。
每次迭代分两步:
a)固定字典Φ[k],然后调整a[k],使得上式,即目标函数最小(即解LASSO问题)。
b)然后固定住a [k],调整Φ [k],使得上式,即目标函数最小(即解凸QP问题)。
不断迭代,直至收敛。这样就可以得到一组可以良好表示这一系列x的基,也就是字典。
2)Coding阶段:给定一个新的图片x,由上面得到的字典A,通过解一个LASSO问题得到稀疏向量a。这个稀疏向量就是这个输入向量x的一个稀疏表达了。
例如:
参考文献:http://blog.csdn.net/zouxy09/article/details/8777094;
http://www.cnblogs.com/tornadomeet/archive/2013/04/16/3024292.html
和autoencoder不同的是,当sparse coding完成训练过程后,只是完成了字典A,也就是超完备基的学习,和训练数据稀疏系数的学习;对于给定的新数据还需要coding过程,去“求解”系数。
3 Sparse Autoencoder =sparse coding + autoencoder
对autoencoder中权值矩阵加上稀疏性限制的autoencoder。