稀疏编码(Sparse Coding)算法的原理与字典学习过程
题目描述
稀疏编码是一种无监督学习方法,旨在从一组输入信号中学习一个“过完备”的字典(即字典中的基向量数量大于输入信号的维度),并基于该字典用尽可能少的基向量的线性组合来稀疏地表示每个输入信号。其核心思想是:在给定输入数据的情况下,同时优化字典和稀疏系数,使得重建误差最小,同时强制系数向量具有稀疏性(即大部分系数为零)。该算法在图像处理、神经科学和压缩感知等领域有广泛应用。
解题过程
- 问题形式化
假设我们有 \(N\) 个输入信号(如图像块)组成矩阵 \(\mathbf{X} = [\mathbf{x}_1, \dots, \mathbf{x}_N] \in \mathbb{R}^{m \times N}\),每个信号 \(\mathbf{x}_i\) 是 \(m\) 维向量。我们希望学习一个字典 \(\mathbf{D} = [\mathbf{d}_1, \dots, \mathbf{d}_K] \in \mathbb{R}^{m \times K}\)(其中 \(K > m\),字典过完备),以及对应的稀疏系数矩阵 \(\mathbf{A} = [\mathbf{a}_1, \dots, \mathbf{a}_N] \in \mathbb{R}^{K \times N}\),使得:
\[ \mathbf{x}_i \approx \mathbf{D} \mathbf{a}_i \quad \text{且} \quad \mathbf{a}_i \text{ 是稀疏的(仅有少数非零元素)}. \]
优化目标可写为:
\[ \min_{\mathbf{D}, \mathbf{A}} \sum_{i=1}^N \left( \frac{1}{2} \|\mathbf{x}_i - \mathbf{D} \mathbf{a}_i\|_2^2 + \lambda \|\mathbf{a}_i\|_1 \right), \]
其中 \(\|\cdot\|_1\) 是 L1 范数(用于促进稀疏性),\(\lambda > 0\) 是正则化参数,用于平衡重建误差和稀疏程度。
-
优化挑战与交替优化策略
上述问题对 \(\mathbf{D}\) 和 \(\mathbf{A}\) 是非凸的,但若固定其中一个变量,则对另一个变量是凸的。因此,通常采用交替优化(Alternating Optimization)策略,迭代以下两步直到收敛:- 稀疏编码步骤(Sparse Coding):固定字典 \(\mathbf{D}\),为每个样本 \(\mathbf{x}_i\) 求解稀疏系数 \(\mathbf{a}_i\)。
- 字典更新步骤(Dictionary Update):固定系数 \(\mathbf{A}\),更新字典 \(\mathbf{D}\) 以更好地重建所有样本。
-
稀疏编码步骤的求解
固定 \(\mathbf{D}\) 时,问题分解为 \(N\) 个独立的 Lasso 问题:
\[ \min_{\mathbf{a}_i} \frac{1}{2} \|\mathbf{x}_i - \mathbf{D} \mathbf{a}_i\|_2^2 + \lambda \|\mathbf{a}_i\|_1, \quad i=1,\dots,N. \]
- 求解方法:由于 L1 正则项不可微,常用算法包括:
- 坐标下降(Coordinate Descent):每次更新系数的一个分量,利用软阈值(Soft-thresholding)操作。
- 迭代收缩阈值算法(ISTA):基于近端梯度下降,更新公式为:
\[ \mathbf{a}_i^{(t+1)} = S_{\lambda/L}\left( \mathbf{a}_i^{(t)} - \frac{1}{L} \mathbf{D}^\top (\mathbf{D} \mathbf{a}_i^{(t)} - \mathbf{x}_i) \right), \]
其中 $L$ 是 Lipschitz 常数(通常取 $L = \|\mathbf{D}^\top \mathbf{D}\|_2$),$S_\tau(\cdot)$ 是软阈值函数:
\[ S_\tau(v) = \operatorname{sign}(v) \max(|v| - \tau, 0). \]
- 物理意义:这一步骤寻找在字典 \(\mathbf{D}\) 下能最佳重建输入信号的最稀疏表示。
- 字典更新步骤的求解
固定 \(\mathbf{A}\) 后,问题变为:
\[ \min_{\mathbf{D}} \frac{1}{2} \|\mathbf{X} - \mathbf{D} \mathbf{A}\|_F^2 \quad \text{subject to} \quad \|\mathbf{d}_j\|_2 \leq 1 \ (\forall j), \]
其中 \(\|\cdot\|_F\) 是 Frobenius 范数,约束条件防止字典原子(基向量)的尺度任意增大(否则系数会变得过小以保持稀疏性)。
- 求解方法:常用方法包括:
- 块坐标下降(Block Coordinate Descent):每次更新字典的一列 \(\mathbf{d}_j\)(一个原子)及其对应的系数行 \(\mathbf{a}^j\)(\(\mathbf{A}\) 的第 \(j\) 行)。更新公式为:
\[ \mathbf{d}_j \leftarrow \frac{1}{\max(\|\mathbf{u}_j\|_2, 1)} \mathbf{u}_j, \quad \mathbf{u}_j = \mathbf{X} (\mathbf{a}^j)^\top - \mathbf{D} \mathbf{A} (\mathbf{a}^j)^\top + \mathbf{d}_j \mathbf{a}^j (\mathbf{a}^j)^\top. \]
- **在线字典学习(Online Dictionary Learning)**:当数据量很大时,可采用随机梯度下降风格的在线算法,每次用小批量数据更新字典,以提高效率。
-
算法整体流程
稀疏编码的完整交替优化流程如下:- 初始化:随机生成字典 \(\mathbf{D}\)(或使用输入样本随机选取并归一化)。
- 重复直到收敛:
- 稀疏编码:对每个样本 \(\mathbf{x}_i\),用 ISTA 或其他算法求解系数 \(\mathbf{a}_i\)。
- 字典更新:固定 \(\mathbf{A}\),用块坐标下降法更新字典的每一列。
- 检查收敛条件:如重建误差变化小于阈值或达到最大迭代次数。
-
扩展与变体
- 约束条件:除了 L2 范数约束,有时还要求字典原子非负(非负稀疏编码)。
- 结构化稀疏:L1 范数可替换为其他正则项(如组稀疏范数),以捕获系数间的结构关系。
- 应用实例:在图像去噪中,稀疏编码学习到的字典能有效表示图像中的边缘和纹理;在神经科学中,它模拟了视觉皮层简单细胞对自然图像的稀疏响应。
通过以上步骤,稀疏编码能够从数据中自动学习具有解释性的基函数(字典原子),并实现高效的数据表示。其核心在于交替优化框架与稀疏性约束的结合,使得学习到的表示既紧凑又具有物理意义。