『ML笔记』深入浅出字典学习2(Dictionary Learning)

『ML笔记』深入浅出字典学习2(Dictionary Learning)文章目录一、理解K-SVD字典学习二、K-SVD字典学习算法概述2.1、随机初始化字典D2.2、固定字典,求取每个样本的稀疏编码2.3、逐列更新字典、并更新对应的非零编码一、理解K-SVD字典学习字典学习也可简单称之为稀疏编码,字典学习偏向于学习字典DDD。从矩阵分解角度,看字典学习过程:给定样本数据集YYY,YYY的每一列表示一个样本;字典学习的目标是把YYY矩阵分解成DDD、XXX矩阵:…

深入浅出字典学习2(Dictionary Learning)

一、理解K-SVD字典学习

  • 字典学习也可简单称之为稀疏编码,字典学习偏向于学习字典 D \mathbf D D。从矩阵分解角度,看字典学习过程:给定样本数据集 Y \mathbf Y Y Y \mathbf Y Y 的每一列表示一个样本;字典学习的目标是把 Y \mathbf Y Y 矩阵分解成 D \mathbf D D X \mathbf X X 矩阵:
    Y ≈ D X (1) \mathbf Y \approx \mathbf D \mathbf X\tag{1} YDX(1)
  • 同时满足约束条件 X \mathbf X X 尽可能稀疏,同时 D \mathbf D D 的每一列是一个归一化向量。 D \mathbf D D 称之为字典, D \mathbf D D每一列称之为原子 X \mathbf X X 称之为编码矢量、特征、系数矩阵;字典学习可以有三种目标函数形式
  • 第一种形式
    D , X = argmin ⁡ 1 2 ∥ Y − D X ∥ 2 + λ ⋅ ∥ X ∥ 0 (2) \mathbf D, \mathbf X=\operatorname{argmin} \frac{1}{2}\|\mathbf Y-\mathbf D \mathbf X\|^{2}+\lambda \cdot\|\mathbf X\|_{0}\tag{2} D,X=argmin21YDX2+λX0(2) 注意:这种形式因为 L 0 L_0 L0 难以求解,所以很多时候用 L 1 L_1 L1 正则项替代近似。
  • 第2种形式
    D , X = arg ⁡ min ⁡ D , X { ∥ X ∥ 0 } st. ∥ Y − D X ∥ 2 ≤ ε (3) \begin{array}{l}{\mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\left\{\| \mathbf X\|_{0}\right\}} \\ {\text {st.} \quad\| \mathbf Y- \mathbf D \mathbf X\|^{2} \leq \varepsilon}\end{array}\tag{3} D,X=D,Xargmin{
    X0}
    st.YDX2ε
    (3)
    注意 ε ε ε是重构误差所允许的最大值。
  • 第3种形式
    D , X = arg ⁡ min ⁡ D , X ∥ Y − D X ∥ 2 st.  ∥ X ∥ 0 ≤ L (4) \begin{array}{l}{ \mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\| \mathbf Y- \mathbf D \mathbf X\|^{2}} \\ {\text {st. }\| \mathbf X\|_{0} \leq L}\end{array}\tag{4} D,X=D,XargminYDX2st. X0L(4) 注意 L L L 是一个常数,稀疏度约束参数,上面三种形式相互等价!

因为目标函数中存在两个未知变量 D , X \bf D,X D,X,K-SVD是字典学习的一种经典算法,其求解方法跟lasso差不多,固定其中一个,然后更新另外一个变量,交替迭代更新。

  • 1. 如果 D \bf D D 的列数少于 Y \bf Y Y 的行数,就相当于欠完备字典,类似于PCA降维;
  • 2. 如果 D \bf D D 的列数大于 Y \bf Y Y 的行数,称之为超完备字典;
  • 3. 如果刚好等于,那么就称之为完备字典;
  • 假设现在有了一个 N ∗ T N*T NT的过完备字典 D \bf D D(比如前面所述图像傅里叶变换的所有频率的波),一个要表示的对象 y y y(要还原的图像),求一套系数 x x x,使得 y = D x y=\bf Dx y=Dx,这里 y y y 是一个已知的长为 N N N 的列向量, x \bf x x 是一个未知的长为 T T T 的列向量,解方程!这是一个 T T T 个未知数, N N N 个方程的方程组, T > N T>N T>N,所以是有无穷多解的,线性代数中这样的方程很熟悉了。 上面我就随便举了个 N = 5 , T = 8 N=5, T=8 N=5,T=8 的例子,用来随便感受下。
    [ 1 2 3 4 5 ] = [ 1 2 3 4 5 6 7 8 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 ] × [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 ] \left[ \begin{array}{l}{1} \\ {2} \\ {3} \\ {4} \\ {5}\end{array}\right]=\left[ \begin{array}{llllllll}{1} & {2} & {3} & {4} & {5} & {6} & {7} & {8} \\ {0} & {1} & {0} & {0} & {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} & {0} & {0} & {0} & {1} \\ {0} & {0} & {0} & {1} & {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} & {1} & {0} & {0} & {0}\end{array}\right]×\left[ \begin{array}{c}{x_1} \\ {x_2} \\ {x_3} \\ {x_4} \\ {x_5} \\ {x_6} \\ {x_7} \\ {x_8}\end{array}\right] 12345=1000021000301004001050001610007000080100×x1x2x3x4x5x6x7x8
  • 这里可以引出一个名词,ill-posed problem(不适定问题),即有多个满足条件的解,无法判断哪个解更加合适,这是更“落地”的应用场景,inverse problem(逆问题),比如图像去噪,从噪声图中提取干净图。于是需要做一个约束。
  • 加限制条件,要求 x \bf x x 尽可能稀疏,怎么“稀疏”呢?就是 x \bf x x 0 0 0 尽可能多,即 n o r m ( x > 0 ) norm(x> 0) norm(x>0)(零范数:非0元素个数)尽可能小。这样就有唯一解了吗?也还不是,如何能“约束”出各位合适的解,如何解,正是稀疏表示所研究的重点问题。比如后来有证明 D D D满足一定条件情况下 x x x满足 n o r m ( x , 1 ) norm(x,1) norm(x,1)即可还原原始数据等,这有不少大神开启这个领域的故事这里就不讲了。

二、K-SVD字典学习算法概述

  • 给定训练数据 Y \bf Y Y Y \bf Y Y 的每一列表示一个样本,我们的目标是求解字典 D \bf D D 的每一列(原子)。

2.1、随机初始化字典D

  • 从样本集 Y \bf Y Y 中随机挑选 k k k 个样本,作为 D \bf D D 的原子;并且初始化编码矩阵 X \bf X X 0 0 0 矩阵。

2.2、固定字典,求取每个样本的稀疏编码

  • 编码过程采用如下公式:
    D , X = arg ⁡ min ⁡ D , X { ∥ X ∥ 0 } st. ∥ Y − D X ∥ 2 ≤ ε (5) \begin{array}{l}{\mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\left\{\| \mathbf X\|_{0}\right\}} \\ {\text {st.} \quad\| \mathbf Y- \mathbf D \mathbf X\|^{2} \leq \varepsilon}\end{array}\tag{5} D,X=D,Xargmin{
    X0}
    st.YDX2ε
    (5)
  • ε ε ε 是重构误差所允许的最大值。假设我们的单个样本是向量 y \bf y y,为了简单起见我们就假设原子只有这4个,也就是字典 D = [ α 1 、 α 2 、 α 3 、 α 4 ] \bf D=[\alpha_1、\alpha_2、\alpha_3、\alpha_4] D=[α1α2α3α4] D \bf D D 是已经知道的;我们的目标是计算 y \bf y y编码 x \bf x x,使得 x \bf x x 尽量的稀疏。
  • (1)、首先从 α 1 、 α 2 、 α 3 、 α 4 \alpha_1、\alpha_2、\alpha_3、\alpha_4 α1α2α3α4中找出与向量 y \bf y y 最近的那个向量,也就是分别计算点乘: α 1 ∗ y 、 α 2 ∗ y 、 α 3 ∗ y 、 α 4 ∗ y \bf α_1*y、α_2*y、α_3*y、α_4*y α1yα2yα3yα4y 然后求取最大值对应的原子 α α α
  • (2)、假设 α 2 ∗ y \bf α_2*y α2y 最大,那么我们就用 α 2 α_2 α2,作为我们的第一个原子,然后我们的初次编码向量就为: x 1 = ( 0 , b , 0 , 0 ) x_1=(0,b,0,0) x1=0,b,0,0b是一个未知参数。
  • (3)、求解系数b: y − b ∗ α 2 = 0 \mathbf y-b*α_2=0 ybα2=0 方程只有一个未知参数 b b b,是一个高度超静定方程,求解最小二乘问题。
  • (4)、然后我们用 x 1 x_1 x1 α 2 α_2 α2相乘重构出数据,然后计算残差向量: y ’ = y − b ∗ α 2 \mathbf y’=\mathbf y-b*\mathbf α_2 y=ybα2 如果残差向量y’满足重构误差阈值范围ε,那么就结束,否则就进入下一步;
  • (5)、计算剩余的字典 α 1 、 α 3 、 α 4 α_1、α_3、α_4 α1α3α4与残差向量 y ’ \bf y’ y的最近的向量,也就是计算
    α 1 ∗ y ’ 、 α 3 ∗ y ’ 、 α 4 ∗ y ’ \bf α_1*y’、α_3*y’、α_4*y’ α1yα3yα4y然后求取最大值对应的向量 α α α,假设 α 3 ∗ y ’ α_3*\mathbf y’ α3y为最大值,那么就令新的编码向量为: x 2 = ( 0 , b , c , 0 ) x_2=(0,b,c,0) x2=0,b,c,0 b 、 c b、c bc是未知参数。
  • (6)、求解系数 b 、 c , b、c, bc,于是我们可以列出方程:
    y − b ∗ α 2 − c ∗ α 3 = 0 \mathbf y-b*α_2-c*α_3=0 ybα2cα3=0方程中有两个未知参数 b 、 c b、c bc,我们可以进行求解最小二乘方程,求得 b 、 c b、c bc
  • (7)、更新残差向量 y ’ \mathbf y’ y y ’ = y − b ∗ α 2 − c ∗ α 3 \mathbf y’=\mathbf y-b*\mathbf α_2-c*\mathbf α_3 y=ybα2cα3
  • 如果 y ’ \mathbf y’ y 的模长满足阈值范围,那么就结束,否则就继续循环,就这样一直循环下去。

2.3、逐列更新字典、并更新对应的非零编码

  • 通过上面那一步,我们已经知道样本的编码。接着我们的目标是更新字典、同时还要更新编码。K-svd采用逐列更新的方法更新字典,就是当更新第 k k k列原子的时候,其它的原子固定不变。假设我们当前要更新第 k k k个原子 α k αk αk,令编码矩阵 X X X对应的第 k k k行为 x k xk xk,则目标函数为:
    ∥ Y − D X ∥ 2 = ∥ Y − ∑ j = 1 K α j ⋅ x j ∥ 2 = ∥ ( Y − ∑ j = k α j ⋅ x j ) − α k ⋅ x k ∥ 2 = ∥ E k − α k ⋅ x k ∥ 2 \|\mathbf Y-\mathbf D \mathbf X\|^{2}=\left\|\mathbf Y-\sum_{j=1}^{\mathrm{K}} \alpha_{j} \cdot \mathbf x_{j}\right\|^{2}=\left\|\left(\mathbf Y-\sum_{j=k} \alpha_{j} \cdot \mathbf x_{j}\right)-\alpha_{k} \cdot \mathbf x_{k}\right\|^{2}=\left\|\mathbf E_{k}-\alpha_{k} \cdot \mathbf x_{k}\right\|^{2} YDX2=Yj=1Kαjxj2=Yj=kαjxjαkxk2=Ekαkxk2
  • 上面的方程,我们需要注意的是 x k \mathbf x_k xk 不是把 X \mathbf X X 一整行都拿出来更新(因为 x k \mathbf x_k xk 中有的是零、有的是非零元素,如果全部抽取出来,那么后面计算的时候xk就不再保持以前的稀疏性了),所以我们只能抽取出非零的元素形成新的非零向量,然后 E k \mathbf E_k Ek 只保留 x k \mathbf x_k xk 对应的非零元素项。
  • 上面的方程,我们可能可以通过求解最小二乘的方法,求解 α k α_k αk,不过这样有存在一个问题,我们求解的 α k α_k αk不是一个单位向量,因此我们需要采用svd分解,才能得到单位向量 α k α_k αk。进过svd分解后,我们以最大奇异值所对应的正交单位向量,作为新的 α k α_k αk,同时我们还需要把系数编码 x k \mathbf x_k xk 中的非零元素也给更新了(根据svd分解)。
    然后算法就在1和2之间一直迭代更新,直到收敛。

参考了作者:

今天的文章『ML笔记』深入浅出字典学习2(Dictionary Learning)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6352.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注