字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客: 奇异值分解SVD

一、字典学习数学模型

字典学习的思想应该源来实际生活中的字典的概念。字典是前辈们学习总结的精华,当我们需要学习新的知识的时候,不必与先辈们一样去学习先辈们所有学习过的知识,我们可以参考先辈们给我们总结的字典,通过查阅这些字典,我们可以大致学会到这些知识。
为了将上述过程用准确的数学语言描述出来,我们需要将“总结字典”、“查阅字典”做出一个更为准确的描述。就从我们的常识出发:

  • 1.我们通常会要求的我们的字典尽可能全面,也就是说总结出的字典不能漏下关键的知识点。
  • 2.查字典的时候,我们想要我们查字典的过程尽可能简洁,迅速,准确。即,查字典要快、准、狠。
  • 3.查到的结果,要尽可能地还原出原来知识。当然,如果要完全还原出来,那么这个字典和查字典的方法会变得非常复杂,所以我们只需要尽可能地还原出原知识点即可。

下面,我们要讨论的就是如何将上述问题抽象成一个数学问题,并解决这个问题。

1.1、数学描述

我们将上面的所提到的关键点用几个数学符号表示一下:

  • “以前的知识”,更专业一点,我们称之为原始样本,用矩阵Y\mathbf{Y}表示;
  • “字典”,我们称之为字典矩阵,用D\mathbf{D}表示,“字典”中的词条,我们称之为原子(atom),用列向量 dk\mathbf{d_{k}} 表示;
  • “查字典的方法”,我们称为稀疏矩阵,用 X\mathbf{X}
  • “查字典的过程”,我们可以用矩阵的乘法来表示,即 DX\mathbf{DX}

用数学语言描述,字典学习的主要思想是,利用包含 KK 个原子 dk\mathbf{d_{k}}的字典矩阵DRm×K\mathbf{D} \in \mathbf{R}^{m \times K},稀疏线性表示原始样本YRm×n\mathbf{Y} \in \mathbf{R}^{m \times n}其中 nn 表示样本数,mm 表示样本的属性),即有Y=DX\mathbf{Y=DX}(这只是我们理想的情况),其中XRK×n\mathbf{X} \in \mathbf{R}^{K \times n}为稀疏矩阵,可以将上述问题用数学语言描述为如下优化问题:
(1-1)minD, XYDXF2,s.t. i, xi0T0\min_{\mathbf{D,\ X}}{\|\mathbf{Y}-\mathbf{DX}\|^2_F},\quad \text{s.t.}\ \forall i,\ \|\mathbf{x}_i\|_0 \le T_0 \tag{1-1}
或者
(1-2)minD, Xixi0,s.t. minD, XYDXF2ϵ,\min_{\mathbf{D,\ X}}\sum_i\|\mathbf{x}_i\|_0, \quad \text{s.t.}\ \min_{\mathbf{D,\ X}}{\|\mathbf{Y}-\mathbf{DX}\|^2_F} \le \epsilon, \tag{1-2}
上式中 X\mathbf{X} 为稀疏编码的矩阵, xi  (i=1,2, ,K)\mathbf{x}_i\,\ (i=1,2,\cdots,K),为该矩阵中的行向量,代表字典矩阵的系数。

注意xi0∥\mathbf{x_{i}}∥_{0}表示零阶范数,它表示向量中不为0的数的个数。即是想让其尽可能的稀疏,非0的元素尽可能的少。

1.2、求解问题

式(1-1)的目标函数表示,我们要最小化查完的字典与原始样本的误差,即要尽可能还原出原始样本;它的限的制条件 xi0T0\|\mathbf{x}_i\|_0 \le T_0,,表示查字典的方式要尽可能简单,即XX要尽可能稀疏。式(1-2)同理。
式(1-1)或式(1-2)是一个带有约束的优化问题,可以利用拉格朗日乘子法将其转化为无约束优化问题
(1-3)minD, XYDXF2+λxi1\min_{\mathbf{D,\ X}}{\|\mathbf{Y}-\mathbf{DX}\|^2_F}+\lambda\|\mathbf{x}_i\|_1 \tag{1-3}

注意xi0∥\mathbf{x_{i}}∥_{0}表示零阶范数 我们将xi0∥\mathbf{x_{i}}∥_{0}xi1∥\mathbf{x_{i}}∥_{1}代替,主要是xi1∥\mathbf{x_{i}}∥_{1}更加便于求解。

这里有两个优化变量D, X\mathbf{D,\ X},为解决这个优化问题,一般是固定其中一个优化变量,优化另一个变量,如此交替进行。式(1-3)中的稀疏矩阵X\mathbf{X}可以利用已有经典算法求解,如Lasso(Least Absolute Shrinkage and Selection Operator)、OMP(Orthogonal Matching Pursuit),这里我重点讲述如何更新字典D\mathbf{D},对更新X\mathbf{ X}不多做讨论。
假设X\mathbf{ X}是已知的,我们逐列更新字典。下面我们仅更新字典的第kk列,记dk\mathbf{d_{k}} 为字典D\mathbf{D}的第kk列向量,记 xTk\mathbf{x}^k_T 为稀疏矩阵X\mathbf{X}的第 kk 行向量,那么对式(1-1),我们有:
(1-4)YDXF2=Yj=1KdjxTjF2=(YjkdjxTj)dkxTkF2=EkdkxTkF2\begin{aligned} {\|\mathbf{Y}-\mathbf{DX}\|^2_F} =&\left\|\mathbf{Y}-\sum^K_{j=1}\mathbf{d}_j\mathbf{x}^j_T\right\|^2_F \\ =&\left\|\left(\mathbf{Y}-\sum_{j\ne k}\mathbf{d}_j\mathbf{x}^j_T\right)-\mathbf{d}_k\mathbf{x}^k_T\right\|^2_F\\ =&\left\|\mathbf{E}_k - \mathbf{d}_k\mathbf{x}_T^k \right\|^2_F \end{aligned} \tag{1-4}
上式中残差: (1-5)Ek=YjkdjxTj\mathbf{E}_k=\mathbf{Y}-\sum_{j\ne k}\mathbf{d}_j\mathbf{x}^j_T\tag{1-5}
此时优化问题可描述为: (1-6)mindk, xTkEkdkxTkF2\min_{\mathbf{d}_k,\ \mathbf{x}^k_T}\left\|\mathbf{E}_k - \mathbf{d}_k\mathbf{x}_T^k \right\|^2_F\tag{1-6}
因此我们需要求出最优的 dk, xTk\mathbf{d}_k,\ \mathbf{x}_T^k,这是一个最小二乘问题,可以利用最小二乘的方法求解,或者可以利用SVD进行求解,这里利用SVD的方式求解出两个优化变量

但是,在这里我人需要注意的是,不能直接利用 Ek\mathbf{E}_k 进行求解,否则求得的新的 xTk\mathbf{x}^k_T 不稀疏。因此我们需要将 Ek\mathbf{E}_k中对应的xTk\mathbf{x}^k_T不为0的位置提取出来,得到新的Ek\mathbf{E}_k^{'},这个过程如图2-1所示,这样描述更加清晰。
ML笔记:字典学习3(Dictionary Learning,KSVD)
如上图,假设我们要更新第0列原子,我们将xTk\mathbf{x}_T^k中为零的位置找出来,然后把Ek\mathbf{E}_k对应的位置删除,得到Ek\mathbf{E}_k^{'},此时优化问题可描述为:
(1-7)mindk, xTkEkdkxTkF2\min_{\mathbf{d}_k,\ \mathbf{x}^k_T}\left\|\mathbf{E}_k^{'} - \mathbf{d}_k\mathbf{x{'}}_T^{k} \right\|^2_F \tag{1-7}
因此我们需要求出最优的 dk, xTk\mathbf{d}_k,\ \mathbf{x^{'}}_T^k:
(1-8)Ek=UΣVT\mathbf{E}_k^{'}=U\Sigma V^T \tag{1-8}
取左奇异矩阵UU的第1个列向量u1=U(,1)\mathbf{u}_1=U(\cdot,1)作为dk=u1\mathbf{d}_k=\mathbf{u}_1,即dk\mathbf{d}_k,取右奇异矩阵的第1个行向量与第1个奇异值的乘积作为xTk\mathbf{x{'}}_T^k,即xTk=Σ(1,1)VT(1,)\mathbf{x{'}}^k_T=\Sigma(1,1)V^T(1,\cdot)。得到xTk\mathbf{x{'}}^k_T后,将其对应地更新到原xTk\mathbf{x}_T^k

注意:式(1-8)所求得的奇异值矩阵 ΣΣ 中的奇异值应从大到小排列;同样也有xTk=Σ(1,1)V(,1)T\mathbf{x{'}}^k_T=\Sigma(1,1)V(\cdot,1)^T,这与上面x′kT的求法是相等的。

1.3、字典学习算法实现

利用1.2小节稀疏算法求解得到稀疏矩阵X\mathbf{X}后,逐列更新字典,有如下算法1.1。

算法 字典学习(K-SVD)
输入 原始样本,字典,稀疏矩阵
输出 字典,稀疏矩阵
1 初始化 从原始样本YRm×nY \in \mathbf{R}^{m \times n}随机取KK个列向量或者取它的左奇异矩阵的前KK个列向量
{d1,d2, ,dK}\{\mathbf{d}_1,\mathbf{d}_2,\cdots,\mathbf{d}_K\}作为初始字典的原子,得到字典D(0)Rm×K\mathbf{D}^{(0)} \in \mathbf{R}^{m \times K}。令j=0j=0
重复下面步骤1-3,直到达到指定的迭代步数,或收敛到指定的误差:
2 稀疏编码 利用字典上一步得到的字典D(j)\mathbf{D}^{(j)},稀疏编码,得到X(j)RK×n\mathbf{X}^{(j)}\in\mathbf{R}^{K \times n}
3 字典更新 逐列更新字典D(j)\mathbf{D}^{(j)},字典的列dk{d1,d2, ,dK}\mathbf{d}_k \in \{\mathbf{d}_1,\mathbf{d}_2,\cdots,\mathbf{d}_K\}
3.1 当更新dk\mathbf{d}_k时,计算误差矩阵Ek\mathbf{E}_k: Ek=YjkdjxTj.\mathbf{E}_k=\mathbf{Y}-\sum_{j\ne k}\mathbf{d}_j\mathbf{x}^j_T.
3.2 取出稀疏矩阵第kk个行向量xTk\mathbf{x}^k_T不为0的索引的集合ωk={i1in,xTk(i)0}\omega_{k}=\left\{i 1 \leq i \leq n, \mathbf{x}_{T}^{k}(i) \neq 0\right\}
还有以下的这个:xTk={xTk(i)1in, xTk(i)0}\mathbf{x'}_T^{k} = \{\mathbf{x}_T^k(i)1\le i\le n,\ \mathbf{x}_T^k(i) \ne 0\}
3.3 Ek\mathbf{E}_k取出对应ωk\omega_k不为0的列,得到Ek\mathbf{E}_k^{'},
3.4 Ek\mathbf{E}_k^{'}作奇异值分解Ek=UΣVT;\mathbf{E}_k=U\Sigma V^T;UU的第1列更新字典的第kk列,即
dk=U(,1)\mathbf{d}_k=U(\cdot,1), 令:xTk=Σ(1,1)V(,1)T\mathbf{x'}^k_T=\Sigma(1,1)V(\cdot,1)^T;得到xTk\mathbf{x'}^k_T后,将其对应地更新到原xTk\mathbf{x}_T^k
3.5 j=j+1j=j+1

最后感谢作者:

相关文章: