ML笔记:字典学习2(Dictionary Learning)

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

文章目录

    • 一、理解K-SVD字典学习
    • 二、K-SVD字典学习算法概述
          • 2.1、随机初始化字典D
          • 2.2、固定字典,求取每个样本的稀疏编码
          • 2.3、逐列更新字典、并更新对应的非零编码

一、理解K-SVD字典学习

字典学习也可简单称之为稀疏编码,字典学习偏向于学习字典 D D D。从矩阵分解角度,看字典学习过程:给定样本数据集 Y Y Y Y Y Y的每一列表示一个样本;字典学习的目标是把 Y Y Y矩阵分解成 D D D X X X矩阵:
Y ≈ D ∗ X Y \approx D^{*} X YDX

同时满足约束条件 X X X尽可能稀疏,同时 D D D的每一列是一个归一化向量。

D D D称之为字典, D D D每一列称之为原子 X X X称之为编码矢量、特征、系数矩阵;字典学习可以有三种目标函数形式

  1. 第一种形式
    D , X = argmin ⁡ 1 2 ∥ Y − D ⋅ X ∥ 2 + λ ⋅ ∥ X ∥ 0 D, X=\operatorname{argmin} \frac{1}{2}\|Y-D \cdot X\|^{2}+\lambda \cdot\|X\|_{0} D,X=argmin21YDX2+λX0

注意:这种形式因为 L 0 L0 L0难以求解,所以很多时候用 L 1 L1 L1正则项替代近似。

  1. 第2种形式
    D , X = arg ⁡ min ⁡ D , X { ∥ X ∥ 0 } st. ∥ Y − D X ∥ 2 ≤ ε \begin{array}{l}{D, X=\arg \min _{D, X}\left\{\|X\|_{0}\right\}} \\ {\text {st.} \quad\|Y-D X\|^{2} \leq \varepsilon}\end{array} D,X=argminD,X{X0}st.YDX2ε

注意 ε ε ε是重构误差所允许的最大值。

  1. 第3种形式
    D , X = arg ⁡ min ⁡ D , X ∥ Y − D X ∥ 2 st.  ∥ X ∥ 0 ≤ L \begin{array}{l}{D, X=\underset{D, X}{\arg \min }\|Y-D X\|^{2}} \\ {\text {st. }\|X\|_{0} \leq L}\end{array} D,X=D,XargminYDX2st. X0L

注意 L L L是一个常数,稀疏度约束参数,上面三种形式相互等价!

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

  • 如果D的列数少于Y的行数,就相当于欠完备字典,类似于PCA降维;
  • 如果D的列数大于Y的行数,称之为超完备字典;
  • 如果刚好等于,那么就称之为完备字典;

假设现在有了一个 N ∗ T N*T NT的过完备字典 D D D(比如前面所述图像傅里叶变换的所有频率的波),一个要表示的对象 y y y(要还原的图像),求一套系数 x x x,使得 y = D x y=Dx y=Dx,这里 y y y是一个已知的长为 N N N的列向量, x 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
这里可以引出一个名词, i l l − p o s e d p r o b l e m ill-posed problem illposedproblem(不适定问题),即有多个满足条件的解,无法判断哪个解更加合适,这是更“落地”的应用场景, i n v e r s e p r o b l e m inverse problem inverseproblem(逆问题),比如图像去噪,从噪声图中提取干净图。于是需要做一个约束。

加限制条件,要求 x x x尽可能稀疏,怎么“稀疏”呢?就是 x 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 Y Y Y Y Y的每一列表示一个样本,我们的目标是求解字典 D D D的每一列(原子)。

2.1、随机初始化字典D

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

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

编码过程采用如下公式:
D , X = arg ⁡ min ⁡ D , X { ∥ X ∥ 0 } st. ∥ Y − D X ∥ 2 ≤ ε \begin{array}{c}{D, X=\arg \min _{D, X}\left\{\|X\|_{0}\right\}} \\ {\text {st.} \quad\|Y-D X\|^{2} \leq \varepsilon}\end{array} D,X=argminD,X{X0}st.YDX2ε
ε ε ε是重构误差所允许的最大值。假设我们的单个样本是向量 y y y,为了简单起见我们就假设原子只有这4个,也就是字典 D = [ α 1 、 α 2 、 α 3 、 α 4 ] D=[α1、α2、α3、α4] D=[α1α2α3α4] D D D是已经知道的;我们的目标是计算 y y y编码 x x x,使得 x x x尽量的稀疏。

(1)、首先从 α 1 、 α 2 、 α 3 、 α 4 α1、α2、α3、α4 α1α2α3α4中找出与向量 y y y最近的那个向量,也就是分别计算点乘:
α 1 ∗ y 、 α 2 ∗ y 、 α 3 ∗ y 、 α 4 ∗ y α1*y、α2*y、α3*y、α4*y α1yα2yα3yα4y
然后求取最大值对应的原子 α α α
(2)、假设 α 2 ∗ y α2*y α2y最大,那么我们就用 α 2 α2 α2,作为我们的第一个原子,然后我们的初次编码向量就为:
x 1 = ( 0 , b , 0 , 0 ) x1=(0,b,0,0) x1=0,b,0,0b是一个未知参数。
(3)、求解系数b:
y − b ∗ α 2 = 0 y-b*α2=0 ybα2=0 方程只有一个未知参数 b b b,是一个高度超静定方程,求解最小二乘问题。
(4)、然后我们用 x 1 x1 x1 α 2 α2 α2相乘重构出数据,然后计算残差向量:
y ’ = y − b ∗ α 2 y’=y-b*α2 y=ybα2 如果残差向量y’满足重构误差阈值范围ε,那么就结束,否则就进入下一步;
(5)、计算剩余的字典 α 1 、 α 3 、 α 4 α1、α3、α4 α1α3α4与残差向量 y ’ y’ y的最近的向量,也就是计算
α 1 ∗ y ’ 、 α 3 ∗ y ’ 、 α 4 ∗ y ’ α1*y’、α3*y’、α4*y’ α1yα3yα4y然后求取最大值对应的向量 α α α,假设 α 3 ∗ y ’ α3*y’ α3y为最大值,那么就令新的编码向量为:
x 2 = ( 0 , b , c , 0 ) x2=(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 y-b*α2-c*α3=0 ybα2cα3=0

方程中有两个未知参数 b 、 c b、c bc,我们可以进行求解最小二乘方程,求得 b 、 c b、c bc

(7)、更新残差向量 y ’ y’ y

y ’ = y − b ∗ α 2 − c ∗ α 3 y’=y-b*α2-c*α3 y=ybα2cα3

如果 y ’ 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 \|Y-D X\|^{2}=\left\|Y-\sum_{j=1}^{\mathrm{K}} \alpha_{j} \cdot x_{j}\right\|^{2}=\left\|\left(Y-\sum_{j=k} \alpha_{j} \cdot x_{j}\right)-\alpha_{k} \cdot x_{k}\right\|^{2}=\left\|E_{k}-\alpha_{k} \cdot x_{k}\right\|^{2} YDX2=Yj=1Kαjxj2=Yj=kαjxjαkxk2=Ekαkxk2
上面的方程,我们需要注意的是 x k xk xk不是把 X X X一整行都拿出来更新(因为 x k xk xk中有的是零、有的是非零元素,如果全部抽取出来,那么后面计算的时候xk就不再保持以前的稀疏性了),所以我们只能抽取出非零的元素形成新的非零向量,然后 E k Ek Ek只保留 x k xk xk对应的非零元素项。

上面的方程,我们可能可以通过求解最小二乘的方法,求解 α k αk αk,不过这样有存在一个问题,我们求解的αk不是一个单位向量,因此我们需要采用svd分解,才能得到单位向量 α k αk αk。进过svd分解后,我们以最大奇异值所对应的正交单位向量,作为新的 α k αk αk,同时我们还需要把系数编码 x k xk xk中的非零元素也给更新了(根据svd分解)。
然后算法就在1和2之间一直迭代更新,直到收敛。
参考了作者:

  • https://blog.csdn.net/abc13526222160/article/details/87936459
  • https://blog.csdn.net/hjimce/article/details/50810129

你可能感兴趣的:(Machine,Learning,机器学习)