深度学习训练技巧 随着神经网络的深度增加,其训练过程变得越来越具有挑战性。其中一个主要问题是所谓的“梯度消失”或“梯度爆炸”。这篇文章对此问题有很好的介绍。 为了使训练深层网络更高效,可以使用一些技术。 保持值在合理区间 为了使数值计算更加稳定,我们需要确保神经网络中的所有值都在合理的范围内,通常为[-1..1]或[0..1]。这并不是一个非常严格的要求,但浮点数计算的性质决定了不同数量级的值不能准确地一起操作。例如,如果我们添加10^-10和10^10,我们很可能会得到10^10,因为较小的值会被“转换”到与较大值相同的数量级,从而导致尾数丢失。 大多数激活函数在[-1..1]附近有非线性,因此将所有输入数据缩放到[-1..1]或[0..1]区间是有意义的。
随着神经网络的深度增加,其训练过程变得越来越具有挑战性。其中一个主要问题是所谓的“梯度消失”或“梯度爆炸”。这篇文章对此问题有很好的介绍。
为了使训练深层网络更高效,可以使用一些技术。
为了使数值计算更加稳定,我们需要确保神经网络中的所有值都在合理的范围内,通常为[-1..1]或[0..1]。这并不是一个非常严格的要求,但浮点数计算的性质决定了不同数量级的值不能准确地一起操作。例如,如果我们添加10^-10和10^10,我们很可能会得到10^10,因为较小的值会被“转换”到与较大值相同的数量级,从而导致尾数丢失。
大多数激活函数在[-1..1]附近有非线性,因此将所有输入数据缩放到[-1..1]或[0..1]区间是有意义的。
理想情况下,我们希望在网络层通过后,值仍保持在同一范围内。因此,重要的是以一种方式初始化权重,以保留值的分布。
正态分布 N(0,1) 不是一个好主意,因为我们有 n 个输入时,输出的标准差将是 n,值很可能超出[0..1]区间。
以下是一些常用的初始化方法:
uniformgaussianglorot),它有助于在前向和反向传播过程中保持信号在范围内即使进行了适当的权重初始化,在训练过程中权重也可能变得非常大或非常小,并将信号带出合适的范围。我们可以使用归一化技术来将信号带回合适的范围。虽然有几种归一化方法(权重归一化、层归一化),最常用的是批量归一化。
批量归一化的想法是考虑小批量中的所有值,并基于这些值进行归一化(即减去平均值并除以标准差)。它作为一个网络层实现,该层在应用权重后但在激活函数之前进行归一化。结果,我们可能会看到更高的最终准确率和更快的训练速度。
这里是关于批量归一化的原始论文,维基百科上的解释,以及一篇好的入门博客文章(以及俄文版本)。
Dropout 是一种有趣的技术,在训练期间随机删除一定比例的神经元。它也被实现为一个带有参数(要删除的神经元百分比,通常为10%-50%)的层,在训练期间将输入向量的随机元素置零,然后传递给下一层。
虽然这听起来像是一个奇怪的想法,但您可以在Dropout.ipynb笔记本中看到Dropout对MNIST数字分类器训练的影响。它加快了训练速度,并允许我们在较少的训练周期内达到更高的准确率。
这种效果可以用几种方式解释:
有些人说,当一个喝醉的人试图学习某些东西时,他会在第二天早上记得更好,而比一个清醒的人更好,因为大脑中有一些功能失调的神经元会更好地适应以理解。我们从未测试过这个说法是否正确
深度学习的一个非常重要的方面是能够防止过拟合。虽然使用非常强大的神经网络模型可能很诱人,但我们应该始终平衡模型参数的数量与训练样本的数量。
确保你理解了我们之前介绍的过拟合概念!
防止过拟合的一些方法包括:
另一个重要的方面是选择一个好的训练算法。虽然经典的梯度下降是一个合理的选择,但它有时可能太慢,或者会导致其他问题。
在深度学习中,我们使用随机梯度下降(SGD),这是应用于小批量数据的梯度下降,小批量是从训练集中随机选取的。权重通过以下公式调整:
wt+1 = wt - η∇ℒ
在动量SGD中,我们保留一部分前几步的梯度。这类似于当我们受到惯性影响移动时,如果受到另一个方向的冲击,我们的轨迹不会立即改变,而是保留一部分原来的运动。这里引入一个向量v来表示速度:
这里参数 γ 表示我们考虑惯性的程度:γ=0 对应于经典SGD;γ=1 是纯运动方程。
因为在每一层中,我们将信号乘以某个矩阵Wi,根据 ||Wi||,梯度可能会缩小接近0,或者无限上升。这就是梯度消失/爆炸问题的本质。
解决这个问题的一种方法是仅在公式中使用梯度的方向,忽略绝对值,即:
wt+1 = wt - η(∇ℒ/||∇ℒ||),其中 ||∇ℒ|| = √∑(∇ℒ)2
这种算法称为Adagrad。其他使用相同思想的算法:RMSProp、Adam
Adam 被认为是许多应用中非常有效的算法,所以如果您不确定使用哪个算法,请使用Adam。
梯度裁剪是上述思想的扩展。当 ||∇ℒ|| ≤ θ 时,我们使用原始梯度进行权重优化,而当 ||∇ℒ|| > θ 时,我们将梯度除以其范数。这里 θ 是一个参数,在大多数情况下我们可以取 θ=1 或 θ=10。
训练的成功往往取决于学习率参数 η。假设较大的 η 值会导致更快的训练,这是我们通常在训练开始时想要的,而较小的 η 值允许我们微调网络。因此,在训练过程中,我们通常希望降低 η。
这可以通过在每次训练周期后将 η 乘以某个数(例如0.98)来实现,或者使用更复杂的学习率计划。
为您的问题选择正确的网络架构可能很棘手。通常,我们会选择已经在特定任务(或类似任务)上证明有效的架构。这里有一个关于计算机视觉的良好概述。
选择一个足够强大的架构以处理我们拥有的训练样本数量非常重要。选择过于强大的模型可能导致过拟合。
另一种好的方法是使用能够自动调整到所需复杂度的架构。在某种程度上,ResNet 架构和Inception是自调整的。更多关于计算机视觉架构的内容可以参考此处。
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。