精华内容
参与话题
问答
  • 深度学习系列(四):什么是稀疏编码

    万次阅读 多人点赞 2015-12-23 21:48:21
    上节使用简单方法阐述了自编码问题与简单操作,本节将正式开始探索深度学习的相关问题,第一个问题就是稀疏编码。关于稀疏编码需要理解的几点: (1)什么是稀疏编码? (2)为什么要稀疏编码? (3)稀疏编码的...

    上节使用简单方法阐述了自编码问题与简单操作,本节将正式开始探索深度学习的相关问题,第一个问题就是稀疏编码。

    关于稀疏编码需要理解的几点:
    (1)什么是稀疏编码?
    (2)为什么要稀疏编码?
    (3)稀疏编码的实现途径。

    首先什么是稀疏编码?在这之前先看看稀疏表示
    从一个简单的例子说起,相信大多数人学过线性代数或者矩阵论之类的课程吧,再线性代数中,最初始的时候就会学到关于如何判断一大堆向量线性的相关或者不相关性,进而确定一组线性无关组。这里比如说空间中一个向量X是一个三维坐标点吧,用(x,y,z)表示。假设现在有一堆点X1(1,0,0);X2(0,1,0);X3(0,0,1);X4(4,3,5);X5(2,1,4)……等等吧,那么我们是不是可以找到这一大堆向量的最大线性无关组其实就可以用X1,X2,X3来表示,其他的任何向量Xi都可以用这三个向量来线性表示,当然用X1,X2,X3来表示任何一个向量来表示是最简单情况,你一个向量同样可以用X1,X2,X3,X4,X5来表示,不过这个多两个待确定系数而已。好了现在假设我们已知有X1~X10这十个向量,那么同空间中有一个向量我们就可以用X1~X10这十个向量线性表示,就有10个待确定系数。但是我们事先是知道一个向量只需要用X1,X2,X3来表示即可了,那么我们可以让上面需要确定的10个参数中的后7个参数约束为0即可,那么其实这个过程就是一种稀疏表示思想。

    可以看出稀疏表示就是找到空间中的一组基,用这组基可以扩展到空间中的任何向量。

    在比如在信号处理中,如何稀疏表示一个呢?比如下面一个信号:
    这里写图片描述

    同样的我们可以用一系列的基信号来表示(至于用什么基,这里谈一下,上面我们看出这个图其实无非是一个函数,只不过不太好直接写出函数表达式表示而已,如果能,傅里叶变换告诉我们,什么函数都可以分解成一系列正弦余弦函数表示吧),所以我们可以找到一系列基信号如下:
    这里写图片描述

    当然可能不止4个,可以有更多,越多表示的越准确,这也反过来说明稀疏表示的一个问题,那就是稀疏到什么程度?上述信号,如果只用前2个基信号表示的话,肯定会差很多,用前3个表示,好点,越多基信号,表示的越准确,然而另一个问题可以看出,用两个表示,极其稀疏,表示起来也简单,但是效果差,用n个,很不稀疏,但是效果好,所以一个信号到底要稀疏表示到什么程度需要自己去设计的,也就是说这是一个变化的参数。

    把上述抽象成数学表示,假设原始信号为X,基信号为d1~dp,这些基信号组合成X的权值参数分别为a1~ap,那么也就是说
    X=a1*d1+a2*d2+…+ap*dp=[d1,d2,…,dp]*[a1,a2,…,ap]’;如下所示
    这里写图片描述

    那么α就是我们要稀疏表示的吧,如果它之中0元素越多,就认为越稀疏表示了。这里再展开一点,就是实际中我们怎么去确定α中那些为0那些又不为0呢?其实在实际中我们并不是非得说某个αi非得为0,而是通过限制所有的α之和为一个比较小的数,或者把这些和加入目标函数的惩罚项中,我们保证所有的α之和必须优化到我们设置的很小的一个数C就认为是稀疏表示了。

    再来看一个例子,我们可以把一个颜色空间稀疏表示成下面这个样子吧:
    这里写图片描述
    好了,从上述可以看出稀疏表示的好处在于降低表示复杂度,更直白的原因其实就是减少系数参数,通过稀疏表示,可以充分发挥数据所含有的信息,去掉冗余的数据信息,达到最大化利用数据,这一点是非常重要的。

    有了上面的认识,我们再来看看深度神经网络中的稀疏编码表示是如何进行的。还是以简单的三层自编码网络为例:
    这里写图片描述
    在这个网络中,我们可能可以学习到样本数据的特征集s,和一个将特征集从特征空间转换到样本数据空间的基向量 A,那么我们可以建立目标函数

    J(A,s)=||Asx||2

    ,表示的意思就是让输出与输入的误差和越小越好,优化这个J找到最佳网络系数即可。那么这是没有稀疏表示的目标函数,这是特征集s可能含有许多重复的,冗余的特征在里面,而这些冗余的特征在理论上我们是需要干掉的。那么在此基础上我们设计带稀疏性质的目标函数如下:
    J(A,s)=||Asx||2+λ||s||1

    这样上式前第一部分是利用基向量将特征集重构为样本数据所产生的误差,第二部分为稀疏性惩罚项(sparsity penalty term),用于保证特征集的稀疏性。
    当然这是最原始的稀疏表示构造方式,要达到此网络稀疏的目的,光这样子是不行的,在真实的网络中还需要加一些其他的限制才可以,然而其稀疏思想确是这样的,详细的内容可以参考:

    稀疏编码自编码表达

    在集成的深度学习工具箱中,关于稀疏编码的设计上,通常我们只需要设计一个限制系数C用于限制稀疏程度就可以了,或者有时候这个C是一定的,比如0.05,所有的网络都给这个参数即可,但是了解稀疏编码对于我们理解深度学习的参数设计优化等等都是很有必要的。

    展开全文
  • 理解稀疏编码sparse coding

    万次阅读 2018-06-20 16:54:07
    2016年01月03日 19:31:25阅读数:8558稀疏编码系列:(一)----Spatial Pyramid 小结(二)----图像的稀疏表示——ScSPM和LLC的总结(三)----理解sparse coding(四)----稀疏模型与结构性稀疏模型----------------...


    稀疏编码系列:

    ---------------------------------------------------------------------------

           

            本文的内容主要来自余凯老师在CVPR2012上给的Tutorial。前面在总结ScSPM和LLC的时候,引用了很多Tutorial上的图片。其实这个Tutorial感觉写的挺好的,所以这次把它大致用自己的语言描述一下。不过稀疏编码是前两年比较火的东西,现在火的是deep learning了。

    1、What is sparse coding?

           1988年,神经稀疏编码的概念由Mitchison提出,由牛津大学的Rolls等正式引用。灵长目动物颚叶视觉皮层和猫视觉皮层的电生理实验报告和一些相关模型的研究结果都说明了视觉皮层复杂刺激的表达是采用稀疏编码原则的。研究表明:初级视觉皮层V1区第四层有5000万个(相当于基函数),而负责视觉感知的视网膜和外侧膝状体的神经细胞只有100万个左右(理解为输出神经元)。说明稀疏编码是神经信息群体分布式表达的一种有效策略。1996年,加州大学伯克利分校的Olshausen等在Nature杂志发表论文指出:自然图像经过稀疏编码后得到的基函数类似V1区简单细胞感受野的反应特性(空间局部性、空间方向性、信息选择性)。

           典型的sparse coding的过程分为训练和测试。

           Training:给定一些训练样本(training samples)[ x1, x2, …, xm(in Rd)],学习一本字典的基(bases)[Φ1,Φ2……(also in Rd)]。可是用k-means等无监督的方法,也可以用优化的方法(这时training完了同时也得到了这些training samples的codes,这是一个LASSO和QP问题的循环迭代);

           Coding:用优化的方法求解测试样本的codes(此时字典已经学得)。经典的方法是求解LASSO:

                      (1)

            自我学习就是在Training的时候采用大量无标注的自然图像训练字典,然后对带标注的图像进行编码得到特征codes。

     

    2、Connections to RBMs, autoencoders

          (1)式(经典的稀疏编码)有几个特点:

                ——系数a是稀疏的;

                ——a的维数一般比x的维数大;

                ——编码过程a=f(x)是一个非线性的关于x的隐函数(即我们没有f(x)的显示表达,因为求解LASSO没有解析解);

                ——重建过程x'=g(a)是一个线性的显示的关于a的函数(X’=ΣaiΦi)。

             而RBM和自编码的特点则是:

               ——有显示的f(x);

               ——不会必然得到稀疏的a,但是如果我们增加稀疏的约束(如稀疏自编码,稀疏RBM),通常能得到更好的效果(进一步说明sparse helps learning)。

             从广义上说,满足这么几个条件的编码方式a=f(x)都可以叫稀疏编码:

               1) a是稀疏的,且通常具有比x更高的维数;

               2) f(x)是一个非线性的映射;(jiang1st2010注:该条要求存疑,见下面解释。

               3) 重建的过程x'=g(a),使得重建后的x'与x相似。

              因此,sparse RBM,sparse auto-encoder,甚至VQ都可以算是一种sparse coding。(jiang1st2010注:第二条要求称f(x)是一个非线性映射,然而SPM中用到的VQ是一个线性映射,原因可以参见这里这里。余凯老师也是LLC论文的作者,似乎存在矛盾?不过这是个小问题了,没必要深究

     

    3、Sparse activations vs. sparse models

             现在可以用a=f(x)表示稀疏编码的问题了。它可以分解成两种情况:

             1)sparse model:f(x)的参数是稀疏的

                      --例如:LASSO f(x)=<w,x>,其中w要求是稀疏的。(jiang1st2010注:这个例子中f(x)也是线性的!)

                      --这是一个特征选择的问题:所有的x都挑选相同的特征子集。

                      --hot topic.

             2)sparse activation:f(x)的输出是稀疏的

                      --就是说a是稀疏的。

                      --这是特征学习的问题:不同的x会激活不懂的特征子集。

                                               

     

    4、Sparsity vs. locality

           其实这个问题在这里已经谈过了。简单的说就是sparsity不一定导致locality,而locality肯定是sparse的。sparse不比locality好,因为locality具有smooth的特性(即相邻的x编码后的f(x)也是相邻的),而仅仅sparse不能保证smooth。smooth的特性对classification会具有更好的效果,并且设计f(x)时,应尽量保证相似的x在它们的codes中有相似的非0的维度。

     

             Tutorial上展示了(1)中取不同的λ,字典中各项呈现的效果:

          

       

            作者想说明的问题是分类效果越好的情况下,basis会更清晰地表现出属于某几个特定的类。但是我没太看明白。

     

    5、Hierarchical sparse coding

            这里图3曾说明了SIFT本身就是一个Coding+Pooling的过程,所以SPM是一个两层的Coding+Pooling。而Hierarchical sparse coding就是两层的coding都是sparse coding,如下图:

             整个HSC的第一层就从pixel层级开始(不需要手动设计SIFT特征了),经过两层SC后,形成codes。这个过程可以从无标注的数据中学习,就是self-taught learning。从pixel层级开始,这点和DNN啥的很像了。

              从结果来看,HSC的性能会比SIFT+SC稍微好些。

            

               Tutorial的最后列举了关于SC的其他主题,我也不懂,这里就不废话了。


    稀疏编码(sparsecode)简单理解

    Sparse coding:

      本节将简单介绍下sparse coding(稀疏编码),因为sparse coding也是deep learning中一个重要的分支,同样能够提取出数据集很好的特征。本文的内容是参考斯坦福deep learning教程:Sparse CodingSparse Coding: Autoencoder Interpretation,对应的中文教程见稀疏编码稀疏编码自编码表达

      在次之前,我们需要对凸优化有些了解,百度百科解释为:”凸优化“ 是指一种比较特殊的优化,是指目标函数为凸函数且由约束条件得到的定义域为凸集的优化问题,也就是说目标函数和约束条件都是”凸”的。

      好了,现在开始简单介绍下sparse coding, sparse coding是将输入的样本集X分解为多个基元的线性组合,然后这些基前面的系数表示的是输入样本的特征。其分解公式表达如下:

       

      而一般情况下要求基的个数k非常大,至少要比x中元素的个数n要大,因为这样的基组合才能更容易的学到输入数据内在的结构和特征。其实在常见的PCA算法中,是可以找到一组基来分解X的,只不过那个基的数目比较小,所以可以得到分解后的系数a是可以唯一确定,而在sparse coding中,k太大,比n大很多,其分解系数a不能唯一确定。一般的做法是对系数a作一个稀疏性约束,这也就是sparse coding算法的来源。此时系统对应的代价函数(前面的博文都用损失函数表示,以后统一改用代价函数,感觉这样翻译更贴切)表达式为:

       

      其中的第一项是重构输入数据X的代价值,第二项的S(.)为分解系数的系数惩罚,lamda是两种代价的权重,是个常量。但是这样还是有一个问题,比如说我们可以将系数a减到很小,且将每个基的值增加到很大,这样第一项的代价值基本保持不变,而第二项的稀疏惩罚依旧很小,达不到我们想要的目的——分解系数中只有少数系数远远大于0,而不是大部分系数都比0大(虽然不会大太多)。解决这个问题的通用方法是是对基集合中的值也做了一个约束,约束后的系统代价函数为:

       

     

      Sparse coding的概率解释:

      主要是从概率的角度来解释sparse coding方法,不过这一部分的内容还真没太看明白,只能讲下自己的大概理解。如果把误差考虑进去后,输入样本X经过sparse coding分解后的表达式则如下:

       

      而我们的目标是找到一组基Ф,使得输入样本数据出现的概率与输入样本数据的经验分布概率 最相近,如果用KL距离来衡量其相似度的话,就是满足他们的KL距离最小,即下面表达式值最小:

       

      由于输入数据的经验分布函数概率是固定值,所以求上式值最小相当等价于求最大。

      经过对参数a的先验估计和函数积分值估计等推导步骤,最后等价于求下面的能量函数值最小:

       

      而这就很好的和sparse coding的代价函数公式给联系起来了。

      到目前为止我们应该知道sparse coding的实际使用过程中速度是很慢的,因为即使我们在训练阶段已经把输入数据集的基Ф学习到了,在测试阶段时还是要通过凸优化的方法去求得其特征值(即基组合前面的系数值),所以这比一般的前向神经网络速度要慢(一般的前向算法只需用矩阵做一下乘法,然后做下加法,求个函数值等少数几步即可完成)。

     

      Sparse coding的autoencoder解释:

      首先来看看向量X的Lk规范数,其值为:  由此可知,L1范数为各元素之和,L2范数为该向量到远点的欧式距离。 

      用矩阵的形式来表达sparse coding的代价函数如下:

       

      和前面所讲的一样,这里也对基值s做了稀疏性惩罚,用的是L1范数来约束,同时也防止系数矩阵A过大,对其用的是L2范数的平方来约束。但是基值处的L1范数在0点是无法求导的,所以不能用梯度下降等类似的方法来对上面的代价函数求最优参数,于是为了在0处可导,可将公式变成如下:

       

     

      拓扑sparse coding:

      拓扑sparse coding主要是模仿人体大脑皮层中相邻的神经元对能提取出某一相近的特征,因此在deep learning中我们希望学习到的特征也具有这样“拓扑秩序”的性质。如果我们随意的将特征排列成一个矩阵,则我们希望矩阵中相邻的特征是相似的。也就是把原先那些特征系数的稀疏性惩罚项L1范数更改为不同小组L1范数惩罚之和,而这些相邻小组之间是有重叠值的,因此只要重叠的那一部分值改变就意味着各自组的惩罚值也会改变,这也就体现出了类似人脑皮层的特性,因此此时系统的代价函数为:

       

      改成矩阵的形式后如下:

       

     

      总结:

      在实际编程时,为了写出准确无误的优化函数代码并能快速又恰到好处地收敛到最优值,可以采用下面的技巧:

    1. 将输入样本集分成多个小的mini-batches,这样做的好处是每次迭代时输入系统的样本数变少了,运行的时间也会变短很多,并且也提高了整体收敛速度。(暂时还没弄明白原因)。
    2. S的初始化值不能随机给。一般都是按照下面的方法进行:

                 

      最后,在实际优化该代价函数时步骤大致如下: 

    1. 随机初始化A
    2. 重复以下步骤直至收敛
      1. 随机选取一个有小的mini-batches。
      2. 按照前面讲的方法来s。
      3. 根据上一步给定的A,求解能够最小化J(A,s)的s
      4. 根据上一步得到的s,求解能够最小化J(A,s)的A

    注:本文学习自CVPRLinear Spatial Pyramid Matching Using Sparse Coding
    for Image Classification》、《Image classification By non-negative sparse coding, low-rank and sparse decomposition》及《基于稀疏编码的图像视觉特征提取及应用》

    本文学习笔记是自己的理解,如有不对的地方,请大家指正批评,共同进步!

    在提取完所有训练图像的SIFT特征后,需要对每幅图像进行视觉特征编码。视觉特征编码的目的在于对原始特征向量进行选择和变换,得到图像中最具表现力和区分度的视觉特征向量,使得计算机可以更高效的进行处理。一般编码方式是向量量化,另一种视觉编码方式稀疏编码能更好的表示图像。

    1、向量量化

    向量量化的基本思想是在基向量空间中寻找目标向量的最近邻,然后用该基向量的编号表示原目标向量:


    其中x为某个SIFT特征向量,di为基向量空间中的第i个向量。其实基向量就是对所有训练图像的所有SIFT特征向量进行聚类,得到的K个聚类中心,这K个特征向量最后作为基向量。然后对于每一幅图像,寻找每个SIFT特征向量属于哪个基向量,来进行映射。

    在向量量化的过程中,基本步骤如下:
    1) 将全部的训练样本进行归一化;
    2) 对训练样本进行聚类,得到若干个类中心,构成基向量空间:
    3) 在所有类中心中为目标向量寻找最近邻。

    BOW模型中,先聚类产生视觉关键词,然后进行向量量化编码。对于用SIFT特征


    就是这幅图像的稀疏编码。
    向量量化的优点在于计算简单,数据压缩率高,缺点在于精度损失比较大,在某些应用中难以满足要求。

    2、稀疏编码

    稀疏编码的本质是一个目标向量可以由少量的基向量经线性拟合而成,且基向量空间存在一定的冗余。与向量量化的区别是向量量化的每个目标向量只能由一个基向量表示。也就是说向量量化方式的约束条件太严格,会引起重构误差。二者区别可表示如下:



    对图像的稀疏编码一般分为两个过程:

    一是基向量的训练过程,也称为字典的学习。在这个过程中,我们利用大量的训练样本,通过无监督学习方法学习获得一组冗余的基向量,这组基向量通常反映了训练样本中一些带有本质特性的基元,如图像中的边界、角点,实验表明,字典的学习过程模拟了人类视觉皮层对信息的处理过程。

    最优化问题(1)变成了二次约束的最小二乘问题,即:


    这个最优化问题,在给定X情况下,交替固定一个变量,训练另一个变量,如此迭代。

       二是线性拟合的求解过程。即任意目标向量xn都可以由字典V内的若干个条目经线性组合拟合而成,该过程根据不同的约束条件,可以得到不同的拟合系数un,然后用该系数向量表示图像特征。

    此时V已知,对图像X稀疏编码得到U,问题变为如下求解:


    3、实验过程:

    1、从每张图像中随机提取一个特征点向量,凑出一个初始训练样本X。(128*2600
    for ii = 1:2600

         fpath = training.path{ii};

          load(fpath);

          num_fea = size(feaSet.feaArr, 2);

           rndidx = randperm(num_fea);

           X(:, ii) = feaSet.feaArr(:, rndidx(ii));

    end;

    2、视觉字典V的学习
      a、初始视觉字典V通过随机函数给出,先随机产生一个128*300的矩阵作为初始视觉 字典

    V = rand(128, 300)-0.5;%先随机生成一个视觉词典V

        V = V - repmat(mean(V,1), size(V,1),1);

         V = V*diag(1./sqrt(sum(V.*V)));

      b、使用刚刚得到的V,对样本X计算得到U

      U = L1QP_FeatureSign_Set(X, V, lambda);

    此函数在已知训练样本X和给出的视觉字典V的前提下,学习得到此时样本的稀


      c、使用刚刚得到的U,再训练得到V
    V = l2ls_learn_basis_dual(X, U, pars.VAR_basis);

    此函数在已知训练样本X和样本稀疏编码U的前提下,学习得到V。在条件


      d、迭代50bc过程,最终得到视觉词典V及训练样本X的稀疏编码U

    3、对每张图像,应用得到的视觉字典V,得到其稀疏编码U

    4、如下代码用某种方式(sc_approx_pooling)对每幅图像的稀疏编码进行了处理,然后用21*300(300是视觉关键词的个数)维向量来表示这幅图像。以前是对向量量化编码U按关键词出现的频次计算直方图来表示这幅图像,现在改用最大池处理,即对于稀疏编码得到的U,Uij表示了第iSIFT特征区域对第j个关键词的归属程度,取每个关键词中归属程度的最大值来表示这个关键词,得到K维特征向量来表示这幅图像。

    sc_fea = zeros(6300, 2600);%%所有训练图像的稀疏编码

    sc_label = zeros(2600, 1);

    for iter1 = 1:2600,  

         fpath = database.path{iter1};

         load(fpath);

         %%对每张图像给出一个稀疏编码矩阵(这里需要对每张图片每金字塔层每个网格给出一个300*N 稀疏编码矩阵,最后按 权值串联该幅图的所有稀疏编码作为最终稀疏编码来表示这幅图像)

         sc_fea(:, iter1) = sc_approx_pooling(feaSet, V, pyramid, gamma);

        sc_label(iter1) = database.label(iter1);

    end;

     

     

    总结一下,稀疏编码其实就是先对所有图像的所有SIFT特征进行训练,得到基向量也即视觉关键词V。之后对于每一幅图像,计算其每个特征点所属的基向量索引uu中含有多个非零系数用来拟合多个基向量,得到一幅图像的系数编码U。用U乘以基向量V就能表示一幅图像X。之后再用方法(sc_approx_pooling)对每幅图像的稀疏表示U进行了处理,得到300(视觉关键词的个数)维向量来表示这幅图像。


    展开全文
  • 稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 (自然图像的小波基?)ϕi\mathbf{\phi}_i ,使得我们能将输入向量 x\mathbf{x}...

    稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 (自然图像的小波基?)ϕi ,使得我们能将输入向量 x 表示为这些基向量的线性组合:

    x=i=1kaiϕi

    所谓“超完备”基向量来表示输入向量 xRn ,也就是说,k>n。超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式(structure && pattern)。然而,对于超完备基来说,系数 ai 不再由输入向量 x 唯一确定。

    这里,我们把“稀疏性”定义为:只有很少的几个非零元素或只有很少的几个远大于零(显著不为零)的元素。要求系数 ai 是稀疏的意思就是说:对于一组输入向量,我们只想有尽可能少的几个系数远大于零。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基元素的叠加,在图像中这些基本元素可以是面或者线

    我们把 m 个输入向量的稀疏编码代价函数定义为:

    mina(j)i,ϕij=1mx(j)i=1ka(j)iϕi2+λi=1kS(a(j)i)

    基向量(ϕi,i=1,2,,k)对于全部的输入向量(训练样本都是一致的),系数 a(j)i 是与输入向量 x(j)相对应的,由基(ϕi)和输入向量(x(j))共同决定,通过其上下标(a(j)i)即可看出。通过最优化函数得到的 k个基向量(ϕi)以及全部的输入样本在该基下的表示 a(j)i

    此处 S(.) 是一个稀疏代价函数,由它来对远大于零的 ai 进行“惩罚”。

    虽然“稀疏性”的最直接测度标准是 “L0” 范式(S(ai)=1|ai|>0),但这是不可微的,通常很难进行优化。在实际中,稀疏代价函数 S(.) 的普遍选择是1 范式代价函数 S(ai)=|ai|1 及对数代价函数 S(ai)=log(1+a2i)

    此外,很有可能因为减小 ai 而增加 ϕi 至很大的常量,使得稀疏惩罚变得非常小。为防止此类事件发生,我们将限制 ϕ2 要小于某常量 C 。包含了限制条件的稀疏编码代价函数的完整形式如下:

    mina(j)i,ϕij=1mx(j)i=1ka(j)iϕi2+λi=1kS(a(j)i)s.t.ϕi2C,i=1,2,,k

    稀疏编码的 Autoencoder 解释

    确切地说,在稀疏编码算法中,有样本数据 x 供我们进行特征学习(feature learning)。特别是,学习一个用于表示样本数据的稀疏特征集 s(稀疏编码,或者叫系数,对基向量(长度为 k)进行线性组合), 和一个将特征集从特征空间转换到样本数据空间的基向量A, 我们可以构建如下目标函数:

    J(A,s)=Asx2+λs1

    如目标函数所示,它的约束性并不强——按常数比例缩放 A 的同时,再按这个常数的倒数缩放 s,也即 (αA)(1αs)=As,结果不会改变误差大小,却会减少稀疏代价(表达式第二项)。因此需要为 A 的每一列增加额外约束,ATjAj1,问题变为:

    minimizes.t.Asx22+λs1ATjAj1j

    遗憾的是,因为目标函数并不是一个凸函数,所以不能用梯度方法解决这个优化问题。但是,在给定 A 的情况下,最小化 J(A,s) 求解 s 是凸的。同理,给定 s 最小化 J(A,s) 求解 A 也是凸的。这表明,可以通过交替固定 s 和 A 分别求解 A和s。实践表明,这一策略取得的效果非常好。

    但是,以上表达式带来了另一个难题:不能用简单的梯度方法来实现约束条件 ATjAj1j。因此在实际问题中,此约束条件还不足以成为“权重衰变”(”weight decay”)项以保证 A 的每一项值够小。这样我们就得到一个新的目标函数:

    J(A,s)=Asx22+λs1+γA22

    这一目标函数带来了最后一个问题,即 L1 范数在 0 点处不可微影响了梯度方法的应用。尽管可以通过其他非梯度下降方法避开这一问题,但是本文通过使用近似值“平滑” L1 范数的方法解决此难题。使用 x2+ϵ代替 |x|, 对 L1 范数进行平滑,其中 ε 是“平滑参数”(”smoothing parameter”)或者“稀疏参数”(”sparsity parameter”) (如果 ε远大于x, 则 x + ε 的值由 ε 主导,其平方根近似于ε)。在下文提及拓扑稀疏编码时,“平滑”会派上用场。

    因此,最终的目标函数是:

    J(A,s)=Asx22+λs2+ϵ+γA22

    s2+ϵks2k+ϵ 的简写)

    该目标函数可以通过以下过程迭代优化:

    • (1)随机初始化A
    • (2)重复以下步骤直至收敛:

      • 根据上一步给定的A,求解能够最小化J(A,s)的s
      • 根据上一步得到的s,,求解能够最小化J(A,s)的A
    展开全文
  • 稀疏编码(Sparse Coding)的前世今生(一)

    千次阅读 2019-03-19 19:15:33
    稀疏编码来源于神经科学,计算机科学和机器学习领域一般一开始就从稀疏编码算法讲起,上来就是找基向量(超完备基),但是我觉得其源头也比较有意思,知道根基的情况下,拓展其应用也比较有底气。哲学、神经科学、...

            稀疏编码来源于神经科学计算机科学和机器学习领域一般一开始就从稀疏编码算法讲起,上来就是找基向量(超完备基),但是我觉得其源头也比较有意思,知道根基的情况下,拓展其应用也比较有底气。哲学、神经科学、计算机科学、机器学习科学等领域的砖家、学生都想搞明白人类大脑皮层是如何处理外界信号的,大脑对外界的“印象”到底是什么东东。围绕这个问题,哲学家在那想、神经科学家在那用设备观察、计算机和机器学习科学家则是从数据理论和实验仿真上推倒、仿真。在神经编码和神经计算领域,我所能查到最早关于稀疏编码的文献是1996年,在此之前的生命科学家的实验观察和假设都不说了,1996年Cornell大学心理学院的Bruno在Nature上发表了一篇题名为:“emergence of simple-cell receptive fieldproperties by learning a sparse code for nature images”的文章,大意是讲哺乳动物的初级视觉的简单细胞的感受野具有空域局部性、方向性和带通性(在不同尺度下,对不同结构具有选择性),和小波变换的基函数具有一定的相似性。当时描述这些性质主要从自然图像编码的统计结构上来理解这些视觉细胞的特性,但是大部分都没有成功,接着Bruno在文章中提出通过最大化稀疏编码假说成功描述了上述细胞的性质,然后稀疏编码就火了。先来看看这篇文章的核心思想,作者基于一个基本假设,图像是有一些基的线性组合形成,如(公式一)所示: 


    (公式一)

          其中fai(x,y)是基函数,alpha是系数,随着不同的图像变化而变化。有效编码的目标就是为了寻找完备的基函数来生成图像空间,而且要求系数尽可能独立,只所以独立就是为了寻找信号的本质结构。当时的淫们很自然的想到PCA,因为PCA可以找到一些统计结构上的空间轴(类似坐标轴)来构成基函数,但是PCA一对噪声太敏感,也就是只能对一些类似高斯分布的数据有效,这样的干净数据可以很好的找到空间轴,对更复杂分布的数据(比如现在的流形分布)无效,作者受信息论启发,即相关变量的联合熵小于个体熵之和(当变量alpha之间互相独立时,二者相等,二者之间差了一个互信息),如果保持图像的联合熵不变,一个使得降低变量相关性的可能方法就是降低个体的熵,因此基于Barlow’s term,作者寻找一个最小熵编码(注:Barlow’s term那本书因年代久远,我找不到源头了,大意是统计独立降低编码冗余度),基于上面,作者猜测自然图像是个稀疏结构,即任何给定图像都可以用大数据里面的少数几个描述符(基)来表示。稀疏编码出生咯,作者开始寻找使得每个系数的概率分布是单模态并且在0处是峰分布的低熵(low-entropy)方法。作者提出稀疏编码的寻找方案可以通过最小化(公式二)来完成:

    (公式二)

         其中第一项就是保持信息的代价(cost),如(公式三)所示:

    (公式三)

         当然如果基于基函数重建的图像和原图像I(x,y)一致的话,代价为0(为最小)。

         (公式二)的第二项则是稀疏价值函数,其中的lambda是个常量正系数,平衡下稀疏系数alpha的重要性,和SVM的常量C有异曲同工之妙。作者提出了三个稀疏价值函数,如(图一)所示:

    (图一)

          可以惊喜的发现,现在经常用的L1正则赫然在列,其他两个应该被淘汰了,其实当时LASSO也开始出现了,只是当时的人们没有直接意识到L1正则可以增加稀疏性。至于为什么L1正则可以增加稀疏性,推荐读下MIT的博士pluskid的这篇博文:http://freemind.pluskid.org/machine-learning/sparsity-and-some-basics-of-l1-regularization/

    Pluskid的数学功底雄厚,阅读者也需要一些功底才行难过。继续我们今天的话题,要最小化公式二,参数变量只有alpha,对其求导,然后用梯度下降法迭代更新alpha即可,更新alpha后,也要继续更新基函数,二者的步骤一并通过(图二)给出:

    (图二)

       求出后的参数alpha和系数如(图三)所示:


    (图三)

          其中a是基函数,b是其系数,c则是验证感受野的特性,d表明系数是在0处单峰。通过图像展示,对于初级视觉细胞的感受野信号的那些属性得到了验证,图像信息得到了保持,而且编码是稀疏的,至此稀疏编码拉开了序幕,衍生了后续各种优化版本和应用。

     

    参考文献:

           [1] emergence of simple-cell receptive field properties by learning a sparse code for nature images. 1996

           [2] Sparse Coding with an Overcomplete BasisSet: A Strategy Employed by V1 ?  1997


    转载请注明链接:http://blog.csdn.net/cuoqu/article/details/8980853


    展开全文
  • 无监督学习和稀疏编码

    千次阅读 2018-07-23 11:29:13
    教程 | 无监督学习中的两个非概率模型:稀疏编码与自编码器 2017-07-02 12:29 机器之心整理 作者:Ruslan Salakhutdinov 参与:Smith 「无监督学习」(Unsupervised Learning)现在已经成为深度学习领域的热点...
  • 稀疏编码(一)

    2016-07-06 16:28:18
    稀疏编码来源于神经科学,计算机科学和机器学习领域一般一开始就从稀疏编码算法讲起,上来就是找基向量(超完备基),但是我觉得其源头也比较有意思,知道根基的情况下,拓展其应用也比较有底气。哲学、神经科学、...
  • 稀疏编码

    2019-12-28 18:02:27
    稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量表示为这些基向量的线性组合: 虽然形如主成分分析...
  • 稀疏编码

    千次阅读 2018-08-25 20:05:02
    转自ufldl,原文地址:http://deeplearning.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95%E4%B8%8E%E7%A8%80%E7...
  • 稀疏编码器(Sparse Encoder)

    千次阅读 2016-12-08 20:14:38
    1.介绍在自动编码器一文中,我们已经简单介绍了基于隐藏神经元数量较小的假设,本文主要基于隐藏神经元数量较大的假设。此时,我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。比如我们...
  • 自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。 具体过程简单的说明如下: 1)给定无...
  • 利用Python实现SAE(稀疏编码器),输入为TensorFlow封装的mnist手写识别数据集 # coding=utf-8 ''' Created on 2016年12月3日 @author: chunsoft ''' import tensorflow as tf import numpy as np import ...
  • 快速稀疏编码matlab

    热门讨论 2012-11-17 01:53:07
    Honglak Lee在NIPs paper"Efficient sparse coding algorithms"里有所描述的快速稀疏编码matlab,欢迎交流。
  • 稀疏编码自编码表达 Contents [hide] 1 稀疏编码2 拓扑稀疏编码3 稀疏编码实践 3.1 将样本分批为“迷你块”3.2 良好的s初始值3.3 可运行算法 4 中英文对照5 中文译者 稀疏编码 在稀疏自编码算法中,...
  • 稀疏编码器

    千次阅读 2018-10-08 14:42:31
    转自:https://blog.csdn.net/u010278305/article/details/46881443 本笔记主要记录学习《深度学习》的总结体会。如有理解不到位的地方,欢迎大家指出,我会努力改正。  在学习《深度学习》时,我主要是通过...
  • 稀疏编码算法的C语言实现

    热门讨论 2013-06-19 23:05:34
    深度学习中的稀疏编码算法的用C语言的实现,代码简单,帮助理解深度学习中的稀疏编码
  • 图像稀疏编码表示

    千次阅读 2015-07-08 09:55:14
    注:本文学习自CVPR《Linear ...for Image Classification》、《Image classification Vy non-negative sparse coding, low-rank and sparse decomposition》及《基于稀疏编码的图像视觉特征提取及应用》
  • 卷积稀疏编码

    千次阅读 2016-01-22 15:54:53
    卷积稀疏编码
  • 本笔记主要记录学习《深度学习》的总结体会。主要学习途径为UFLDL教程,本篇记录我对稀疏编码器(Sparse Autoencoder)的理解,并具有完整的matlab代码实现,可以直接运行查看效果。
  • 前言 学完稀疏编码器,参考http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B中的Exercise:Sparse Autoencoder 使用MatLab完成练习要求。这个例子所要实现的内容大概如下:从给定的数据...
  • 编码器(Auto Encoder)神经网络常常用于分类,通过定义一个目标函数衡量输出与目标值之间的差异,然后通过调整系统的参数使系统尽量拟合训练数据. 而对每一层神经网络来说,前一层的输出都是可看做未加工的初始...
  • 稀疏编码(Sparse Coding)

    千次阅读 2018-06-08 16:23:24
    稀疏编码(Sparse Coding)的思想是通过码本(Codebook){di}Ki=1,di∈Rd{di}i=1K,di∈Rd\{\boldsymbol{d}_i\}_{i=1}^{K},\boldsymbol{d}_i\in R^{d}的线性组合来重构输入变量x∈Rdx∈Rd\boldsymbol{x}\in R^{d},而...
  • Tensorflow实现稀疏自动编码(SAE)

    千次阅读 2016-12-04 11:59:12
    1.概述人在获取图像时,并不是像计算机逐个像素去读,一般是扫一眼物体,大致能得到...在实际运用时可以用稀疏编码器发现的特征取代原始数据,这样往往能带来更好的结果。 上图就是稀疏编码的一半流程,清晰的说明了
  • 快速稀疏编码算法

    千次阅读 2016-04-18 16:28:07
    【self-taught learning】快速稀疏编码算法   Self-taught learning是Honglak Lee等开发的一个matlab框架,能够实现他们在论文Self-taught Learning Transfer Learningfrom Unlabeled Data和...
  • 稀疏编码器一览表

    2016-04-22 20:15:33
    下面是我们在推导sparse autoencoder时使用的符号一览表: 符号 含义 训练样本的输入特征,. 输出值/目标值. 这里 可以是向量. 在autoencoder中,. ...连接第 层 单元和第
  • 稀疏编码最优化解法

    万次阅读 2014-01-22 10:23:38
    稀疏编码最优化解法--概述 分类: 机器学习2014-01-17 11:24 196人阅读 评论(0) 收藏 举报 稀疏编码最优化解法概述 目录(?)[+] 稀疏编码的概念来自于神经生物学。生物学家提出,...
  • https://blog.csdn.net/zouxy09/article/details/8775518
  • 为什么需要稀疏编码及解释

    千次阅读 2015-05-22 09:03:08
    稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 ,使得我们能将输入向量 表示为这些基向量的线性组合: 虽然形如主成分...
  • 斯坦福深度学习稀疏编码的代码

    热门讨论 2013-06-21 10:43:40
    网址:http://deeplearning.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder斯坦福深度学习的教程,这个是稀疏编码的的练习,可以直接运行
  • 稀疏编码器符号一览表 下面是我们在推导sparse autoencoder时使用的符号一览表: 符号 含义 训练样本的输入特征,. 输出值/目标值. 这里 可以是向量. 在autoencoder中,. 第 个...

空空如也

1 2 3 4 5 ... 20
收藏数 31,036
精华内容 12,414
关键字:

稀疏编码