稀疏编码笔记1
稀疏编码近几年来是个十分热门的研究领域,它是一种无监督学习算法,它通过寻找一组超完备基(即字典)来捕捉数据中的高层次语义,同时学习得到数据这组基下的稀疏坐标。最早被用于建模人类视觉皮层(human visual cortex),而如今,稀疏编码已经用于许多领域,如图像复原,信号分类,人脸识别,图片分类等。
这里,“超完备”指的是这组基的数量$k$大于原来的维数$p$,超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式。通过稀疏编码,我们可以高效地表示数据。假设原始空间中的一个样本为$x^{(i)}$,则在这组稀疏基下,其可以表示为:
$$ x^{(i)} = \sum_{j=1}^k s^{(i)}_jB_j $$
其中,$B_j$是第$j$组基,$s^{(i)}$是$x^{(i)}$在这组基下的坐标。上式可以写为更简化的矩阵形式:
$$ x^{(i)} = Bs^{(i)} $$
这个形式可能有点难理解,不过回顾我们学过的线性代数课程中的线性方程组就可以知道,$Bs^{(i)}$就是$B$中每一列以向量$s^{(i)}$每一个元素为权重的线性组合。
我们熟悉的无监督降维算法如PCA也是通过找到一组基,然后将数据投影到这组基坐标下,不同的是PCA找到的基是完备的,即一般$k<p$。而在稀疏编码中,由于基是超完备的(即$k>p$),这就产生了一个问题:这样产生的表示不唯一。
这里具体解释一下,我们都学过线性代数,那么可以把下面的式子想象为一个线性方程组
$$ Bs^{(i)} =x^{(i)} $$
式子中有$k$个变量,$p$个等式。由于$k>p$,即变元数大于方程数,因此有$k-p$个自由变元,所以导致这个方程组的解不唯一。
因此,在稀疏编码算法中,我们另加了一个评判标准“稀疏性”来解决因超完备而导致的退化(degeneracy)问题。这种稀疏性带来的结果是:$s^{(i)}$中只有很少非0元素,其余均是0。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素(即这里的$B_j$)的叠加,在图像中这些基本元素可以是面或者线。同时,比如与初级视觉皮层的类比过程也因此得到了提升。
引入稀疏性的稀疏代价函数定义为:
$$ \sum_{i=1}^n \left\|x^{(i)} - \sum_{j=1}^ks^{(i)}_jB_j\right\|^2+\lambda\sum_{i=1}^n\sum_{j=1}^k\Omega(s^{(i)}_j) $$
第一项是稀疏重构项,确保得到的表示能够尽可能地拟合原始数据;第二项是稀疏惩罚项,确保得到的坐标足够稀疏,$\Omega$是一个稀疏代价函数,参数$\lambda$控制稀疏的程度,$\lambda$越大,结果越稀疏。
(注:参考资料1中的公式后一项没有$\sum_{i=1}^n$这一项,我觉得不对)
其可以进一步写为矩阵形式:
$$ \sum_{i=1}^n \left\|X - BS\right\|^2 + \lambda \sum_{i=1}^n\sum_{j=1}^k\Omega(s^{(i)}_j) $$
其中$X=[x^{(1)},x^{(2)},...,x^{(n)}]$,$S=[s^{(1)},s^{(2)},...,s^{(n)}]$
最简单的稀疏代价函数是L0范数:$\Omega(s^{(i)}_j)=\begin{cases}1,&|s^{(i)}_j|>0\\0,&|s^{(i)}_j|=0\end{cases}$,即向量$s^{(i)}$中非零元素的个数。一方面,L0范数是不可导的,另一方面,L0范数的组合问题是NP-hard的,所以通常不用L0。
现实中最常用的是L1范数:$\Omega(s^{(i)}_j)=|s^{(i)}_j|$。L1范数优化是与L0范数优化最接近的凸优化问题(convex optimization problem),并且相关研究发现,当得到的表示足够稀疏时,L0范数与L1等价。
此外,减小$s_j$或增大$B_j$会使稀疏惩罚项变得很小,因此必须限制$\left\|B\right\|^2$小于某个常数$C$,即$\left\|B\right\|^2<C$
注意,稀疏编码只是获得稀疏表示的一种方式,但不是唯一的方式。
参考资料:
http://ufldl.stanford.edu/wiki/index.php/%E7%A8%80%E7%96%8F%E7%BC%96%E7%A0%81