如何调试神经网络。 手册。

即使对于现场专家来说,调试神经网络也可能是一项艰巨的任务。 数百万个参数紧密结合在一起,即使是很小的更改也可能会破坏您的所有辛苦工作。 如果不进行调试和可视化,您的所有操作就会大打折扣,更糟糕的是会浪费您的时间。 在这里,我收集了可以帮助您及早发现问题的实践。

数据集问题

尝试用小数据集过度拟合模型
通常,神经网络应该在几百次迭代中就过度拟合数据。 如果您的损失没有减少,那么您的问题就更深了。

使用迭代逻辑解决问题
尝试构建最简单的网络来解决您的主要问题,然后逐步解决全局问题。 例如,如果要创建样式转移网络,请首先尝试训练您的脚本以在一个图像上转移样式。 如果可行,则仅创建将样式转移到任何图像的模型。

使用失真的平衡数据集
例如,如果您训练网络对数据进行分类,则每个课程的训练数据应具有相同数量的输入。 在其他情况下,可能会因班级而过度拟合。 神经网络并非对所有失真都不变,因此您需要为此专门训练它们。 因此,使输入失真可以提高网络精度。

网络容量与数据集大小
您的数据集应该足以供网络学习。 如果您的数据集较小且网络较大,它将停止学习(在某些情况下,对于大量不同的输入,这将导致相同的结果)。 如果您拥有大数据集和小型网络,那么您会看到损失跳跃,导致网络容量无法存储太多信息。

使用均值居中
这将从您的网络中删除噪声数据并提高训练性能,并且在某些情况下还可以解决NaN问题。 但是请记住,如果您具有时间序列数据,则应使用批处理居中而不是全局。

神经网络问题

首先尝试更简单的模型
我看到许多情况,当人们首先尝试使用诸如ResNet-50,VGG19等标准的大型网络时,却发现只需几层网络就可以解决他们的问题。 因此,如果您没有标准问题,请先从小型网络开始。 添加的内容越多,解决模型的难度就越大,因此从小型网络开始也可以节省时间。 您还应该记住,大型网络会消耗大量内存和操作。

可视化是必须的
如果您正在使用Tensorflow,那么一定要开始使用Tensorboard。 如果没有,请尝试为您的框架找到一些可视化工具,或者自己编写。 这将帮助您在培训的早期阶段发现问题。 您绝对应该可视化的内容:损失,权重直方图,变量和梯度。 如果您使用CV,则始终将过滤器可视化以了解网络实际所见。

权重初始化
如果权重设置不正确,则由于零梯度或所有神经元的类似更新等原因,您的网络可能变得无法训练。另外,您还应该记住,权重与学习率相关,因此,大的学习率和权重可能会导致NaN问题。

对于小型网络,在1e-2–1e-3附近使用一些高斯分布初始化器就足够了。

对于深度网络,这将无济于事,因为您的权重将彼此多次相乘,这将导致非常小的数字,这将几乎消除了反向传播步骤中的梯度。 多亏了Ioffe和Szegedy,我们现在有了批量标准化,可以减轻很多麻烦。

使用标准网络解决标准问题
您可以立即使用许多预先训练的模型(1)(2)。 在某些情况下,您可以立即使用它们,也可以使用微调技术来节省培训时间。 主要思想是,对于不同的问题,大多数网络容量是相同的。 例如,如果我们谈论的不是计算机视觉,那么网络的第一层将由简单的过滤器(例如线,点,天使)组成,这些过滤器对于所有图像都是相同的,因此您无需重新培训它们。

使用衰减来提高学习速度
这几乎总是可以助您一臂之力。 Tensorflow中有很多不同的衰减调度器

使用网格搜索或随机搜索或配置文件调整超参数
不要尝试手动检查所有参数,这非常耗时且无效。 我通常对所有参数使用全局配置,并在运行检查结果后查看应该进一步研究的方向。 如果此方法无济于事,则可以使用随机搜索或网格搜索。

激活功能

  1. 消失的梯度问题。
    一些激活功能(例如Sigmoid和Tanh)饱受饱和问题的困扰。 在极端情况下,它们的导数接近于零,从而消除了梯度和学习过程。 因此,最好检查不同的功能。 现在,标准激活功能是ReLU。 此问题也可能出现在非常深的网络或经常出现的网络中,例如,如果您有150层,并且所有激活均给出0.9的结果,则0.9 1 = 0,000000137。 但是正如我上面所说,批归一化将有助于此以及剩余层。
  2. 不是零中心激活。
    例如,Sigmoid,ReLU函数不是零中心的。 这意味着在训练过程中,您的所有梯度将全部为正或全部为负,这将导致学习问题。 这也是为什么我们使用零中心输入数据的原因。
  3. 死的ReLU。
    标准的ReLU功能也不完美。 对于负数ReLU给出0的问题意味着它们将不会被激活,因此您的神经元的某些部分将死亡并且永远不会被使用。 发生这种情况的原因是学习率高和权重初始化错误。 如果参数调整没有帮助,您可以尝试不存在此问题的Leaky ReLU,PReLU,ELU或Maxout。
  4. 爆炸的梯度。
    该问题与消失问题相同,只是每一步的梯度都变得越来越大。 对此的主要解决方法之一是使用渐变修剪,基本上为渐变设置了硬性限制。

深度网络上的网络准确性下降
真正深层的网络从某个时候开始就表现为坏掉的电话。 因此,添加更多层会降低网络准确性。 解决此问题的方法是使用残差层,该残差层将输入的一部分传递给所有层。 在图像瓶颈残留层上。

如果您没有在上面提到的问题,请在评论中提出,我会尽力帮助您。
同样,我将为我可以添加到本文中的更多调试案例而感激。

支持

如果您喜欢我的文章,可以随时通过一些啤酒赚钱来支持我https://paypal.me/creotiv

每天获取有趣的文章-在电报频道订阅

新文章

教程:使用OpenCV计算道路通行能力
今天,我将向您展示一个非常简单但功能强大的示例,说明如何使用您可以使用的算法来计算流量。