深度学习训练技巧


文档摘要

深度学习训练技巧 随着神经网络的深度增加,其训练过程变得越来越具有挑战性。其中一个主要问题是所谓的“梯度消失”或“梯度爆炸”。这篇文章对此问题有很好的介绍。 为了使训练深层网络更高效,可以使用一些技术。 保持值在合理区间 为了使数值计算更加稳定,我们需要确保神经网络中的所有值都在合理的范围内,通常为[-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]区间。

以下是一些常用的初始化方法:

  • 均匀分布 -- uniform
  • N(0,1/n) -- gaussian
  • N(0,1/√n_in) 可以保证对于均值为零且标准差为1的输入,相同的均值/标准差会保持不变
  • N(0,√2/(n_in+n_out)) -- 所谓的Xavier 初始化 (glorot),它有助于在前向和反向传播过程中保持信号在范围内

批量归一化

即使进行了适当的权重初始化,在训练过程中权重也可能变得非常大或非常小,并将信号带出合适的范围。我们可以使用归一化技术来将信号带回合适的范围。虽然有几种归一化方法(权重归一化、层归一化),最常用的是批量归一化。

批量归一化的想法是考虑小批量中的所有值,并基于这些值进行归一化(即减去平均值并除以标准差)。它作为一个网络层实现,该层在应用权重后但在激活函数之前进行归一化。结果,我们可能会看到更高的最终准确率和更快的训练速度。

这里是关于批量归一化的原始论文维基百科上的解释,以及一篇好的入门博客文章(以及俄文版本)。

Dropout

Dropout 是一种有趣的技术,在训练期间随机删除一定比例的神经元。它也被实现为一个带有参数(要删除的神经元百分比,通常为10%-50%)的层,在训练期间将输入向量的随机元素置零,然后传递给下一层。

虽然这听起来像是一个奇怪的想法,但您可以在Dropout.ipynb笔记本中看到Dropout对MNIST数字分类器训练的影响。它加快了训练速度,并允许我们在较少的训练周期内达到更高的准确率。

这种效果可以用几种方式解释:

  • 它可以被认为是对模型的随机冲击因素,使得优化从局部最小值中逃脱
  • 它可以被认为是隐式模型平均,因为在Dropout期间,我们实际上是在训练稍微不同的模型

有些人说,当一个喝醉的人试图学习某些东西时,他会在第二天早上记得更好,而比一个清醒的人更好,因为大脑中有一些功能失调的神经元会更好地适应以理解。我们从未测试过这个说法是否正确

防止过拟合

深度学习的一个非常重要的方面是能够防止过拟合。虽然使用非常强大的神经网络模型可能很诱人,但我们应该始终平衡模型参数的数量与训练样本的数量。

确保你理解了我们之前介绍的过拟合概念!

防止过拟合的一些方法包括:

  • 早期停止 -- 持续监控验证集上的误差,在验证误差开始增加时停止训练。
  • 显式权重衰减/正则化 -- 向损失函数中添加额外惩罚项,以防止模型产生非常不稳定的结果。
  • 模型平均 -- 训练多个模型,然后取平均结果。这有助于最小化方差。
  • Dropout(隐式模型平均)

优化器/训练算法

另一个重要的方面是选择一个好的训练算法。虽然经典的梯度下降是一个合理的选择,但它有时可能太慢,或者会导致其他问题。

在深度学习中,我们使用随机梯度下降(SGD),这是应用于小批量数据的梯度下降,小批量是从训练集中随机选取的。权重通过以下公式调整:

wt+1 = wt - η∇ℒ

动量

动量SGD中,我们保留一部分前几步的梯度。这类似于当我们受到惯性影响移动时,如果受到另一个方向的冲击,我们的轨迹不会立即改变,而是保留一部分原来的运动。这里引入一个向量v来表示速度

  • vt+1 = γ vt - η∇ℒ
  • wt+1 = wt+vt+1

这里参数 γ 表示我们考虑惯性的程度:γ=0 对应于经典SGD;γ=1 是纯运动方程。

Adam、Adagrad等

因为在每一层中,我们将信号乘以某个矩阵Wi,根据 ||Wi||,梯度可能会缩小接近0,或者无限上升。这就是梯度消失/爆炸问题的本质。

解决这个问题的一种方法是仅在公式中使用梯度的方向,忽略绝对值,即:

wt+1 = wt - η(∇ℒ/||∇ℒ||),其中 ||∇ℒ|| = √∑(∇ℒ)2

这种算法称为Adagrad。其他使用相同思想的算法:RMSPropAdam

Adam 被认为是许多应用中非常有效的算法,所以如果您不确定使用哪个算法,请使用Adam。

梯度裁剪

梯度裁剪是上述思想的扩展。当 ||∇ℒ|| ≤ θ 时,我们使用原始梯度进行权重优化,而当 ||∇ℒ|| > θ 时,我们将梯度除以其范数。这里 θ 是一个参数,在大多数情况下我们可以取 θ=1 或 θ=10。

学习率衰减

训练的成功往往取决于学习率参数 η。假设较大的 η 值会导致更快的训练,这是我们通常在训练开始时想要的,而较小的 η 值允许我们微调网络。因此,在训练过程中,我们通常希望降低 η。

这可以通过在每次训练周期后将 η 乘以某个数(例如0.98)来实现,或者使用更复杂的学习率计划

不同的网络架构

为您的问题选择正确的网络架构可能很棘手。通常,我们会选择已经在特定任务(或类似任务)上证明有效的架构。这里有一个关于计算机视觉的良好概述

选择一个足够强大的架构以处理我们拥有的训练样本数量非常重要。选择过于强大的模型可能导致过拟合

另一种好的方法是使用能够自动调整到所需复杂度的架构。在某种程度上,ResNet 架构和Inception是自调整的。更多关于计算机视觉架构的内容可以参考此处

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


发布者: 作者: 转发
评论区 (0)
U