深入浅出字典学习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} Y≈DX(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=argmin21∥Y−DX∥2+λ⋅∥X∥0(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{
∥X∥0}st.∥Y−DX∥2≤ε(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,Xargmin∥Y−DX∥2st. ∥X∥0≤L(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 N∗T的过完备字典 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{
∥X∥0}st.∥Y−DX∥2≤ε(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 α1∗y、α2∗y、α3∗y、α4∗y 然后求取最大值对应的原子 α α α。
- (2)、假设 α 2 ∗ y \bf α_2*y α2∗y 最大,那么我们就用 α 2 α_2 α2,作为我们的第一个原子,然后我们的初次编码向量就为: x 1 = ( 0 , b , 0 , 0 ) x_1=(0,b,0,0) x1=(0,b,0,0)b是一个未知参数。
- (3)、求解系数b: y − b ∗ α 2 = 0 \mathbf y-b*α_2=0 y−b∗α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’=y−b∗α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’ α1∗y’、α3∗y’、α4∗y’然后求取最大值对应的向量 α α α,假设 α 3 ∗ y ’ α_3*\mathbf y’ α3∗y’为最大值,那么就令新的编码向量为: x 2 = ( 0 , b , c , 0 ) x_2=(0,b,c,0) x2=(0,b,c,0) b 、 c b、c b、c是未知参数。
- (6)、求解系数 b 、 c , b、c, b、c,于是我们可以列出方程:
y − b ∗ α 2 − c ∗ α 3 = 0 \mathbf y-b*α_2-c*α_3=0 y−b∗α2−c∗α3=0方程中有两个未知参数 b 、 c b、c b、c,我们可以进行求解最小二乘方程,求得 b 、 c b、c b、c。
- (7)、更新残差向量 y ’ \mathbf y’ y’: y ’ = y − b ∗ α 2 − c ∗ α 3 \mathbf y’=\mathbf y-b*\mathbf α_2-c*\mathbf α_3 y’=y−b∗α2−c∗α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} ∥Y−DX∥2=∥∥∥∥∥Y−j=1∑Kαj⋅xj∥∥∥∥∥2=∥∥∥∥∥∥⎝⎛Y−j=k∑αj⋅xj⎠⎞−αk⋅xk∥∥∥∥∥∥2=∥Ek−αk⋅xk∥2- 上面的方程,我们需要注意的是 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