稀疏编码(Sparse Coding)的在线字典学习(Online Dictionary Learning)算法原理与优化过程
稀疏编码是一种无监督学习方法,旨在用一组过完备的“字典”基向量的线性组合来稀疏地表示输入数据。这个过程通常分为两步:稀疏编码(给定字典,为每个输入数据找到稀疏表示)和字典更新(给定稀疏表示,优化字典)。当数据量很大或数据流式到达时,传统的批处理字典学习(如K-SVD)效率较低。在线字典学习(Online Dictionary Learning, ODL) 旨在高效地处理大规模数据,通过一次处理一个或一小批样本,并逐步更新字典。以下将详细讲解其原理与优化过程。
1. 问题形式化
假设我们有 \(n\) 个输入样本 \(\mathbf{x}_i \in \mathbb{R}^m\)(\(i = 1, \dots, n\)),目标是学习一个字典 \(\mathbf{D} \in \mathbb{R}^{m \times k}\)(\(k > m\),过完备)和对应的稀疏编码向量 \(\mathbf{\alpha}_i \in \mathbb{R}^k\),使得:
- 每个样本 \(\mathbf{x}_i\) 能近似表示为 \(\mathbf{D} \mathbf{\alpha}_i\)。
- 编码 \(\mathbf{\alpha}_i\) 是稀疏的(即大部分元素为零)。
目标函数(批处理形式)为:
\[\min_{\mathbf{D} \in \mathcal{C}, \mathbf{\alpha}_i} \frac{1}{n} \sum_{i=1}^{n} \left( \frac{1}{2} \|\mathbf{x}_i - \mathbf{D} \mathbf{\alpha}_i\|_2^2 + \lambda \|\mathbf{\alpha}_i\|_1 \right) \]
其中:
- \(\lambda > 0\) 是正则化参数,控制稀疏性(L1范数)。
- \(\mathcal{C} = \{ \mathbf{D} \in \mathbb{R}^{m \times k} : \|\mathbf{d}_j\|_2 \leq 1, \, \forall j \}\) 是约束集合,防止字典原子(列)的尺度任意放大。
批处理优化(如交替最小化)需要反复遍历整个数据集,计算开销大。在线字典学习将问题转化为在线优化问题:数据样本按顺序(或小批量)到达,逐步更新字典。
2. 在线优化问题重构
考虑经验风险最小化,定义损失函数 \(f_i(\mathbf{D}) = \min_{\mathbf{\alpha}} \left( \frac{1}{2} \|\mathbf{x}_i - \mathbf{D} \mathbf{\alpha}\|_2^2 + \lambda \|\mathbf{\alpha}\|_1 \right)\),则批处理目标为 \(\min_{\mathbf{D} \in \mathcal{C}} \frac{1}{n} \sum_{i=1}^{n} f_i(\mathbf{D})\)。
在线学习将其视为随机逼近问题:每次迭代 \(t\),随机抽取一个样本 \(\mathbf{x}_t\)(或一小批),计算关于该样本的损失 \(f_t(\mathbf{D})\),并更新字典 \(\mathbf{D}\)。
3. 算法步骤详解
在线字典学习的核心是交替执行以下两步:
步骤1:稀疏编码(给定当前字典 \(\mathbf{D}_{t-1}\) )
对于当前样本 \(\mathbf{x}_t\),求解稀疏编码问题:
\[\mathbf{\alpha}_t = \arg\min_{\mathbf{\alpha}} \frac{1}{2} \|\mathbf{x}_t - \mathbf{D}_{t-1} \mathbf{\alpha}\|_2^2 + \lambda \|\mathbf{\alpha}\|_1 \]
这是一个Lasso问题,可以用坐标下降法(Coordinate Descent)、最小角回归(LARS) 或近端梯度法高效求解。得到编码 \(\mathbf{\alpha}_t\)(通常是稀疏向量)。
步骤2:字典更新(基于历史信息逐步更新)
在线算法不会直接基于所有样本重新优化字典,而是维护两个聚合变量,以近似整体目标函数的梯度信息:
- 令 \(\mathbf{A}_t = \sum_{i=1}^{t} \mathbf{\alpha}_i \mathbf{\alpha}_i^T\) 为编码向量的外积和(维度 \(k \times k\))。
- 令 \(\mathbf{B}_t = \sum_{i=1}^{t} \mathbf{x}_i \mathbf{\alpha}_i^T\) 为样本与编码的外积和(维度 \(m \times k\))。
当新样本 \((\mathbf{x}_t, \mathbf{\alpha}_t)\) 到达时,更新聚合变量:
\[\mathbf{A}_t = \mathbf{A}_{t-1} + \mathbf{\alpha}_t \mathbf{\alpha}_t^T, \quad \mathbf{B}_t = \mathbf{B}_{t-1} + \mathbf{x}_t \mathbf{\alpha}_t^T \]
然后,字典更新步骤转化为求解以下优化问题:
\[\mathbf{D}_t = \arg\min_{\mathbf{D} \in \mathcal{C}} \frac{1}{t} \sum_{i=1}^{t} \left( \frac{1}{2} \|\mathbf{x}_i - \mathbf{D} \mathbf{\alpha}_i\|_2^2 + \lambda \|\mathbf{\alpha}_i\|_1 \right) \approx \arg\min_{\mathbf{D} \in \mathcal{C}} \frac{1}{t} \left( \frac{1}{2} \text{Tr}(\mathbf{D}^T \mathbf{D} \mathbf{A}_t) - \text{Tr}(\mathbf{D}^T \mathbf{B}_t) \right) \]
这里忽略了与 \(\mathbf{D}\) 无关的常数项。该问题是一个带约束的二次优化问题:
\[\min_{\mathbf{D} \in \mathcal{C}} \frac{1}{t} \left( \frac{1}{2} \text{Tr}(\mathbf{D}^T \mathbf{D} \mathbf{A}_t) - \text{Tr}(\mathbf{D}^T \mathbf{B}_t) \right) \]
约束 \(\mathcal{C}\) 要求字典的每一列 \(\mathbf{d}_j\) 的L2范数不超过1。
步骤3:字典列的块坐标下降更新
上述问题可以通过块坐标下降法(Block Coordinate Descent) 逐列更新字典原子 \(\mathbf{d}_j\)(\(j = 1, \dots, k\)),同时固定其他列。
具体更新公式推导如下:
- 目标函数关于 \(\mathbf{d}_j\) 的梯度(忽略常数因子)为:
\[\nabla_{\mathbf{d}_j} = \mathbf{D} \mathbf{a}_t^j - \mathbf{b}_t^j \]
其中 \(\mathbf{a}_t^j\) 是 \(\mathbf{A}_t\) 的第 \(j\) 列,\(\mathbf{b}_t^j\) 是 \(\mathbf{B}_t\) 的第 \(j\) 列。
- 更精确地,当固定其他列时,优化 \(\mathbf{d}_j\) 的子问题为:
\[\min_{\|\mathbf{d}_j\|_2 \leq 1} \frac{1}{2} \mathbf{d}_j^T \mathbf{d}_j [\mathbf{A}_t]_{jj} - \mathbf{d}_j^T \left( \mathbf{b}_t^j - \sum_{l \neq j} \mathbf{d}_l [\mathbf{A}_t]_{lj} \right) \]
其中 \([\mathbf{A}_t]_{jj}\) 是 \(\mathbf{A}_t\) 的第 \(j\) 个对角线元素,\([\mathbf{A}_t]_{lj}\) 是第 \(l\) 行第 \(j\) 列元素。
求解该子问题得到闭式解:
\[\mathbf{d}_j = \frac{ \mathbf{u}_j }{ \max(\|\mathbf{u}_j\|_2, 1) } \]
其中 \(\mathbf{u}_j = \frac{1}{[\mathbf{A}_t]_{jj}} \left( \mathbf{b}_t^j - \sum_{l \neq j} \mathbf{d}_l [\mathbf{A}_t]_{lj} \right)\)。
实际实现技巧:为了避免每次完整计算 \(\mathbf{u}_j\) 时重复求和,可以维护一个残差矩阵 \(\mathbf{R}_t = \mathbf{B}_t - \mathbf{D}_{t-1} \mathbf{A}_t\),并增量更新。
步骤4:算法流程总结
- 初始化:随机初始化字典 \(\mathbf{D}_0 \in \mathcal{C}\),设置 \(\mathbf{A}_0 = 0\),\(\mathbf{B}_0 = 0\)。
- 循环 \(t = 1, 2, \dots, T\):
a. 抽取样本:随机获得样本 \(\mathbf{x}_t\)。
b. 稀疏编码:用当前字典 \(\mathbf{D}_{t-1}\) 求解Lasso得到 \(\mathbf{\alpha}_t\)。
c. 更新聚合变量:
\[ \mathbf{A}_t = \mathbf{A}_{t-1} + \mathbf{\alpha}_t \mathbf{\alpha}_t^T, \quad \mathbf{B}_t = \mathbf{B}_{t-1} + \mathbf{x}_t \mathbf{\alpha}_t^T \]
d. 字典更新:使用块坐标下降法更新 \(\mathbf{D}_t\),逐列求解上述闭式解,并投影到约束集 \(\mathcal{C}\)。
3. 输出:最终字典 \(\mathbf{D}_T\)。
4. 收敛性分析
在线字典学习可以视为随机近似与最小化经验风险的结合。理论上,在样本独立同分布假设下,当迭代次数 \(t \to \infty\),算法生成的字典序列会收敛到批处理问题的一个稳定点(局部最优)。关键点包括:
- 稀疏编码步骤是准确的(精确求解Lasso)。
- 字典更新步骤使用了历史信息的充分统计量(\(\mathbf{A}_t, \mathbf{B}_t\)),保证了稳定性。
- 学习率隐含在聚合平均中(除以 \(t\)),实际上采用了递减的步长(类似随机梯度下降的 \(1/t\) 步长),确保收敛。
5. 优势与应用
- 处理大规模数据:无需存储全部数据,内存效率高。
- 在线适应:可适应数据分布缓慢变化(非平稳数据)。
- 广泛应用:图像去噪、特征提取、压缩感知、深度学习中的稀疏初始化等。
通过以上步骤,在线字典学习能够高效地从海量数据中学习具有稀疏表示能力的字典,同时保证计算的可扩展性和稳定性。