基于神经网络的项目的瓶颈通常不是网络的实现。有时,在编写了所有代码并尝试了一堆超参数配置之后,网络就是不工作。尤其是面对数以百万计的参数,任何一个小改动都可能前功尽弃。在面对各种问题后,有人总结了一些实用的技巧来帮助调试神经网络,希望能够降低调试神经网络的成本。检查梯度问题有时梯度是问题的原因。下面是几种与梯度相关的调试方法:数值计算每个权重的梯度。这通常称为“梯度检查”,有助于确保正确计算梯度,其中一种方法是使用有限差分。将每个权重的大小与梯度的大小进行比较。确保尺寸比例合理。如果梯度大小远小于权重大小,则网络将花费很长时间进行训练。如果梯度大小与权重大小大致相同或更大,网络将非常不稳定,可能根本无法训练。检查爆炸或消失的梯度。如果梯度变为0或nan/infinity,则可以确定网络未正确训练。需要先搞清楚为什么会出现梯度爆炸/消失,步数是否过大。一旦弄清了梯度爆炸/消失的原因,就会有多种解决方案,例如添加残差连接以更好地传播梯度或简单地使用更小的网络。激活函数也可能导致梯度爆炸/消失。如果sigmoid激活函数的输入太大,梯度将非常接近0。随着时间的推移检查激活函数的输入,然后确保这些输入不会导致梯度始终为0或非常大.检查训练进度经常检查网络的训练进度可以节省时间。以训练贪吃蛇游戏为例。它不是训练网络几天然后检查网络是否学到了任何东西,而是每十分钟使用当前学习的权重运行一次游戏。几个小时后,如果我们注意到我们每次都在做同样的事情并且得到零奖励,我们就知道出了问题,这节省了几天的训练时间。不要依赖量化输出如果我们只看量化输出,我们可能会错过有用的调试信息。例如,在训练语音翻译网络时,阅读翻译后的语音以确保其有意义比仅仅检查评估函数是否递减更重要;在训练图像识别网络时,一定要手动检查网络提供的标签。量化输出不应依赖,原因有二:第一,评估函数可能存在错误。如果您只查看错误评估函数输出的数字,可能需要数周时间才能发现问题所在。其次,神经网络输出中可能存在无法量化的错误模式。我们可能会意识到一个特定的词总是被误译,或者左上象限的图像识别网络总是错误的。反过来,这些观察可以帮助发现数据处理部分中的代码错误,否则这些错误会被忽视。另一种尝试使用小型数据集来确定您的代码是否存在错误或您的数据是否难以训练的方法是首先拟合较小的数据集,例如将100,000个训练示例的数据集修剪为仅100个甚至1个训练示例。如果给定一个训练样例,网络仍然有很高的测试误差并且不能很好地拟合数据,那么几乎可以肯定网络代码有问题。尝试更简单的网络如果您在训练全尺寸网络时遇到困难,您可以尝试使用层数更少的更小网络,这样可以训练得更快。如果较小的网络在全尺寸网络失败的地方成功,则表明全尺寸模型的网络架构过于复杂。如果简单网络和全尺寸网络都失败,则可能是代码中存在错误。尝试使用框架如果您没有使用机器学习框架编写神经网络代码,您可以通过在机器学习框架中编写相同的网络架构来检查问题出在哪里。然后将打印语句放入非框架版本和框架版本中,逐层比较输出,直到找到打印语句不同的地方,即错误。如果在反向传播过程中出现错误,可以从最后一层开始逐层打印权重的梯度,直到发现差异。但是这种方法只对网络的第一次迭代有效,因为第二次及以后的迭代会因为第一次迭代输出的不同而有不同的起点。参考内容:https://towardsdatascience.com/debugging-tips-for-neural-networks-f7dc699d6845:almosthuman2014)》】点此查看作者更多好文
