本篇文章6564字,读完约16分钟

雷锋。(公开号码:雷锋。新闻:这篇文章是在人工智能新媒体量子位(公开号:qbitai)的授权下转载的。请联系来源进行复制。王@王晓昕编译自。

每个人都可能在调试神经网络时遇到过这样的时刻:

搞什么鬼。我的神经网络坏了!到底该怎么办!丹尼尔·霍尔登是机器学习博客theorangeduck的作者,也是育碧蒙特利尔实验室的机器学习研究员。

根据我工作中失败的教训,我列出了神经网络错误的11个原因。当量子位被传送时,当你被神经网络滥用时,你可以跟随地图。

当然,读完这11篇文章后,我也祝你进步神速,炼丹顺利。

1.忘记数据标准化什么?

在使用神经网络的过程中,考虑如何对数据进行规范化是非常重要的。

这一步不应该草率。如果标准化完成得不正确且不仔细,您的网络将无法正常工作。

由于标准化数据的重要步骤在深度学习领域早已为人所知,本文中很少提及,因此它经常成为初学者的障碍。

怎么做?

一般来说,标准化是指从数据中减去平均值,然后除以标准差的操作。

通常,这个操作是针对每个输入和输出特征分别进行的,但是您可能希望同时规范化一整套特征,然后挑选一些特殊处理。

为什么?

我们需要对数据进行标准化的主要原因是,在神经网络中几乎所有的数据传输方式中,都假设输入输出数据结构的标准差接近1,平均值接近0。这种假设在深度学习中随处可见,从权重因子的初始化到激活函数,再到训练网络的优化算法。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

未经训练的神经网络通常输出范围从-1到1的结果。如果你想让它的输出值在其他范围内,例如,rgb图片的值范围是0到255,你会遇到麻烦。

当期望输出值为255时,当神经网络开始训练时,情况将非常不稳定,因为实际产生的值是-1或1,这与用于训练神经网络的大多数优化算法的255相比具有巨大的误差。这将产生巨大的梯度,你的训练误差可能会超出图表。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

即使在你训练的初始阶段没有任何异常,这个过程仍然是没有意义的,因为神经网络正在错误的方向学习和发展。

如果您首先对数据进行归一化(在本例中,您可以将rgb值除以128并减去1),则不会出现这些情况。

一般来说,神经网络中各种特征的取值范围决定了它们的重要性。

如果输出中某个特征的值范围很大,这意味着它将比其他特征产生更多的误差。同样,输入范围大的要素将主导网络,并在下游造成更大的变化。

因此,仅仅依靠许多神经网络库中的自动归一化来盲目地减去平均值然后除以方差并不总是合适的。可能有一个输入要素,其值范围通常介于0和0.001之间。是因为这个特性不重要,还是因为它的单位比其他特性小?这决定了你是否应该标准化它。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

同样,我们应该对那些小范围的特征保持谨慎,因为它们的标准偏差可能很小,接近或严格等于0。如果您将它们规范化,您可能会得到nan(不是数字)错误。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

这种情况需要谨慎对待,仔细考虑你的特征真正代表什么,并考虑规范化过程是使所有输入特征等效。

这些是我认为需要人类在深度学习中完成的几项任务。

2.没有测试结果什么?

当你训练网络通过几个时代,错误开始下降-成功!

但这是否意味着你已经完成了训练?医生能毕业吗?不幸的是,答案是否定的。

你的代码中还有一些错误。该缺陷可能存在于数据预处理、网络训练甚至最终给出推理结果的过程中。

仅仅因为错误开始减少,并不意味着你的网络已经学会了“真正的功夫”。

怎么做?

毫无疑问,在数据传输过程的每个阶段检查数据的正确性是非常重要的,这通常意味着通过一些方法将结果可视化。

如果你的数据是一个图像,情况很简单,相应的动画数据是很好地生成的。但是,如果你的数据很精彩,你也应该找到一个合适的方法,可以在预处理、网络训练和数据传输的每个阶段检查数据的正确性,并与原始的真实数据进行比较。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

为什么?

与传统的编程过程不同,机器学习系统在失败时不会发出任何噪音。

在传统编程中,我们习惯于在遇到情况时向计算机报告错误,然后我们就可以用错误报告内容进行调试。不幸的是,这个过程不适合机器学习应用。

因此,我们需要非常小心地在每个阶段检查我们的过程中是否有任何问题,以便我们能够检测到错误,并在需要返回并仔细检查代码时及时发现它。

然后呢。

有很多方法可以检查你的网络是否有效。其中之一是澄清训练错误的含义。将在训练集上运行的神经网络的输出可视化——输出与实际情况相比如何?

您可能会看到,在训练过程中,误差从100下降到1,但最终结果仍然不可用,因为1的误差在实际场景中仍然是不可接受的。如果网络在训练集上是有效的,那么在验证集上测试它——它也适用于以前没有见过的数据吗?

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

我的建议是从一开始就把所有的过程可视化,不要等到网络不起作用了。在你开始尝试不同的神经网络结构之前,你应该确保在整个过程中没有错误。这是正确评估不同网络模型的唯一方法。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

3.忘记数据预处理什么?

大多数数据都很棘手。从数据的角度来看,我们认为非常相似的东西可能有完全不同的数字表达式。

以视频中人物的动作为例,如果我们的数据在特定的位置或特征方向,并记录人物关节相对于视频中心的三维位置,那么如果我们改变方向或位置,同一组动作可能会有完全不同的数字表达。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

因此,我们需要用一种新的方式来表达我们的数据,例如,把它放在一些局部参考系统中(比如那些与字符质心相关的系统),以便类似的动作有类似的数字表达式。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

怎么做?

想想你的特征代表什么——你能对它们做一些简单的转换来确保用来代表相似事物的数据点通常有相似的数字表达式吗?有没有一个局部坐标系可以用不同的形式更自然地表达你的数据?例如,更好的颜色/0/房间?

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

为什么?

神经网络只对输入数据做出一些基本假设,但这些假设之一是,这些数据分布的空是连续的,也就是说,对于空的大部分地区,两个数据点之间的点类似于这两个数据点的“混合”。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

当数据空中有很大的不连续性时,或者当一大组独立的数据都表示同一事物时,这将大大增加学习任务的难度。

然后呢。

理解数据预处理的另一种方法是将其视为一种尝试,以减少由排列和组合引起的数据爆炸。

例如,如果基于角色的动作训练的神经网络需要在不同的地方和方向学习角色的同一组动作,这将消耗大量的资源,并且学习过程将是多余的。

4.忘了规范什么?

正则化是训练神经网络的另一个必不可少的方面,它通常以漏层、小噪声或某种形式的随机过程的形式应用于网络。

即使您认为当前数据比例比参数比例大得多,或者在某些情况下,拟合效果不会出现,或者即使出现,也不会影响效果,您仍然应该添加缺失层或其他形式的小噪声。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

怎么做?

向神经网络添加正则化的最基本方法之一是在网络中的每个线性层(如卷积层或稠密层)之前添加缺失层。

当您开始设置压差值时,可以将中间值定义为低值,如0.25或0.1。您可以根据网络的各种指标来判断和调整过度拟合的程度。如果您仍然认为过度拟合效果是不可能的,您可以将压差值设置为非常小的值,例如0.01。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

为什么?

正则化不仅用于控制过拟合效应,而且在训练过程中引入了一些随机过程,在某种意义上平滑了代价模式。这种方法可以加快训练过程,有助于处理数据中的异常值,防止网络中出现极端的权值结构。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

像丢失层一样,数据增强或其他类型的噪声也可以用作正则化方法。

虽然脱落层通常被认为是一种组合许多随机子网络的预测结果的技术,但是它也可以被认为是一种通过在训练期间生成各种输入数据的相似变体来动态扩展训练集大小的方法。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

此外,我们应该知道,防止过度拟合和提高网络精度的最佳方法是向神经网络输入大量非重复的训练数据。

5.设置了太大的批量。什么?

设置太大的批量可能会在训练过程中对网络的准确性产生负面影响,因为这会降低梯度下降的随机性。

怎么做?

最小批量应在可接受的培训时间内确定。能够合理利用gpu并行性能的批处理大小可能无法达到最佳精度,因为在某些情况下,较大的批处理大小可能需要训练更多的迭代周期才能达到相同的精度。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

开始时,尝试非常小的批量,例如16、8甚至1。

为什么?

批量越小,波动越大,重量更新越随机。这有两个积极的效果,一个是帮助训练“跳出”可能在它之前陷入的局部最小值,另一个是使训练在“平坦”最小值结束,这通常导致更好的泛化性能。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

数据中的其他元素有时会影响批量大小。

例如,以两倍于先前分辨率的分辨率处理图像,其效果类似于使用四倍于批次大小的分辨率。

为了做出直观的解释,考虑到在cnn网络中,每个过滤器的权重更新值将根据输入图像的所有像素和批次中的每个图像进行平均。将图像分辨率提高两倍将产生四倍像素量的平均效果,这类似于将批次大小提高四倍。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

一般来说,最重要的是考虑在每次迭代中有多少决定性的梯度更新值是平均的,并确保这种不利影响和充分利用gpu并行性能的需要之间的关系是平衡的。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

6.使用不恰当的学习率。

学习率对网络培训效果有很大影响。如果您刚刚开始使用常见深度学习框架中给出的各种默认参数,几乎可以肯定您的设置是错误的。

怎么做?

关闭梯度削波,找出最大学习率,也就是在训练过程中不会使误差超出图表的上限。如果学习率被设置为小于这个值,它可能非常接近最佳学习率。

为什么?

默认情况下,大多数深度学习框架都支持梯度裁剪。这样,通过限制在每个步骤中可以调整的权重的数量,可以防止优化策略在训练过程中崩溃。

当您的数据包含许多异常值时,它将导致较大的梯度和权重更新。这个限制特别有用。但是默认情况下,这种方法也使得用户很难手动找到最佳学习率。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

我发现大多数深度学习的初学者都会设定过高的学习率,而梯度切割会缓解这个问题,使得全局训练过程变慢,并且改变学习率后的网络效应是不可预测的。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

如果你很好地清理数据,删除大部分异常值,并设置一个合理的学习率,你实际上不需要梯度裁剪。如果您关闭梯度切割,您会发现网络中偶尔会出现训练错误,然后再次打开它。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

但是请记住,训练错误通常表明在您的数据中仍然存在一些问题,梯度裁剪只是一个临时的解决方案。

7.错误的激活函数在最后一层使用了什么?

在最后一层,不合理的激活功能有时会导致您的网络无法输出所需的全部值。最常见的错误是在最后一层使用relu函数,这导致网络只产生正输出。

怎么做?

如果你想实现返回任务,你通常不需要在最后一层使用任何激活函数,除非你详细知道你想要输出什么样的值。

为什么?

标准化后,重新确认输入数据的实际意义和具体范围。

网络的输出区间很可能是从负无穷大到正无穷大。在这种情况下,您不应该在最后一层使用激活功能。

如果网络输出仅在某个时间间隔内有意义,则需要使用一些特殊的激活功能。例如,网络的输出是区间[0,1]的概率值,可以根据这种情况使用S形激活函数。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

在选择最后一层的激活函数时有许多形而上学。

在神经网络产生输出后,你可以把它减少到[-1,1]的区间。将这个限幅过程视为最后一层的激活函数似乎是有意义的,因为它将确保网络中的误差函数不会惩罚[-1,1]区间之外的值。然而,无误差意味着这些区间外的值没有相应的梯度,这在某些情况下不能用于网络训练。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

或者,您可以在最后一层使用tanh函数,因为该激活函数的输出范围是[-1,1]。然而,这可能会引起问题,因为当该函数的斜率接近1或-1时,它会变得非常大,这可能会大大增加权重,并且最终仅产生-1或1的输出。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

一般来说,最好的选择是采取寻求稳定的策略,在最后一层不使用任何激活功能,而不是试图使用一些巧妙的技巧,这可能会适得其反。

8.网络包含坏梯度什么?

使用relu激活函数的深层神经网络通常可能遭受由不良梯度引起的所谓“死神经元”的困扰。这可能会对网络性能产生负面影响,或者在某些情况下导致完全无法进行培训。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

怎么做?

如果你发现你的训练错误不会随着时间的推移而改变,那可能是所有的神经元都因为再激活功能而死亡。

尝试另一个激活功能,如泄漏relu或elu,看看是否同样的事情会再次发生。

为什么?

对于正值,relu激活函数的梯度为1,对于负值,梯度为0。这是因为对于小于0的输入,输入的微小变化不会影响输出。

这似乎不是问题,因为正值的梯度很大。但是许多是堆叠在一起的,负权重可以将具有强梯度的大正值变为具有零梯度的负值。

你可能经常会发现,不管你输入什么,一些甚至所有的隐藏单元对成本函数的梯度都是0。这就是所谓的“死网络”,所有的权重都无法更新。

然后呢。

许多操作的梯度为0,例如裁剪、舍入或取最大/最小值。如果用它们来计算成本函数相对于权重的导数,就会有一个不好的梯度。

如果它们出现在你的符号图中的任何地方,要非常小心,因为它们经常会导致意想不到的困难。

9.网络权重未正确初始化。

如果不正确初始化神经网络的权值,神经网络可能根本无法训练。

神经网络中还有许多其他组件,它们会假设您的权重初始化是正确的或标准的,并且它们会将权重设置为0,或者使用您自定义的随机初始化权重,因此它将不起作用。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

怎么做?

“he”、“lecun”或“xavier”的权重初始化是一个流行的选择,几乎在任何情况下都应该运行良好。只要选一个(我最喜欢的是“乐村”)。

但是一旦神经网络开始训练,你就可以自由地进行实验,为你的任务找到最合适的权重。

为什么?

你可能听说过“小随机数”可以用来初始化神经网络的权值,但它不是那么简单。

以上所有的初始化方法都是通过复杂而细致的数学发现的,这也解释了为什么它们是最好的。

更重要的是,许多其他的神经网络组件都是围绕着这些初始化而构建的,它们被用来根据经验进行测试。可能很难通过初始化自己来复制其他研究人员的结果。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

其他层可能也需要仔细初始化。网络偏移初始化为零,而其他更复杂的层(如参数激活函数)可能有自己的初始化,这与正确一样重要。

10.什么神经网络太深了。

网络越深越好?不一定。

当您对网络进行基准测试,并尝试将某些任务的准确度提高1%时,较深的网络通常性能更好。

但是,如果您设计的浅层(3-5层)网络没有学到任何功能,可以保证您设计的超深层(如100层)网络将是无效的,甚至更糟。

怎么做?

开始时,尝试浅神经网络的效果,通常是3到8层。只有当你的网络有了一定的效果,你开始提高准确度,你才能研究更深层次的网络结构。

为什么?

似乎当有人决定堆砌一个数百层的神经网络时,神经网络模型突然得到了突破性的结果,但事实并非如此。

在过去的十年中,神经网络中所有改进技术取得的微小进步同样适用于浅层和深层网络。如果你的网络不工作,那可能不是深层问题,而是其他方面的问题。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

然后呢。

从一个小网络进行训练意味着更快地训练网络,更快地完成模型推理,更快地完成不同结构和参数配置的迭代过程。首先,与堆叠更多的网络层相比,上述所有方面都会对模型的准确性产生更大的影响。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

11.隐藏单元的数量不正确。

在某些情况下,过多或过少的隐藏单元会使网络难以训练。

隐藏单元太少,可能无法表达所需的任务;过多的单元会使网络变慢,难以训练,残余噪声难以消除。

怎么做?

开始时隐藏单元的数量最好在256和1024之间。

然后,看看研究类似应用的研究人员使用了多少隐藏单元来寻找灵感。如果你的同龄人使用的数字与上面给出的数字相差甚远,可能会有一些特殊的原因,这些原因对你来说可能非常重要。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

为什么?

当决定隐藏单元的数量时,关键是要考虑表达你想通过网络传输的信息所需的最小真值。

然后,考虑到辍学,网络的冗余表示,并为你的估计留一点空间,你可以扩大这个数字一点。

如果你正在分类,你可以用5到10倍的类别数作为隐藏单元数;如果返回,可以使用2到3倍的输入或输出变量。

当然,所有这些都高度依赖于环境,并且没有简单的自动解决方案。当决定隐藏单位的数量时,最重要的是直觉。

然后呢。

事实上,与其他因素相比,隐藏单元的数量通常对神经网络的性能影响很小。在很多情况下,高估隐藏单位的数量不仅会降低训练速度,而且不会产生负面影响。

我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

一旦网络开始正常工作,如果你仍然担心,你可以尝试不同数量的隐藏单元,并测量网络的准确性,直到你找到最合适的设置。

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:我搭的神经网络不 work 该怎么办!看看这 11 条新手最容易犯的错误

地址:http://www.hcsbodzyz.com/hcxw/7081.html