深度学习模型能够自动从原始输入数据中学习丰富的内部表示。
这被称为特征学习或表示学习。反过来,更好的学习表示可以通过可视化学习特征来提供对领域的更好洞察,并生成利用学习特征的更好预测模型。
学习特征的一个问题是它们可能对训练数据过于特化,或者过拟合,并且不能很好地泛化到新样本。学习表示中的大值可能是表示过拟合的迹象。活动或表示正则化提供了一种技术,以鼓励学习表示(网络隐藏层或多层的输出或激活)保持小而稀疏。
在这篇文章中,您将发现激活正则化作为一种技术,用于改善神经网络中学习特征的泛化。
阅读本文后,你将了解:
- 神经网络从数据和模型中学习特征,例如自编码器和编码器-解码器模型,它们明确地寻求有效的学习表示。
- 与权重类似,学习特征中的大值(例如,大激活)可能表示模型过拟合。
- 向损失函数添加惩罚,根据激活的幅度按比例惩罚模型,可能会导致更稳健和泛化的学习特征。
用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

用于减少深度学习神经网络中泛化误差的激活正则化
照片由Nicholas A. Tonelli拍摄,保留部分权利。
概述
本教程分为五个部分;它们是:
- 学习特征的问题
- 鼓励小激活
- 如何鼓励小激活
- 激活正则化的例子
- 使用激活正则化的技巧
学习特征的问题
深度学习模型能够进行特征学习。
也就是说,在网络训练过程中,模型将自动从输入模式中提取显著特征,或者“学习特征”。这些特征可以在网络中用于预测回归的量或分类的类别值。
这些内部表示是实际存在的。网络中隐藏层的输出代表模型在该点学习到的特征。
有一个研究领域专注于高效和有效的特征自动学习,通常通过让网络将输入缩减为小的学习特征,然后使用第二个网络从学习特征重建原始输入来研究。这类模型被称为自编码器或编码器-解码器,它们的学习特征对于了解更多领域(例如,通过可视化)以及在预测模型中都很有用。
学习特征或“编码输入”必须足够大以捕获输入的显著特征,但也要足够集中以避免对训练数据集中的特定样本过拟合。因此,学习特征的表达能力和泛化能力之间存在张力。
更重要的是,当编码器-解码器架构中代码的维度大于输入时,有必要限制代码携带的信息量,否则编码器-解码器可能会简单地以一种琐碎的方式学习恒等函数并产生无趣的特征。
— 无监督学习不变特征层次结构及其在目标识别中的应用,2007年。
正如网络中大的权重可能预示着不稳定和过拟合的模型一样,学习特征中大的输出值也可能预示着同样的问题。
学习特征中最好有小值,例如,来自编码器网络的小输出或激活。
想要通过深度学习获得更好的结果吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
鼓励小激活
可以更新网络的损失函数,根据其激活的幅度按比例惩罚模型。
这类似于“权重正则化”,其中损失函数被更新以根据权重的幅度按比例惩罚模型。层的输出被称为其“激活”,因此,这种形式的惩罚或正则化被称为“激活正则化”或“活动正则化”
……对神经网络中单元的激活施加惩罚,鼓励它们的激活稀疏。
— 第254页,深度学习,2016年。
编码器的输出,或者通常是神经网络中隐藏层的输出,可以被认为是模型在该点的表示。因此,这种类型的惩罚也可以被称为“表示正则化”。
希望拥有小激活值,甚至很少的激活值且大部分为零,也被称为对稀疏性的渴望。因此,这种类型的惩罚也称为“稀疏特征学习”。
限制超完备代码信息内容的一种方法是使其稀疏。
— 无监督学习不变特征层次结构及其在目标识别中的应用,2007年。
鼓励自编码器模型中的稀疏学习特征被称为“稀疏自编码器”。
稀疏自编码器简单来说就是一个自编码器,其训练标准除了重建误差之外,还包含一个针对编码层的稀疏性惩罚。
— 第505页,深度学习,2016年。
当使用大于所需的隐藏层(例如,超完备)来学习可能鼓励过拟合的特征时,最常寻求稀疏性。引入稀疏性惩罚可以抵消这个问题并鼓励更好的泛化。
稀疏超完备的学习特征已被证明比其他类型的学习特征更有效,对噪声甚至输入中的变换(例如,图像的学习特征可能对图像中物体的位置具有更好的不变性)具有更好的鲁棒性。
稀疏-超完备表示具有许多理论和实践优势,这已在最近的一些研究中得到证明。特别是,它们对噪声具有良好的鲁棒性,并提供了位置和频率联合空间的良好划分。此外,它们对于分类器具有优势,因为在更高维空间中分类更容易。
— 深度信念网络的稀疏特征学习,2007年。
人们普遍关注表示的稀疏性,而不是小向量的幅度。对这些表示的研究比神经网络的使用更普遍,被称为“稀疏编码”。
稀疏编码提供了一类算法,用于寻找刺激的简洁表示;仅给定无标签的输入数据,它学习捕获数据中更高级别特征的基函数。
— 高效稀疏编码算法,2007年。
如何鼓励小激活
激活惩罚可以按层应用,可能只应用于作为学习表示焦点的某一层,例如编码器模型的输出或自编码器模型的中间(瓶颈)。
可以施加一个约束,该约束会增加一个与层向量输出幅度成比例的惩罚。
激活值可能为正或负,因此我们不能简单地求和这些值。
计算激活幅度的两种常用方法是
L1范数鼓励稀疏性,例如允许某些激活变为零,而L2范数通常鼓励小激活值。L1范数的使用可能是激活正则化更常用的惩罚。
必须指定一个超参数,指示损失函数将如何加权或关注惩罚。常用值在0到0.1之间的对数刻度上,例如0.1、0.001、0.0001等。
活动正则化可以与其他正则化技术(例如权重正则化)结合使用。
激活正则化的例子
本节提供了一些激活正则化的例子,以便为该技术在实践中如何使用提供一些背景。
在深度学习早期,正则化或稀疏激活最初被视为支持开发更深层神经网络的方法。因此,许多例子可能使用受限玻尔兹曼机(RBM)等架构,这些架构已被更现代的方法取代。权重正则化的另一个重要应用是在半标签或无标签数据的自编码器中,即所谓的稀疏自编码器。
蒙特利尔大学的Xavier Glorot等人引入了使用修正线性激活函数来鼓励表示的稀疏性。他们使用了L1惩罚,并在一系列经典计算机视觉分类任务(如MNIST和CIFAR10)上评估了深度监督MLP。
此外,在预训练和微调期间,将一个系数为0.001的L1激活惩罚添加到成本函数中,以增加学习表示中的稀疏程度
— 深度稀疏修正器神经网络,2011年。
Salesforce Research的Stephen Merity等人结合dropout正则化,对用于自然语言处理的LSTMs的输出和循环输出使用了L2激活正则化。他们在一系列语言建模问题上测试了不同激活正则化系数的值。
虽然实现简单,但活动正则化和时间活动正则化与其他更复杂的正则化技术具有竞争力,并提供了相同或更好的结果。
— 重新审视语言RNN的激活正则化,2017年。
使用激活正则化的技巧
本节提供了一些在神经网络中使用激活正则化的技巧。
适用于所有网络类型
激活正则化是一种通用方法。
它可以与大多数(甚至可能所有)类型的神经网络模型一起使用,特别是最常见的网络类型,如多层感知机、卷积神经网络和长短期记忆循环神经网络。
与自编码器和编码器-解码器一起使用
活动正则化可能最适合那些明确寻求高效学习表示的模型类型。
这些模型包括自编码器(即稀疏自编码器)和编码器-解码器模型,例如用于序列到序列预测问题的编码器-解码器LSTM。
尝试不同的范数
最常见的激活正则化是L1范数,因为它鼓励稀疏性。
尝试其他类型的正则化,例如L2范数,或者同时使用L1和L2范数,例如Elastic Net线性回归算法。
使用修正线性单元
修正线性激活函数,也称为ReLU,是一种目前广泛应用于深度神经网络隐藏层的激活函数。
与传统的激活函数(如tanh(双曲正切函数)和sigmoid(逻辑函数))不同,relu函数可以很容易地产生精确的零值。这使得它在学习稀疏表示时(例如使用l1向量范数激活正则化)成为一个很好的选择。
网格搜索参数
通常对正则化超参数使用小值,该超参数控制每个激活对惩罚的贡献。
可以从对数尺度上的值开始测试,例如0.1、0.001和0.0001。然后在最有希望的数量级上使用网格搜索。
标准化输入数据
通常好的做法是将输入变量重新缩放为相同的尺度。
当输入变量具有不同的尺度时,网络权重的尺度也会相应变化。大的权重会使非线性传递函数饱和,并减少层输出的方差。这在使用激活正则化时可能会引入问题。
这个问题可以通过对输入变量进行归一化或标准化来解决。
使用超完备表示
将选定为学习特征的层(例如,编码器的输出或自编码器中的瓶颈)配置为具有比可能需要的更多节点。
这被称为过完备表示,它将鼓励网络对训练样本过拟合。这可以通过强激活正则化来抵消,以鼓励丰富且稀疏的学习表示。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
书籍
- 7.10 稀疏表示, 深度学习, 2016年。
论文
- 深度稀疏修正器神经网络, 2011.
- 深度信念网络的稀疏特征学习, 2007.
- 无监督学习不变特征层次及其在目标识别中的应用, 2007.
- 高效稀疏编码算法, 2007.
- 衡量深度网络中的不变性, 2009.
- 视觉区域V2的稀疏深度信念网络模型, 2007.
- 重新审视语言RNN的激活正则化, 2017.
- 监督学习中的稀疏活动和稀疏连接, 2013.
文章
总结
在这篇文章中,您发现了激活正则化作为一种提高学习特征泛化能力的技术。
具体来说,你学到了:
- 神经网络从数据和模型中学习特征,例如自编码器和编码器-解码器模型,它们明确地寻求有效的学习表示。
- 与权重类似,学习特征中的大值(例如,大激活)可能表示模型过拟合。
- 向损失函数添加惩罚,根据激活的幅度按比例惩罚模型,可能会导致更稳健和泛化的学习特征。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
我做了一些实验,在分类器最后一个隐藏层的sigmoid输出上使用了可微分二值化正则器,鼓励学习二值码。该层的宽度对应于在类别中进行选择所需的比特数。这似乎是可行的。至少它不会破坏分类。当然,还需要更多的实验。我知道也有关于二值化神经网络的论文。
干得好!
嘿!
只是想澄清一些基本疑问。
我正在使用自编码器处理MNIST数据。我有一个784的输入层,在隐藏层中我将其减小到300,然后在第二个隐藏层中减小到64,并且每次都使用relu激活。现在在解码过程中,我使用相同的架构反向操作,并得到一个784维的向量作为输出。这里我也使用了relu激活。
现在的疑问是,我是否会得到整个网络relu激活后的值,这可能与我最初开始时的数据完全不同。那么,如何确保自编码器正确学习输入数据呢?因为输入数据与我们最终再现的数据会非常不同。那么在这里应用损失函数是否有效呢?或者我们需要进行一些操作吗?
或许将输入和输出值范围设为0-1?
或许从MSE作为损失函数开始?
嗨,Jason,
感谢您的精彩解释!我只是想知道是否也可以使用欠完备自编码器和激活正则化。我当时在想,如果将自编码器用作特征提取,并强制自编码器学习最相关的模式。
最后,我们是在编码器和解码器的每一层都添加激活正则化,还是只在编码器中添加?
是的,在您的数据集上尝试一下,并与使用原始数据进行比较。
可能只在瓶颈层,但同样,比较一下看看。
谢谢,Jason,您的回复。我已经在第一个隐藏层尝试添加激活正则化,但效果不佳。
我一定会尝试将其添加到瓶颈层,看看效果如何。
感谢您的建议!
好的,告诉我进展如何。