稀疏编码是无监督学习的一种,它学习一组超完备基的集合用以高效地表示数据,即
稀疏编码就是要找到基向量ϕi。
虽然PCA等技术可以让我们高效地找到基向量,但我们希望可以找到基向量的超完备集(over-complete)来表示输入向量 x∈Rn (也就是k>n)。有一组超完备基的好处在于我们的基向量可以更高地捕捉到输入数据内在的结构和模式。然而,使用超完备基时,系数 αi 不再是由输入x唯一确定了。因此,稀疏编码中,我们引入了一个评价标准:稀疏性(sparsity )用以解决超完备带来的退化(degeneracy)问题。
我们对稀疏性的定义如下:
只有少数非零元素或者只有少数不接近零的元素。要求系数
αi
稀疏意思是,对于一组输入向量,我们希望远离0的系数越少越好。
之所以要求输入数据的表示具有稀疏性,是因为很多感官数据,比如自然图像,可以视作为一些数量较少的元素(如面或者边)的叠加。
定义m个输入向量的稀疏编码代价函数为
S(.)是用来惩罚 ai 离0较远。虽然稀疏的直观表示为 "L0" 范数,也就是 S(αi)=1(|αi|>0) ,但是它是不可微的,比较难进行优化。实际上,稀疏化比较常见的方法是用 "L1" 范数 S(αi)=|αi|1 和log惩罚函数 S(αi)=log(1+α2i) 。
代价函数优化时,有可能为了减小 ai ,使得 Φi 很大,为了防止这种事情发生,我们约束 ||Φi||2 小于一个常数C。完整的稀疏编码代价方程为:
概率解释
我们可以从概率的角度出发,将稀疏编码视作为一种生成模型。
我们将对自然图像的建模视作为k个独立源特征
Φi
和加性噪声v的叠加:
我们的目标是找到一组特征基向量
Φ
,使得P(x∣ϕ)和输入数据P∗(x)的经验分布函数尽可能相似。一种方法是最小化他们的KL散度(KL divergence)
也就是最大化 log(P(X|Φ) .
假设v是方差为 σ2 的高斯白噪声,则
假设我们的源特征是相互独立的,则
我们将稀疏性加进来,也就是我们希望 αi 的概率分布在0处的峰值很高。一个方便的参数化先验分布为:
其中, S(αi) 是决定先验分布的形状的函数
这时,我们可以得到P(X|ϕ)
我们的问题变为求
但通过对α积分求 P(X|ϕ) 是不可行的,前文提到过 P(X|ϕ) 非常陡峭,因此,我们可以近似积分为 P(X|ϕ) 的最大值。
跟之前一样,为了防止 ϕ 过大,我们对它添加一个约束。最终得到:
其中, λ=2σ2β ,且关系不大的常亮被隐藏了。我们可以将上式改写为:
通过概率论的分析,选择 "L1" 范数和log惩罚函数 S(αi)=log(1+α2i) 分别对应于使用了拉普拉斯概率 P(ai)∝exp(−β|ai|) 和柯西概率 P(ai)∝β1+a2i
学习
用稀疏编码算法学习
ϕ
的过程实际上包含两个优化过程:对每个训练样本x优化
αi
,之后一次性处理多个样本对基向量
ϕ
进行优化。
如果采用
L1
范数作为稀疏惩罚函数,学习
αi
实际上成为了用
L1
范数做最小二乘法问题,对于
αi
是凸函数,有很多凸优化器如CVX可以解决。如果S(.)是可微的,如log惩罚函数,可以采用基于梯度算法的方法,如共轭梯度法。
用 L2 范数来约束,同样也可以简化为用 L2 范数的最小二乘法问题,标准的凸优化器同样可以用,不过也有很多新的更有效的方法,如对偶拉格朗日法。
稀疏编码有一个显著的局限性,即使可以学到一组基向量,但为了编码到新的数据,优化器必须再次执行优化过程来得到所需的稀疏。这种显著的实时消耗意味着,即使在test时,稀疏编码计算量很大,尤其和典型的前馈结构比。