标准自编码器虽然对降维有效,但其学习到的潜在编码无法自然保证捕捉到真正有意义的特征。若无约束,编码器可能仅学习到一个恒等函数(尤其当潜在维度较大时),或者过度适应训练数据。稀疏自编码器引入了一种正则化方法,专门用来解决此问题,即强制其隐藏(瓶颈)层中的激活值具有稀疏性。主要思想是,对于任何给定的输入样本,隐藏层中只有一小部分神经元应显著活跃(即具有非零或接近非零的激活值)。这鼓励网络为数据中存在的独立特征学习专门的检测器,而不是让所有神经元对许多输入都做出微弱响应。这类似于生物神经网络系统的运作方式。稀疏自编码器通过施加稀疏性约束,旨在学习更有意义的特征。施加稀疏性约束主要有两种方法:使用 $L_1$ 正则化或 Kullback–Leibler (KL) 散度。用于稀疏性的 L1 正则化这种方法直接惩罚隐藏层中激活值的量级。回想一下,$L_1$ 正则化会添加一个与参数绝对值之和成比例的惩罚项。在稀疏自编码器的情况下,我们将这种惩罚应用于隐藏层神经元的激活值,而不是权重。设 $h_j(x^{(i)})$ 表示第 $i$ 个输入样本 $x^{(i)}$ 的第 $j$ 个隐藏单元的激活值。$L_1$ 稀疏性惩罚项被添加到标准重构损失中:$$ L_{总}(x, \hat{x}) = L_{重构}(x, \hat{x}) + \lambda \sum_{j} |h_j(x)| $$其中:$L_{重构}(x, \hat{x})$ 是输入 $x$ 与重构输出 $\hat{x}$ 之间的常见重构损失(例如,均方误差或二元交叉熵)。$h_j(x)$ 表示单个输入 $x$ 的隐藏层中第 $j$ 个神经元的激活值。这个和通常针对该输入的所有隐藏神经元进行计算。在实际训练中,这个和会在批次上取平均值。$\lambda$ 是一个超参数,控制稀疏性惩罚的强度。较大的 $\lambda$ 会强制更强的稀疏性,促使更多激活值趋近于零。思路直接明了:为了最小化总损失,网络必须平衡精确重构输入(最小化 $L_{重构}$)和保持隐藏层激活值小(最小化 $L_1$ 项)。由于 $L_1$ 范数已知能够促进稀疏解(与鼓励小但非零值的 $L_2$ 范数不同),这种惩罚能有效地促使许多隐藏单元的激活值趋近于零。KL 散度稀疏性约束另一种常用方法是,通过约束每个隐藏神经元在整个训练数据集(或一个大批次)上的平均激活值来引导稀疏性。我们定义一个目标稀疏性参数 $\rho$,它表示每个隐藏神经元期望的平均激活水平(例如,$\rho = 0.05$,表示我们希望每个神经元平均而言只有5%的时间活跃)。首先,我们计算第 $j$ 个隐藏神经元在 $m$ 个训练样本上的实际平均激活值 $\hat{\rho}_j$:$$ \hat{\rho}j = \frac{1}{m} \sum{i=1}^{m} h_j(x^{(i)}) $$请注意,这要求激活函数 $h_j$ 的输出值通常在0到1之间(例如 sigmoid 函数),以便将其解释为激活概率或激活水平时有意义。接着,我们使用 Kullback–Leibler (KL) 散度来度量期望平均激活值 $\rho$(视为均值为 $\rho$ 的伯努利分布)与观察到的平均激活值 $\hat{\rho}_j$(视为均值为 $\hat{\rho}_j$ 的伯努利分布)之间的差异。两个伯努利分布之间的 KL 散度由下式给出:$$ KL(\rho || \hat{\rho}_j) = \rho \log \frac{\rho}{\hat{\rho}_j} + (1-\rho) \log \frac{1-\rho}{1-\hat{\rho}_j} $$这个 KL 散度项充当惩罚项。当 $\hat{\rho}_j = \rho$ 时,它被最小化(等于零),并且随着 $\hat{\rho}_j$ 偏离 $\rho$ 而增大。我们将此惩罚项对所有 $s$ 个隐藏单元求和,并将其添加到重构损失中,由另一个超参数 $\beta$ 加权:$$ L_{总}(x, \hat{x}) = L_{重构}(x, \hat{x}) + \beta \sum_{j=1}^{s} KL(\rho || \hat{\rho}_j) $$最小化这个总损失鼓励网络在实现精确重构的同时,确保每个隐藏神经元的平均激活值 $\hat{\rho}_j$ 接近目标稀疏性水平 $\rho$。$\rho$:目标平均激活水平(超参数,小数值如0.01,0.05)。$\beta$:稀疏性惩罚项的权重(超参数)。控制重构与稀疏性之间的权衡。计算 $\hat{\rho}_j$:此平均激活值通常在每个训练批次上估计,并使用移动平均更新,以近似数据集上的真实平均值。比较 L1 和 KL 散度稀疏性直接性:$L_1$ 直接惩罚每个输入的单个高激活值,可能导致每个样本的编码非常稀疏。KL 散度侧重于神经元在整个数据集上的平均行为,确保神经元不会持续不活跃或过度活跃。分布假设:KL 散度隐式地将激活值建模为伯努利随机变量,使其自然适用于 sigmoid 激活函数。$L_1$ 对激活函数类型更不敏感,尽管激活值通常会被裁剪或缩放。实现:$L_1$ 更简单,通常只需根据隐藏层的输出来向损失中添加一个项。KL 需要计算每个神经元在一个批次上的平均激活值,增加了一点复杂性。这两种方法都服务于同一目的:强制自编码器学习一种压缩表示,其中对于任何给定输入,只有少数隐藏单元是活跃的。这鼓励隐藏单元进行专门化,有可能从数据中获取更独立和可解释的特征,同时也是一个强大的正则化器,可防止过拟合。在它们之间进行选择,并调整相关的超参数($\lambda$ 或 $\rho$ 和 $\beta$),通常取决于具体数据集和任务。