Spars Coding理论

参考网页:

http://deeplearning.stanford.edu/wiki/index.php/Sparse_Coding

http://deeplearning.stanford.edu/wiki/index.php/Sparse_Coding:_Autoencoder_Interpretation

  搞了好几天的sparse coding,终于基本上搞明白了,当时看了网页知识觉得挺简单,但当动手做的时候才发现有各种问题,看来动手真的很重要。

Sparse Coding:

  Sparse Coding是一种无监督学习方法,目标是寻找一组过完备基(over-complete)以更好的表达数据,那么数据就是这一组基的线性表示,即

其实PCA可以找到一组完备基,那么为什么要使用过完备基呢,因为过完备基可以更好的捕捉数据内存的结构,那么系数由样本x 与稀疏性(sparsity)两者共同决定,所以稀疏性就是只有少数基被激活,即为1,大多数基未被激活,=0 。因此目标函数需要加上稀疏惩罚项:

稀疏惩罚项可以用L0 ,不可导且很难优化,L1 , 或者log 惩罚

从目标函数可以看出,对于一组最优解(),我们可以将缩放K倍,将扩大K倍,使目标函数的值更小,为了解决这个问题,我们对基增加约束,类似于在求正交基时要求每个基的模为1。

Sparse Coding的概率解释:

  假设一张图片可以使用一组K个相互独立的特征及噪声V来表示 

  

  我们的目标是找到一组特征基,使与经验分布尽可能的接近,即最小化的KL散度

  

  由于 P*(X)为常量,因此上式等价于最大化的似然函数,现在的问题是的分布到底是怎样的?由于,那么分别计算右边两项即可。

  假设V是高斯白噪声,那么

  

  假设基之间相互独立

  

  基于稀疏性的要求,即系数 = 0的概率很大,即p()的分布非常的陡,很快落到0,大于0的取值区间很小。

  

  因此:

  我们的目标即优化以下函数 :

  

   如前面所讲需要增加稀疏惩罚项,那么根据能量原理 

  

  

Sparse Coding的anutoencoder解释:

  autoencoder的目标函数是:

  

  第一项为重构误差,第二项为稀疏性约束,我们可以通过将s缩放K倍,将A增大K倍而不改变重构误差,使目标函数更小。因为对A增加约束,每一列的模小于1

  

   为方便优化,化为拉格朗日函数:

  那么问题变为凸优化问题,可以非常方便的求解,gamma为权重衰减因子

  在使用梯度下降法求解时,第二项在0处不可导,可以通过加平滑项来处理

  

 Topographic sparse coding:

   大脑皮层识别图像时,相邻的神经元识别比较相似的特征,一个神经元识别水平边缘,那么相邻的神经元会识别水平方向稍微倾斜一点的边缘。我们也希望我们学习到的特征有类似的特征,即一个特征被激活,那么它的相邻特征会以比较弱的程度被激活,这样学习到的特征之间存在一种“topographic order"。怎样实现这种拓扑结构呢,假设将特征特征保存在一个方阵中,我们期望相邻的特征比较相似,可以通过将这些相似的特征作为一组来进行L1稀疏惩罚,

用V表示分组情况,每行表示一个组别,值为1表示属于该组。

使用矩阵表示可以非常方便的计算梯度,上式的表示有两个问题

  1、第二项应该是s.^2,因为我们是计算每个特征的模。VS^2表示将特征根据V分组,然后对每个组进行稀疏惩罚。S的每一列是A的一个线性表示,我们对A进行分组,希望每一组学习到的特征相似,表现在S中即:S中每一列中属于同一组的维度具有相似的激活性

    可参考:http://metaoptimize.com/qa/questions/8540/topographic-sparse-coding

  2、第一项应该除以样本数据,否则样本数目不同的话求解结果不同

因此目标函数应该为

这里为什么将特征以方阵来组织呢,可能是为了后面编程时比较容易的获得V吧。  我们学习到的特征其实是神经网络中的隐含层,我们想将这些特征以某种规则排序,使相邻的特征可以检测相似的特征,如边缘,没有发现方阵组织的必要性。

 难道是由于 S的每一列是一个图片块的特征表示,而图片一般表示为方阵????

 

实现细节:

  目标函数求解时,若固定A则为s的凸优化问题,若固定s为A的凸优化问题,因此可以通过迭代算法求解:

    如果使用所有数据进行上述操作,那么每一轮求解将非常耗时,而且收敛速度也将非常慢,为了解决这个问题,提出了以下两个trick加快收敛速度:

  1、baching examples into "mini-batches"

    每一轮只使用一部分数据计算,类似于批梯度下降算法与随机梯度下降算法,不仅可以提高迭代速度,还可以加快收敛速度(why)

  2、good initialization of s 

    

 (1) 在已知A的情况下,我们期望找到s使,那么我们将s = ATx作为s的初始值

 (2) 不清楚为什么要这么做,ng的网页讲义上说是为了使稀疏项更小

因此求解过程如下:

注意第4步,可以直接求解,因为s已知时,目标函数是关于A的凸问题,可以直接使用计算解析解。

  

 

  

 

posted @ 2014-12-08 15:33  dupuleng  阅读(575)  评论(0)    收藏  举报