字典学习数学原理
这里我们省去背景介绍,我们直接通过数学公式来更加直观的了解这一技术,并通过一些具体的应用领域来感受字典学习的魅力,那就开始吧!
对于给定样本数据集
Y
Y
Y,我们可以建立一个能够表示这个数据集的字典
D
D
D,这时数据集每个样本都能通过字典
D
D
D与该样本对应的稀疏表示
X
X
X来恢复,且
X
X
X满足一定的稀疏度,用公式表示如下:
Y
≈
D
X
Y \approx DX
Y≈DX,st.
∥
X
∥
0
≤
L
\|X\|_{0} \leq L
∥X∥0≤L
而字典学习就是通过迭代的方式寻找出字典
D
D
D与各样本所对应的稀疏表示
X
X
X,如下式所示:
min
D
,
X
∑
i
∥
x
i
∥
0
,
\min _{\mathbf{D}, \mathbf{X}} \sum_{i}\left\|\mathbf{x}_{i}\right\|_{0}, \quad
minD,X∑i∥xi∥0, s.t.
min
D
,
X
∥
Y
−
D
X
∥
F
2
≤
ϵ
\min _{\mathbf{D}, \mathbf{X}}\|\mathbf{Y}-\mathbf{D} \mathbf{X}\|_{F}^{2} \leq \epsilon
minD,X∥Y−DX∥F2≤ϵ
式中零范数不容易寻优,可以使用一范数来代替,即使用
∥
x
i
∥
1
\left\|\mathbf{x}_{i}\right\|_{1}
∥xi∥1代替
∥
x
i
∥
0
\left\|\mathbf{x}_{i}\right\|_{0}
∥xi∥0,其中
E
\mathcal{E}
E为重构允许的误差最大值。
K-SVD优化
我们可以使用K-SVD算法来求解该优化问题,这里有两个优化变量,一般是先固定一个,优化另一个变量,然后交替运行,直至达到要求为止。
初始化
我们可以从数据集中随机选出一些列来组成字典 D D D的原子,即其列向量,对于稀疏表示 X X X我们可以初始化为全零列向量。
更新 X X X
为了方便,我们这里只考虑单个样本向量y,假设字典中只有4个原子,即 D = [ α 1 , α 2 , α 3 , α 4 ] D=[\alpha 1, \alpha 2, \alpha 3, \alpha 4] D=[α1,α2,α3,α4],且这里的字典就是按照我们之前的初始化方法从数据集中随机选取的四个样本,现在我们的目标是计算y的编码x,并使得x尽量稀疏。
- 首先我们从
α
1
,
α
2
,
α
3
,
α
4
\alpha 1, \alpha 2, \alpha 3, \alpha 4
α1,α2,α3,α4找出与y最近的向量,也就是分别计算点乘:
α 1 ⋆ y , α 2 ⋆ y , α 3 ⋆ y , α 4 ⋆ y \alpha 1^{\star} y, \alpha 2^{\star} y, \alpha 3^{\star} y, \alpha 4^{\star} y α1⋆y,α2⋆y,α3⋆y,α4⋆y,得到最近的原子 α \alpha α - 假设
α
2
∗
y
\alpha 2^{*} y
α2∗y是最小的,我们就选用
α
2
\alpha 2
α2作为我们的第一个原子,然后我们的初始编码向量为:
x 1 = ( 0 , b , 0 , 0 ) x 1=(0, b, 0,0) x1=(0,b,0,0)
其中b为未知量。 - 求解未知量b:
y − b ⋆ α 2 = 0 y-b^{\star} \alpha 2=0 y−b⋆α2=0
显然我们可以很容易的求出b。 - 计算残差
y
′
y^{\prime}
y′:
y ′ = y − b ⋆ α 2 y^{\prime}=y-b^{\star} \alpha 2 y′=y−b⋆α2,如果满足重构误差阈值 E \mathcal{E} E,则结束,否则进入下一步。 - 计算剩余的字典
α
1
,
α
3
,
α
4
\alpha 1, \alpha 3, \alpha 4
α1,α3,α4与残差向量y’的最近的向量,也就是计算
α 1 ⋆ y ′ , α 3 ⋆ y ′ , α 4 ⋆ y ′ \alpha 1^{\star} y^{\prime}, \alpha 3^{\star} y^{\prime}, \alpha 4^{\star} y^{\prime} α1⋆y′,α3⋆y′,α4⋆y′
然后求取最小值对应的向量 α \alpha α,假设 α 3 ⋆ y ′ \alpha 3^{\star} y^{\prime} α3⋆y′为最大值,那么就令新的编码向量为:
x 2 = ( 0 , b , c , 0 ) x 2=(0, b, c, 0) x2=(0,b,c,0)
其中b、c为未知数 - 求解系数b、c,于是我们可以列出方程:
y − b ⋆ α 2 − c ⋆ α 3 = 0 y-b^{\star} \alpha 2-c^{\star} \alpha 3=0 y−b⋆α2−c⋆α3=0
方程中有两个未知参数b、c,我们可以进行求解最小二乘方程,求得b、c。 - 更新残差向量y’
y ′ = y − b ⋆ α 2 − c ⋆ α 3 y^{\prime}=y-b^{\star} \alpha 2-c^{\star} \alpha 3 y′=y−b⋆α2−c⋆α3
如果y’的模长满足阈值范围,那么就结束,否则就继续循环,就这样一直循环下去。
更新字典D
假设X是已知的,我们逐列更新字典。下面我们仅更新字典的第k列,记dk为字典D的第k列向量,记
x
T
k
\mathbf{x}_{T}^{k}
xTk为稀疏矩阵X的第k行向量,我们有:
∥
Y
−
D
X
∥
F
2
=
∥
Y
−
∑
j
=
1
K
d
j
x
T
j
∥
F
2
=
∥
(
Y
−
∑
j
≠
k
d
j
x
T
j
)
−
d
k
x
T
k
∥
F
2
=
∥
E
k
−
d
k
x
T
k
∥
F
2
\begin{aligned}\|\mathbf{Y}-\mathbf{D} \mathbf{X}\|_{F}^{2} &=\left\|\mathbf{Y}-\sum_{j=1}^{K} \mathbf{d}_{j} \mathbf{x}_{T}^{j}\right\|_{F}^{2} \\ &=\left\|\left(\mathbf{Y}-\sum_{j \neq k} \mathbf{d}_{j} \mathbf{x}_{T}^{j}\right)-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2} \\ &=\left\|\mathbf{E}_{k}-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2} \end{aligned}
∥Y−DX∥F2=∥∥∥∥∥Y−j=1∑KdjxTj∥∥∥∥∥F2=∥∥∥∥∥∥⎝⎛Y−j=k∑djxTj⎠⎞−dkxTk∥∥∥∥∥∥F2=∥∥Ek−dkxTk∥∥F2
上式中残差:
E
k
=
Y
−
∑
j
≠
k
d
j
x
T
j
\mathbf{E}_{k}=\mathbf{Y}-\sum_{j \neq k} \mathbf{d}_{j} \mathbf{x}_{T}^{j}
Ek=Y−∑j=kdjxTj
此时优化问题可描述为:
min
d
k
,
x
T
k
∥
E
k
−
d
k
x
T
k
∥
F
2
\min _{\mathbf{d}_{k}, \mathbf{x}_{T}^{k}}\left\|\mathbf{E}_{k}-\mathbf{d}_{k} \mathbf{x}_{T}^{k}\right\|_{F}^{2}
mindk,xTk∥∥Ek−dkxTk∥∥F2
因此我们需要求出最优的dk,
x
T
k
\mathbf{x}_{T}^{k}
xTk,这是一个最小二乘问题,可以利用最小二乘的方法求解,或者可以利用SVD进行求解,这里利用SVD的方式求解出两个优化变量。
但是,在这里我们需要注意的是,不能直接利用Ek进行求解,否则求得的新的
x
T
k
\mathbf{x}_{T}^{k}
xTk不稀疏。因此我们需要将Ek中对应的
x
T
k
\mathbf{x}_{T}^{k}
xTk不为0的位置提取出来,得到新的
E
k
′
\mathbf{E}_{k}^{\prime}
Ek′,这个过程如图所示,这样描述更加清晰。
如上图,假设我们要更新第0列原子,我们将
x
T
k
\mathbf{x}_{T}^{k}
xTk中为零的位置找出来,然后把Ek对应的位置删除,得到
E
k
′
\mathbf{E}_{k}^{\prime}
Ek′,此时优化问题可描述为:
min
d
k
,
x
T
k
∥
E
k
′
−
d
k
x
T
′
k
∥
F
2
\min _{\mathbf{d}_{k}, \mathbf{x}_{T}^{k}}\left\|\mathbf{E}_{k}^{\prime}-\mathbf{d}_{k} \mathbf{x}_{T}^{\prime k}\right\|_{F}^{2}
mindk,xTk∥∥Ek′−dkxT′k∥∥F2
交替更新
通过上述的更新,我们可以得到最优的字典D、以及稀疏表示X。
实际应用
字典学习是很有使用价值的一个技术,能够被广泛应用在图像去噪、恢复、去马赛克等领域,这里仅以图像去噪为例简单说明。
如果你的计算资源有限,我们可以用大量的数据,通过字典学习针对这些样本学到能够表征所有这些样本的字典原子,在测试时,给你一张被污染的图像,我们可以固定字典,仅更新对该图像的稀疏表示,即只要找到最优的稀疏表示就能够恢复出干净图像。自然我们也可以直接在被污染的图片上通过交替更新字典D与稀疏表示X来恢复出干净的图像。也能够选择一种折中的方案,即更新预训练的字典D。
具体的更新过程如下图所示:
图中x表示干净图像,y表示被污染的图像,
α
\alpha
α表示稀疏表示,D为字典,R表示取出x的一个局部块。
去噪效果如下图所示:
参考文献
字典学习(Dictionary Learning, KSVD)详解
ML笔记:字典学习2(Dictionary Learning)
Digital image processing: p068- Sparse Modeling Image Processing Examples
赵小胖的脑科学园地
[论文]K-SVD: An Algorithm for Designing Overcomplete Dictionaries for Sparse Representationk-svd字典学习