训练深度学习神经网络模型的挑战的温和介绍
最后更新于 2021 年 1 月 18 日
深度学习神经网络学习从输入到输出的映射函数。
这是通过更新网络的权重来实现的,以响应模型在训练数据集上产生的误差。不断进行更新以减少这种错误,直到找到足够好的模型,或者学习过程停滞不前。
一般来说,训练神经网络的过程是使用该技术最具挑战性的部分,并且就配置该过程所需的努力和执行该过程所需的计算复杂性而言,是最耗时的。
在这篇文章中,你将发现为深度学习神经网络寻找模型参数的挑战。
看完这篇文章,你会知道:
- 神经网络学习从输入到输出的映射函数,可以概括为解决函数逼近问题。
- 与其他机器学习算法不同,神经网络的参数必须通过解决具有许多好的解和许多误导性好的解的非凸优化问题来找到。
- 随机梯度下降算法用于解决优化问题,其中使用反向传播算法在每次迭代中更新模型参数。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
温和介绍训练深度学习神经网络模型的挑战
图片由米盖尔·迪凯特提供,版权所有。
概观
本教程分为四个部分;它们是:
- 神经网络学习映射函数
- 学习网络权重很难
- 导航错误表面
- 学习算法的组成部分
神经网络学习映射函数
深度学习神经网络学习映射函数。
开发模型需要来自域的历史数据,这些数据用作训练数据。该数据由来自域的观察或示例组成,具有描述条件的输入元素和捕获观察含义的输出元素。
例如,输出是一个量的问题通常被描述为回归预测建模问题。而输出是标签的问题通常被描述为分类预测建模问题。
神经网络模型使用示例来学习如何将特定的输入变量集映射到输出变量。它必须以这样一种方式做到这一点,即这种映射对训练数据集很有效,但对模型在训练期间看不到的新示例也很有效。这种在具体例子和新例子中表现良好的能力被称为模型概括的能力。
多层感知器只是将一组输入值映射到输出值的数学函数。
—第 5 页,深度学习,2016。
我们可以把输入变量和输出变量之间的关系描述成一个复杂的数学函数。对于给定的模型问题,我们必须相信存在一个真实的映射函数来最好地将输入变量映射到输出变量,并且神经网络模型可以在逼近真实未知的底层映射函数方面做得很好。
前馈网络定义了一个映射,并学习导致最佳函数逼近的参数值。
—第 168 页,深度学习,2016。
因此,我们可以将神经网络解决的更广泛的问题描述为“函数逼近”他们学习在给定训练数据集的情况下逼近未知的底层映射函数。给定我们设计的特定网络结构,他们通过学习权重和模型参数来做到这一点。
最好将前馈网络视为功能近似机器,旨在实现统计泛化,偶尔从我们对大脑的了解中获得一些见解,而不是将其视为大脑功能的模型。
—第 169 页,深度学习,2016。
学习网络权重很难
寻找神经网络的参数通常是困难的。
对于许多更简单的机器学习算法,我们可以在给定训练数据集的情况下计算最优模型。
例如,我们可以使用线性代数来计算线性回归模型和训练数据集的特定系数,该训练数据集可以最大限度地减少平方误差。
同样,我们可以使用优化算法,当为非线性算法(如逻辑回归或支持向量机)找到一组最佳模型参数时,这些算法可以提供收敛保证。
为许多机器学习算法寻找参数涉及解决一个凸优化问题:这是一个误差表面,形状像一个碗,只有一个最佳解决方案。
深度学习神经网络不是这样。
我们既不能直接计算模型的最优权值集,也不能得到全局收敛保证来寻找最优权值集。
应用于非凸损失函数的随机梯度下降法没有【……】收敛保证,并且对初始参数值敏感。
—第 177 页,深度学习,2016。
事实上,训练神经网络是使用该技术最具挑战性的部分。
为了解决神经网络训练问题的一个实例,在数百台机器上投入几天到几个月的时间是很常见的。
—第 274 页,深度学习,2016。
在神经网络中使用非线性激活函数意味着我们为了找到模型参数而必须解决的优化问题不是凸的。
它不是一个简单的碗形,只有一套我们肯定能找到的最佳重量。相反,有一个山峰和山谷的景观,有许多好的和许多误导性的好参数集,我们可能会发现。
解决这个优化问题很有挑战性,尤其是因为误差面包含许多局部最优解、平点和悬崖。
必须使用迭代过程来导航模型的非凸误差表面。一个导航错误的幼稚算法很可能会被误导、丢失,并最终陷入困境,从而导致模型表现不佳。
导航非凸误差曲面
神经网络模型可以被认为是通过导航非凸误差表面来学习的。
可以在训练数据集上评估具有特定权重集的模型,并且可以将所有训练数据集的平均误差视为模型的误差。模型权重的改变将导致模型误差的改变。因此,我们寻求一组权重,从而得到一个误差很小的模型。
这包括重复评估模型和更新模型参数的步骤,以便降低误差面。重复这个过程,直到找到一组足够好的参数,或者搜索过程停滞不前。
这是一个搜索或优化过程,我们称以这种方式运行的优化算法为梯度优化算法,因为它们天真地沿着误差梯度运行。它们计算成本高,速度慢,它们的经验行为意味着在实践中使用它们更多的是艺术而不是科学。
最常用于导航误差表面的算法称为随机梯度下降,简称 SGD。
几乎所有的深度学习都是由一个非常重要的算法提供动力的:随机梯度下降或 SGD。
—第 151 页,深度学习,2016。
可以使用为非凸优化问题设计的其他全局优化算法,例如遗传算法,但是随机梯度下降更有效,因为它通过称为反向传播的算法专门使用梯度信息来更新模型权重。
[反向传播]描述了一种通过巧妙应用导数链规则来计算网络训练误差相对于权重的导数的方法。
—第 49 页,神经锻造:前馈人工神经网络中的监督学习,1999。
反向传播是指从微积分中计算特定模型参数的模型误差的导数(例如斜率或梯度)的技术,允许更新模型权重以向下移动梯度。因此,用于训练神经网络的算法通常也称为简单的反向传播。
实际上,反向传播仅指计算梯度的方法,而另一种算法,如随机梯度下降,用于使用该梯度执行学习。
—第 204 页,深度学习,2016。
随机梯度下降可用于为其他机器学习算法(如线性回归)寻找参数,并且在处理非常大的数据集时使用,尽管如果有足够的资源,那么基于凸的优化算法的效率明显更高。
学习算法的组成部分
使用具有反向传播的随机梯度下降来训练深度学习神经网络模型包括选择多个组件和超参数。在本节中,我们将依次看一看每一个。
必须选择一个误差函数,通常称为目标函数、成本函数或损失函数。通常,选择一个特定的概率推理框架,称为最大似然。在这个框架下,通常选择的损失函数是分类问题的交叉熵和回归问题的均方误差。
- 损耗功能。用于估计模型表现的函数,该模型在来自训练数据集的示例上具有一组特定的权重。
搜索或优化过程需要一个开始模型更新的起点。起点由初始模型参数或权重定义。由于误差面是非凸的,优化算法对初始起点敏感。因此,选择小的随机值作为初始模型权重,尽管可以使用不同的技术来选择这些值的比例和分布。这些技术被称为“权重初始化”方法。
- 重量初始化。在训练过程开始时,将初始小随机值分配给模型权重的过程。
更新模型时,必须使用训练数据集中的大量示例来计算模型误差,通常简称为“损失”可以使用训练数据集中的所有示例,这可能适用于较小的数据集。或者,可以使用单个示例,这可能适用于流传输示例或数据经常变化的问题。可以使用混合方法,其中可以选择来自训练数据集的示例数量,并将其用于估计误差梯度。实例数量的选择被称为批量。
- 批量。在更新模型参数之前用于估计误差梯度的示例数。
一旦估计了误差梯度,就可以计算误差的导数并用于更新每个参数。训练数据集中和误差梯度估计中可能存在统计噪声。此外,模型的深度(层数)和模型参数单独更新的事实意味着,很难精确计算每个模型参数的变化量,以便最好地沿着误差梯度向下移动整个模型。
相反,每次迭代都会执行一小部分权重更新。一个名为“学习率”的超参数控制模型权重的更新量,进而控制模型在训练数据集上的学习速度。
- 学习率:学习算法每个周期每个模型参数更新的量。
训练过程必须重复多次,直到发现一组好的或足够好的模型参数。过程的总迭代次数由训练数据集的完整遍数限定,在此之后训练过程终止。这被称为训练次数“时代”
- 时代。在训练过程终止之前,通过训练数据集的完整次数。
学习算法有许多扩展,尽管这五个超参数通常控制深度学习神经网络的学习算法。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
- 深度学习,2016 年。
- 神经锻造:前馈人工神经网络中的监督学习,1999。
- 用于模式识别的神经网络,1995。
摘要
在这篇文章中,你发现了为深度学习神经网络寻找模型参数的挑战。
具体来说,您了解到:
- 神经网络学习从输入到输出的映射函数,可以概括为解决函数逼近问题。
- 与其他机器学习算法不同,神经网络的参数必须通过解决具有许多好的解和许多误导性好的解的非凸优化问题来找到。
- 随机梯度下降算法用于解决优化问题,其中使用反向传播算法在每次迭代中更新模型参数。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
深度学习中激活正则化的温和介绍
最后更新于 2019 年 8 月 6 日
深度学习模型能够从原始输入数据中自动学习丰富的内部表示。
这被称为特征或表征学习。更好的学习表示反过来可以导致对领域更好的洞察,例如通过学习特征的可视化,以及更好的利用学习特征的预测模型。
学习特征的一个问题是,它们可能对训练数据过于专门化,或者过度训练,并且不能很好地推广到新的例子。学习表示中的大值可能是表示过度的标志。活动或表示正则化提供了一种技术来鼓励学习的表示,即网络的隐藏层的输出或激活,保持小而稀疏。
在这篇文章中,你将发现激活正则化是一种提高神经网络中学习特征泛化能力的技术。
看完这篇文章,你会知道:
- 神经网络从数据和模型中学习特征,例如自动编码器和编码器-解码器模型,明确寻求有效的学习表示。
- 类似于权重,学习特征中的较大值,例如较大的激活,可以指示过拟合模型。
- 在损失函数中增加惩罚,惩罚模型与激活的幅度成比例,可以产生更健壮和更一般化的学习特征。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
减少深度学习神经网络泛化误差的激活正则化
图片由尼古拉斯·阿·托内利提供,保留部分权利。
概观
本教程分为五个部分;它们是:
- 已学习功能的问题
- 鼓励小规模激活
- 如何鼓励小规模激活
- 激活正则化的例子
- 使用激活正则化的提示
已学习功能的问题
深度学习模型能够执行特征学习。
也就是说,在网络的训练过程中,模型会自动从输入的模式中提取显著特征或“学习特征”这些特征可以在网络中使用,以便预测回归的量或预测分类的类值。
这些内部表示是有形的东西。网络中隐藏层的输出表示模型在网络中该点学习的特征。
有一个研究领域专注于特征的高效和有效的自动学习,通常通过在使用第二网络从学习的特征重构原始输入之前,让网络将输入减少到小的学习的特征来研究。这种类型的模型被称为自动编码器或编码器-解码器,它们的学习特征对于学习更多关于领域的知识(例如通过可视化)和预测模型是有用的。
学习的特征或“编码的输入””必须足够大以捕捉输入的显著特征,但也足够集中以不过拟合训练数据集中的特定示例。因此,在所学特征的表达和概括之间有一种张力。
更重要的是,当编码器-解码器结构中代码的维数大于输入时,有必要限制代码携带的信息量,以免编码器-解码器可能简单地以琐碎的方式学习身份函数并产生不感兴趣的特征。
——不变特征层次的无监督学习及其在对象识别中的应用,2007。
正如网络中的大权重可能表示模型不稳定和过拟合一样,学习到的特征中的大输出值也可能表示相同的问题。
期望在学习的特征中具有小的值,例如来自编码器网络的小输出或激活。
鼓励小规模激活
网络的损失函数可以更新,以便根据模型激活的程度来惩罚模型。
这类似于“T0”权重正则化,其中损失函数被更新以与权重的大小成比例地惩罚模型。一个层的输出被称为其“激活”,同样,这种形式的惩罚或正则化被称为“激活正则化或“活动正则化
……对神经网络中单元的激活进行惩罚,鼓励它们的激活稀疏。
—第 254 页,深度学习,2016。
编码器的输出,或者一般来说,神经网络中隐藏层的输出,可以被认为是模型中该点问题的表示。因此,这种类型的惩罚也可以称为“表示正则化”
希望有小的激活或者甚至很少的激活,并且大部分激活的值为零,这也被称为希望稀疏。因此,这种类型的惩罚也被称为“稀疏特征学习”
限制过完备代码的信息内容的一种方法是使其稀疏。
——不变特征层次的无监督学习及其在对象识别中的应用,2007。
自动编码器模型中稀疏学习特征的鼓励被称为“稀疏自动编码器”
稀疏自动编码器只是一种自动编码器,其训练标准除了重构误差之外,还包括代码层的稀疏性损失
—第 505 页,深度学习,2016。
当使用大于所需的隐藏层(例如,过完备)来学习可能导致过拟合的特征时,最常寻求稀疏性。稀疏惩罚的引入解决了这个问题,并鼓励更好的推广。
稀疏的过完备学习特征已经被证明比其他类型的学习特征更有效,提供了对输入中的噪声甚至变换的更好的鲁棒性,例如,图像的学习特征可以对图像中对象的位置具有改进的不变性。
稀疏-过完备表示具有许多理论和实践上的优势,这在最近的一些研究中得到了证明。特别是,它们对噪声具有良好的鲁棒性,并且提供了位置和频率的联合空间的良好拼接。此外,它们对于分类器是有利的,因为在高维空间中分类更容易。
——深度信念网络的稀疏特征学习,2007。
人们普遍关注的是表示的稀疏性,而不是小的矢量幅度。对这些表示的研究比神经网络的使用更普遍,被称为“稀疏编码”
稀疏编码为寻找刺激的简洁表示提供了一类算法;仅给定未标记的输入数据,它学习捕获数据中更高级特征的基函数。
——高效稀疏编码算法,2007。
如何鼓励小规模激活
可以对每一层应用激活惩罚,可能只在学习表示的焦点所在的一层应用,例如编码器模型的输出或自动编码器模型的中间(瓶颈)。
可以应用一个约束,该约束增加了与层的矢量输出的幅度成比例的惩罚。
激活值可能是正的,也可能是负的,所以我们不能简单地对这些值求和。
计算激活量的两种常用方法是:
L1 范数鼓励稀疏性,例如允许一些激活变为零,而 l2 范数通常鼓励小的激活值。使用 L1 范数可能是激活正则化更常用的惩罚。
必须指定一个超参数,指示损失函数将加重或关注损失的数量或程度。常用值是 0 到 0.1 之间的对数标度,如 0.1、0.001、0.0001 等。
活动正则化可以与其他正则化技术结合使用,例如权重正则化。
激活正则化的例子
本节提供了一些激活正则化的例子,以便为如何在实践中使用该技术提供一些背景。
在深度学习的早期历史中,正则化或稀疏激活最初是作为一种支持更深层神经网络发展的方法来寻求的。因此,许多例子可以利用像受限玻尔兹曼机器(RBMs)这样的架构,这些架构已经被更现代的方法所取代。权重正则化的另一个重要应用是在具有半标记或未标记数据的自动编码器中,即所谓的稀疏自动编码器。
蒙特利尔大学的 Xavier Glorot 等人介绍了使用校正的线性激活函数来促进表示的稀疏性。他们使用了 L1 惩罚,并在一系列经典的计算机视觉分类任务(如 MNIST 和 CIFAR10)上评估深度监督的 MLPs。
此外,在预训练和微调期间,将系数为 0.001 的激活的 L1 惩罚添加到成本函数中,以增加所学习的表示中的稀疏度
——深度稀疏整流神经网络,2011。
来自 Salesforce Research 的 Stephen Merity 等人将 L2 激活正则化与 LSTMs 一起用于自然语言处理的输出和循环输出,并与丢弃正则化结合使用。他们在一系列语言建模问题上测试了一套不同的激活正则化系数值。
虽然实现起来很简单,但是活动正则化和时间活动正则化与其他复杂得多的正则化技术相比具有竞争力,并且提供了同等或更好的结果。
——重温语言 RNNs 的激活正则化,2017。
使用激活正则化的提示
本节提供了一些神经网络使用激活正则化的技巧。
适用于所有网络类型
激活正则化是一种通用方法。
它可以用于大多数,也许是所有类型的神经网络模型,尤其是最常见的多层感知器、卷积神经网络和长短期记忆递归神经网络。
与自动编码器和编码器-解码器一起使用
活动正则化可能最适合于那些明确寻求高效学习表示的模型类型。
这些模型包括自动编码器(即稀疏自动编码器)和编码器-解码器模型,例如用于序列到序列预测问题的编码器-解码器 LSTMs。
用不同的标准做实验
最常见的激活正则化是 L1 范数,因为它鼓励稀疏性。
尝试其他类型的正则化,例如 L2 范数,或者同时使用 L1 和 L2 范数,例如弹性网线性回归算法。
使用线性整流器
整流线性激活函数,也叫 relu ,是一种现在广泛应用于深层神经网络隐层的激活函数。
与 tanh(双曲正切函数)和 sigmoid(逻辑函数)等经典激活函数不同,relu 函数允许精确的零值。这使得它在学习稀疏表示时成为一个很好的候选,例如使用 l1 向量范数激活正则化。
网格搜索参数
正则化超参数通常使用较小的值来控制每次激活对惩罚的贡献。
也许可以从测试对数标度的值开始,例如 0.1、0.001 和 0.0001。然后按照最有希望的数量级进行网格搜索。
标准化输入数据
一般来说,将输入变量重新缩放到相同的比例是一种很好的做法。
当输入变量具有不同的标度时,网络权重的标度将相应地变化。大权重可以使非线性传递函数饱和,并降低层输出的方差。这可能会在使用激活正则化时带来问题。
这个问题可以通过规范化或标准化输入变量来解决。
使用过完备表示法
将所选的层配置为学习的特征,例如编码器的输出或自动编码器中的瓶颈,以具有更多可能需要的节点。
这被称为过完备表示,它将鼓励网络对训练示例进行过完备化。这可以通过强激活正则化来应对,以鼓励也是稀疏的丰富的学习表示。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 7.10 稀疏表示,深度学习,2016。
报纸
- 深度稀疏整流神经网络,2011。
- 深度信念网络的稀疏特征学习,2007。
- 不变特征层次的无监督学习及其在目标识别中的应用,2007。
- 高效稀疏编码算法,2007。
- 测量深度网络中的不变性,2009 年。
- 视觉区稀疏深度信念网模型 V2 ,2007。
- 重温语言 RNNs 的激活正则化,2017。
- 监督学习中的稀疏活动和稀疏连通,2013。
文章
摘要
在这篇文章中,您发现激活正则化是一种提高所学特征的泛化能力的技术。
具体来说,您了解到:
- 神经网络从数据和模型中学习特征,例如自动编码器和编码器-解码器模型,明确寻求有效的学习表示。
- 类似于权重,学习特征中的较大值,例如较大的激活,可以指示过拟合模型。
- 在损失函数中增加惩罚,惩罚模型与激活的幅度成比例,可以产生更健壮和更一般化的学习特征。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
深度学习 Adam 优化算法的温和介绍
原文:https://machinelearningmastery.com/adam-optimization-algorithm-for-deep-learning/
最后更新于 2021 年 1 月 13 日
为您的深度学习模型选择优化算法可能意味着几分钟、几小时和几天内的良好结果之间的差异。
亚当优化算法是随机梯度下降的扩展,最近在计算机视觉和自然语言处理的深度学习应用中得到了更广泛的采用。
在这篇文章中,你将得到一个温和的介绍,亚当优化算法用于深度学习。
看完这篇文章,你会知道:
- 亚当算法是什么,以及使用该方法优化模型的一些好处。
- Adam 算法是如何工作的,它与 AdaGrad 和 RMSProp 的相关方法有何不同。
- 如何配置 Adam 算法以及常用的配置参数。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
什么是 Adam 优化算法?
Adam 是一种优化算法,可以用来代替经典的随机梯度下降过程,根据训练数据迭代更新网络权重。
亚当是由来自 OpenAI 的 Diederik Kingma 和来自多伦多大学的 Jimmy Ba 在他们 2015 年的 ICLR 论文(海报)中提出的,论文标题为“ Adam:一种随机优化的方法”。除非另有说明,我将在这篇文章中大量引用他们的论文。
这个算法叫做亚当。它不是首字母缩略词,也不是写成“ADAM”。
Adam 这个名字来源于自适应矩估计。
在介绍该算法时,作者列出了在非凸优化问题上使用 Adam 的诱人好处,如下所示:
- 实现起来很简单。
- 计算效率高。
- 对内存要求不高。
- 对梯度的对角线重新缩放不变。
- 非常适合数据和/或参数庞大的问题。
- 适用于非固定目标。
- 适用于具有非常嘈杂/稀疏梯度的问题。
- 超参数有直观的解释,通常几乎不需要调整。
亚当是如何工作的?
Adam 不同于经典的随机梯度下降。
随机梯度下降为所有权重更新保持单一学习率(称为α),并且学习率在训练期间不变。
为每个网络权重(参数)保持一个学习率,并随着学习的展开而单独调整。
该方法根据梯度的第一和第二矩的估计来计算不同参数的个体自适应学习率。
作者将亚当描述为结合了随机梯度下降的另外两个扩展的优点。具体来说:
- 自适应梯度算法 (AdaGrad),保持每个参数的学习率,提高稀疏梯度问题(如自然语言和计算机视觉问题)的表现。
- 均方根传播 (RMSProp),也保持基于权重梯度最近幅度的平均值(例如,其变化有多快)进行调整的每个参数的学习率。这意味着该算法在在线和非平稳问题(如噪声)上表现良好。
Adam 意识到了 AdaGrad 和 RMSProp 的好处。
不像 RMSProp 那样基于平均第一矩(均值)来调整参数学习率,Adam 还利用了梯度的第二矩的平均值(无间隔方差)。
具体而言,该算法计算梯度和平方梯度的指数移动平均值,参数β1 和β2 控制这些移动平均值的衰减率。
移动平均线的初始值以及接近 1.0 的β1 和β2 值(推荐值)会导致力矩估计值偏向零。这种偏差是通过首先计算有偏差的估计,然后计算偏差校正的估计来克服的。
这篇论文可读性很强,如果您对具体的实现细节感兴趣,我鼓励您阅读它。
如果您想学习如何在 Python 中从零开始编写 Adam 代码,请参见教程:
亚当是有效的
Adam 是深度学习领域的一种流行算法,因为它能快速获得好的结果。
实证结果表明,Adam 在实践中运行良好,优于其他随机优化方法。
在最初的论文中,亚当通过实证证明了收敛性符合理论分析的预期。Adam 应用于 MNIST 数字识别和 IMDB 情感分析数据集上的逻辑回归算法、MNIST 数据集上的多层感知器算法和 CIFAR-10 图像识别数据集上的卷积神经网络。他们得出结论:
通过使用大型模型和数据集,我们证明了 Adam 可以高效地解决实际的深度学习问题。
Adam 与其他优化算法的比较训练多层感知器
摘自 Adam:随机优化方法,2015。
Sebastian Ruder 对现代梯度下降优化算法进行了全面的回顾,标题为“梯度下降优化算法概述”首先作为的博文发布,然后在 2016 年发布了一份技术报告。
这篇论文基本上是对现代方法的考察。在他的标题为“的部分中,使用哪个优化器?”,他建议使用亚当。
就目前而言,RMSprop、Adadelta 和 Adam 是非常相似的算法,在相似的环境中表现良好。[……]随着梯度变得越来越稀疏,它的偏差校正帮助 Adam 在优化接近尾声时略微优于 RMSprop。就目前而言,亚当可能是最好的选择。
在 Andrej Karpathy 等人开发的名为“ CS231n:用于视觉识别的卷积神经网络”的斯坦福计算机视觉深度学习课程中,Adam 算法再次被建议作为深度学习应用的默认优化方法。
实际上,目前推荐使用 Adam 作为默认算法,并且通常比 RMSProp 稍好一些。然而,通常也值得尝试 SGD+Nesterov 动力作为替代方案。
后来更明白地说:
推荐使用的两个更新是 SGD+Nesterov 动量或亚当。
Adam 正被改编成深度学习论文中的基准。
例如,在关于图像字幕中的注意力的论文“展示、出席和讲述:具有视觉注意力的神经图像字幕生成”和关于图像生成的论文“绘制:用于图像生成的递归神经网络”中使用了它。
你知道亚当的其他例子吗?评论里告诉我。
亚当配置参数
- α。也称为学习率或步长。权重更新的比例(例如 0.001)。较大的值(例如 0.3)导致在更新速率之前更快的初始学习。较小的值(例如 1.0E-5)会在训练过程中降低学习速度
- β1。第一时刻估计值的指数衰减率(如 0.9)。
- β2。二阶矩估计的指数衰减率(如 0.999)。对于具有稀疏梯度的问题(例如自然语言处理和计算机视觉问题),该值应设置为接近 1.0。
- ε。是一个非常小的数字,以防止在实现中被零除(例如 10E-8)。
此外,学习率衰减也可以用于亚当。本文使用每个时期(t)更新的衰减率α=α/sqrt(t)进行逻辑回归论证。
亚当的论文建议:
测试的机器学习问题的良好默认设置是α= 0.001,β1 = 0.9,β2 = 0.999 和ε= 108
张量流文档建议对ε进行一些调整:
ε的默认值 1e-8 通常可能不是一个好的默认值。例如,在 ImageNet 上训练一个 Inception 网络时,当前一个好的选择是 1.0 或 0.1。
我们可以看到,流行的深度学习库一般使用论文推荐的默认参数。
- TensorFlow:learning _ rate = 0.001,beta1=0.9,beta2=0.999,ε= 1e-08。
T3】Keras:lr =0.001,beta_1=0.9,beta_2=0.999,ε= 1e-08,衰变= 0.0。 - 块 : learning_rate=0.002,beta1=0.9,beta2=0.999,ε= 1e-08,decay _ factor = 1。
- 千层面 : learning_rate=0.001,beta1=0.9,beta2=0.999,ε= 1e-08
- Caffe:learning _ rate = 0.001,beta1=0.9,beta2=0.999,ε= 1e-08
- MxNet:learning _ rate = 0.001,beta1=0.9,beta2=0.999,ε= 1e-8
- 火炬 : learning_rate=0.001,beta1=0.9,beta2=0.999,ε= 1e-8
你知道亚当的其他标准配置吗?评论里告诉我。
进一步阅读
本节列出了了解有关 Adam 优化算法的更多信息的资源。
- 亚当:一种随机优化的方法,2015。
- 维基百科上的随机梯度下降
- 梯度下降优化算法概述,2016。
- ADAM:一种随机优化的方法(综述)
- 深度网络优化(幻灯片)
- 亚当:一种随机优化的方法(幻灯片)。
- 从零开始编码亚当梯度下降优化
你知道亚当还有什么好的资源吗?评论里告诉我。
摘要
在这篇文章中,你发现了深度学习的亚当优化算法。
具体来说,您了解到:
- Adam 是一种用于训练深度学习模型的随机梯度下降的替代优化算法。
- Adam 结合了 AdaGrad 和 RMSProp 算法的最佳属性,提供了一种优化算法,可以处理噪声问题上的稀疏梯度。
- Adam 相对容易配置,默认配置参数在大多数问题上表现良好。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
深度神经网络批量归一化简介
原文:https://machinelearningmastery.com/batch-normalization-for-training-of-deep-neural-networks/
最后更新于 2019 年 12 月 4 日
训练具有几十层的深度神经网络是具有挑战性的,因为它们可能对学习算法的初始随机权重和配置敏感。
造成这种困难的一个可能的原因是,当权重被更新时,输入到网络深层的分布在每个小批量之后可能会改变。这会导致学习算法永远追逐运动目标。网络中各层输入分布的这种变化被称为技术名称“内部协变量移位”
批处理标准化是一种训练深度神经网络的技术,它为每个小批处理标准化了一个层的输入。这具有稳定学习过程和显著减少训练深层网络所需的训练时期数量的效果。
在这篇文章中,您将发现用于加速深度学习神经网络训练的批处理规范化方法。
看完这篇文章,你会知道:
- 深度神经网络的训练具有挑战性,尤其是因为来自先前层的输入在权重更新后会发生变化。
- 批处理标准化是一种标准化网络输入的技术,应用于前一层的激活或直接输入。
- 批处理规范化加速了训练,在某些情况下通过将时代减半或更好,并提供了一些正则化,减少了泛化误差。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
深度神经网络批处理规范化的温和介绍
图片由丹尼斯·贾维斯提供,保留部分权利。
概观
本教程分为五个部分;它们是:
- 深度网络训练问题
- 标准化层输入
- 如何标准化层输入
- 使用批处理规范化的示例
- 使用批处理规范化的提示
深度网络训练问题
训练深度神经网络,例如具有几十个隐藏层的网络,是具有挑战性的。
这一挑战的一个方面是,使用假设当前层之前的层中的权重是固定的误差估计,从输出到输入逐层向后更新模型。
非常深的模型涉及几个函数或层的组合。在假设其他层不变的情况下,梯度告诉如何更新每个参数。实际上,我们同时更新所有的层。
—第 317 页,深度学习,2016。
因为在更新过程中所有层都发生了变化,所以更新过程永远在追逐移动的目标。
例如,给定先前层输出具有给定分布的值的预期,更新层的权重。在前一层的权重更新后,这种分布可能会改变。
训练深度神经网络是复杂的,因为每一层的输入分布在训练过程中会随着前一层的参数变化而变化。这通过要求较低的学习率和仔细的参数初始化来减缓训练,并且使得训练具有饱和非线性的模型变得众所周知的困难。
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
引入批量归一化的论文作者将训练期间输入分布的变化称为“内部协变量移动”
在训练过程中,我们将深层网络内部节点分布的变化称为内部协变量偏移。
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
标准化层输入
批处理规范化,简称 batchnorm,是一种帮助协调模型中多个层的更新的技术。
批处理规范化提供了一种优雅的方式来重新参数化几乎任何深度网络。重新参数化大大减少了跨多个层协调更新的问题。
—第 318 页,深度学习,2016。
它这样做是为了缩放层的输出,特别是通过标准化每个小批量的每个输入变量的激活,例如激活前一层的节点。回想一下,标准化指的是重新调整数据,使其平均值为零,标准偏差为 1,例如标准高斯。
批量标准化对模型进行重新参数化,以使某些单元始终按照定义进行标准化
—第 319 页,深度学习,2016。
当应用于计算机视觉中的图像时,这个过程也被称为“T0”白化。
通过白化每一层的输入,我们将朝着实现输入的固定分布迈出一步,这将消除内部协变量移动的不良影响。
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
对前一层的激活进行标准化意味着后续层在权重更新期间对输入的传播和分布所做的假设不会改变,至少不会显著改变。这具有稳定和加速深度神经网络的训练过程的效果。
批量标准化仅用于标准化每个单元的均值和方差,以稳定学习,但允许单元之间的关系和单个单元的非线性统计发生变化。
—第 320 页,深度学习,2016。
规范化层的输入对模型的训练有影响,大大减少了所需的时期数量。它还可以具有正则化效果,减少泛化误差,就像使用激活正则化一样。
批量归一化会对优化表现产生显著影响,尤其是对于卷积网络和具有乙状线非线性的网络。
—第 425 页,深度学习,2016。
虽然减少“内部协变量移动”是开发该方法的动机,但有一些建议认为,相反,批处理规范化是有效的,因为它平滑并反过来简化了在训练网络时正在解决的优化功能。
……batchorm 从根本上影响了网络训练:它使相应优化问题的场景明显更加平滑。这尤其确保梯度更具预测性,从而允许使用更大范围的学习率和更快的网络收敛。
— 批处理规范化如何帮助优化?(不,不是关于内部协变量移位),2018。
如何标准化层输入
在训练过程中,可以通过计算每一个小批量层的每个输入变量的平均值和标准偏差,并使用这些统计数据来执行标准化,从而实现批量标准化。
或者,平均值和标准偏差的运行平均值可以跨小批量保持,但可能导致不稳定的训练。
很自然地会问,我们是否可以简单地使用移动平均线[…]在训练期间执行标准化[…]。然而,这已经被观察到导致模型爆炸。
——批量重正化:减少批量标准化模型中的小批量依赖,2017。
训练后,层输入的平均值和标准偏差可以设置为在训练数据集上观察到的平均值。
对于小的小批量或不包含来自训练数据集的示例的代表性分布的小批量,训练和推理(在训练后使用模型)之间的标准化输入的差异会导致表现的显著差异。这可以通过修改称为批量重正化(简称 BatchRenorm)的方法来解决,该方法使得变量平均值和标准偏差的估计在小批量中更加稳定。
批处理重正化通过每维校正来扩展批处理,以确保激活在训练和推理网络之间匹配。
——批量重正化:减少批量标准化模型中的小批量依赖,2017。
输入的这种标准化可以应用于第一隐藏层的输入变量,或者更深层的隐藏层的激活。
在实践中,通常允许层学习两个新参数,即新的平均值和标准偏差,分别为贝塔和伽玛,这允许标准化层输入的自动缩放和移位。这些参数由模型学习,作为训练过程的一部分。
请注意,简单地标准化层的每个输入可能会改变层可以表示的内容。[……]这些参数与原始模型参数一起学习,并恢复网络的表示能力。
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
重要的是,反向传播算法被更新以对变换的输入进行操作,并且误差也被用于更新由模型学习的新的标度和移位参数。
标准化应用于层的输入,即输入变量或来自前一层的激活函数的输出。给定激活函数的选择,层的输入分布可能是非高斯的。在这种情况下,在前一层中的激活函数之前标准化总和激活可能是有益的。
我们在非线性之前添加 BN 变换……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
使用批处理规范化的示例
本节提供了一些利用批处理规范化的里程碑论文和流行模型的例子。
在 2015 年的论文中,该论文引入了名为“批量归一化:通过减少内部协变量移位来加速深度网络训练”的技术,来自谷歌的作者谢尔盖·约夫(Sergey Ioffe)和克里斯蒂安·塞格迪(Christian Szegedy)展示了基于初始阶段的卷积神经网络在照片分类方面相对于基线方法的显著加速。
通过仅使用批处理规范化[…],我们在不到一半的训练步骤中匹配了 Inception 的准确性。
何等人在 2015 年发表的论文《用于图像识别的深度残差学习》中,在称为 ResNet 的深度模型中的卷积层之后使用了批处理归一化,并在标准照片分类任务 ImageNet 数据集上获得了最先进的结果。
我们在每次卷积之后和激活之前都采用了批量归一化
来自谷歌的 Christian Szegedy 等人在 2016 年发表的论文《重新思考计算机视觉的初始架构》》中,在他们更新的称为 GoogleNet Inception-v3 的初始模型中使用了批处理规范化,在 ImageNet 数据集上实现了当时最先进的结果。
BN-辅助是指辅助分类器的全连接层也是批量归一化的版本,而不仅仅是卷积。
来自百度的 Dario Amodei 在他们 2016 年的论文《深度语音 2:英语和普通话的端到端语音识别》中使用了批量归一化递归神经网络的变体作为语音识别的端到端深度模型。
……我们发现,当应用于大数据集上的非常深的 rnn 网络时,我们使用的 BatchNorm 变体除了加速训练之外,还大大改善了最终的泛化误差
使用批处理规范化的提示
本节提供了在自己的神经网络中使用批处理规范化的提示和建议。
使用不同的网络类型
批处理标准化是一种通用技术,可用于标准化层的输入。
它可以用于大多数网络类型,如多层感知器、卷积神经网络和递归神经网络。
可能在激活前使用
可以在前一层的激活函数之前或之后,对该层的输入使用批量标准化。
如果对于像双曲正切和逻辑函数这样的 s 形函数,在激活函数之后可能更合适。
对于可能导致非高斯分布的激活,如大多数网络类型的现代默认校正线性激活函数,在激活函数之前设置可能是合适的。
批处理标准化的目标是在整个训练中实现激活值的稳定分布,在我们的实验中,我们在非线性之前应用它,因为在非线性处,匹配第一和第二矩更有可能导致稳定分布
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
也许用你的网络测试这两种方法。
使用大学习率
使用批处理规范化使网络在训练过程中更加稳定。
这可能需要使用比正常学习率大得多的速率,这又可能进一步加快学习过程。
在批处理标准化模型中,我们已经能够从更高的学习率中实现训练加速,而没有不良副作用
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
更快的训练也意味着用于学习率的衰减速率可能会增加。
对权重初始化不太敏感
深度神经网络对用于在训练前初始化权重的技术非常敏感。
批量归一化给训练带来的稳定性使得训练深度网络对权重初始化方法的选择不太敏感。
数据准备的替代方案
批量标准化可用于标准化具有不同标度的原始输入变量。
如果为每个输入特征计算的平均值和标准偏差是在小批量上计算的,而不是在整个训练数据集上计算的,那么批量大小必须充分代表每个变量的范围。
它可能不适合数据分布高度非高斯的变量,在这种情况下,最好将数据缩放作为预处理步骤。
不要用于丢弃
批量归一化提供了一些正则化效果,减少了泛化误差,也许不再需要使用去核来正则化。
从修改后的 BN-initiation 中删除 from 加快了训练速度,而不会增加过拟合。
——批量归一化:通过减少内部协变量移位加速深度网络训练,2015。
此外,在同一网络中使用批处理规范化和丢弃可能不是一个好主意。
原因是,考虑到在丢弃过程中节点的随机丢弃,用于标准化前一层激活的统计数据可能变得有噪声。
批处理标准化有时还会减少泛化误差,并允许省略缺失,因为用于标准化每个变量的统计估计中存在噪声。
—第 425 页,深度学习,2016。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 第 8.7.1 节–批量标准化,深度学习,2016。
- 第 7.3.1 节。高级架构模式,Python 深度学习, 2017。
报纸
文章
- 批量归一化,维基百科。
- 批量定额为什么起作用?,deeplearning.ai ,视频
- 批量归一化,OpenAI,2016。
- 【ReLU 之前还是之后批量归一化?,Reddit 。
摘要
在这篇文章中,您发现了用于加速深度学习神经网络训练的批处理规范化方法。
具体来说,您了解到:
- 深度神经网络的训练具有挑战性,尤其是因为来自先前层的输入在权重更新后会发生变化。
- 批处理标准化是一种标准化网络输入的技术,应用于前一层的激活或直接输入。
- 批处理规范化加速了训练,在某些情况下通过将时代减半或更好,并提供了一些正则化,减少了泛化误差。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
配置反向传播来训练更好的神经网络的 8 个技巧
最后更新于 2019 年 8 月 6 日
使用随机梯度下降训练神经网络模型,并使用反向传播算法更新模型权重。
通过训练神经网络模型解决的优化非常具有挑战性,尽管这些算法被广泛使用,因为它们在实践中表现得非常好,但是不能保证它们会及时收敛到好的模型。
训练神经网络的挑战实际上归结为配置训练算法的挑战。
在这篇文章中,你将发现在训练神经网络模型时,如何最大限度地利用反向传播算法的技巧和诀窍。
看完这篇文章,你会知道:
- 训练神经网络的挑战实际上是学习训练数据集和推广到训练数据集之外的新例子之间的平衡。
- 八个具体的技巧,你可以用来训练更好的神经网络模型,更快。
- 二阶优化算法,在某些情况下也可以用来训练神经网络。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
配置反向传播以训练更好的神经网络的 8 个技巧,更快
图片由詹明斯 1提供,保留部分权利。
帖子概述
本教程分为五个部分;它们是:
- 高效背板概述
- 学习和概括
- 反向传播的 8 个实用技巧
- 二阶优化算法
- 讨论和结论
高效背板概述
1998 年出版的名为《神经网络:交易技巧》的书提供了一系列由学者和神经网络从业者撰写的章节,描述了配置和使用神经网络模型的最佳实践。
该书在深度学习复兴的风口浪尖进行了更新,2012 年发布了包含 13 个新章节的第二版。
这两个版本的第一章的标题都是由扬·勒昆、莱昂·博图(都在脸书人工智能公司)吉纳维芙·奥尔和克劳斯-罗伯特·穆勒(也是本书的共同编辑)撰写的高效反向传播。
这一章也可以作为预印本在网上免费获得。
- 高效背板,预印本,1998 年。
这一章也在两个版本的《速度学习》一书中的序言中进行了总结
这是一个重要的章节和文件,因为它提供了一个关于如何在 1998 年的随机梯度下降下最好地配置反向传播的几乎详尽的总结,并且许多建议在今天也是相关的。
在这篇文章中,我们将专注于这一章或论文,并试图提炼出与现代深度学习实践者最相关的建议。
作为参考,本章分为 10 节;它们是:
- 1.1:导言
- 1.2:学习和概括
- 1.3:标准反向传播
- 1.4:一些实用技巧
- 1.5:梯度下降的收敛
- 1.6:经典二阶优化方法
- 1.7:计算多层网络中黑森信息的技巧
- 1.8:多层网络中的黑森分析
- 1.9:将二阶方法应用于多层网络
- 1.10:讨论和结论
我们将重点介绍配置反向传播和随机梯度下降的技巧和诀窍。
学习和概括
本章首先描述了神经网络模型的学习和推广的双重挑战的一般问题。
作者通过强调反向传播算法是训练神经网络模型最广泛使用的算法来激励文章,因为它有效并且高效。
反向传播是一种非常流行的神经网络学习算法,因为它概念简单,计算效率高,并且经常有效。然而,让它很好地发挥作用,有时甚至完全发挥作用,与其说是一门科学,不如说是一门艺术。
作者还提醒我们,用反向传播训练神经网络真的很难。尽管该算法既有效又高效,但它需要仔细配置多个模型属性和模型超参数,其中每一个都需要对算法有深刻的了解和经验才能正确设置。
然而,没有规则可以遵循来“最好地”配置模型和训练过程。
使用 backprop 设计和训练网络需要做出许多看似任意的选择,例如节点的数量和类型、层次、学习率、训练和测试集等等。这些选择可能至关重要,但没有万无一失的方法来决定它们,因为它们在很大程度上依赖于问题和数据。
训练神经网络模型的目标最具挑战性,因为它需要同时解决两个难题:
- 学习训练数据集,以便最好地最小化损失。
- 概括模型表现,以便对未知示例进行预测。
这些问题之间有一个权衡,因为一个学习得太好的模型会概括得很差,而一个概括得很好的模型可能会有所欠缺。很好地训练神经网络的目标是在这两个关注点之间找到一个愉快的平衡。
这一章的重点是改善最小化成本函数过程的策略。然而,这些策略必须与最大化网络泛化能力的方法结合使用,也就是说,为学习系统以前没有见过的模式预测正确的目标。
有趣的是,训练神经网络模型的问题是根据偏差-方差权衡来解决的,通常用于描述一般的机器学习算法。
当拟合神经网络模型时,这些术语可以定义为:
- 偏差:衡量所有数据集的网络输出平均值与期望函数的差异。
- 方差:衡量网络输出在不同数据集之间的差异程度。
这种框架模型将模型的容量定义为偏差的选择,控制可以学习的功能范围。它将方差作为训练过程的函数,并在过拟合训练数据集和泛化误差之间取得平衡。
这个框架也有助于理解训练过程中模型表现的动态变化。即从训练开始时偏差大、方差小的模型,到训练结束时偏差较低、方差较大的模型。
在训练的早期,偏差很大,因为网络输出与期望的功能相差甚远。方差很小,因为数据还没有什么影响。在训练后期,偏差很小,因为网络已经学会了底层功能。
这些是模型的正常动态,尽管在训练时,我们必须防止训练模型太多和过拟合训练数据集。这使得模型变得脆弱,降低了偏差,使模型专门用于训练例子,进而导致更大的差异。
然而,如果训练时间过长,网络也将学习到该数据集特有的噪声。这被称为过度训练。在这种情况下,方差会很大,因为数据集之间的噪声不同。
对反向传播算法的关注意味着以暂时忽略“*泛化”*为代价,专注于“学习”,这可以在后面通过引入正则化技术来解决。
专注于学习意味着专注于快速(快速学习)和有效(学好)减少损失。
因此,本章的思想是提出最小化策略(给定一个成本函数)以及与提高最小化速度和质量相关的技巧。
反向传播的 8 个实用技巧
本章的重点是反向传播的一系列实用技巧,以更好地训练神经网络模型。
有八招;它们是:
- 1.4.1:随机学习与批量学习
- 1.4.2:打乱示例
- 1.4.3:标准化输入
- 1.4.4:乙状结肠
- 1.4.5:选择目标值
- 1.4.6:初始化权重
- 1.4.7:选择学习率
- 1.4.8:径向基函数与 Sigmoid
这一部分首先评论说,我们试图用随机梯度下降和反向传播解决的优化问题是具有挑战性的。
反向传播可能非常慢,特别是对于多层网络,其中成本面通常是非二次的、非凸的和高维的,具有许多局部最小值和/或平坦区域。
作者继续强调,在选择随机梯度下降和反向传播算法来优化和更新权重时,我们没有表现保证。
没有公式可以保证(1)网络会收敛到一个好的解,(2)收敛很快,或者(3)收敛甚至会发生。
这些评论为这些技巧提供了背景,这些技巧也没有保证,反而增加了更快找到更好模型的可能性。
让我们依次仔细看看每个技巧。
许多技巧都集中在 sigmoid (s 形)激活函数上,这不再是用于隐藏层的最佳实践,而是被修正的线性激活函数所取代。因此,我们花在乙状结肠相关技巧上的时间会更少。
技巧 1:随机学习和批量学习
本技巧强调了在训练模型时使用随机梯度下降还是批量梯度下降的选择。
随机梯度下降,也称为在线梯度下降,是指一种算法版本,其中误差梯度是从训练数据集中随机选择的单个例子中估计的,然后更新模型参数(权重)。
它具有快速训练模型的效果,尽管它会导致模型权重的大的、有噪声的更新。
出于以下三个原因,随机学习通常是基本反向传播的首选方法:
1.随机学习通常比批量学习快得多。
2。随机学习通常也会产生更好的解决方案。
3。随机学习可用于跟踪变化。
批量梯度下降涉及使用训练数据集中所有示例的平均值来估计误差梯度。执行起来更快,从理论角度更好理解,但导致学习速度更慢。
尽管随机学习有很多优点,但仍然有理由考虑使用批处理学习:
1.收敛的条件是众所周知的。
2。许多加速技术(例如共轭梯度)仅在批处理学习中运行。
3。重量动态和收敛速度的理论分析更简单。
一般来说,作者建议尽可能使用随机梯度下降,因为它提供了更快的模型训练。
尽管有批量更新的优势,随机学习仍然经常是首选方法,特别是在处理非常大的数据集时,因为它简单得多。
他们建议利用学习率衰减时间表来抵消随机梯度下降期间权重更新的噪声影响。
…噪声对于寻找更好的局部极小值至关重要,它也阻碍了完全收敛到最小值。[……]因此,为了减少波动,我们可以降低(退火)学习率,或者采用自适应批量。
他们还建议使用小批量的样本来减少权重更新的噪音。在这种情况下,误差梯度是在训练数据集中的一小部分样本上估计的,而不是在随机梯度下降的情况下的一个样本,或者在分批梯度下降的情况下的所有样本。
这种变化后来被称为小批量梯度下降,是训练神经网络时的默认值。
另一种去除噪声的方法是使用“小批量”,即从小批量开始,并随着训练的进行增加批量。
技巧 2:打乱例子
本技巧强调了在培训过程中向模型显示的示例顺序对培训过程的重要性。
一般来说,作者强调,当用于更新模型的下一个示例不同于前一个示例时,学习算法的表现会更好。理想情况下,它是模型中最不同或最陌生的。
网络从最意想不到的样本中学习最快。因此,建议在每次迭代中选择一个系统最不熟悉的样本。
实现这个技巧的一个简单方法是确保用于更新模型参数的连续示例来自不同的类。
……粗略实现这一想法的一个非常简单的技巧是简单地选择来自不同类的连续示例,因为属于同一类的训练示例很可能包含相似的信息。
这个技巧也可以通过向模型展示和重新展示例子来实现,在进行预测时,模型会犯最大的错误。这种方法可能是有效的,但是如果在训练期间被过度表示的例子是异常值,也会导致灾难。
选择信息量最大的示例
1.打乱训练集,以便连续的训练示例从不(很少)属于同一个类。
2。给出比产生小误差的例子更频繁地产生大误差的输入例子
技巧 3:标准化输入
本技巧强调了在训练神经网络模型之前数据准备的重要性。
作者指出,当训练数据集中的例子总和为零时,神经网络通常学习得更快。这可以通过从每个输入变量中减去平均值来实现,称为居中。
如果训练集中每个输入变量的平均值接近零,收敛通常会更快。
他们还评论说,当应用于来自先前层的隐藏层的输入时,输入的这种居中也改善了模型的收敛性。这令人着迷,因为它为近 15 年后开发并广泛流行的批量标准化技术奠定了基础。
因此,最好移动输入,使训练集的平均值接近零。这种启发式方法应该应用于所有层,这意味着我们希望节点输出的平均值接近于零,因为这些输出是下一层的输入
作者还评论了标准化输入变量分布的必要性。这可以通过用标准偏差除这些值来实现。对于具有高斯分布的变量,以这种方式对值进行居中和归一化意味着它们将被简化为平均值为零、标准偏差为 1 的标准高斯分布。
缩放加速学习,因为它有助于平衡连接到输入节点的权重的学习速度。
最后,他们建议将输入变量去相关。这意味着消除输入变量之间的任何线性相关性,并且可以使用主成分分析作为数据转换来实现。
主成分分析(也称为卡尔洪恩-洛夫展开)可用于消除输入中的线性相关性
关于数据准备的提示可以总结如下:
转换输入
1.训练集中每个输入变量的平均值应该接近于零。
2。缩放输入变量,使它们的协方差大致相同。
3。如果可能,输入变量应该是不相关的。
这三个推荐的居中、归一化和去相关的数据准备步骤被很好地总结在一个图表中,从下面的书中复制:
输入转换
摘自第 18 页,“神经网络:交易技巧
当在网络的隐藏层中使用更现代的 ReLU 激活函数时,输入变量的居中可能是也可能不是最好的方法,所以我建议在为模型准备数据时评估标准化和规范化过程。
技巧 4:乙状结肠
本技巧建议在网络的隐藏层中使用 sigmoid 激活函数。
非线性激活函数赋予神经网络非线表现力。激活功能最常见的形式之一是 sigmoid …
具体来说,作者将 sigmoid 激活函数称为任何 S 形函数,例如 logistic(称为 sigmoid)或双曲正切函数(称为 tanh)。
像双曲正切这样的对称 sigmoids 通常比标准 logistic 函数收敛得更快。
作者建议修改默认函数(如果需要),使函数的中点为零。
对隐藏层使用逻辑和 tanh 激活函数不再是明智的默认,因为使用 ReLU 的表现模型收敛得更快。
技巧 5:选择目标值
本技巧强调了对目标变量选择的更仔细的考虑。
在二分类问题的情况下,当分别使用交叉熵或铰链损失函数时,目标变量可能在逻辑激活函数极限的集合{0,1}中,或者在双曲正切函数的集合{-1,1}中,甚至在现代神经网络中也是如此。
作者认为,在激活函数的极端使用值可能会使学习问题更具挑战性。
常识似乎表明,目标值应该设置在 sigmoid 渐近线的值。然而,这有几个缺点。
他们建议,在激活函数的饱和点(边缘)实现值可能需要越来越大的权重,这可能会使模型不稳定。
解决这个问题的一种方法是使用远离输出函数边缘的目标值。
选择 sigmoid 上最大二阶导数点的目标值,以避免输出单元饱和。
我记得在 20 世纪 90 年代,通常的建议是将{0.1 和 0.9}集合中的目标值与逻辑函数一起使用,而不是{0 和 1}。
技巧 6:初始化权重
本技巧强调了权重初始化方案选择的重要性,以及它如何与激活函数的选择紧密相关。
在 sigmoid 激活函数的情况下,他们建议选择网络的初始权重来激活线性区域中的函数(例如,S 形的直线部分而不是曲线部分)。
权重的起始值会对训练过程产生重大影响。权重应随机选择,但应使 sigmoid 主要在其线性区域激活。
该建议也适用于 ReLU 的权重激活,其中函数的线性部分为正。
这突出了初始权重对学习的重要影响,其中大权重使激活函数饱和,导致学习不稳定,小权重导致梯度非常小,进而导致学习缓慢。理想情况下,我们寻求激活函数的线性(非曲线)部分的模型权重。
……在 sigmoid 线性区域范围内的权重具有以下优势:( 1)梯度足够大,学习可以继续进行;( 2)网络将在更困难的非线性部分之前学习映射的线性部分。
作者提出了一种随机权重初始化方案,使用前一层的节点数,即所谓的扇入。这很有趣,因为它是后来被称为泽维尔权重初始化方案的前身。
技巧 7:选择学习速度
这个技巧强调了选择学习率的重要性。
学习率是算法每次迭代更新模型权重的数量。较小的学习率会导致较慢的收敛,但可能会得到较好的结果,而较大的学习率会导致较快的收敛,但可能会得到不太理想的结果。
作者建议当权重值开始前后变化时,例如振荡,降低学习率。
这些方案大多在权重向量“振荡”时降低学习率,而在权重向量遵循相对稳定的方向时提高学习率。
他们评论说,当使用在线梯度下降时,这是一个硬策略,因为默认情况下,权重会波动很大。
作者还建议对模型中的每个参数使用一个学习率。目标是帮助模型的每个部分以相同的速度收敛。
……很明显,为每个权重选择不同的学习率(eta)可以提高收敛性。[……]主要理念是确保网络中的所有权重以大致相同的速度收敛。
他们将该属性称为每个模型参数的“均衡学习速度”。
均衡学习速度
–给每个权重赋予自己的学习率
–学习率应与单元输入数量的平方根
成比例–较低层的权重通常应大于较高层的权重
除了使用每个参数的学习率,作者还建议使用动量和自适应学习率。
有趣的是,这些建议后来被载入了像 AdaGrad 和 Adam 这样的方法中,这些方法现在是流行的默认值。
技巧 8:径向基函数与 Sigmoid 单位
这最后的提示今天可能不太相关,我建议在某些情况下尝试径向基函数(RBF)而不是 sigmoid 激活函数。
作者建议,训练径向基函数单元可以比使用乙状结肠激活的训练单元更快。
与可以覆盖整个空间的乙状线单元不同,单个径向基函数单元只覆盖输入空间的一小部分局部区域。这可能是一个优势,因为学习可以更快。
理论基础
在这些提示之后,作者继续提供一个理论基础,说明为什么这些提示中的许多是一个好主意,并且期望在训练神经网络模型时导致更好或更快的收敛。
具体来说,该分析支持的提示是:
- 从输入变量中减去平均值
- 标准化输入变量的方差。
- 去相关输入变量。
- 对每个权重使用单独的学习率。
二阶优化算法
这一章的剩余部分集中于使用二阶优化算法来训练神经网络模型。
这可能不是每个人都喜欢的,需要有背景和对矩阵演算的良好记忆。你可能想跳过它。
您可能还记得,一阶导数是函数的斜率(有多陡),反向传播使用一阶导数按照模型输出误差的比例更新模型。这些方法被称为一阶优化算法,例如在模型输出中使用误差一阶导数的优化算法。
你可能还记得微积分中二阶导数是一阶导数的变化率,或者在这种情况下是误差梯度本身的梯度。它给出了当前权重集的损失函数曲线的概念。使用二阶导数的算法被称为二阶优化算法。
作者接着介绍了五种二阶优化算法,具体如下:
- 牛顿
- 共轭梯度
- 高斯-牛顿
- 莱文伯格·马夸特
- 准牛顿(BFGS)
这些算法需要访问黑森矩阵或黑森矩阵的近似。如果你介绍了反向传播算法的理论,你可能还记得黑森矩阵。在一个手波的方式,我们使用黑森来描述模型权重的二阶导数。
作者继续概述了一些方法,可以用来近似黑森矩阵(用于二阶优化算法),如:有限差分,平方雅可比近似,黑森对角线,等等。
然后他们继续分析多层神经网络中的 Hessian 和二阶优化算法的有效性。
总之,他们强调,也许二阶方法更适合使用批量梯度下降训练的较小的神经网络模型。
经典的二阶方法在几乎所有有用的情况下都是不切实际的。
讨论和结论
这一章以一个非常有用的总结结束,总结了在训练神经网络模型时如何最大限度地利用反向传播的技巧。
该摘要转载如下:
–打乱示例
–通过减去平均值
将输入变量居中–将输入变量标准化为 1
的标准偏差–如果可能,将输入变量去相关。
–选择具有图 1.4 所示 sigmoid 功能的网络
–在 sigmoid 范围内设置目标值,通常为+1 和-1。
–将权重初始化为随机值(如 1.16 所述)。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
- 神经网络:交易技巧,第一版,1998 年。
- 神经网络:交易的诀窍,第二版,2012 年。
- 高效背板,预印本,1998 年。
- 黑森矩阵,维基百科。
摘要
在这篇文章中,你发现了在训练神经网络模型时最大限度地利用反向传播算法的技巧和诀窍。
你在你的项目中尝试过这些技巧吗?
在下面的评论中让我知道你的结果。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
如何获得更好的深度学习效果(7 天迷你课程)
原文:https://machinelearningmastery.com/better-deep-learning-neural-networks-crash-course/
最后更新于 2020 年 1 月 8 日
更好的深度学习神经网络速成班。
在 7 天内从深度学习模式中获得更好的表现。
配置神经网络模型通常被称为“黑暗艺术”
这是因为没有针对给定问题配置网络的硬性规则。我们无法分析计算给定数据集的最佳模型类型或模型配置。
幸运的是,在配置和训练神经网络时,有一些已知的技术可以解决特定的问题,这些技术在现代深度学习库中是可用的,比如 Keras。
在本速成课程中,您将发现如何在七天内自信地从深度学习模型中获得更好的表现。
这是一个又大又重要的岗位。你可能想把它做成书签。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
- 2020 年 1 月更新:更新了 Keras 2.3 和 TensorFlow 2.0 的 API。
如何获得更好的深度学习表现(7 天迷你课程)
图片由达米安·加达尔提供,版权所有。
这个速成班是给谁的?
在我们开始之前,让我们确保你在正确的地方。
下面的列表提供了一些关于本课程是为谁设计的一般指南。
你需要知道:
- 绕过基本的 Python 和 NumPy。
- 深度学习的基础知识。
你不需要知道:
- 如何成为数学奇才!
- 如何成为深度学习专家!
这个速成课程将把你从一个知道一点深度学习的开发人员带到一个可以在深度学习项目中获得更好表现的开发人员。
注意:本速成课程假设您有一个工作正常的 Python 2 或 3 SciPy 环境,其中至少安装了 NumPy 和 Keras 2。如果您需要环境方面的帮助,可以遵循这里的逐步教程:
- 如何用 Anaconda 建立机器学习和深度学习的 Python 环境
速成班概述
这门速成课分为七节课。
您可以每天完成一节课(推荐)或一天内完成所有课程(硬核)。这真的取决于你有多少时间和你的热情程度。
以下七节课将让您自信地提高深度学习模式的绩效:
- 第 01 课:更好的深度学习框架
- 第 02 课:批量
- 第 03 课:学习进度计划表
- 第 04 课:批次正常化
- 第 05 课:权重正则化
- 第 06 课:增加噪音
- 第 07 课:提前停止
每节课可能需要你 60 秒或 30 分钟。慢慢来,按照自己的节奏完成课程。提问,甚至在下面的评论中发布结果。
这些课程期望你去发现如何做事。我会给你提示,但每节课的一部分要点就是逼你学会去哪里找帮助(提示,我所有的答案都直接在这个博客上;使用搜索框)。
我确实以相关帖子链接的形式提供了更多帮助,因为我想让你建立一些信心和惰性。
在评论中发布您的结果;我会为你加油的!
坚持住。不要放弃。
注:这只是速成班。要了解更多细节和充实的教程,请参阅我的书,主题为“T2 更好的深度学习”
第 01 课:更好的深度学习框架
在本课中,您将发现一个框架,可以用来系统地提高深度学习模型的表现。
现代深度学习库(如 Keras)允许您在几分钟内用几行代码定义并开始拟合各种神经网络模型。
然而,配置神经网络以在新的预测建模问题上获得良好的表现仍然是一个挑战。
就深度学习神经网络模型的不良表现而言,有三种类型的问题很容易诊断;它们是:
- 学习上的问题。学习中的问题表现在模型不能有效地学习训练数据集,或者在学习训练数据集时表现出缓慢的进度或糟糕的表现。
- 泛化的问题。泛化的问题表现在一个模型中,该模型过度扩展了训练数据集,并且在保持数据集上表现不佳。
- 预测问题。预测的问题表现为随机训练算法对最终模型有很大的影响,导致行为和表现的巨大差异。
提议的细分中三个领域之间的顺序关系允许深度学习模型表现的问题首先被隔离,然后用特定的技术或方法作为目标。
我们可以将有助于解决这些问题的技术总结如下:
- 更好的学习。响应于训练数据集改进或加速神经网络模型权重自适应的技术。
- 更好的概括。提高神经网络模型在保持数据集上的表现的技术。
- 更好的预测。降低最终模型表现差异的技术。
您可以使用这个框架来首先诊断您的问题类型,然后确定一种技术来评估以尝试解决您的问题。
你的任务
在本课中,您必须列出属于框架三个领域的两种技术或关注领域。
有问题吗?请注意,作为本小型课程的一部分,我们将从三个领域中的两个领域寻找一些示例。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将发现如何控制批量学习的速度。
第 02 课:批量
在本课中,您将发现批次大小在训练神经网络时的重要性。
使用梯度下降来训练神经网络,其中基于训练数据集的子集来计算用于更新权重的误差估计。
误差梯度估计中使用的训练数据集中的示例数称为批量,是影响学习算法动态性的重要超参数。
批量的选择控制算法学习的速度,例如:
- 批量梯度下降。批量大小设置为训练数据集中的示例数,误差估计更准确,但权重更新之间的时间更长。
- 随机梯度下降。批次大小设置为 1,误差估计值有噪声,但权重经常更新。
- 迷你批次梯度下降。批处理大小设置为大于 1 且小于训练示例数的值,在批处理和随机梯度下降之间进行权衡。
Keras 允许您通过 fit() 函数的 batch_size 参数来配置批次大小,例如:
# fit model
history = model.fit(trainX, trainy, epochs=1000, batch_size=len(trainX))
下面的例子演示了一个多层感知器,它在二进制分类问题上具有批量梯度下降。
# example of batch gradient descent
from sklearn.datasets import make_circles
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=1000, noise=0.1, random_state=1)
# split into train and test
n_train = 500
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(50, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile model
opt = SGD(lr=0.01, momentum=0.9)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=1000, batch_size=len(trainX), verbose=0)
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
对于本课,您必须对每种梯度下降类型(批处理、小批量和随机)运行代码示例,并描述它在训练期间对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将了解如何在培训过程中根据学习进度计划对模型进行微调
第 03 课:学习进度计划
在本课中,您将了解如何配置自适应学习率计划,以便在培训运行期间微调模型。
在这个搜索过程的每一步中,模型的变化量,或者说步长,被称为“学习率”,它可能提供了最重要的超参数来调整你的神经网络,以便在你的问题上取得良好的表现。
配置一个固定的学习率是非常具有挑战性的,需要仔细的实验。使用固定学习率的替代方法是在整个训练过程中改变学习率。
Keras 提供了reduce lronplateaau学习率计划,当检测到模型表现平稳时,例如,给定数量的训练时期没有变化,该计划将调整学习率。例如:
# define learning rate schedule
rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_delta=1E-7, verbose=1)
该回调旨在降低模型停止改进后的学习率,希望在训练过程中微调模型权重。
下面的示例演示了一个多层感知器,该感知器在二进制分类问题上有一个学习率计划,如果在 5 个训练时期内没有检测到验证损失的变化,学习率将降低一个数量级。
# example of a learning rate schedule
from sklearn.datasets import make_circles
from keras.layers import Dense
from keras.models import Sequential
from keras.optimizers import SGD
from keras.callbacks import ReduceLROnPlateau
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=1000, noise=0.1, random_state=1)
# split into train and test
n_train = 500
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(50, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile model
opt = SGD(lr=0.01, momentum=0.9)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
# define learning rate schedule
rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_delta=1E-7, verbose=1)
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=300, verbose=0, callbacks=[rlrp])
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
在本课中,您必须在有和没有学习率计划的情况下运行代码示例,并描述学习率计划在培训期间对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将发现如何通过批处理规范化来加速培训过程
第 04 课:批量标准化
在本课中,您将发现如何使用批处理规范化来加速深度学习神经网络的训练过程。
批处理规范化,简称 batchnorm,是一种帮助协调模型中多个层的更新的技术。
引入批量归一化的论文作者将训练期间输入分布的变化称为“内部协变量移位”。批处理规范化旨在通过缩放前一层的输出来对抗内部协变量偏移,特别是通过标准化每个小批处理的每个输入变量的激活,例如前一层节点的激活。
Keras 通过单独的批处理规范化层支持批处理规范化,该层可以添加到模型的隐藏层之间。例如:
model.add(BatchNormalization())
下面的例子演示了一个多层感知器模型,它对二进制分类问题进行了批量规范化。
# example of batch normalization
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
from keras.layers import BatchNormalization
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=1000, noise=0.1, random_state=1)
# split into train and test
n_train = 500
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(50, input_dim=2, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation='sigmoid'))
# compile model
opt = SGD(lr=0.01, momentum=0.9)
model.compile(loss='binary_crossentropy', optimizer=opt, metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=300, verbose=0)
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
对于本课,您必须运行带有和不带有批处理规范化的代码示例,并描述批处理规范化在训练期间对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将发现如何使用权重正则化来减少过拟合。
第 05 课:权重正则化
在本课中,您将发现如何使用权重正则化来减少深度学习神经网络的过拟合。
权重大的模型比权重小的模型更复杂。这是一个网络的迹象,可能过于专门用于训练数据。
学习算法可以更新,以鼓励网络使用小权重。
一种方法是改变网络优化中使用的损耗计算,同时考虑权重的大小。这被称为权重正则化或权重衰减。
Keras 通过层上的核正则化器参数支持权重正则化,可以配置为使用 L1 或 L2 向量范数,例如:
model.add(Dense(500, input_dim=2, activation='relu', kernel_regularizer=l2(0.01)))
下面的例子演示了一个多层感知器模型,它在二分类问题上具有权重衰减。
# example of weight decay
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.regularizers import l2
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
# split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu', kernel_regularizer=l2(0.01)))
model.add(Dense(1, activation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
对于本课,您必须运行带有和不带权重正则化的代码示例,并描述它在训练期间对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将发现如何通过向模型添加噪声来减少过拟合
第 06 课:添加噪音
在本课中,您将发现在训练过程中向神经网络添加噪声可以提高网络的鲁棒性,从而获得更好的泛化能力和更快的学习速度。
使用小数据集训练神经网络会导致网络记住所有训练示例,进而导致在保持数据集上表现不佳。
使输入空间更平滑、更容易学习的一种方法是在训练过程中给输入添加噪声。
在神经网络模型的训练期间添加噪声具有正则化效果,并且反过来提高了模型的鲁棒性。
噪声可以通过高斯噪声层添加到你的模型中。例如:
model.add(GaussianNoise(0.1))
噪声可以添加到输入层或隐藏层之间的模型中。
下面的例子演示了一个多层感知器模型,在二进制分类问题上隐藏层之间增加了噪声。
# example of adding noise
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import GaussianNoise
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
# split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(GaussianNoise(0.1))
model.add(Dense(1, activation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
对于本课,您必须运行添加和不添加噪声的代码示例,并描述它在训练过程中对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
在下一课中,您将发现如何使用提前停止来减少过拟合。
第 07 课:提前停止
在本课中,您将发现在神经网络过度训练数据集之前尽早停止神经网络的训练可以减少过度训练并提高深度神经网络的泛化能力。
训练神经网络的一个主要挑战是训练它们需要多长时间。
太少的训练将意味着模型将会使火车和测试设备下不来。过多的训练将意味着模型会过度训练训练数据集,并且在测试集上表现不佳。
一种折中的方法是在训练数据集上进行训练,但在验证数据集的表现开始下降时停止训练。这种简单、有效且广泛使用的神经网络训练方法被称为提前停止。
Keras 支持通过提前停止回调来提前停止,该回调允许您指定训练期间要监控的指标。
# patient early stopping
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
下面的示例演示了一个多层感知器,它在二进制分类问题上提前停止,当验证损失在 200 个训练时期内没有改善时,它将停止。
# example of early stopping
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping
from matplotlib import pyplot
# generate dataset
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
# split into train and test
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# patient early stopping
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=200)
# fit model
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0, callbacks=[es])
# evaluate the model
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
# plot loss learning curves
pyplot.subplot(211)
pyplot.title('Cross-Entropy Loss', pad=-40)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
# plot accuracy learning curves
pyplot.subplot(212)
pyplot.title('Accuracy', pad=-40)
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
你的任务
对于本课,您必须在有和没有提前停止的情况下运行代码示例,并描述它在培训期间对学习曲线的影响。
在下面的评论中发表你的答案。我很想看看你的发现。
然后
这是你的最后一课。
末日!
( 看你走了多远!)
你成功了。干得好!
花一点时间,回头看看你已经走了多远。
你发现了:
- 一个框架,您可以使用它来系统地诊断和改进深度学习模型的表现。
- 批量可以用来控制估计误差的准确率和训练过程中的学习速度。
- 学习率计划可用于在训练期间微调模型权重。
- 批量归一化可用于显著加速神经网络模型的训练过程。
- 权重正则化将基于权重的大小惩罚模型,并减少过拟合。
- 添加噪声将使模型对输入差异更加稳健,并减少过拟合
- 提前停止将在正确的时间停止训练过程,减少过度训练。
这只是您深度学习绩效提升之旅的开始。不断练习和发展你的技能。
进行下一步,查看我的关于通过深度学习获得更好表现的书。
摘要
你觉得迷你课程怎么样?
你喜欢这个速成班吗?
你有什么问题吗?有什么症结吗?
让我知道。请在下面留言。
3 本深度学习实践者必备书籍
原文:https://machinelearningmastery.com/books-for-deep-learning-practitioners/
最后更新于 2019 年 8 月 6 日
开发神经网络通常被称为一门黑暗的艺术。
其原因是,熟练开发神经网络模型来自经验。没有可靠的方法来分析计算如何为您的特定数据集设计“好”或“最好”的模型。你必须从经验和实验中吸取教训,才能发现解决问题的方法。
很多这样的经验可以来自于实际开发测试问题的神经网络。
尽管如此,许多人以前来过,并记录了他们的发现、最佳实践和首选技术。关于如何设计和配置神经网络,你可以从这个主题的一些最佳书籍中了解到很多。
在这篇文章中,你将发现我推荐阅读的三本书,在为你的数据集开发神经网络时,它们就在你身边。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
神经网络三本推荐书籍
如果你是神经网络从业者,我认为你必须拥有三本书的物理副本。
它们是:
- 用于模式识别的神经网络,1995。
- 神经锻造:前馈人工神经网络中的监督学习,1999。
- 深度学习,2016 年。
这些书是参考资料,不是教程。
在项目之前和项目期间,你一次又一次地使用它们,以确保你能从你的数据和模型中得到你能得到的一切。
这些是我一直在读和参考的书。如果你在开发神经网络模型时有推荐的书籍,请在下面的评论中告诉我。
现在,让我们依次仔细看看每本书。
模式识别的神经网络
模式识别的神经网络
大约十年后,这本伟大的书被仍然经典的教科书模式识别和机器学习(亲切地称为 PRML)所继承。克里斯托弗·毕晓普既是爱丁堡大学的教授,也是微软剑桥研究实验室(T3)的主任。
这本书是神经网络领域的经典之作。这是一本手册,轻松地抓住了当时的理论状态,以及近 25 年后的今天仍然适用的技术。
尽管从头到尾阅读这本书会为你提供一个坚实的基础,但我还是鼓励你把它作为一个参考,让你的神经网络模型发挥最大的作用。
我建议根据需要浏览以下章节:
- 第七章:参数优化算法
- 第八章:预处理和特征提取
- 第九章:学习与概括。
光是这本书的第九章就值这个价了,给出了一系列你应该测试的正则化方法和集成方法的描述。
我推荐这本书,因为几乎每天都有新方法的描述,实践者经常会忘记那些尝试过的真正的基础知识。
我想这本书已经不印刷了,但是你可以在网上到处找到二手的和国际版的。
神经锻造:前馈人工神经网络中的监督学习
神经锻造:前向人工神经网络中的监督学习由罗素·里德和罗伯特·马克斯于 1999 年发布。
神经锻造:前馈人工神经网络中的监督学习
我很喜欢这本书。
它发布后不久,我就购买了它,并将其用作我自己在整个 21 世纪实现神经网络算法的参考。
这本书有两点我最喜欢:
- 密码
- 情节
这本书使用数学和描述来解释概念,但重要的是,它们还使用伪代码或 ANSI C 的片段来展示事物是如何工作的。这在你第一次编写错误或激活函数的反向传播代码时是非常宝贵的。
这本书还使用了决策面模型的图。这对于理解模型在不同学习算法下的训练过程中正在做什么/看到什么,以及正则化之类的东西如何影响模型是非常宝贵的。
考虑到作者对该领域的兴趣,也许过度关注修剪方法;尽管如此,我还是建议在开发自己的模型时阅读以下章节:
- 第十四章:影响概括的因素
- 第十五章:概括预测和评估
- 第十六章:提高概括能力的启发法
- 第十七章:带噪声输入的训练效果
虽然我建议买下这本书,放在你身边(永远如此),但罗伯特·马克斯在他的网站上有这本书的转载,格式为 HTML:
深度学习
由伊恩·古德费勒、约斯华·本吉奥和亚伦·库维尔合作的《深度学习》于 2016 年上映。
深度学习
这是 90 年代经典书籍与现代深度学习之间缺失的桥梁。
重要的是,引入神经网络时仔细提到了使该领域成为今天这样的创新和里程碑。具体来说第六章:深度前馈网络和第 6.6 节历史笔记。
有三章是神经网络从业者必读;它们是:
- 第七章:深度学习的正则化
- 第八章:深度模型训练的优化
- 第十一章:实践方法论
第十一章尤其重要,因为它将具体的方法以及如何和何时在实践中使用它们联系在一起。光是这本书的买价就值这么多。
这是必须有的。你需要这本书的实体拷贝。尽管如此,全文可在图书网站上找到:
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 用于模式识别的神经网络,1995。
- 神经锻造:前馈人工神经网络中的监督学习,1999。
- 深度学习,2016 年。
附加书籍
- 模式识别与机器学习,2006。
其他链接
摘要
在这篇文章中,你发现了我认为每个神经网络从业者都必须拥有的三本参考书。
你自己使用这些书中的一本或多本吗?
你大量引用哪些章节?
还有其他你经常参考的书吗?
下面让我知道。
用于深度神经网络正则化的丢弃法的温和介绍
原文:https://machinelearningmastery.com/dropout-for-regularizing-deep-neural-networks/
最后更新于 2019 年 8 月 6 日
深度学习神经网络很可能用很少的例子来快速过度训练训练数据集。
已知具有不同模型配置的神经网络的集成减少了过拟合,但是需要训练和维护多个模型的额外计算费用。
通过在训练期间随机丢弃节点,可以使用单个模型来模拟拥有大量不同的网络架构。这被称为丢失,并提供了一种计算量非常小且非常有效的正则化方法来减少过拟合并改善各种深度神经网络中的泛化误差。
在这篇文章中,你将会发现使用丢失正则化来减少过拟合和提高深度神经网络的泛化能力。
看完这篇文章,你会知道:
- 神经网络中的大权重是一个更复杂的网络过度训练数据的标志。
- 概率性地丢弃网络中的节点是一种简单有效的正则化方法。
- 使用 drop 时,建议使用具有更多训练和使用权重约束的大型网络。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
《深度神经网络规范化的丢弃生入门》摄影:乔斯林·金霍恩,版权所有。
概观
本教程分为五个部分;它们是:
- 过拟合的问题
- 随机删除节点
- 如何丢弃
- 使用丢弃的例子
- 使用流失正则化的技巧
过拟合的问题
在相对较小的数据集上训练的大型神经网络会过度训练训练数据。
这具有模型学习训练数据中的统计噪声的效果,当在新数据(例如测试数据集)上评估模型时,这导致较差的表现。泛化误差由于过拟合而增加。
减少过拟合的一种方法是在同一数据集上拟合所有可能的不同神经网络,并对每个模型的预测进行平均。这在实践中是不可行的,并且可以使用不同模型的小集合来近似,称为集合。
通过无限制的计算,对固定大小的模型进行“规则化”的最佳方式是对参数的所有可能设置的预测进行平均,在给定训练数据的情况下,通过其后验概率对每个设置进行加权。
——丢弃:防止神经网络过拟合的简单方法,2014。
即使是集成近似也存在一个问题,即需要拟合和存储多个模型,如果模型很大,需要几天或几周的时间来训练和调整,这可能是一个挑战。
随机删除节点
Dropout 是一种近似并行训练大量不同结构神经网络的正则化方法。
在训练过程中,一些层输出被随机忽略或“掉出”这样做的效果是使该层看起来像一个具有不同节点数和与前一层连接性的层,并被当作一个层来对待。实际上,在训练期间对层的每次更新都是使用已配置层的不同“视图”来执行的。
放弃一个单元,我们指的是暂时将它从网络中移除,以及它的所有传入和传出连接
——丢弃:防止神经网络过拟合的简单方法,2014。
退出会使训练过程变得嘈杂,迫使层内的节点在概率上承担或多或少的输入责任。
这种概念化表明,可能是丢弃打破了网络层共同适应纠正前几层的错误的情况,反过来使模型更加健壮。
…单位可能会改变,以弥补其他单位的错误。这可能会导致复杂的共同适应。这反过来会导致过拟合,因为这些协同适应不会推广到看不见的数据。[…]
——丢弃:防止神经网络过拟合的简单方法,2014。
Dropout 模拟来自给定层的稀疏激活,有趣的是,这反过来鼓励网络实际学习稀疏表示作为副作用。因此,它可以用作活动正则化的替代,以鼓励自动编码器模型中的稀疏表示。
我们发现,作为放弃的副作用,隐藏单元的激活变得稀疏,即使不存在稀疏诱导正则化。
——丢弃:防止神经网络过拟合的简单方法,2014。
因为丢失层的输出是随机二次采样的,所以它在训练期间具有减少容量或细化网络的效果。因此,当使用丢弃时,可能需要更宽的网络,例如更多的节点。
如何丢弃
在神经网络中,每一层都实现了丢包。
它可以用于大多数类型的层,如密集的全连接层、卷积层和递归层,如长短期内存网络层。
丢弃可以在网络中的任何或所有隐藏层以及可见或输入层上实现。它不用于输出层。
术语“丢失”是指在神经网络中丢失单元(隐藏和可见)。
——丢弃:防止神经网络过拟合的简单方法,2014。
引入了一个新的超参数,它指定了层的输出被丢弃的概率,或者相反,指定了层的输出被保留的概率。解释是一个实现细节,可能会因纸张和代码库而异。
公共值是 0.5 的概率,用于保留隐藏层中每个节点的输出,以及接近 1.0 的值,例如 0.8,用于保留可见层的输入。
在最简单的情况下,每个单元都以独立于其他单元的固定概率 p 保留,其中 p 可以使用验证集来选择,也可以简单地设置为 0.5,这对于广泛的网络和任务来说似乎接近最佳。然而,对于输入单元,最佳保留概率通常更接近 1 而不是 0.5。
——丢弃:防止神经网络过拟合的简单方法,2014。
当使用拟合网络进行预测时,在训练之后不使用丢弃。
由于丢失,网络的权重将比正常情况下更大。因此,在最终确定网络之前,首先根据所选的丢弃率来调整权重。然后,网络可以正常使用来进行预测。
如果一个单元在训练期间以概率 p 被保留,则该单元的输出权重在测试时乘以 p
——丢弃:防止神经网络过拟合的简单方法,2014。
相反,权重的重新调整可以在训练时执行,在小批量结束时的每次权重更新之后。这有时被称为“T0”反向下降,在训练过程中不需要对重量进行任何修改。Keras 和 PyTorch 深度学习库都以这种方式实现丢弃。
在测试时,我们按丢弃率缩小输出。[……]请注意,这个过程可以通过在训练时执行两个操作,并在测试时保持输出不变来实现,这通常是它在实践中的实现方式
—第 109 页,用 Python 深度学习,2017。
Dropout 在实践中运行良好,或许可以取代权重正则化(例如权重衰减)和活动正则化(例如表示稀疏性)的需要。
……与其他标准的计算成本低廉的正则化器(如权重衰减、滤波器范数约束和稀疏活动正则化)相比,dropout 更有效。丢弃也可以结合其他形式的正规化,以产生进一步的改善。
—第 265 页,深度学习,2016。
使用 drop 的示例
本节总结了一些在最近的研究论文中使用丢弃的例子,为如何和在哪里使用丢弃提供建议。
Geoffrey Hinton 等人在 2012 年的论文中首次介绍了名为“通过防止特征检测器的共同适应来改进神经网络”的 drop,他们将该方法应用于不同问题类型的一系列不同神经网络,取得了改进的结果,包括手写数字识别( MNIST )、照片分类(CIFAR-10)和语音识别(TIMIT)。
…我们使用相同的丢弃率–所有隐藏单元的丢弃率为 50%,可见单元的丢弃率为 20%
Nitish Srivastava 等人在 2014 年的期刊论文中介绍了名为“from:防止神经网络过拟合的简单方法”的 from,该论文在广泛的计算机视觉、语音识别和文本分类任务中使用了 drop,并发现它在每个问题上的表现都得到了一致的提高。
我们为不同领域的数据集上的分类问题训练了脱落神经网络。我们发现,与不使用丢弃的神经网络相比,丢弃提高了所有数据集的泛化表现。
在计算机视觉问题上,不同的丢弃率与最大范数权重约束一起被用于整个网络层。
丢弃被应用于网络的所有层,对于网络的不同层(从输入层到卷积层到完全连接层),保留该单元的概率为 p = (0.9,0.75,0.75,0.5,0.5,0.5)。此外,c = 4 的最大范数约束用于所有权重。[…]
文本分类任务使用了更简单的配置。
我们在输入层使用保留概率 p = 0.8,在隐藏层使用 0.5。所有层都使用了 c = 4 的最大范数约束。
Alex Krizhevsky 等人在他们 2012 年的著名论文《使用深度卷积神经网络的图像网分类》》中(当时)在使用深度卷积神经网络和缺失正则化的图像网数据集上获得了照片分类的最新结果。
我们在[模型的]前两个完全连接的层中使用了 drop。没有丢弃,我们的网络表现出大量的过度匹配。退出大约是收敛所需迭代次数的两倍。
乔治·达尔(George Dahl)等人在 2013 年发表的题为“使用整流线性单元和脱落改进 LVCSR 的深度神经网络”的论文中使用了具有整流线性激活函数和脱落的深度神经网络,以在标准语音识别任务中获得(当时)最先进的结果。他们使用贝叶斯优化程序来配置激活函数的选择和退出量。
……贝叶斯优化程序了解到,对于我们训练的这种规模的 sigmoid 网来说,丢弃是没有帮助的。总的来说,ReLUs 和丢弃似乎合作得很好。
使用流失正则化的技巧
本节提供了一些在神经网络中使用脱落正则化的技巧。
适用于所有网络类型
丢弃正规化是一种通用的方法。
它可以用于大多数,也许是所有类型的神经网络模型,尤其是最常见的多层感知器、卷积神经网络和长短期记忆递归神经网络。
在 LSTMs 的情况下,可能需要对输入和循环连接使用不同的丢弃率。
丢弃率
丢失超参数的默认解释是训练层中给定节点的概率,其中 1.0 表示没有丢失,0.0 表示该层没有输出。
隐藏层中脱落的良好值介于 0.5 和 0.8 之间。输入层使用较大的丢弃率,例如 0.8。
使用更大的网络
对于更大的网络(更多的层或更多的节点)来说,更容易过度填充训练数据是很常见的。
当使用脱落正则化时,可以使用更大的网络,具有更小的过拟合风险。事实上,可能需要一个大型网络(每层更多的节点),因为丢失可能会降低网络的容量。
一个很好的经验法则是将丢弃之前的层中的节点数除以建议的丢弃率,并将其用作使用丢弃的新网络中的节点数。例如,一个网络有 100 个节点,建议的丢弃率为 0.5,当使用 drop 时,将需要 200 个节点(100 / 0.5)。
如果 n 是任何层中隐藏单元的数量,p 是保留一个单元的概率……,那么一个好的丢失网应该至少有 n/p 个单元
——丢弃:防止神经网络过拟合的简单方法,2014。
网格搜索参数
与其猜测适合你的网络的丢弃率,不如系统地测试不同的丢弃率。
例如,测试值在 1.0 和 0.1 之间,增量为 0.1。
这将帮助您发现什么最适合您的特定模型和数据集,以及模型对丢弃率有多敏感。一个更敏感的模型可能是不稳定的,可能会受益于尺寸的增加。
使用权重约束
响应于层激活的概率移除,网络权重的大小将增加。
重量大可能是网络不稳定的标志。
为了抵消这种影响,可以施加权重约束,以强制层中所有权重的范数(大小)低于指定值。例如,建议最大范数约束的值在 3-4 之间。
[……]我们可以使用最大范数正则化。这将每个隐藏单元的输入权重向量的范数约束为常数 c。c 的典型值范围为 3 到 4。
——丢弃:防止神经网络过拟合的简单方法,2014。
这确实引入了额外的超参数,可能需要对模型进行调整。
用于较小的数据集
像其他正则化方法一样,对于训练数据量有限且模型可能会过度训练数据的问题,dropout 更有效。
有大量训练数据的问题可能会从使用 from 中看到较少的好处。
对于非常大的数据集,正则化几乎不会减少泛化误差。在这些情况下,使用脱落和更大模型的计算成本可能超过正则化的好处。
—第 265 页,深度学习,2016。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 第 7.12 节丢弃,深度学习,2016。
- 第 4.4.3 节添加丢弃生,Python 深度学习,2017。
报纸
- 通过防止特征检测器的共同适应来改进神经网络,2012。
- 丢弃:防止神经网络过拟合的简单方法,2014。
- 利用整流线性单元和压差改善 LVCSR 的深度神经网络,2013。
- 作为自适应正则化的丢弃训练,2013。
邮件
文章
摘要
在这篇文章中,您发现了使用丢失正则化来减少过拟合和提高深度神经网络的泛化能力。
具体来说,您了解到:
- 神经网络中的大权重是一个更复杂的网络过度训练数据的标志。
- 概率性地丢弃网络中的节点是一种简单有效的正则化方法。
- 使用 drop 时,建议使用具有更多训练和使用权重约束的大型网络。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。
避免过度训练神经网络的提前停止的温和介绍
原文:https://machinelearningmastery.com/early-stopping-to-avoid-overtraining-neural-network-models/
最后更新于 2019 年 8 月 6 日
训练神经网络的一个主要挑战是训练它们需要多长时间。
太少的训练将意味着模型将会使火车和测试设备下不来。过多的训练将意味着模型会过度训练训练数据集,并且在测试集上表现不佳。
一种折中的方法是在训练数据集上进行训练,但在验证数据集的表现开始下降时停止训练。这种简单、有效且广泛使用的神经网络训练方法被称为提前停止。
在这篇文章中,你会发现在神经网络对训练数据集进行过拟合之前,尽早停止神经网络的训练可以减少过拟合,提高深度神经网络的泛化能力。
阅读这篇文章后,你会知道:
- 训练一个神经网络足够长的时间来学习映射,但又不能长到超过训练数据,这是一个挑战。
- 可以在训练期间监控保持验证数据集上的模型表现,并且当泛化误差开始增加时停止训练。
- 使用提前停止需要选择要监控的表现度量、停止训练的触发器以及要使用的模型权重。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
提前停止避免过度训练神经网络模型简介
图片由本森夸提供,版权所有。
概观
本教程分为五个部分;它们是:
- 训练刚刚好的问题
- 当泛化误差增加时停止训练
- 如何尽早停止训练
- 提前停止的例子
- 提前停止的提示
培训是否足够的问题
训练神经网络具有挑战性。
当训练一个大网络时,在训练过程中会有一个点,此时模型将停止泛化,并开始学习训练数据集中的统计噪声。
训练数据集的这种过拟合将导致泛化误差的增加,使得该模型在对新数据进行预测时不太有用。
挑战是训练网络足够长的时间,使其能够学习从输入到输出的映射,但不要训练模型太长,以致于过度训练训练数据。
然而,所有标准的神经网络体系结构,如全连接多层感知器,都容易过拟合[10]:虽然网络似乎变得越来越好,即训练集上的误差减小,但在训练过程中的某个时刻,它实际上又开始变得更差,即看不见的例子上的误差增加。
——提前停止–但是什么时候?,2002 年。
解决这一问题的一种方法是将个训练时期视为一个超参数,用不同的值多次训练模型,然后选择在训练或保持测试数据集上获得最佳表现的时期数。
这种方法的缺点是需要训练和丢弃多个模型。这可能会导致计算效率低下且耗时,尤其是对于在大型数据集上经过数天或数周训练的大型模型。
当泛化误差增加时停止训练
另一种方法是针对大量训练时期对模型进行一次训练。
在训练期间,在每个时期之后,在保持验证数据集上评估模型。如果模型在验证数据集上的表现开始下降(例如,损失开始增加或准确率开始降低),则训练过程停止。
…相对于独立数据(通常称为验证集)而言,测量的误差通常一开始会减小,随后随着网络开始过拟合而增大。因此,可以在相对于验证数据集的最小误差点停止训练
—第 259 页,模式识别与机器学习,2006。
然后使用停止训练时的模型,并且已知该模型具有良好的泛化表现。
这一过程被称为“提前停止”并且可能是最古老和最广泛使用的神经网络正则化形式之一。
这种策略被称为提前停止。这可能是深度学习中最常用的正则化形式。它的流行是因为它的有效性和简单性。
—第 247 页,深度学习,2016。
如果像权重衰减这样更新损失函数以鼓励不太复杂的模型的正则化方法被认为是“显式”正则化,那么提前停止可以被认为是一种“隐式”正则化,很像使用容量较小的较小网络。
正则化也可能是隐含的,如提前停止的情况。
——理解深度学习需要重新思考概括,2017。
如何尽早停止训练
提前停止要求您将网络配置为受限,这意味着它的容量超过了问题所需的容量。
当训练网络时,使用比通常可能需要的更多的训练时期,以给网络足够的机会来适应,然后开始过度训练训练数据集。
使用提前停止有三个要素;它们是:
- 监控模型表现。
- 触发停止训练。
- 要使用的型号的选择。
监控表现
培训期间必须监控模型的表现。
这需要选择用于评估模型的数据集和用于评估模型的指标。
通常会分割训练数据集,并使用一个子集(如 30%)作为验证数据集,用于在训练期间监控模型的表现。该验证集不用于训练模型。使用验证数据集中的损失作为监控指标也很常见,尽管您也可以在回归的情况下使用预测误差,或者在分类的情况下使用准确性。
训练数据集中模型的丢失也将作为训练过程的一部分,并且还可以在训练数据集中计算和监控额外的度量。
在每个时期结束时,在验证集上评估模型的表现,这在训练期间增加了额外的计算成本。这可以通过减少评估模型的频率来减少,例如每 2、5 或 10 个训练阶段。
提前停止触发器
一旦选择了评估模型的方案,就必须选择停止训练过程的触发器。
触发器将使用监控的表现指标来决定何时停止训练。这通常是模型在保持数据集上的表现,例如损失。
在最简单的情况下,一旦验证数据集上的表现与先前训练时期的验证数据集上的表现相比下降(例如损失增加),就停止训练。
实践中可能需要更复杂的触发器。这是因为神经网络的训练是随机的,可能有噪声。绘制在图表上,模型在验证数据集上的表现可能会上下波动多次。这意味着过度训练的第一个迹象可能不是停止训练的好地方。
……在验证误差开始增加之后,它仍然可以进一步下降………………………………………………………………………………………………………………………………………………………………………………………
——提前停止–但是什么时候?,2002 年。
一些更复杂的触发器可能包括:
- 在给定的时期数内,度量没有变化。
- 度量的绝对变化。
- 在一定时期内观察到的表现下降。
- 给定时期数内指标的平均变化。
停止时的一些延迟或“耐心”几乎总是一个好主意。
……结果表明,与“更快”的标准相比,“更慢”的标准比其他标准停止得更晚,平均而言会导致泛化能力的提高。然而,平均而言,这种改进需要花费的培训时间相当长,而且当使用慢速标准时,培训时间也会发生巨大变化。
——提前停止–但是什么时候?,2002 年。
车型选择
当停止训练时,已知该模型比先前时期的模型具有稍差的泛化误差。
因此,可能需要考虑到底保存哪个模型。具体来说,就是将模型中的权重保存到文件中的训练时期。
这将取决于选择停止训练过程的触发器。例如,如果触发因素是从一个时期到下一个时期表现的简单下降,则前一时期模型的权重将是优选的。
如果需要触发器来观察在固定数量的时期内表现的下降,那么在触发器周期开始时的模型将是优选的。
也许一个简单的方法是,如果模型在保持数据集上的表现比前一个时期更好,则总是保存模型权重。这样,您将始终拥有在保持集上具有最佳表现的模型。
每次验证集的错误有所改善,我们都会存储一份模型参数的副本。当训练算法终止时,我们返回这些参数,而不是最新的参数。
—第 246 页,深度学习,2016。
提前停止的例子
本节总结了一些使用提前停止的例子。
尹金在 2014 年的论文《卷积神经网络在情感分析中的开创性应用》中使用了提前停止,将 10%的训练数据集用作验证开始。
除了在开发集上提前停止之外,我们不会执行任何特定于数据集的调优。对于没有标准开发集的数据集,我们随机选择 10%的训练数据作为开发集。
麻省理工学院(MIT)、伯克利分校(Berkeley)和谷歌(Google)的张等人在 2017 年发表的题为《理解深度学习需要重新思考泛化》的论文中强调,在用于照片分类的非常深度的卷积神经网络上,有丰富的数据集,早期停止可能并不总是带来好处,因为模型不太可能过度填充如此大的数据集。
[关于 ImageNet 上的训练和测试准确性[结果建议]早期停止的潜在表现增益参考。但是,在 CIFAR10 数据集上,我们没有观察到提前停止的任何潜在好处。
剑桥大学的亚林·加尔和邹斌·盖拉马尼在他们 2015 年发表的论文《递归神经网络中丢弃生的理论基础应用》中“将提前停止作为 LSTM 模型在一系列语言建模问题上的不规则基线”。
*> RNN 模型缺乏规律性,使得处理小数据变得困难,为了避免过拟合,研究人员经常使用提前停止,或者小的和指定不足的模型
Alex Graves 等人在他们 2013 年的著名论文《使用深度递归神经网络的语音识别》》中,利用 LSTMs 实现了语音识别的最新成果,同时利用了早期停止。
规范化对于无线网络的良好表现至关重要,因为它们的灵活性使它们容易过度适应。本文使用了两个正则项:提前停止和加权噪声
提前停止的提示
本节提供了一些在神经网络中使用提前停止正则化的技巧。
何时使用提前停止
提前停止是如此容易使用,例如用最简单的触发器,以至于在训练神经网络时几乎没有理由不使用它。
使用提前停止可能是深度神经网络现代训练的主要内容。
早停应该几乎普遍使用。
—第 425 页,深度学习,2016。
绘制学习曲线以选择触发器
在使用提前停止之前,拟合一个欠约束模型,并在一个训练和验证数据集上监控模型的表现,可能会很有趣。
实时或在长期运行结束时绘制模型的表现将显示特定模型和数据集的训练过程有多嘈杂。
这可能有助于选择提前停止的触发器。
监控重要指标
损失是一个很容易在训练中监控并触发提前停止的指标。
问题是损失并不总是抓住模型对你和你的项目最重要的地方。
选择一个表现指标来监控可能更好,该指标最好地定义了模型在您打算使用它的方式方面的表现。这可能是您打算用来报告模型表现的指标。
建议的培训时期
提前停止的一个问题是模型没有利用所有可用的训练数据。
可能需要避免过拟合,并对所有可能的数据进行训练,尤其是在训练数据量非常有限的问题上。
一种推荐的方法是将训练时期的数量视为一个超参数,并网格搜索一系列不同的值,可能使用 k 倍交叉验证。这将允许您固定训练时期的数量,并在所有可用数据上拟合最终模型。
可以使用提前停止来代替。提前停止程序可以重复多次。可以记录停止训练的时期号。然后,当在所有可用的训练数据上拟合最终模型时,可以使用所有早期停止重复的历元数的平均值。
每次运行提前停止时,可以使用将训练集分成训练和验证步骤的不同方式来执行该过程。
另一种方法可能是使用验证数据集的早期停止,然后通过对保留的验证集进行进一步的训练来更新最终模型。
通过交叉验证提前停止
早期停止可以与 k 倍交叉验证一起使用,尽管不建议这样做。
k-fold 交叉验证程序旨在通过在数据集的不同子集上反复修改和评估来估计模型的泛化误差。
早期停止旨在监控一个模型的泛化误差,并在泛化误差开始下降时停止训练。
它们之所以不一致,是因为交叉验证假设你不知道泛化误差,而提前停止是为了给你基于泛化误差知识的最佳模型。
可能希望使用交叉验证来估计具有不同超参数值的模型的表现,例如学习率或网络结构,同时也使用提前停止。
在这种情况下,如果您有资源来重复评估模型的表现,那么也许训练时期的数量也可以被视为一个要优化的超参数,而不是使用提前停止。
当评估模型的不同超参数值(例如,不同的学习率)时,可以直接使用早期停止,而不需要重复评估,而不是使用具有早期停止的交叉验证。
一个可能的混淆点是,提前停止有时被称为“交叉验证训练”此外,对比较触发器的早期停止的研究可以使用交叉验证来比较不同触发器的影响。
超额验证
多次重复早期停止过程可能会导致模型过拟合验证数据集。
这就像过拟合训练数据集一样容易发生。
一种方法是,一旦模型的所有其他超参数都被选择,就只使用提前停止。
另一种策略可以是在每次使用提前停止时,将训练数据集分成不同的训练集和验证集。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 第 7.8 节早停,深度学习,2016。
- 第 5.5.2 节提前停止,模式识别与机器学习,2006。
- 第 16.1 节提前停止,神经锻造:前馈人工神经网络中的监督学习,1999。
报纸
- 提前停止–但是什么时候?,2002 年。
- 用非收敛方法改进模型选择,1993。
- 使用交叉验证自动提前停止:量化标准,1997。
- 理解深度学习需要重新思考概括,2017。
邮件
文章
摘要
在这篇文章中,你发现在神经网络对训练数据集进行过拟合之前,尽早停止神经网络的训练,可以减少过拟合,提高深度神经网络的泛化能力。
具体来说,您了解到:
- 训练一个神经网络足够长的时间来学习映射,但又不能长到超过训练数据,这是一个挑战。
- 可以在训练期间监控保持验证数据集上的模型表现,并且当泛化误差开始增加时停止训练。
- 使用提前停止需要选择要监控的表现度量、停止训练的触发器以及要使用的模型权重。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。*
深度学习神经网络的集成学习方法
原文:https://machinelearningmastery.com/ensemble-methods-for-deep-learning-neural-networks/
最后更新于 2019 年 8 月 6 日
如何通过组合多个模型的预测来提高表现。
深度学习神经网络是非线性方法。
它们提供了更高的灵活性,并且可以根据可用的培训数据量按比例扩展。这种灵活性的缺点是,他们通过随机训练算法学习,这意味着他们对训练数据的细节很敏感,每次训练时可能会发现不同的权重集,这反过来会产生不同的预测。
一般来说,这被称为具有高方差的神经网络,当试图开发用于进行预测的最终模型时,这可能会令人沮丧。
降低神经网络模型方差的一种成功方法是训练多个模型而不是单个模型,并组合来自这些模型的预测。这被称为集成学习,不仅可以减少预测的方差,还可以产生比任何单一模型都好的预测。
在这篇文章中,您将发现深度学习神经网络的方法,以减少方差并提高预测表现。
看完这篇文章,你会知道:
- 神经网络模型是非线性的,具有很高的方差,这在准备最终模型进行预测时可能会令人沮丧。
- 集成学习将来自多个神经网络模型的预测组合在一起,以减少预测的方差和泛化误差。
- 用于集成学习的技术可以根据不同的元素进行分组,例如训练数据、模型以及如何组合预测。
用我的新书更好的深度学习启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
减少差异和提高深度学习神经网络表现的集成方法
图片由旧金山表演艺术大学提供,保留部分权利。
概观
本教程分为四个部分;它们是:
- 神经网络模型的高方差
- 使用模型集合减少方差
- 如何集成神经网络模型
- 集合技术综述
神经网络模型的高方差
训练深度神经网络在计算上非常昂贵。
基于数百万个例子训练的非常深的网络可能需要几天、几周甚至几个月的时间来训练。
谷歌的基线模型[…]是一个深度卷积神经网络[…]已经在大量核心上使用异步随机梯度下降进行了大约六个月的训练。
——在神经网络中提取知识,2015。
投入这么多时间和资源后,不能保证最终的模型泛化误差低,在训练时没有看到的例子上表现良好。
…训练许多不同的候选网络,然后选择最好的,[……]并丢弃其余的。这种方法有两个缺点。首先,所有训练剩余网络的努力都白费了。第二,[……]在验证集上表现最好的网络可能不是在新测试数据上表现最好的网络。
—第 364-365 页,用于模式识别的神经网络,1995。
神经网络模型是一种非线性方法。这意味着他们可以学习数据中复杂的非线性关系。这种灵活性的缺点是它们对初始条件敏感,无论是初始随机权重还是训练数据集中的统计噪声。
学习算法的这种随机性质意味着,每次训练神经网络模型时,它可能从输入到输出学习到稍微(或显著)不同版本的映射函数,这反过来将在训练和保持数据集上具有不同的表现。
因此,我们可以认为神经网络是一种具有低偏差和高方差的方法。即使在大型数据集上进行训练以满足高方差,在最终模型中使用任何方差来进行预测也会令人沮丧。
使用模型集合减少方差
神经网络高方差的解决方案是训练多个模型并组合它们的预测。
这个想法是将来自多个好的但不同的模型的预测结合起来。
一个好的模型有技巧,这意味着它的预测比随机的机会更好。重要的是,模型在不同的方面必须是好的;他们必须做出不同的预测误差。
模型平均有效的原因是不同的模型通常不会在测试集上产生相同的错误。
—第 256 页,深度学习,2016。
组合来自多个神经网络的预测增加了偏差,这反过来又抵消了单个训练的神经网络模型的方差。结果是对训练数据的细节、训练方案的选择和单次训练的意外发现不太敏感的预测。
除了减少预测中的方差之外,集合还可以产生比任何单一最佳模型更好的预测。
…一个委员会的表现可能优于孤立使用的最佳单个网络的表现。
—第 365 页,用于模式识别的神经网络,1995。
这种方法属于一类称为“集合学习”的一般方法,描述了试图最好地利用为同一问题准备的多个模型的预测的方法。
一般来说,集成学习包括在同一数据集上训练多个网络,然后在以某种方式组合预测以做出最终结果或预测之前,使用每个训练的模型来做出预测。
事实上,模型的集成是应用机器学习的标准方法,以确保做出最稳定和最好的预测。
例如,Alex Krizhevsky 等人在他们 2012 年的著名论文《使用深度卷积神经网络的 Imagenet 分类》中介绍了用于照片分类的非常深度的卷积神经网络(即 AlexNet),该论文使用多个表现良好的 CNN 模型之间的模型平均来获得当时最先进的结果。将一个模型的表现与两个、五个和七个不同模型的总体平均预测进行比较。
对五种类似氯化萘的预测进行平均,误差率为 16.4%。[……]用上述五种氯化萘对预先训练过的两种氯化萘进行平均预测,误差率为 15.3%。
集合也是机器学习竞赛获胜者使用的方法。
另一种在任务中获得最佳结果的强大技术是模型组装。[……]如果你看看机器学习竞赛,尤其是在 Kaggle 上,你会看到获胜者使用非常大的模型集合,这些模型集合不可避免地会击败任何一个模型,不管它有多好。
—第 264 页,用 Python 深度学习,2017。
如何集成神经网络模型
也许最古老也是最常用的神经网络集成方法被称为网络委员会
在同一数据集上训练具有相同配置和不同初始随机权重的网络集合。然后使用每个模型进行预测,并将实际预测计算为预测的平均值。
由于训练模型的计算开销以及增加更多集成成员带来的表现收益递减,集成中模型的数量通常保持较少。集合可能小到三个、五个或十个训练好的模型。
集成学习领域研究得很好,在这个简单的主题上有许多变化。
考虑改变集成方法的三个主要要素可能会有所帮助;例如:
- 训练数据:改变用于训练集合中每个模型的数据选择。
- 集成模型:改变集成中所用模型的选择。
- 组合:改变组合成员结果的方式选择。
让我们依次仔细看看每个元素。
变化的训练数据
用于训练全体成员的数据可以变化。
最简单的方法是使用 k 倍交叉验证来估计所选模型配置的泛化误差。在这个过程中,在 k 个不同的训练数据子集上训练 k 个不同的模型。然后,这些 k 个模型可以被保存并用作一个集合的成员。
另一种流行的方法包括用替换对训练数据集进行重采样,然后使用重采样的数据集训练网络。重采样过程意味着每个训练数据集的组成是不同的,重复示例的可能性允许在数据集上训练的模型对样本密度有稍微不同的预期,进而有不同的泛化误差。
这种方法被称为引导聚合,简称 bagging,设计用于具有高方差和低偏差的未运行决策树。通常使用大量决策树,例如数百或数千棵,因为它们准备起来很快。
…降低方差并因此提高统计学习方法的预测准确率的一种自然方法是从总体中提取许多训练集,使用每个训练集构建单独的预测模型,并对结果预测进行平均。[……]当然,这并不实际,因为我们通常无法访问多个训练集。相反,我们可以通过从(单个)训练数据集中获取重复样本来引导。
—第 216-317 页,R中应用的统计学习介绍,2013。
一种等效的方法可能是使用较小的训练数据集子集而不进行正则化,以允许更快的训练和一些过拟合。
对稍微优化不足的模型的期望更普遍地适用于整体成员的选择。
……委员会成员不应被单独挑选,以在偏差和方差之间进行最佳权衡,而应具有相对较小的偏差,因为额外的方差可以通过平均来消除。
—第 366 页,用于模式识别的神经网络,1995。
其他方法可以包括选择输入空间的随机子空间来分配给每个模型,例如输入空间中超体积的子集或输入特征的子集。
集成教程
有关不同训练数据的深度学习集成的示例,请参见:
可变模型
给定问题的难度和学习算法的随机性质,在具有不同初始条件的相同数据上训练相同的欠约束模型将导致不同的模型。
这是因为网络试图解决的优化问题是如此具有挑战性,以至于有许多“好的”和“不同的”解决方案来将输入映射到输出。
大多数神经网络算法达到次优表现,特别是由于存在大量次优局部极小值。如果我们取一组已经收敛到局部极小值的神经网络,并应用平均,我们可以构造一个改进的估计。理解这一事实的一种方式是考虑到,一般来说,落入不同局部最小值的网络在特征空间的不同区域中表现不佳,因此它们的误差项不会强相关。
——当网络不一致时:混合神经网络的集成方法,1995。
这可能导致方差减小,但可能不会显著改善泛化误差。模型产生的误差可能仍然高度相关,因为模型都学习了相似的映射函数。
另一种方法可能是改变每个集成模型的配置,例如使用具有不同容量(例如,层数或节点数)的网络或在不同条件下训练的模型(例如,学习率或正则化)。
结果可能是模型的集合,这些模型已经学习了映射函数的更异质的集合,并且反过来在它们的预测和预测误差中具有更低的相关性。
随机初始化的差异、小匹配的随机选择、超参数的差异或神经网络的非确定性实现的不同结果通常足以导致集成的不同成员产生部分独立的错误。
—第 257-258 页,深度学习,2016。
这种不同配置模型的集合可以通过开发网络和调整其超参数的正常过程来实现。在这个过程中,可以保存每个模型,并选择更好的模型的子集来组成集合。
稍微训练不足的网络是大多数调优算法的免费副产品;希望使用这样的额外副本,即使它们的表现明显差于找到的最佳表现。通过使用最佳可用参数和在可用数据库的不同子集上训练不同的副本,仔细规划集合分类,可以获得更好的表现。
——神经网络集成,1990。
在单个模型可能需要几周或几个月来训练的情况下,另一种选择可能是在训练过程中定期保存最佳模型,称为快照或检查点模型,然后在保存的模型中选择集成成员。这提供了在相同数据上训练多个模型的好处,尽管是在单次训练中收集的。
快照集合从单个训练过程中产生精确和多样模型的集合。快照集成的核心是一个优化过程,在收敛到最终解决方案之前,会访问几个局部最小值。我们在这些不同的最小值拍摄模型快照,并在测试时对它们的预测进行平均。
——快照合集:1 号列车,免费获得 M,2017。
快照集成的一个变化是保存一系列时期的模型,可能是通过在训练期间查看模型在训练和验证数据集上的学习曲线来识别的。来自这种连续模型序列的集成被称为水平集成。
首先,选择为相对稳定的历元范围训练的网络。每个标签概率的预测由标准分类器在选定的时期内产生,然后进行平均。
——深度表示分类的水平和垂直集合,2013。
快照集成的进一步增强是在训练期间系统地改变优化过程,以强制不同的解决方案(即权重集),其中最好的可以保存到检查点。这可能涉及在训练时期注入振荡量的噪声,或者在训练时期振荡学习率。这种方法的一个变种叫随机梯度下降与热重启(SGDR)证明了更快的学习和最先进的标准照片分类任务的结果。
我们的 SGDR 通过安排学习率来模拟热重启,以获得快 2 到 4 倍的竞争结果。我们还与 SGDR 达成了新的最先进的成果,主要是通过使用更广泛的(模型)和 SGDR 轨迹快照的集合。
——SGDR:温重启随机梯度下降,2016。
深度神经网络的一个好处是,中间隐藏层提供了低分辨率输入数据的学习表示。隐藏层可以直接输出它们的内部表示,来自一个非常深的网络的一个或多个隐藏层的输出可以用作新分类模型的输入。当使用自动编码器模型训练深度模型时,这可能是最有效的。这种类型的集成称为垂直集成。
该方法集成了一系列输入是中间层表示的分类器。由于这些特性看起来多种多样,因此错误率预计会更低。
——深度表示分类的水平和垂直集合,2013。
集成教程
有关不同模型的深度学习集成的示例,请参见:
不同的组合
组合预测的最简单方法是计算来自集成成员的预测平均值。
通过对每个模型的预测进行加权,可以稍微改善这一点,其中权重使用保持验证数据集进行优化。这提供了一种加权平均集成,有时称为模型混合。
……我们可能会预计,委员会的一些成员通常会比其他成员做出更好的预测。因此,如果我们给予一些委员会成员比其他成员更大的权重,我们希望能够进一步减少错误。因此,我们考虑由成员预测的加权组合给出的广义委员会预测…
—第 367 页,用于模式识别的神经网络,1995。
复杂性的另一步涉及使用新模型来学习如何最好地组合来自每个集成成员的预测。
该模型可以是简单的线性模型(例如,非常像加权平均),但也可以是复杂的非线性方法,除了每个成员提供的预测之外,还考虑特定的输入样本。这种学习新模型的一般方法被称为模型堆叠,或堆叠概括。
堆叠泛化的工作原理是通过推导泛化器相对于所提供的学习集的偏差。这种推导是通过在第二个空间中进行归纳来进行的,当用学习集的一部分进行教学时,第二个空间的输入是(例如)原始归纳者的猜测,并试图猜测其余部分,第二个空间的输出是(例如)正确的猜测。[……]当与单个概化器一起使用时,堆叠概化是一种用于估计(然后校正)概化器的误差的方案,该概化器已经在特定的学习集上被训练,然后被问到特定的问题。
——堆叠概括,1992。
有更复杂的方法来堆叠模型,例如增强,每次添加一个集合成员,以纠正先前模型的错误。复杂性的增加意味着这种方法不太常用于大型神经网络模型。
另一个有点不同的组合是将多个结构相同的神经网络的权重进行组合。可以对多个网络的权重进行平均,希望产生一个新的单一模型,该模型的整体表现优于任何原始模型。这种方法被称为模型加权平均。
…表明有希望在权重空间中对这些点进行平均,并使用具有这些平均权重的网络,而不是通过对模型空间中网络的输出进行平均来形成集合
——平均权重带来更宽的最优值和更好的泛化,2018。
集成教程
有关不同组合的深度学习集成的示例,请参见:
集合技术综述
总之,我们可以列出一些更常见和更有趣的神经网络集成方法,这些方法由可以变化的方法的每个元素组成,如下所示:
- 变化的训练数据
- 不同型号
- 多重训练跑集成
- 超参数调谐集成
- 快照集
- 横向时代集成
- 垂直表征集合
- 不同组合
没有单一的最佳集成方法;也许可以尝试一些方法,或者让项目的约束来指导你。
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
书
- 第 9.6 节网络委员会,模式识别神经网络,1995。
- 第 7.11 节装袋等集成方法,深度学习,2016。
- 第 7.3.3 节模型组装,Python 深度学习,2017。
- 第 8.2 节装袋,随机森林,提升,R中应用的统计学习介绍,2013。
报纸
- 神经网络集成,1990。
- 神经网络集成、交叉验证和主动学习,1994。
- 当网络不一致时:混合神经网络的集成方法,1995。
- 快照合集:1 号列车,免费获得 M,2017。
- SGDR:温重启随机梯度下降,2016。
- 深度表征分类的水平和垂直集合,2013。
- 堆叠概括,1992。
- 平均权重导致更宽的最优值和更好的泛化,2018。
文章
- 一起学习,维基百科。
- 引导聚合,维基百科。
- Boosting(机器学习),维基百科。
摘要
在这篇文章中,您发现了深度学习神经网络的集成方法,以减少方差并提高预测表现。
具体来说,您了解到:
- 神经网络模型是非线性的,具有很高的方差,这在准备最终模型进行预测时可能会令人沮丧。
- 集成学习将来自多个神经网络模型的预测组合在一起,以减少预测的方差和泛化误差。
- 用于集成学习的技术可以根据不同的元素进行分组,例如训练数据、模型以及如何组合预测。
你有什么问题吗?
在下面的评论中提问,我会尽力回答。