机器学习经典算法:k-SVD 前面为什么加个 k?
11、字典学习思想
人类知识的发展历程比较复杂,我们简单点将其看成一个迭代过程:一代人的知识积累下来,再传授给下一代,下一代人除了使用已有知识外,还会对知识作进一步提升和扩展,然后继续传授给下一代。如此往复,不断进步。
然而知识从广义上看非常宽泛,我们不妨将其作一个简化,假设知识可以用一个字典来表示,那么知识的形成和应用也简化为两个步骤:建字典和查字典。
这里隐藏着如下一些大致要求,
字典尽量建得全面完备,以满足各个方面各个角度的不同应用。概括地说,就是具有完备性甚至允许冗余性。
而查字典往往是为了解决某一个特定问题,因此涉及到的具体知识点会比较有限,反映在所谓的稀疏性上。概括地说,就是具有稀疏性而不失精准。
从机器学习的角度来看,我们需要将这两点数学化,那么该如何办到呢?
¸转化为数学问题
我们将上面的所提到的几个关键点用简单的数学概念表示如下:
数据矩阵,用 表示,每一列表示一个样本; 字典矩阵,用 表示,而列向量 表示字典中的词条,称为原子(atom); 稀疏表示,即查字典,用矩阵乘法表示,即 ,其中 的列表示一个样本的系数向量。
2k-SVD 方法
我们的出发点是观察到的
令观测值为
首先,令
其中
然后,所谓的字典学习任务被转换为以下具体优化问题,
其中
这是一个非凸优化任务,可以迭代式求解。然而,
因此,每一次迭代包括两个阶段,
第 1 阶段:假设
是固定的,针对 , 进行优化。 第 2 阶段:假设系数向量是固定的,并针对
的列进行优化。
在
这也是
¸第 1 阶段:稀疏编码
假设
由于 Frobenius 范数的定义可知,这相当于解如下
这个问题并不好处理,不妨转变一下思路,比如考虑以下优化任务,则可以实现类似的目标:
其中
上式的任务可以通过任何一种
而带有约束的优化问题,可以利用拉格朗日乘子法将其转化为无约束优化问题,
这里我们用
¸第 2 阶段:字典更新
从第 1 阶段获得
现在的目标是针对
的列进行优化,注意,算法中是逐列分别处理的。
假设我们目前考虑更新
其中
请注意,在上述总和中,索引为
接着,我们将最小化外积矩阵(秩 为 1)
观察到这个乘积,除了
现在的任务就是求解一个秩 1 矩阵以最小化下式,
其中,
这个可以从下式中推得,
换句话说,我们要寻找一个在 Frobenius 范数意义上最逼近误差矩阵
的秩 1 矩阵。
上面从形式上看是一个最小二乘问题,自然可以利用最小二乘法来求解。但回想一下矩阵的 SVD 分解,容易知道这个小任务也可以通过矩阵
根据
因此,我们首先在
然后,得到一个简化向量
观察等式
然后我们收集
由 SVD 分解可得
后续将
综上所述,
1、初始化
2、第 1 阶段稀疏编码:用相关算法(如 OMP)解优化问题,获得稀疏编码表示向量
3、第 2 阶段字典更新:对于
从第 1 阶段计算所得的矩阵
中确定第 行中各非零元素的位置。 选择
中与 的第 行非零元素位置对应的列,构建误差矩阵 。 求
的 SVD 分解: 。 将
的第 列更新为最大奇异值对应的左奇异向量,即 。 更新
,将它的第 行的非零元位置设为 中的相应值。
4、如果满足收敛标准,则停止迭代;否则令
¸为什么叫 k-SVD
名称的 SVD 部分非常明显。但是,读者可能想知道前面为啥要加一个
那么它到底为啥要加上这个名头呢?实际上,该算法可以被认为是
因此,我们可以将
此外,基于输入向量到簇的分配,在