神经网络无效的原因?

神经网络经常会遇到一些不能工作的问题,主要原因有以下几个方面:

一、没有规范化你的数据(Normalize)

What?

使用神经网络时,必须要准确的考虑如何规范化数据,这是一个不可妥协的步骤,如果没有正确的并且谨慎地执行此操作,神经网络运行的可能性很小。由于这一步非常重要,并且在深度学习社区中众所周知,淫才很少在论文中提到,因为几乎总是会让初学者感到高兴。

How?

通常,归一化意味着-从数据中减去均值并将数据除以其标准差。通常,这是针对每个输入和输出功能单独完成的,但你可能经常希望针对功能组执行此操作,或者特别小心地处理某些功能的规范化。

Why?

我们需要对数据进行归一化的主要原因是神经网络管道的大多数部分假设输入和输出数据的分布标准偏差大约为1,平均值大致为零。这些假设在的狠毒学习文献中随处可见,从权重初始化到激活函数,再到训练网络的优化算法。

And?

未经训练的神经网络通常会输出大致在-1到1范围内的值。如果你希望输出其它范围内的值,例如存储字节的RGB图像在0-255范围内,则会有一些问题。当开始训练时,网络将非常不稳定,因为预期值为255,它将产生-1或1的值,这个误差被大多数用于训练神经网络的的优化算法认为是巨大的。这将产生巨大的梯度,并且训练时的错误可能会爆炸。如果你的训练没有爆炸,那么训练的前几个阶段仍然是一个浪费,因为网络将学习的第一件事是缩放并将输出值转换到大致所需的范围,如果您对数据进行标准化(在这种情况下,可以简单的除以128并减去1),那么这些都不是问题。

通常神经网络中的特征尺度也将决定他们的重要性,如果输出中的某个功能具有较大的比例,那么与其他功能相比,它将产生更大的错误,同样输入中的大规模特征将主导网络并导致下游更大的变化。由于这个原因,使用许多神经网络库的自动归一化并不总是足够的,这些神经网络库盲目地减去平均值并除以每个特征的标准偏差,可能有一个输入功能,通常介于0.0和0.001之间,这个功能的范围很小,因为他是一个不重要的功能,同样要小心他们的标准偏差接近的范围很小的特征,或者确切地说,如果你将他们标准化,这些将产生NaN的不稳定性。考虑将规范化作为使所有的输入功能的单位相等的过程。

 二、没有检查你的结果

What?

你已经训练你的网络几个小时,你可以看到错误-- 成功!这是否意味着你已经完成了?获博士学位?不幸的是 - 几乎可以肯定你的代码还有问题。它可能是数据预处理,训练代码甚至推理中的错误。仅仅因为错误消失并不意味着你的网络正在学习任何有用的东西。

How?

检查数据在每个管道的每个阶段都是正确的,这非常重要。通常意味着找到一些方法来可视化结果。如果你有图像数据则很容易-动画数据也可以在没有太多麻烦的情况下可视化,如果你有更奇特的东西,你必须找到一种理智的方法来检查它,以确保它在你的预处理,训练和推理管道的每个阶段看起来都正确,并将它与地面实况数据进行比较。

Why?

与传统编程不同,机器学习系统几乎在所有情况下都会无声地失败。对于传统的编程,我们习惯于计算机在出现问题时抛出错误并将其用作返回并检查错误的信号。不幸的是,这个过程不适用于机器学习应用程序,因此我们应该非常小心地用人眼检查每个阶段的流程,以便我们知道何时生成错误以及何时需要返回并检查我们的代码更彻底。

And?

有很多方法可以检查您的网络是否正常工作。部分原因是确切地了解报告的训练误差的真正含义。可视化应用于训练集中数据的网络结果 - 您的网络结果与实际中的基本事实相比如何?您可能会看到错误训练期间从1.0到0.01,但结果仍然是不可用的,如果以0.01的错误仍然是在实践中一个不可接受的结果。如果它在训练集上工作,请在验证集上检查它 - 它是否仍适用于之前没有见过的数据?我的建议是从一开始就习惯于对所有内容进行可视化 - 只有当你的网络不工作时才开始 - 确保在你开始尝试不同的神经网络结构之前,你已经拥有了完整的管道。最终用户在整个过程中进行了健全性检查。这是您可以准确评估许多潜在不同方法的唯一方法。

 三、没有预处理你的数据

 

What?

大多数数据都很棘手 - 通常我们所知道的数据类似,数字表示可能会有很大差异。举一个角色动画的例子 - 如果我们使用角色关节相对于动作捕捉工作室中心的三维位置来表示我们的数据,那么在一个位置或面向一个方向进行动作可能会有一个非常不同的数值表示在不同的位置执行相同的运动,或面向不同的方向。我们需要做的是以不同的方式表示数据 - 例如在一些局部参考系中(例如相对于角色的质心),以便我们知道的两个运动相似,得到类似的数值表示。

How?

想一想你的特征代表什么 - 你可以对它们做一些简单的转换,以确保代表我们所知道的东西的数据点总是得到类似的数字表示吗?是否有一个局部坐标系,你可以代表你的数据,使事情更自然 - 也许是更好的色彩空间 - 不同的格式?

Why?

神经网络仅对它们作为输入所采用的数据做出一些基本假设 - 但这些基本假设之一是数据所处的空间有些连续 - 对于大多数空间,两个数据点之间的点至少是这两个数据点有点“混合”,两个附近的数据点在某种意义上代表“相似”的东西。在数据空间中存在大的不连续性,或者代表相同事物的大量分离数据,将使学习任务变得更加困难。

And?

考虑数据预处理的另一种方法是尝试减少可能需要的数据变化的组合爆炸。例如,如果在角色动画数据上训练的神经网络必须在每个位置和方向上学习角色的相同运动集,则网络的大量容量被浪费并且许多学习过程被复制。

四、没有使用正则化

 

What?

正则化 - 通常以丢失,噪声或注入网络的某种形式的随机过程的形式是训练现代神经网络的另一个不可协商的方面。即使您认为您拥有的数据远远多于参数,或者您认为过度拟合无关紧要或看似不可能,您仍应经常添加辍学或其他形式的噪音。

How?

规范神经网络的最基本方法是在网络中的每个线性层(卷积或密集)之前添加丢失。从中等到高的保留概率开始,例如0.75或0.9。根据您认为过度拟合的可能性以及您是否找到任何证据进行调整。如果您仍然认为过度拟合是不可能的,请考虑将保留概率设置为非常高的值,例如0.99。

Why?

正规化不仅仅是控制过度拟合。通过在训练过程中引入一些随机过程,您在某种程度上可以“平滑”成本环境。这可以加速训练,帮助处理数据中的噪声或异常值,并防止网络的极端配置。

And?

数据增加或其他类型的噪声也可以像丢失一样充当正规化。虽然考虑辍学的常用方法是将许多随机子网络的预测结合起来的技术,但也可以将辍学视为通过产生许多类似的变化来动态扩展训练集的大小的一种方式。训练期间输入数据。而且正如我们所知,避免过度拟合和提高网络准确性的最佳方法是拥有如此多的数据,以至于神经网络永远不会看到两次同样的事情!

五、使用了较大的batch_size

What?

使用过大的批量大小会对训练期间网络的准确性产生负面影响,因为它会降低梯度下降的随机性。

How?

找到可以容忍培训时间的最小批量大小。在精确度方面,优化使用GPU并行性的批量大小可能不是最好的,因为在某些时候,更大的批量大小将需要训练网络以获得更多的时期以达到相同的准确度。不要害怕以非常小的批量大小开始,例如16,8或甚至1。

Why?

使用较小的批量生产会产生更多的随机重量更新。这可能有两个积极的影响。首先,它可以帮助训练“跳出”它之前可能已经卡住的局部最小值,其次它可以使训练在最小化中达到“更平坦”,这通常表示更好的泛化性能。

And?

数据中的某些其他元素有时可以有效地像批量大小一样工作。例如,以如前所述的两倍分辨率处理图像可以具有与使用批量大小的四倍相似的效果。为了获得直观,请考虑在CNN中,每个滤波器的权重更新将在输入图像中应用的所有像素以及批处理中的每个图像上进行平均。将图像分辨率提高2将产生平均效果超过像素数的四倍,这与将批量大小增加4的方式非常相似。总的来说,重要的是要考虑最终梯度更新的平均值 在每次迭代中,确保平衡这对于尽可能多地使用GPU的潜在并行性需求的不利影响。

六、学习率设置错误

What?

学习速度会对培训网络的容易程度产生巨大影响,如果您是新手,几乎可以肯定,由于常见深度学习框架中使用的各种默认选项,您已将其设置错误。

How?

关闭渐变剪裁。找到学习率的最高值,这不会使训练期间的错误爆炸。设置学习率略低于此 - 这可能非常接近最佳学习率。

Why?

许多深度学习框架默认启用渐变剪辑。此选项通过强制执行每个步骤中权重可以更改的最大量来防止在训练期间使用的优化爆炸。这可能很有用 - 特别是如果您的数据包含许多产生大错误并因此产生大量梯度和重量更新的异常值 - 但默认情况下启用它也会使得手动找到最佳学习率非常困难。我发现大多数深度学习的新手都将学习速度设置得太高,并且通过渐变剪辑解释了这一点,使得整体训练行为变慢并且改变学习速率的效果变得不可预测。

And?

如果你已经正确清理了数据,删除了大部分异常值,并正确设置了学习率,那么你真的不需要渐变裁剪。如果没有它你会发现你的训练错误偶尔爆炸,然后通过一切方式打开渐变剪辑,但只记得看到你的训练错误爆炸几乎总是表明你的一些数据有其他错误 - 剪辑是一个临时修复。

七、激活函数使用错误

What?

在最后一层使用激活功能有时可能意味着您的网络无法生成所需的全部值。最常见的错误是在最后一层使用ReLU - 导致网络只能产生正值作为输出。

How?

如果您正在进行回归,那么大多数情况下您不希望在最终图层上使用任何类型的激活函数,除非您知道某些特定于您希望作为输出生成的值的类型。

Why?

再次想一想您的数据值实际代表什么以及标准化后它们的范围。最有可能的情况是您的输出值是无限正数或负数 - 在这种情况下,您不应在最后一层使用激活函数。如果您的输出值仅在某些范围内有意义,则它包含0-1范围内的概率,最有可能是在最终层上使用的特定激活函数,例如S形激活函数。

And?

在最后一层使用激活功能有许多细微之处。也许你知道你的系统最终会在神经网络产生后将输出剪辑到-1,1范围内。然后,将此剪切过程添加为最终图层激活似乎是有意义的,因为这将确保您的网络错误函数不会惩罚大于1或小于-1的值。但是没有错误意味着这些值大于或小于1的值也没有梯度 - 这在某些情况下会使您的网络无法训练。或者你可能想在最后一层使用tanh,知道这个激活函数输出-1到1范围内的值 - 但是这也可能导致问题,因为这个函数在1或-1附近的梯度变得非常小,这可能导致你的权重增大,试图产生-1或者1。一般来说,最好的选择通常是保证安全并且在最后一层根本不使用激活功能,而不是试图做一些可能适得其反的聪明事。

八、网络有坏的梯度

What?

使用ReLU激活功能的深度网络通常会遭受由不良梯度引起的所谓“死神经元”。这可能会对网络的性能产生负面影响,或者在某些情况下会使其完全无法训练。

How?

如果您发现您的训练错误没有从纪元变为纪元,则可能是您的所有神经元都因使用ReLU激活功能而死亡。尝试切换到另一个激活功能,如泄漏的ReLU或ELU,看看是否发生了同样的事情。

Why?

对于正值,ReLU激活函数的梯度为1,对于负值,为0。这是因为输入中的非常小的变化不会影响小于零的输入的输出。这可能看起来不像是一个问题,因为正值的梯度很大,但是很多层堆叠在一起,而负权重能够将具有强梯度的大正值改变为具有零梯度的负值,它通常可以在某些甚至所有网络权重相对于成本函数具有零梯度的情况下,无论给出什么输入。在这种情况下,我们说网络“死”,因为权重完全无法更新。

And?

任何具有零梯度的操作(例如削波,舍入或取最大值/最小值)如果用于计算成本函数相对于权重的导数,也会产生不良梯度。如果它们出现在符号图中的任何位置,请务必小心,因为它们通常会导致无法预料的困难,如果它们用于作为成本函数的一部分提供的某些自定义错误度量标准中,则为EG。

九、错误的初始化了网络权重

What?

如果你没有正确初始化你的神经网络权重,那么你的神经网络根本不可能训练。神经网络中的许多其他组件假设某种形式的正确或标准化权重初始化并将权重设置为零,或者使用您自己的自定义随机初始化不起作用。

How?

'he','lecun'或'xavier'重量初始化都是流行的选择,几乎可以在任何情况下都能很好地运作。只需选择一个(我最喜欢的是'lecun'),但是一旦你的神经网络工作,你就可以自由地进行实验,直到找到最适合你的任务。

Why?

您可能听说过可以使用“小随机数”初始化神经网络权重,但事实并非如此简单。所有上述初始化都是使用复杂而详细的数学发现的,这些数学解释了为什么它们是最优的。更重要的是,围绕这些初始化构建了其他神经网络组件,并使用它们进行了经验测试 - 使用您自己的初始化可能会使再现其他研究人员的结果变得更加困难。

And?

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

十、网络结构太深

What?

更深的是更好吗?好吧并不总是......当我们玩基准游戏并尝试从某项任务中提高1%的准确度时,更深层次通常更好,但如果你的3,4,5层小网络未能学到任何东西,那么我可以保证你是一个100层的庞然大物,如果不是更糟,就会失败。

How?

从浅层神经网络开始,层数为3到8层。只有当您已经运行良好并开始研究如何提高准确性时,才开始尝试更深入的网络。

Why?

虽然它可能看起来像,但当有人决定堆叠数百层时,神经网络不会突然开始获得突破性的结果。在过去十年中对神经网络进行的所有改进都是小的,根本性的变化,这些变化同样适用于较小网络的性能。如果您的网络不能正常工作,除了深度之外,更有可能出现其他问题。

And?

从小开始也意味着培训您的网络将更快,推理将更快,并且迭代不同的设计和设置将更快。最初,所有这些事情都会对您的准确性产生更大的影响,而不仅仅是堆叠几层。

十一、使用了错误的隐藏层单元

What?

在某些情况下,使用大量过多或过少的隐藏单元会使您的网络难以训练。太少的单位,它可能没有能力表达所需的任务,而太多,并且可能变得缓慢和笨重的训练残留噪音难以消除。

How?

从256到1024个隐藏单位之间开始。然后,查看从事类似应用的研究人员使用的数字,并将其作为灵感。如果其他研究人员使用与上面给出的数字大不相同的数字,那么可能有一些具体原因可能对您来说很重要。

Why?

在决定使用密钥的隐藏单元的数量时,要大致考虑您认为表达您希望通过网络传递的信息所需的最少数量的实际值。那么你应该把这个数字缩小一点。这将允许丢失,网络使用更多冗余的表示,并为您的估计留出一点余地。如果你正在进行分类,你可以使用五到十倍的类作为一个良好的初始猜测,而如果你正在进行回归,你可以使用输入或输出变量数量的两到三倍。当然 - 所有这些都是高度依赖于环境的,并且没有简单的自动解决方案 - 良好的直觉仍然是决定隐藏单元数量的最重要的事情。

And?

实际上,与其他因素相比,隐藏单元的数量通常对神经网络性能的影响相当小,并且在许多情况下,高估所需隐藏单元的数量除了使训练变慢之外几乎没有负面影响。一旦你的网络正常工作,如果你仍然担心,只需尝试一大堆不同的数字并测量准确度,直到找到效果最好的数字。

你可能感兴趣的:(深度学习)