字典学习和稀疏编码

来源:互联网 发布:管家婆软件初始密码 编辑:程序博客网 时间:2024/06/05 10:18

(1)Sparse coding with an overcomplete basis set: A strategy employed by V1?

(2)Emergence of simple-cell receptive field properties by learning a sparse code for natural images

我们都知道稀疏编码可以分为两大步骤:(1)字典训练,即利用训练样本通过最小化代价函数得到字典(也称为基等),也可称为特征学习;(2)特征编码,即利用步骤(1)中学习到的字典再次最小化代价函数,得到新的样本的特征(也称为系数等)。对于如何实施稀疏编码的这两个步骤,这里将以“The importance of encoding versus training with sparse coding and vector quantization”这篇论文作为参考进行总结,并谈谈自己的一些看法。

字典训练常用的方法概括如下:

(1)Sparse Coding(SC)

这也是比较常见的一种方法,跟原始的SC方法比较类似,其代价函数形式如下:

稀疏编码之字典训练和特征编码

式中D是字典,S为系数。第一个式子的第一项为重构误差项,第二项为稀疏惩罚项(采用的L1范数作为惩罚函数),第二个式子是字典各元素需要满足的条件(各元素是单位向量)。我们知道要实现稀疏应该用L0范数(表示非0元素的个数),但这里为什么用L1范数,而非L0,L2范数,原因可参以下几篇博文。

第一篇:

http://freemind.pluskid.org/machine-learning/sparsity-and-some-basics-of-l1-regularization/

第二篇:

http://www.cnblogs.com/aixueshuqian/p/3939101.html

第三篇:

http://blog.csdn.net/zouxy09/article/details/24971995

第四篇;

http://www.cvchina.info/2010/06/01/sparse-representation-vector-matrix-tensor-1/

第五篇:

http://www.cnblogs.com/tenosdoit/p/3708996.html

优化上面的代价函数一般采用交替优化的步骤,即固定D优化S,然后固定S再优化D,因为这时候是凸优化,方便进行。目前的优化方法有很多,到底选择哪一种优化方法是个值得思考的问题。如上所述,这里需要分两步来优化:当固定D来优化S时,此时的优化问题也就变为解Lasso问题,在其他地方我看到一些关于SC的资料,直接说这一步优化就是解Lasso问题,个人认为这是不合适的,如果惩罚函数不是L1范数,还能称为解Lasso问题?解Lasso问题可以用LARS算法解决。此外,优化S时还可以采用generic QP solvers (e.g., CVX)、interior point Method等;当固定S来优化D时,可以采用generic convex optimization solvers (e.g., QCQP solver)、gradient descent等方法。尽管优化方法很多,但这些方法多数速度较慢,为此加速优化(也可以说加快sc的执行,因为优化耗费时间最多)也是一个SC等领域研究得比较多的问题,称为scale-up sparse coding。关于这些可参考以下论文:

第一篇:

Efficient sparse coding algorithms(有代码,速度快,效果也不错)

第二篇:

Learning Fast Approximations of Sparse Coding

当然还有其他的论文,再此不一一列举。

(2)Orthogonal matching pursuit (OMP-k)

关于OMP数学理论,本人也不十分明白,有兴趣的自己查资料。该方法的代价函数如下所示:

稀疏编码之字典训练和特征编码

其优化步骤与SC相同,也是交替优化。优化方法采用OMP即可。

(3)Sparse RBMs and sparse auto-encoders (RBM, SAE)

RBM和SAE一般是训练得到连接输入层和隐含层的权重W以及偏置项b,通过隐含层单元采用的激活函数即可计算出隐含层激活值(也被称为权重)。用这两种方法计算字典D时,W的转置即可作为字典。

(4)Random weights (R)

我们知道SC中一般我们是随机初始化得到基,R方法就是把随机初始化的基作为学习的字典进行特征编码。基常用的是初始化为服从正态分布。

(5)Randomly sampled patches (RP)

这种方法是将样本按一定要求标准化后作为学习的字典D。这种方法没有给出参考文献,不知道自己理解的对不对,但是按论文的说法是这样的,当然这些样本应该是经过白化等预处理的。

特征编码常用的方法概括如下:

(1)Sparse coding (SC)

得到字典D后,将其带入字典训练步骤中的SC中优化代价函数得到系数S。在实际应用中(比如分类),为了效果更好,有时候会用下式计算得到最终的特征。

稀疏编码之字典训练和特征编码

这里用的是软阈值函数(soft thresholding function,或soft shrinkage function),关于其具体细节可参考论文“Penalty and Shrinkage Functions for Sparse Signal Processing”(应该不是原文)。这种处理特征方式的具体应用可参考论文“Unsupervised feature learning for aerial scene classification”。

(2)Orthogonal matching pursuit (OMP-k)

这种方法与上面的SC类似。

(3)Soft threshold (T)

这种方法是利用软阈值函数得到系数S(特征),处理方法如下:

稀疏编码之字典训练和特征编码

D为字典,x为样本,alpha是阈值。

注意:以上字典学习和特征编码时对字典D进行限制(各元素为单位向量),其他地方可能会看到不同的限制方法。另外,论文是为了比较各方法,所以对D做了同样的处理。

既然有这么多字典训练和特征编码的方法,在应用时具体该怎么选择呢?实际上是没有限制的,比如说字典训练我选SC,特征编码时除了SC还可以选择其他任意一种特征编码方法,也就是说训练出来字典D后,“随便’你用哪种特征编码方法。但是,需要注意的是:字典训练阶段,优化代价函数时候,需要根据代价函数的样式选择优化方法,否则是不合理的。比如说,字典学习SC这种方法中,若采用L1范数作为惩罚函数,当固定D优化S时采用OMP优化就不合理了,因为这本是一个Lasso问题。

关于优化,推荐采用spams这个工具包,各种常用的优化方法几乎都有,而且比较好的一点在于每种方法对应的程序中都给列出了该方法可以解决的优化问题(给出了该方法可以解决的各种代价函数,编译spams时需要根据系统修改其中的一个参数然后再编译)。下载地址:

http://spams-devel.gforge.inria.fr/

下图是字典训练和特征编码组合时候的识别效果(第一列表示字典学习方法,第一行表示特征编码方法)。可以看到,字典训练和特征编码采用不同的方法时可能会取得更好的结果。

 

稀疏编码之字典训练和特征编码

原创粉丝点击