稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。稀疏编码算法的目的就是找到一组基向量 (自然图像的小波基?) ϕi ,使得我们能将输入向量 x 表示为这些基向量的线性组合:
所谓“超完备”基向量来表示输入向量 x∈Rn ,也就是说, k>n 。超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式(structure && pattern)。然而,对于超完备基来说,系数 ai 不再由输入向量 x 唯一确定。
这里,我们把“稀疏性”定义为:只有很少的几个非零元素或只有很少的几个远大于零(显著不为零)的元素。要求系数 ai 是稀疏的意思就是说:对于一组输入向量,我们只想有尽可能少的几个系数远大于零。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基元素的叠加,在图像中这些基本元素可以是面或者线。
我们把 m 个输入向量的稀疏编码代价函数定义为:
此处 S(.) 是一个稀疏代价函数,由它来对远大于零的 ai 进行“惩罚”。
虽然“稀疏性”的最直接测度标准是 “L0” 范式( S(ai)=1|ai|>0 ),但这是不可微的,通常很难进行优化。在实际中,稀疏代价函数 S(.) 的普遍选择是 ℓ1 范式代价函数 S(ai)=|ai|1 及对数代价函数 S(ai)=log(1+a2i) 。
此外,很有可能因为减小 ai 而增加 ϕi 至很大的常量,使得稀疏惩罚变得非常小。为防止此类事件发生,我们将限制 ∥ϕ∥2 要小于某常量 C 。包含了限制条件的稀疏编码代价函数的完整形式如下:
确切地说,在稀疏编码算法中,有样本数据 x 供我们进行特征学习(feature learning)。特别是,学习一个用于表示样本数据的稀疏特征集 s (稀疏编码,或者叫系数,对基向量(长度为 k )进行线性组合), 和一个将特征集从特征空间转换到样本数据空间的基向量 A , 我们可以构建如下目标函数:
如目标函数所示,它的约束性并不强——按常数比例缩放 A 的同时,再按这个常数的倒数缩放 s ,也即 (α⋅A)(1α⋅s)=As ,结果不会改变误差大小,却会减少稀疏代价(表达式第二项)。因此需要为 A 的每一列增加额外约束, ATjAj≤1 ,问题变为:
遗憾的是,因为目标函数并不是一个凸函数,所以不能用梯度方法解决这个优化问题。但是,在给定 A 的情况下,最小化 J(A,s) 求解 s 是凸的。同理,给定 s 最小化 J(A,s) 求解 A 也是凸的。这表明,可以通过交替固定 s 和 A 分别求解 A和s。实践表明,这一策略取得的效果非常好。
但是,以上表达式带来了另一个难题:不能用简单的梯度方法来实现约束条件 ATjAj≤1∀j 。因此在实际问题中,此约束条件还不足以成为“权重衰变”(”weight decay”)项以保证 A 的每一项值够小。这样我们就得到一个新的目标函数:
这一目标函数带来了最后一个问题,即 L1 范数在 0 点处不可微影响了梯度方法的应用。尽管可以通过其他非梯度下降方法避开这一问题,但是本文通过使用近似值“平滑” L1 范数的方法解决此难题。使用 x2+ϵ−−−−−√ 代替 |x| , 对 L1 范数进行平滑,其中 ε 是“平滑参数”(”smoothing parameter”)或者“稀疏参数”(”sparsity parameter”) (如果 ε远大于x, 则 x + ε 的值由 ε 主导,其平方根近似于ε)。在下文提及拓扑稀疏编码时,“平滑”会派上用场。
因此,最终的目标函数是:
该目标函数可以通过以下过程迭代优化:
(2)重复以下步骤直至收敛: