0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

构建神经网络的经验和教训总结

汽车玩家 来源:AI公园 作者:Matt H and Daniel R 2020-05-04 11:58 次阅读

导读

从成千上万小时的模型训练中累计的经验和教训。

在我们的机器学习实验室,我们在许多高性能的机器已经积累了成千上万个小时的训练。然而,并不是只有计算机在这个过程中学到了很多东西:我们自己也犯了很多错误,修复了很多错误。

在这里,我们根据我们的经验(主要基于 TensorFlow)提出了一些训练深度神经网络的实用技巧。有些建议对你来说可能是显而易见的,但对我们中的某个人来说却不是。其他的建议可能不适用,甚至对你的特定任务来说是不好的建议:谨慎使用!

我们承认这些都是众所周知的方法。我们也站在巨人的肩膀上!我们这篇文章的目的仅仅是对它们进行高层次的总结,以便在实践中使用。

通用 Tips

使用 ADAM 优化器。它真的很好用。比起传统的优化方法,如原始的梯度下降,我更喜欢它。注意:如果要保存和恢复权重,记得在设置好AdamOptimizer之后设置Saver ,因为 ADAM 也有需要恢复的状态(即每个权重的学习率)。

ReLU 是最好的非线性(激活函数)。这有点像说 Sublime 是最好的文本编辑器。但实际上,ReLUs 是快速的、简单的,而且令人惊讶的是,它们能够工作,并且没有梯度衰减的问题。虽然 sigmoid 是一种常见的教科书式激活函数,但它不能很好地通过 DNNs 传播梯度。

不要在输出层使用激活函数。这应该是显而易见的,但这是一个很容易犯的错误,如果你用一个共享函数构建每个层:一定要在输出处关闭激活函数。

一定要在每一层添加一个偏差。这是 ML 101:偏差本质上是将飞机转换成最佳位置。在y=mx+b中,b 是偏差,允许直线向上或向下移动到“最合适”的位置。

使用 variance-scaled 初始化。在 Tensorflow 中,就像tf.contrib.layers.variance_scaling_initializer()。在我们的经验中,这比常规的高斯分布、截断的正太分布和 Xavier 更能泛化/缩放。粗略地说, variance scaling 初始化根据每一层的输入或输出的数量来调整初始随机权重的方差(TensorFlow 中的默认值是输入的数量),从而帮助信号更深入地传播到网络中,而不需要额外的“技巧”,比如 clipping 或 batch normalization。Xavier 是很相似的方法,但是 Xavier 的所有层的方差几乎相同,在那些层的形状变化很大的网络(通常是卷积网络)中,可能不能很好地处理每一层相同的变化。

白化(归一化)你的输入数据。训练时,减去数据集的均值,然后除以其标准差。你需要向各个方向拉伸和拉伸的幅度越少,你的网络学习就会越快、越容易。保持输入数据的均值以不变的方差为中心有助于解决这个问题。你还必须对每个测试输入执行相同的标准化,因此要确保你的训练集与真实数据相似。

以合理保留其动态范围的方式缩放输入数据。这与归一化有关,但应该在归一化之前进行。例如,实际范围为[0,140000000]的数据“x”通常可以用tanh(x)或tanh(x/C)来处理,其中 C是某个常数,它拉伸曲线以适应 tanh 函数动态的、倾斜的部分中的更多输入范围。特别是在输入数据的一端或两端可能是无界的情况下,神经网络在(0,1)之间可以更好地学习。

不要费心降低学习速度(通常)。学习率下降在 SGD 中更为常见,但 ADAM 自然地处理了这个问题。如果你绝对想要榨干每一盎司的表现:在训练结束后短时间内降低学习速度,你可能会看到一个突然的,非常小的误差下降,然后它会再次变平。

如果你的卷积层有 64 或 128 个滤波器,那可能就足够了。特别是对于深度网络。实际上,128 已经很多了。如果你已经有了大量的滤波器,那么添加更多的滤波器可能不会改善性能。

池化用于转换不变性。池化本质上是让网络学习图像“那部分”的“大意”。例如,最大池可以帮助卷积网络对图像中特征的平移、旋转和缩放变得健壮。

调试神经网络

如果你的网络没有学习(意思是:在训练过程中,损失没有收敛,或者你没有得到你期望的结果),试试下面的建议:

过拟合!如果你的网络没有在学习,首先要做的就是在单个数据样本上让网络过拟合。这样的话,准确度应该是 100%或 99.99%,或者接近于 0 的误差。如果你的神经网络不能对单个数据点进行过拟合,那么可能是体系结构出现严重问题,但问题可能很微妙。如果你可以过拟合一个数据点,但是在更大的集合上的训练仍然不收敛,请尝试以下建议。

降低学习率。你的网络学习速度会变慢,但它可能会进入一个以前无法进入的最小值,因为之前它的步长太大了。(直觉上,当你真正想进入沟底时,你的错误是最低的,想象一下跨过路边的水沟。)

提高学习率。这将加快训练,帮助收紧反馈回路,这意味着你会更早知道你的网络是否在工作。虽然网络应该更快地收敛,但它的结果可能不会很好,而且“收敛”的过程实际上可能会跳来跳去。(使用 ADAM 的时候,我们发现~0.001 是一个非常好的值,在许多实验中都是这样。)

减小 minibatch 大小。将 minibatch 大小减少到 1 可以提供与权重更新相关的更细粒度的反馈,你可以使用 TensorBoard(或其他调试/可视化工具)报告这些更新。

去掉 batch normalization。随着批大小减少到 1,这样做可以梯度消失或梯度爆炸。几个星期以来,我们的网络都没有收敛,当我们删除了 batch normalization 之后,我们意识到在第二次迭代时输出都是 NaN。Batch norm 的作用是给需要止血带的东西贴上创可贴。它有它用的位置,但只有在你网络是没有 bug 的情况下才可以用。

增加 minibatch 大小。更大的 minibatch — 如果可以的话,使用整个训练集 — 减少梯度更新中的方差,使每次迭代更精确。换句话说,让权重更新的方向是正确的。但是!它的有用性有一个有效的上限,物理内存的限制。通常,我们发现这不如前两个建议那么有用,这两个建议将 minibatch 大小减少到 1 并删除 batch normalization。

检查一下 reshaping。剧烈的 reshaping(比如改变图像的 X、Y 维度)会破坏空间的局部性,使得网络更难学习,因为它也必须学习 reshaping。(自然景观变得支离破碎。自然特征在空间上是局部的,这就是为什么 conv 网如此有效的原因。如果使用多个图像/通道进行 reshape,要特别小心,使用numpy.stack()进行适当的对齐。

仔细检查你的损失函数。如果使用复合函数,尝试将其简化为 L1 或 L2。我们发现 L1 对异常值的敏感度较低,当遇到有噪声的批处理或训练点时,L1 的调整幅度较小。

仔细检查你的可视化效果,如果适用的话。你的可视化库(matplotlib, OpenCV 等)是调整数值的比例,还是剪切它们?还可以考虑使用一种感觉上一致的配色方案。

用一个例子来学习一下

为了使上面描述的过程更接近实际,这里有一些损失图(通过 TensorBoard 画出来的),用于我们构建的卷积神经网络的一些实际回归实验。

起初,这个网络根本没有学习:

构建神经网络的经验和教训总结

我们尝试对值进行 clipping,以防止它们超出界限:

构建神经网络的经验和教训总结

嗯。看看这些没做平滑的值有多疯狂。学习率太高?我们试着降低学习速度,只对一个输入进行训练:

构建神经网络的经验和教训总结

你可以看到学习率的最初几个变化发生在什么地方(大约在第 300 步和第 3000 步)。显然,我们衰减得太快了。所以,在衰减之前给它更多的时间,它可以做得更好:

构建神经网络的经验和教训总结

你可以看到我们在 2000 步和 5000 步时衰减。这个更好,但仍然不是很好,因为它没有趋近于 0。

然后,我们禁用了学习率衰减,并尝试将值移动到一个更窄的范围内,不过不是通过输入 tanh。虽然这明显使错误值低于 1,但我们仍然不能过拟合训练集:

构建神经网络的经验和教训总结

通过删除 batch normalization,我们发现,在经过一两次迭代之后,网络可以快速输出 NaN。我们禁用了 batch normalization,并将初始化更改为 variance scaling。这些改变了一切!我们能够过拟合我们的测试集,只是一个或两个输入。虽然底部的图表盖住了 Y 轴,但初始误差值远远高于 5,表明误差减少了近 4 个数量级:

构建神经网络的经验和教训总结

上面的图表非常平滑,但是你可以看到它与测试输入过拟合的速度非常快,随着时间的推移,整个训练集的损失降到了 0.01 以下。这并没有降低学习率。在学习率下降一个数量级后,我们继续训练,得到了更好的结果:

构建神经网络的经验和教训总结

这些结果好多了!但是如果我们以几何的方式衰减学习率而不是把训练分成两部分呢?

将每一步的学习率乘以 0.9995,结果并不好:

构建神经网络的经验和教训总结

大概是因为衰减太快了,乘数为 0.999995 的情况要好一些,但结果几乎等于完全不衰减。我们从这个特殊的实验序列中得出结论,batch normalization 隐藏了糟糕的初始化所导致的急剧变化的梯度,降低学习率对 ADAM 优化器并没有特别的帮助,除了在最后可能会故意降低。与 batch normalization 一起,clipping 只是掩盖了真正的问题。我们还通过将高方差输入值放入 tanh 来处理它们。

我们希望随着你对构建深度神经网络越来越熟悉,你会发现这些基本技巧非常有用。通常,只是一些简单的事情就能改变一切。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4575

    浏览量

    98792
  • ADAM
    +关注

    关注

    0

    文章

    13

    浏览量

    9761
收藏 人收藏

    评论

    相关推荐

    实现图像识别神经网络的步骤

    我们的下一个任务是使用先前标记的图像来训练神经网络,以对新的测试图像进行分类。因此,我们将使用nn模块来构建我们的神经网络
    的头像 发表于 01-22 10:01 443次阅读
    实现图像识别<b class='flag-5'>神经网络</b>的步骤

    卷积神经网络的优点

    卷积神经网络的优点  卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度学习的神经网络模型,在图像识别、语音识别、自然语言处理等领域有着广泛的应用。相比
    的头像 发表于 12-07 15:37 2980次阅读

    构建神经网络模型的常用方法 神经网络模型的常用算法介绍

    神经网络模型是一种通过模拟生物神经元间相互作用的方式实现信息处理和学习的计算机模型。它能够对输入数据进行分类、回归、预测和聚类等任务,已经广泛应用于计算机视觉、自然语言处理、语音处理等领域。下面将就神经网络模型的概念和工作原理,
    发表于 08-28 18:25 627次阅读

    人工神经网络和bp神经网络的区别

    人工神经网络和bp神经网络的区别  人工神经网络(Artificial Neural Network, ANN)是一种模仿人脑神经元网络结构和功能的计算模型,也被称为
    的头像 发表于 08-22 16:45 3450次阅读

    卷积神经网络和深度神经网络的优缺点 卷积神经网络和深度神经网络的区别

    深度神经网络是一种基于神经网络的机器学习算法,其主要特点是由多层神经元构成,可以根据数据自动调整神经元之间的权重,从而实现对大规模数据进行预测和分类。卷积
    发表于 08-21 17:07 2351次阅读

    卷积神经网络的介绍 什么是卷积神经网络算法

    卷积神经网络的介绍 什么是卷积神经网络算法 卷积神经网络涉及的关键技术 卷积神经网络(Convolutional Neural Network,CNN)是一种用于图像分类、物体识别、语
    的头像 发表于 08-21 16:49 1436次阅读

    卷积神经网络层级结构 卷积神经网络的卷积层讲解

    卷积神经网络层级结构 卷积神经网络的卷积层讲解 卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度学习的神经网络模型,在许多视觉相关的任务中
    的头像 发表于 08-21 16:49 4510次阅读

    卷积神经网络的基本原理 卷积神经网络发展 卷积神经网络三大特点

    卷积神经网络的基本原理 卷积神经网络发展历程 卷积神经网络三大特点  卷积神经网络的基本原理 卷积神经网络(Convolutional Ne
    的头像 发表于 08-21 16:49 1454次阅读

    卷积神经网络三大特点

    卷积神经网络三大特点  卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,其具有三大特点:局部感知、参数共享和下采样。 一、局部感知 卷积神经网络
    的头像 发表于 08-21 16:49 3669次阅读

    卷积神经网络模型有哪些?卷积神经网络包括哪几层内容?

    卷积神经网络模型有哪些?卷积神经网络包括哪几层内容? 卷积神经网络(Convolutional Neural Networks,CNN)是深度学习领域中最广泛应用的模型之一,主要应用于图像、语音
    的头像 发表于 08-21 16:41 1517次阅读

    卷积神经网络概述 卷积神经网络的特点 cnn卷积神经网络的优点

    卷积神经网络概述 卷积神经网络的特点 cnn卷积神经网络的优点  卷积神经网络(Convolutional neural network,CNN)是一种基于深度学习技术的
    的头像 发表于 08-21 16:41 1947次阅读

    卷积神经网络的应用 卷积神经网络通常用来处理什么

    卷积神经网络的应用 卷积神经网络通常用来处理什么 卷积神经网络(Convolutional Neural Network,简称CNN)是一种在神经网络领域内广泛应用的
    的头像 发表于 08-21 16:41 4023次阅读

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法 卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度学习的人工
    的头像 发表于 08-17 16:30 929次阅读

    什么是神经网络?为什么说神经网络很重要?神经网络如何工作?

    神经网络是一个具有相连节点层的计算模型,其分层结构与大脑中的神经元网络结构相似。神经网络可通过数据进行学习,因此,可训练其识别模式、对数据分类和预测未来事件。
    的头像 发表于 07-26 18:28 2000次阅读
    什么是<b class='flag-5'>神经网络</b>?为什么说<b class='flag-5'>神经网络</b>很重要?<b class='flag-5'>神经网络</b>如何工作?

    三个最流行神经网络

    在本文中,我们将了解深度神经网络的基础知识和三个最流行神经网络:多层神经网络(MLP),卷积神经网络(CNN)和递归神经网络(RNN)。
    发表于 05-15 14:19 1179次阅读
    三个最流行<b class='flag-5'>神经网络</b>