如何有效的调试神经网络
即使对于现场专家来说,调试神经网络也是一项艰巨的任务。数以百万计的参数粘在一起,即使一个小小的改变也会破坏你所有的努力。没有调试和可视化,你的所有行为都会冒出一个硬币,更糟糕的是它耗费你的时间。在这里,我收集的做法可以帮助您尽早发现问题。
数据集问题
尝试用小数据集过度拟合您的模型
一般来说,您的神经网络应该在数百次迭代中过度拟合您的数据。如果你的损失没有下降,那么你的问题就更深了。
在解决问题时使用迭代逻辑
尝试构建解决您主要问题的最简单网络,然后逐步解决全局问题。例如,如果您正在创建样式转换网络,请先尝试训练脚本以将样式转换为一个图像。如果它工作,那么只有创建将样式转换为任何图像的模型。
使用具有失真的平衡数据集
例如,如果您训练网络以对数据进行分类,那么您的训练数据应该具有相同数量的每个类别的输入。在其他情况下,可能会按班级过度配合。神经网络对于所有的扭曲都不是不变的,你需要为此专门进行训练。所以输入失真会增加网络的准确性。
网络容量与数据集大小
数据集应足以让网络学习。如果你有小数据集和大网络,它将停止学习(在某些情况下,这将导致大量不同输入的结果相同)。如果你有大的数据集和小的网络,那么你会看到损失的跳跃,导致网络容量不能存储这么多的信息。
使用平均中心
这将消除网络中的噪音数据并提高培训效果,并且在某些情况下还可以解决NaN问题。但请记住,如果您有时间序列数据,那么您应该使用批次居中而不是全局。
神经网络问题
首先尝试更简单的模型
我看到许多情况下,人们首先尝试了一些标准的大型网络,如ResNet-50,VGG19等,但后来发现他们的问题可以在网络上仅用几层就可以解决。所以如果你没有标准的问题先从小型网络开始。为了解决你的问题,你添加的东西越难以训练模型,所以从小型网络开始也会节省时间。你也应该记住,大型网络会吃掉很多的内存和操作。
可视化是必须的
如果你使用的是Tensorflow,那么肯定会开始使用Tensorboard。如果没有,请尝试为您的框架找到一些可视化工具,或者自己写。这将有助于您在培训的早期阶段发现问题。你应该明确想象的东西:损失,权重直方图,变量和梯度。如果你使用CV,那么总是可视化过滤器,以了解实际上网络正在看到的内容。
权重初始化
如果您错误地设置权重,您的网络可能因为零梯度或所有神经元的类似更新而变得无法排除。还应该记住权重与学习速率相结合,因此大的学习速率和较大的权重可能导致NaN问题。
对于小型网络,在1e-2-1e-3周围使用一些高斯分布初始化器就足够了。
对于深度网络来说,这不会有帮助,因为你的权重会相互乘以多次,这将导致非常小的数字,这几乎会消除反向传播步骤中的梯度。感谢Ioffe和Szegedy,我们现在拥有批量标准化功能,可以减轻许多麻烦。
使用标准网络解决标准问题
有许多预先训练好的模型(1)(2),您可以立即使用。在某些情况下,您可以立即使用它们,也可以使用微调技术来节省培训时间。主要想法是,对于不同的问题,大部分网络容量是相同的。例如,如果我们谈论的是计算机视觉而不是第一层网络,它将包含简单的过滤器,如线条,点,天使等,对于所有图像都是相同的,而且您不需要重新训练它们。
学习速度使用衰减
这几乎总是会给你一个提升。Tensorflow中有许多不同的衰减调度程序
使用网格搜索或随机搜索或配置文件调整超参数
不要尝试手动检查所有参数,这是非常耗时和无效的。我通常对所有参数使用全局配置,并在运行检查结果后查看我应该进一步调查的方向。如果这种方法没有帮助,那么你可以使用随机搜索或网格搜索。
消除渐变问题。
一些激活函数,例如Sigmoid和Tanh正饱受饱和问题的困扰。在他们的极端情况下,他们的派生接近于零,从而杀死了渐变和学习过程。所以检查不同的功能是很好的。现在标准激活函数是ReLU。此外,这个问题可能出现在非常深的或经常性的网络中,例如,如果你有150层,并且所有激活给出0.9结果,则0.915 = 0,000000137。但正如我上面所说的批量标准化将有助于这一点,还有残留层。
不是零中心激活。
例如Sigmoid,ReLU函数不是零中心的。这意味着在训练过程中,您所有的渐变都将是积极的或全部消极的,这会导致学习问题。这也是我们使用零中心输入数据的原因。
Dead ReLUs。
标准的ReLU功能也不完美。对于负数ReLU给出0意味着它们不会被激活,并且因此你的神经元的一部分将会死亡并且从未被使用的问题。造成这种情况的原因可能是学习速度快,权重初始化错误。如果参数调整不起作用,您可以尝试不存在此问题的Leaky ReLU,PReLU,ELU或Maxout。
爆炸渐变。
除了每一步梯度变得越来越大以外,问题与消失问题相同。对此的主要修复之一是使用渐变剪裁,基本上设置渐变的硬限制。
深度网络中
的网络准确度降低问题:从某个时候开始表现为非常深的网络表现为断开的电话。因此添加更多图层会降低网络准确性 解决这个问题的方法是使用残留图层来跨所有图层传递一部分输入。在图像瓶颈残留层。