深度学习中的正则化技术 - 稀疏表示篇

序言

深度学习(DL)作为机器学习的一个重要分支,正引领着人工智能技术的快速发展。在深度学习的众多技术中,稀疏表示(Sparse Representation)扮演着举足轻重的角色。稀疏表示通过寻找数据的高效且简洁的表示形式,不仅减少了数据存储和处理的复杂度,还增强了模型的泛化能力和鲁棒性。这种技术尤其适用于图像识别、信号处理及语音处理等领域,通过提取数据中的关键特征,实现了对复杂数据的精准描述和高效处理。

稀疏表示

  • 权重衰减施加直接作用于模型参数的惩罚。另一种策略是将惩罚放在神经网络的激活单元,鼓励对应的激活是稀疏。这间接的对模型参数施加了复杂惩罚。
  • 我们已经讨论过(在参数范数惩罚篇中) L 1 L^1 L1惩罚如何诱导稀疏的参数,意味着许多参数为零(或接近于零)。 表示的稀疏,在另一方面描述了许多的元素是零(或接近零)的表示。我们可以线性回归的情况下简单说明这种区别:
    [ 18 5 15 − 9 − 3 ] y ∈ R m = [ 4 0 0 − 2 0 0 0 0 − 1 0 3 0 0 5 0 0 0 0 1 0 0 − 1 0 − 4 1 0 0 0 − 5 0 ] A ∈ R m × n [ 2 3 − 2 − 5 1 4 ] x ∈ R n — 公式1 \underset{\boldsymbol{y}\in\mathbb{R}^m}{\begin{bmatrix}18\\5\\15\\{-9}\\{-3}\end{bmatrix}}=\underset{\boldsymbol{A}\in\mathbb{R}^{m\times n}}{\begin{bmatrix}4&0&0&{-2}&0&0\\0&0&{-1}&0&3&0\\0&5&0&0&0&0\\1&0&0&{-1}&0&{-4}\\1&0&0&0&{-5}&0\end{bmatrix}} \underset{\boldsymbol{x}\in\mathbb{R}^n}{\begin{bmatrix}2\\3\\{-2}\\{-5}\\1\\4\end{bmatrix}}\quad\textbf{---\footnotesize{公式1}} yRm 1851593 =ARm×n 400110050001000200100300500040 xRn 232514 公式1
    [ − 14 1 19 2 23 ] y ∈ R m = [ 3 − 1 2 − 5 4 1 4 2 − 3 − 1 1 3 − 1 5 4 2 − 3 − 2 3 1 2 − 3 0 − 3 − 5 4 − 2 2 − 5 − 1 ] B ∈ R m × n [ 0 2 0 0 − 3 0 ] h ∈ R n — 公式2 \underset{\boldsymbol{y}\in\mathbb{R}^m}{\begin{bmatrix}{-14}\\1\\19\\2\\23\end{bmatrix}}=\underset{\boldsymbol{B}\in\mathbb{R}^{m\times n}}{\begin{bmatrix}3&{-1}&2&{-5}&4&1\\4&2&{-3}&{-1}&1&3\\{-1}&5&4&2&{-3}&{-2}\\3&1&2&{-3}&0&{-3}\\{-5}&4&{-2}&2&{-5}&{-1}\end{bmatrix}} \underset{\boldsymbol{h}\in\mathbb{R}^n}{\begin{bmatrix}0\\2\\0\\0\\{-3}\\0\end{bmatrix}}\quad\textbf{---\footnotesize{公式2}} yRm 14119223 =BRm×n 341351251423422512324130513231 hRn 020030 公式2
  • 上述公式说明
    • 第一个表达式是参数稀疏的线性回归模型的例子。
    • 第二个是数据 x \boldsymbol{x} x具有稀疏表示 h \boldsymbol{h} h的线性回归。也就是说, h \boldsymbol{h} h x \boldsymbol{x} x的一个函数,在某种意义上表示存在于 x \boldsymbol{x} x中的信息,但用一个稀疏向量表示。
  • 表示的正则化可以使用参数正则化中同种类型的机制实现。
  • 表示的范数惩罚正则化是通过向损失函数 J J J添加对表示的范数惩罚。
    • 记这个惩罚为 Ω ( h ) \Omega(\boldsymbol{h}) Ω(h)。和以前一样,我们将正则化后的损失函数记为: J ~ \tilde{J} J~,即
      J ~ ( θ ; X , y ) = J ( θ ; X , y ) + α Ω ( h ) — 公式3 \tilde{J}(\boldsymbol{\theta};\boldsymbol{X},\boldsymbol{y})=J(\boldsymbol{\theta};\boldsymbol{X},\boldsymbol{y})+\alpha\Omega(\boldsymbol{h})\quad\textbf{---\footnotesize{公式3}} J~(θ;X,y)=J(θ;X,y)+αΩ(h)公式3
    • 其中 α ∈ [ 0 , ∞ ] \alpha\in[0,\infty] α[0,]权衡范数惩罚项的相对贡献,越大的 α \alpha α对应更多的正则化。
  • 正如对参数的 L 1 L^1 L1惩罚诱导参数稀疏性,对表示元素的 L 1 L^1 L1惩罚诱导稀疏的表示: Ω ( h ) = ∥ h ∥ 1 = ∑ i ∣ h i ∣ \Omega(\boldsymbol{h})=\Vert\boldsymbol{h}\Vert_1=\sum_i|h_i| Ω(h)=h1=ihi。当然 L 1 L^1 L1惩罚是导致稀疏表示的选择之一。
  • 其他包括从表示上Student t 先验导出的惩罚 (Olshausen and Field, 1996; Bergstra, 2011) 和KL散度惩罚 (Larochelle and Bengio, 2008a) 有利于表示元素约束于单位区间上。 Lee et al. (2008) 和Goodfellow et al. (2009) 都提供了基于几个样本平均激活的正则化策略的例子,即令 1 m ∑ i h ( i ) \frac{1}{m}\sum_i\boldsymbol{h}^{(i)} m1ih(i)接近某些目标值(如每项都是 . 01 .01 .01的向量)。
  • 还有其他方法使用激活值的硬性约束获得表示稀疏。
  • 例如,正交匹配追踪(orthogonal matching pursuit)(Pati et al., 1993) 通过解决约束优化问题将输入值 x \boldsymbol{x} x编码成表示 h \boldsymbol{h} h arg min ⁡ h , ∥ h ∥ 0 < k ∥ x − W h ∥ 2 \argmin\limits_{\boldsymbol{h},\Vert\boldsymbol{h}\Vert_0 <k}\Vert\boldsymbol{x}-\boldsymbol{Wh}\Vert^2 h,h0<kargminxWh2
    • 其中 ∥ h ∥ 0 \Vert\boldsymbol{h}\Vert_0 h0 h \boldsymbol{h} h中非零项的个数。
    • W \boldsymbol{W} W被约束为正交时,这个问题可以高效地解决。
    • 这种方法通常被称为 OMP- k \text{OMP-}k OMP-k,通过 k k k指定允许的非零特征数量。Coates and Ng(2011) 证明 OMP- 1 \text{OMP-}1 OMP-1可以成为深度架构中非常有效的特征提取器。
  • 有隐藏单元的模型本质上都能变得稀疏。在后续篇幅中,我们将看到各种情况下使用稀疏正则化的例子。

稀疏表示原理

  • 稀疏表示的基本思想是使用尽可能少的非零元素来表示原始数据,这些非零元素对应于数据中的关键特征或重要信息。
  • 在深度学习中,稀疏表示通常与特征学习相结合,通过训练模型来学习数据的稀疏特征表示。这种表示方式不仅能够降低数据的维度和复杂度,还能提高模型的泛化能力和解释性。

实际应用

1. 图像处理

(1)图像去噪与恢复

  • 稀疏表示在图像去噪和恢复中发挥了重要作用。通过稀疏编码技术,可以将图像分解为一系列稀疏的基图像(或称为字典原子)的线性组合。
  • 在噪声环境下,这些基图像的选择和系数会受到噪声的影响,但稀疏性约束使得大多数系数为零或接近零,从而能够有效地去除噪声并恢复出清晰的图像。

(2)图像分类与识别

  • 在图像分类和识别任务中,稀疏表示也表现出色。
  • 通过将图像转换为稀疏特征向量,可以捕捉到图像中的关键信息,同时减少冗余和噪声的干扰。
  • 这些稀疏特征向量在分类器(如支持向量机、神经网络等)中更容易被区分和识别,从而提高分类和识别的准确率。

2. 语音识别

  • 在语音识别领域,稀疏表示同样具有应用价值。
  • 语音信号可以看作是由一系列稀疏的语音单元(如音素、音节等)组成。
  • 通过稀疏编码技术,可以将语音信号转换为稀疏特征向量,这些向量能够反映语音信号的本质特征,同时减少冗余信息。
  • 在语音识别系统中,利用这些稀疏特征向量进行训练和识别,可以提高系统的鲁棒性和准确性。

3. 自然语言处理

  • 在自然语言处理(NLP)中,稀疏表示也扮演着重要角色。
  • 例如,在文本分类和情感分析任务中,稀疏表示可以将文本数据转换为稀疏特征向量,这些向量能够捕捉到文本中的关键信息和情感倾向。
  • 通过训练分类器或情感分析模型,可以利用这些稀疏特征向量对文本进行分类或情感分析。
  • 此外,稀疏表示还可以用于文本聚类、信息检索等NLP任务中。

4. 深度学习模型压缩

  • 在深度学习模型压缩方面,稀疏表示也是一种有效的手段。
  • 通过训练具有稀疏连接或稀疏权重的神经网络模型,可以减少模型的参数数量和计算复杂度,同时保持模型的性能。
  • 这种稀疏性可以通过在训练过程中引入正则化项(如 L 1 L^1 L1正则化)来实现,也可以通过剪枝技术来进一步压缩模型。

图像稀疏编码示例

  • 以图像稀疏编码为例,我们可以将一幅图像看作是由多个基图像(也称为字典原子或特征向量)的线性组合而成。
  • 在稀疏编码过程中,我们的目标是找到一组最优的基图像和对应的系数,使得这些基图像的线性组合能够最好地重建原始图像,并且系数向量尽可能稀疏(即大多数元素为零)。

步骤概述

1. 字典学习

首先,从训练图像中学习一个过完备的字典(即基图像集合)。这个字典包含了能够表示训练图像中所有可能特征的原子。

2. 稀疏编码

对于给定的测试图像,使用学习到的字典对其进行稀疏编码。这通常涉及到一个优化问题,即在保证重建误差尽可能小的同时,使得编码系数尽可能稀疏。

3. 重建图像

最后,使用学习到的字典和编码系数重建原始图像。由于编码系数的稀疏性,重建过程将主要依赖于字典中的少数几个关键原子,从而实现图像的稀疏表示。

源码示例

# coding: utf-8
import numpy as np  
from skimage import io  
from scipy.sparse.linalg import lsqr  

# 为了提高代码的模块化,将字典学习和稀疏编码过程封装为类
class SparseRepresentation:
    def __init__(self, dictionary_size=(64, 256), img_size=(64, 64)):
        """
        初始化函数,用于设置字典大小和图片大小,并初始化字典D。
        
        Args:
            dictionary_size (tuple, optional): 包含两个整数值的元组,表示字典的大小,默认值为(64, 256)。
            img_size (tuple, optional): 包含两个整数值的元组,表示图片的大小,默认值为(64, 64)。
        
        Returns:
            None: 无返回值,初始化字典D后存储在类的实例变量中。
        
        """
        self.dictionary_size = dictionary_size
        self.img_size = img_size
        # 初始化字典D
        self.D = self.initialize_dictionary()

    def initialize_dictionary(self):
        """
        初始化一个随机字典矩阵。
        
        Args:
            无。
        
        Returns:
            np.ndarray: 初始化后的字典矩阵,形状为 (self.dictionary_size[0], self.dictionary_size[1]),
                其中元素是从标准正态分布中随机抽取的,并进行了行归一化处理。
        
        """
        D = np.random.randn(self.dictionary_size[0], self.dictionary_size[1])
        D = D / np.linalg.norm(D, axis=0)
        return D

    def load_and_preprocess_image(self, file_path):
        """
        加载并预处理图像。
        
        Args:
            file_path (str): 图像文件的路径。
        
        Returns:
            Union[ndarray, None]: 加载并预处理后的图像数据(一维numpy数组,形状为(-1, 1)),
                若加载或预处理失败则返回None。
        
        Raises:
            无。
        
        """
        try:
            # 读取图像,转换为灰度,并进行预处理
            img = io.imread(file_path, as_gray=True)
            img = img.reshape(-1, 1)
            img = img[:self.img_size[0] * self.img_size[1]]
            return img
        except Exception as e:
            print(f"Error loading or preprocessing image: {e}")
            return None

    def sparse_coding(self, img, l1_reg=0.1, iter_lim=1000):
        """
        稀疏编码
        
        Args:
            img (np.ndarray): 输入图像,一维numpy数组
            l1_reg (float, optional): L1正则化系数. Defaults to 0.1.
            iter_lim (int, optional): 最大迭代次数. Defaults to 1000.
        
        Returns:
            np.ndarray: 稀疏编码后的结果,一维numpy数组
        
        Raises:
            无
        
        注意:
            - 如果输入图像为空或者尺寸为0,则返回None并打印错误信息
            - 如果字典D的列数与输入图像的一维长度不匹配,则返回None并打印错误信息
            - 使用lsqr算法进行稀疏编码求解,将结果中小于1e-3的绝对值设为0,得到稀疏表示
        """
        if img is None or img.size == 0:
            print("Invalid input image.")
            return None

        # 确保D的列数与img的一维长度匹配
        if self.D.shape[1] != img.size:
            print("Dictionary dimension mismatch with input image.")
            return None

        A = self.D
        b = img

        x, istop, itn, rnorm, anorm = lsqr(A, b, damp=l1_reg, iter_lim=iter_lim)
        sparse_x = np.where(np.abs(x) < 1e-3, 0, x)
        return sparse_x

    def reconstruct_image(self, sparse_x):
        """
        使用给定的稀疏系数来重构图像。
        
        Args:
            sparse_x (np.ndarray): 稀疏系数数组,形状为 (n_atoms,)。
        
        Returns:
            np.ndarray: 重构后的图像,形状为 (img_size[0], img_size[1])。
        
        Raises:
            无特定异常,但会在控制台打印 "Invalid sparse coefficients." 消息并返回 None,
            如果 sparse_x 为 None 或其大小为 0。
        
        """
        if sparse_x is None or sparse_x.size == 0:
            print("Invalid sparse coefficients.")
            return None

        reconstructed_img = self.D.dot(sparse_x).reshape(self.img_size[0], self.img_size[1])
        return reconstructed_img

# 示例用法
if __name__ == "__main__":
    sr = SparseRepresentation()
    img_path = 'example.png'
    img = sr.load_and_preprocess_image(img_path)
    if img is not None:
        sparse_x = sr.sparse_coding(img)
        if sparse_x is not None:
            reconstructed_img = sr.reconstruct_image(sparse_x)
            # 显示重构图像(需要额外的显示逻辑)

总结

稀疏表示在深度学习中的应用,不仅提高了模型的学习效率和性能,还为我们理解数据内在结构和规律提供了新的视角。通过将输入数据表示为其潜在特征的线性组合,并使得大多数特征的权重接近于零,稀疏表示能够有效地过滤掉冗余信息,保留对目标任务至关重要的信息。这不仅增强了模型的特征提取能力,还提高了模型在噪声环境下的稳定性和准确性。未来,随着稀疏表示技术的不断发展和完善,我们有理由相信,它将在更多领域发挥重要作用,推动深度学习技术的进一步发展和应用。

往期内容回顾

深度学习中的正则化技术 - 参数范数惩罚篇
深度学习中的正则化技术 - 作为约束的范数惩罚篇

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绎岚科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值