神经网络模型使用随机梯度下降进行训练,模型权重使用反向传播算法进行更新。
训练神经网络模型所解决的优化问题非常具有挑战性,尽管这些算法在实践中表现良好而广受欢迎,但它们不能保证及时收敛到良好的模型。
训练神经网络的挑战实际上归结为配置训练算法的挑战。
在这篇文章中,您将发现一些技巧和窍门,以在训练神经网络模型时充分利用反向传播算法。
阅读本文后,你将了解:
- 训练神经网络的挑战实际上是学习训练数据集和泛化到训练数据集之外的新示例之间的平衡。
- 您可以使用八个特定技巧来更快地训练更好的神经网络模型。
- 在某些情况下,也可以用于训练神经网络的二阶优化算法。
用我的新书《更好的深度学习》来启动你的项目,书中包含分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

配置反向传播以更快地训练更好的神经网络的8个技巧
图片来源:Jamesthe1st,保留部分权利。
帖子概述
本教程分为五个部分;它们是:
- 高效反向传播概述
- 学习与泛化
- 反向传播的8个实用技巧
- 二阶优化算法
- 讨论与结论
高效反向传播概述
1998年出版的《神经网络:技巧与窍门》一书收录了学者和神经网络从业者撰写的章节,描述了配置和使用神经网络模型的最佳实践。
该书在深度学习复兴的前夕进行了更新,并于2012年发布了第二版,其中包含了13个新章节。
两版的第一章都名为“高效反向传播”,由Yann LeCun、Leon Bottou(均任职于Facebook AI)、Genevieve Orr和Klaus-Robert Muller(也是该书的共同编辑)撰写。
该章的预印本也可在线免费获取。
- 高效反向传播,预印本,1998年。
该章节还在两版书的序言中以“快速学习”为题进行了总结。
这是一个重要的章节和文献,因为它提供了1998年关于如何在随机梯度下降下最佳配置反向传播的近乎详尽的总结,而且其中许多建议在今天仍然非常相关。
在这篇文章中,我们将重点关注这一章或论文,并试图提炼出对现代深度学习实践者最相关的建议。
为方便参考,该章节分为10个部分;它们是:
- 1.1:引言
- 1.2:学习与泛化
- 1.3:标准反向传播
- 1.4:几个实用技巧
- 1.5:梯度下降的收敛性
- 1.6:经典二阶优化方法
- 1.7:在多层网络中计算Hessian信息的技巧
- 1.8:多层网络中Hessian的分析
- 1.9:将二阶方法应用于多层网络
- 1.10:讨论与结论
我们将重点关注配置反向传播和随机梯度下降的技巧和窍门。
想要通过深度学习获得更好的结果吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
学习与泛化
该章首先描述了神经网络模型学习和泛化的双重挑战这一普遍问题。
作者通过强调反向传播算法是训练神经网络模型最广泛使用的算法来激发本文的兴趣,因为它有效且高效。
反向传播是一种非常流行的神经网络学习算法,因为它概念简单,计算效率高,并且通常有效。然而,要使其良好工作,有时甚至根本工作,似乎更像一门艺术而非科学。
作者还提醒我们,用反向传播训练神经网络确实很难。尽管该算法既有效又高效,但它需要仔细配置多个模型属性和模型超参数,其中每一个都需要对算法有深入的了解和经验才能正确设置。
然而,并没有“最佳”配置模型和训练过程的规则可循。
使用反向传播设计和训练网络需要做出许多看似随意的选择,例如节点和层数、类型、学习率、训练集和测试集等等。这些选择可能至关重要,但没有万无一失的方案来决定它们,因为它们在很大程度上取决于问题和数据。
训练神经网络模型的目标最具挑战性,因为它需要同时解决两个难题:
- 学习训练数据集以最大限度地减少损失。
- 泛化模型性能,以便对未见过的示例进行预测。
这些问题之间存在权衡,因为一个学习得太好的模型泛化能力会很差,而一个泛化能力好的模型可能会欠拟合。训练一个好的神经网络的目标是在这两个问题之间找到一个愉快的平衡。
本章重点介绍改进成本函数最小化过程的策略。然而,这些策略必须与最大化网络泛化能力的方法结合使用,即预测学习系统以前从未见过模式的正确目标。
有趣的是,训练神经网络模型的问题被表述为偏差-方差权衡,这通常用于描述一般的机器学习算法。
在拟合神经网络模型时,这些术语可以定义为:
- 偏差:衡量网络输出在所有数据集中平均值与所需函数之间的差异。
- 方差:衡量网络输出在不同数据集之间变化的程度。
这种框架将模型容量的定义视为偏差的选择,控制可以学习的函数范围。它将方差视为训练过程的函数以及训练数据集过拟合与泛化误差之间的平衡。
这种框架也有助于理解训练过程中模型性能的动态。也就是说,从训练初期具有大偏差和小方差的模型,到训练结束时具有低偏差和高方差的模型。
在训练早期,由于网络输出与所需函数相去甚远,偏差较大。方差非常小,因为数据几乎没有产生影响。在训练后期,由于网络已经学习了底层函数,偏差较小。
这些是模型的正常动态,尽管在训练时,我们必须提防过度训练模型并使训练数据集过拟合。这使得模型脆弱,降低了偏差,使模型专门针对训练示例,进而导致更大的方差。
然而,如果训练时间过长,网络也会学习到该数据集特有的噪声。这被称为过拟合。在这种情况下,方差会很大,因为噪声在不同数据集之间变化。
专注于反向传播算法意味着专注于“学习”,而暂时忽略可以通过引入正则化技术稍后解决的“泛化”。
专注于学习意味着专注于快速(快速学习)和有效地(良好学习)最小化损失。
因此,本章的目的是介绍最小化策略(给定成本函数)以及与提高最小化速度和质量相关的技巧。
反向传播的8个实用技巧
本章重点介绍了一系列用于反向传播以更好地训练神经网络模型的实用技巧。
共有八个技巧;它们是:
- 1.4.1:随机学习与批处理学习
- 1.4.2:打乱示例
- 1.4.3:标准化输入
- 1.4.4:Sigmoid
- 1.4.5:选择目标值
- 1.4.6:初始化权重
- 1.4.7:选择学习率
- 1.4.8:径向基函数 vs Sigmoid
该部分以一句评论开始,即我们试图通过随机梯度下降和反向传播解决的优化问题具有挑战性。
反向传播可能非常缓慢,特别是对于多层网络,其中成本表面通常是非二次、非凸、高维且具有许多局部最小值和/或平坦区域。
作者接着强调,在选择随机梯度下降和反向传播算法来优化和更新权重时,我们无法保证性能。
没有公式能保证(1)网络将收敛到一个好的解决方案,(2)收敛迅速,或者(3)收敛确实发生。
这些评论为这些技巧提供了背景,这些技巧也无法提供保证,但却增加了更快找到更好模型的可能性。
让我们依次仔细研究每个技巧。
许多技巧都集中于 Sigmoid(S形)激活函数,而它在隐藏层中不再是最佳实践,已被整流线性激活函数取代。因此,我们将减少在 Sigmoid 相关技巧上的时间。
技巧 #1:随机学习与批量学习
此技巧强调了在训练模型时选择使用随机梯度下降还是批量梯度下降。
随机梯度下降,也称为在线梯度下降,指的是一种算法版本,其中误差梯度是从训练数据集中的单个随机选择的示例中估计的,然后更新模型参数(权重)。
它的效果是快速训练模型,尽管这可能会导致模型权重的更新幅度较大且噪声较多。
随机学习通常是基本反向传播的首选方法,原因有以下三点:
1. 随机学习通常比批量学习快得多。
2. 随机学习通常也能得到更好的解决方案。
3. 随机学习可用于跟踪变化。
批量梯度下降涉及使用训练数据集中所有示例的平均值来估计误差梯度。它执行速度更快,从理论角度来看也更容易理解,但学习速度较慢。
尽管随机学习具有优势,但仍有一些原因可能会考虑使用批量学习:
1. 收敛条件得到了很好的理解。
2. 许多加速技术(例如共轭梯度法)仅在批量学习中有效。
3. 权重动态和收敛率的理论分析更简单。
一般来说,作者建议尽可能使用随机梯度下降,因为它能更快地训练模型。
尽管批量更新具有优势,但随机学习仍然是首选方法,尤其是在处理超大数据集时,因为它速度快得多。
他们建议使用学习率衰减策略,以抵消随机梯度下降过程中权重更新产生的噪声效应。
…噪声,对于寻找更好的局部最小值至关重要,但它也阻止了完全收敛到最小值。[…] 因此,为了减少波动,我们可以降低(退火)学习率或采用自适应批次大小。
他们还建议使用小批量样本来减少权重更新的噪声。在这种情况下,误差梯度是通过训练数据集中一小部分样本(而不是随机梯度下降中的一个样本或批量梯度下降中的所有样本)来估计的。
这种变体后来被称为小批量梯度下降,是训练神经网络时的默认方法。
另一种消除噪声的方法是使用“小批量”,即从小的批量大小开始,随着训练的进行逐渐增加批量大小。
技巧 #2:打乱示例
此技巧强调了训练过程中向模型展示示例的顺序对训练过程的重要性。
通常,作者强调,当用于更新模型的下一个示例与上一个示例不同时,学习算法表现更好。理想情况下,它与模型最不相似或最不熟悉。
网络从最出乎意料的样本中学习最快。因此,建议在每次迭代中选择对系统最不熟悉的样本。
实现此技巧的一个简单方法是确保用于更新模型参数的连续示例来自不同的类别。
...一个非常简单的技巧,粗略地实现了这个想法,就是简单地选择来自不同类别的连续示例,因为属于同一类别的训练示例很可能包含相似的信息。
这个技巧也可以通过向模型反复展示它在预测时错误最多或误差最大的例子来实现。这种方法可能有效,但也可能导致灾难,如果训练过程中过度代表的例子是异常值的话。
选择信息量最大的示例
1. 打乱训练集,使连续的训练示例永远不会(很少)属于同一类别。
2. 更频繁地呈现产生大误差的输入示例,而不是产生小误差的示例。
技巧 #3:标准化输入
此技巧强调了在训练神经网络模型之前进行数据准备的重要性。
作者指出,当训练数据集中的示例总和为零时,神经网络通常学习得更快。这可以通过从每个输入变量中减去平均值来实现,这称为居中。
如果训练集中每个输入变量的平均值接近零,则收敛通常更快。
他们还评论说,这种输入居中操作应用于前一层到隐藏层的输入时,也能改善模型的收敛性。这令人着迷,因为它为近15年后开发并广受欢迎的批量归一化技术奠定了基础。
因此,最好对输入进行移位,使其在训练集上的平均值接近于零。这个启发式方法应该应用于所有层,这意味着我们希望节点的输出平均值接近于零,因为这些输出是下一层的输入。
作者还评论了标准化输入变量分布范围的必要性。这可以通过将值除以其标准差来实现。对于高斯分布的变量,以这种方式对值进行居中和标准化意味着它们将被简化为平均值为零、标准差为一的标准高斯分布。
缩放加速学习,因为它有助于平衡与输入节点连接的权重的学习速度。
最后,他们建议对输入变量进行去相关处理。这意味着消除输入变量之间的任何线性依赖关系,这可以通过使用主成分分析作为数据转换来实现。
主成分分析(也称为 Karhunen-Loeve 展开)可用于消除输入中的线性相关性。
此数据准备技巧可总结如下:
转换输入
1. 训练集中每个输入变量的平均值应接近零。
2. 缩放输入变量,使它们的协方差大致相同。
3. 如果可能,输入变量应不相关。
这些推荐的居中、标准化和去相关的三步数据准备工作在下图中清晰地概括,该图摘自书中:

输入转换
摘自《神经网络:技巧与窍门》第18页。
当在网络的隐藏层中使用更现代的ReLU激活函数时,输入变量的居中处理可能不是最佳方法,因此我建议在为模型准备数据时评估标准化和归一化过程。
技巧 #4:Sigmoid
此技巧建议在网络的隐藏层中使用Sigmoid激活函数。
非线性激活函数赋予神经网络非线性能力。最常见的激活函数形式之一是 Sigmoid …
具体来说,作者将 Sigmoid 激活函数指代任何 S 形函数,例如逻辑函数(称为 Sigmoid)或双曲正切函数(称为 tanh)。
对称 Sigmoid 函数(如双曲正切)通常比标准 Logistic 函数收敛更快。
作者建议(如果需要)修改默认函数,使函数的中心点为零。
现在,将 Logistic 和 tanh 激活函数用于隐藏层已不再是明智的默认选择,因为使用 ReLU 的性能模型收敛速度快得多。
技巧 #5:选择目标值
此技巧强调了对目标变量选择的更仔细考虑。
在二分类问题中,目标变量可能属于 {0, 1} 集合(用于逻辑激活函数的极限),或属于 {-1, 1} 集合(用于双曲正切函数),当分别使用交叉熵或铰链损失函数时,即使在现代神经网络中也是如此。
作者认为,使用激活函数极限处的值可能会使问题学习更具挑战性。
常识似乎建议将目标值设置为 Sigmoid 渐近线的值。然而,这有几个缺点。
他们认为,达到激活函数饱和点(边缘)的值可能需要越来越大的权重,这可能导致模型不稳定。
解决这个问题的一种方法是使用远离输出函数边缘的目标值。
在 Sigmoid 函数最大二阶导数点选择目标值,以避免输出单元饱和。
我记得在1990年代,通常的建议是使用逻辑函数时,目标值设置为{0.1和0.9},而不是{0和1}。
技巧 #6:初始化权重
此技巧强调了权重初始化方案选择的重要性,以及它与激活函数选择的紧密关系。
在 Sigmoid 激活函数的上下文中,他们建议网络的初始权重应选择为在线性区域激活函数(例如,S 形的直线部分而非曲线部分)。
权重的起始值对训练过程有显著影响。权重应随机选择,但应确保 Sigmoid 主要在其线性区域激活。
此建议也可能适用于 ReLU 的权重激活,其中函数的线性部分为正。
这突出显示了初始权重对学习的重要影响,其中大权重会使激活函数饱和,导致学习不稳定;而小权重会导致梯度非常小,进而导致学习缓慢。理想情况下,我们寻求的权重应位于激活函数的线性(非弯曲)部分。
…在 Sigmoid 线性区域内的权重具有优势,因为 (1) 梯度足够大,学习可以进行,并且 (2) 网络将先学习映射的线性部分,然后再学习更困难的非线性部分。
作者提出了一种随机权重初始化方案,该方案使用前一层的节点数,即所谓的扇入。这很有趣,因为它成为了后来被称为Xavier权重初始化方案的先驱。
技巧 #7:选择学习率
此技巧强调了选择学习率的重要性。
学习率是模型权重在算法每次迭代中更新的量。较小的学习率可能导致较慢的收敛但可能获得更好的结果,而较大的学习率可能导致较快的收敛但可能得到次优结果。
作者建议当权重值开始来回变化,即出现振荡时,降低学习率。
大多数这些方案在权重向量“振荡”时降低学习率,而在权重向量遵循相对稳定的方向时增加学习率。
他们评论说,在使用在线梯度下降时,这是一个困难的策略,因为默认情况下,权重会大量振荡。
作者还建议为模型中的每个参数使用一个学习率。目标是帮助模型的每个部分以相同的速度收敛。
...很明显,为每个权重选择不同的学习率(eta)可以改善收敛。[...] 主要的理念是确保网络中的所有权重以大致相同的速度收敛。
他们将此属性称为每个模型参数的“均衡学习速度”。
均衡学习速度
– 给每个权重一个自己的学习率
– 学习率应与单元输入数量的平方根成比例
– 下层权重通常应大于上层权重
除了为每个参数使用学习率之外,作者还建议使用动量和自适应学习率。
有趣的是,这些建议后来被AdaGrad和Adam等方法所采纳,这些方法现在已成为流行的默认设置。
技巧 #8:径向基函数 vs Sigmoid 单元
这最后一个技巧今天可能不太相关,我建议在某些情况下尝试径向基函数(RBF)而不是 Sigmoid 激活函数。
作者认为,训练RBF单元可能比训练使用Sigmoid激活的单元更快。
与可以覆盖整个空间的 Sigmoid 单元不同,单个 RBF 单元只覆盖输入空间的一个小局部区域。这可能是一个优势,因为学习速度会更快。
理论基础
在这些技巧之后,作者继续提供了一个理论基础,解释为什么许多这些技巧是一个好主意,并且在训练神经网络模型时预计会导致更好或更快的收敛。
具体而言,这些分析支持的技巧是:
- 从输入变量中减去均值
- 标准化输入变量的方差。
- 对输入变量进行去相关处理。
- 为每个权重使用单独的学习率。
二阶优化算法
本章的其余部分重点介绍了使用二阶优化算法训练神经网络模型。
这可能不合所有人的胃口,需要具备矩阵微积分的背景和良好的记忆力。您可能想跳过它。
您可能还记得一阶导数是函数的斜率(它有多陡峭),反向传播使用一阶导数按其输出误差的比例更新模型。这些方法被称为一阶优化算法,即使用模型输出中误差的一阶导数的优化算法。
您可能还记得微积分中的二阶导数是一阶导数的变化率,或者在本例中,是误差梯度本身的梯度。它提供了损失函数在当前权重集下的弯曲程度。使用二阶导数的算法被称为二阶优化算法。
作者接着介绍了五种二阶优化算法,具体如下:
- 牛顿法
- 共轭梯度法
- 高斯-牛顿法
- Levenberg Marquardt
- 拟牛顿法 (BFGS)
这些算法需要访问Hessian矩阵或其近似值。如果您曾接触过反向传播算法的理论介绍,您可能还会回忆起Hessian矩阵。粗略地说,我们使用Hessian来描述模型权重的二阶导数。
作者接着概述了许多可用于近似 Hessian 矩阵(用于二阶优化算法)的方法,例如:有限差分、平方雅可比近似、Hessian 对角线等等。
然后,他们继续分析了多层神经网络中的Hessian以及二阶优化算法的有效性。
总而言之,他们强调二阶方法可能更适用于使用批量梯度下降训练的较小神经网络模型。
经典二阶方法在几乎所有有用的情况下都不实用。
讨论与结论
本章最后对训练神经网络模型时如何充分利用反向传播的技巧进行了非常有用的总结。
此摘要转载如下:
– 打乱示例
– 通过减去均值来居中输入变量
– 将输入变量标准化为标准差为1
– 如果可能,对输入变量进行去相关处理。
– 选择图1.4所示的 Sigmoid 函数网络
– 将目标值设置在 Sigmoid 函数的范围内,通常为 +1 和 -1。
– 将权重初始化为随机值(按1.16规定)。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- 神经网络:技巧与窍门,第一版,1998年。
- 神经网络:技巧与窍门,第二版,2012年。
- 高效反向传播,预印本,1998年。
- Hessian 矩阵,维基百科.
总结
在这篇文章中,您发现了在训练神经网络模型时如何充分利用反向传播算法的技巧和窍门。
您在项目中尝试过这些技巧吗?
请在下面的评论中告诉我您的结果。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
完美……太喜欢了……
谢谢。
非常有趣
谢谢。
二阶优化算法可以用Python配置吗?
Python 中提供了此类算法,并且通常用于许多不同的 scikit-learn 算法中。
“为每个权重使用单独的学习率。”
实现这种方法是什么?
SGD 的 Adam 版本。
告诉我一些与反向传播和激活函数不同的 ANN 训练方法。
你好 Ana… 以下资源可能对您有所帮助
https://medium.com/@sallyrobotics.blog/backpropagation-and-its-alternatives-c09d306aae4c