最近,hackernoon上出现了一篇名为《How to debug neural networks. Manual.》的文章。实践经验。调试神经网络是一项艰巨的工作,即使对于专家来说也是如此。面对数以百万计的参数,任何一个小小的改动都可能让你前功尽弃。如果没有调试和可视化,您的所有操作就像掷硬币一样,更糟糕的是,这是在浪费时间。以下是我收集的实践总结,希望能帮助大家及早发现问题。1.数据集问题1.尝试用小数据集过度拟合你的模型一般来说,神经网络应该在数百次迭代中过度拟合你的数据。如果你的损失没有减少,问题就更深了。2.使用迭代逻辑解决问题尝试构建最简单的网络来解决你的主要问题,然后逐步扩展到全局问题。例如,假设您正在创建一个风格转移网络,首先在图像上训练您的脚本转移风格。如果可行,则继续为任何图像创建风格转换模型。3.使用带有失真的平衡数据集,例如在分类数据上训练网络,你的训练数据应该对每个类别具有相同数量的输入。在其他情况下,存在分类过度拟合的可能性。神经网络并不是对所有失真都是不变的,所以你需要专门训练它们。使输入扭曲将提高网络准确性。4.网络容量vs数据集大小你的数据集应该足够大,网络可以从中学习。如果你的数据集很小而网络很大,它将停止学习(并且在某些情况下对于大量不同的输入输出相同的结果)。如果你有大数据而网络很小,那么你会看到损失值的跳跃,因为网络容量无法存储那么多信息。5.使用均值居中(meancentering)这将从你的网络中去除噪声数据,提高训练性能,在某些情况下有助于解决NaN问题。但是请记住,如果你有时间序列数据,那么你应该使用批处理而不是全局集中化。2.神经网络问题1.先尝试更简单的模型我见过很多这样的情况,人们先尝试一些标准的大型网络,比如ResNet-50,VGG19等,然后发现他们的问题通过只有几层的网络可以也得到解决。因此,如果您没有标准问题,请先从小型网络开始。添加的数据越多,训练模型就越困难,因此从小型网络开始花费的时间越少。您还应该记住,更大的网络需要更多的内存和更多的操作。2.可视化是必须的如果你正在使用TensorFlow,一定要从TensorBoard开始。如果没有,请尝试为您的框架寻找一些可视化工具,或者编写您自己的工具。这对你在训练初期发现问题很有帮助。你必须可视化的东西是:损失值、权重直方图、变量和梯度。如果您正在做计算机视觉,请始终可视化过滤器以了解网络实际看到的内容。3.权重初始化如果你设置的权重不正确,你的网络将变得不可训练,因为梯度为零,或者所有神经元的类似更新等。另外你应该记住权重与学习率成对,所以高学习率和大权重可以导致NaN问题。对于某些网络,大约1e-2–1e-3的高斯初始化软件就足够了。对于深度网络,这是没有用的,因为你的权重相互相乘了很多次,这将产生非常小的值,几乎消除了反向传播的梯度。感谢Ioffe和Szegedy,我们现在有了批量归一化,这减轻了很多麻烦。4.使用标准网络解决标准问题有大量的预训练模型可以正确使用。在某些情况下确实如此,或者您可以通过使用调整技术来节省训练时间。主要思想是大部分网络容量对于不同的问题是相同的。例如,如果我们谈论计算机视觉,它会包含所有图像都相同的线、点、角,您不需要重新训练它们。5.对学习率使用衰减这几乎每次都会给你一个提升。TensorFlow(https://www.tensorflow.org/versions/r0.12/api_docs/python/train/decaying_the_learning_rate)中有大量不同的衰减调度器。6.使用网格搜索、随机搜索或配置文件调整超参数不要尝试手动调整所有参数,这既耗时又低效。我经常使用全局配置来调整所有参数,并在运行检查结果后查看我应该进一步调查的方向。如果此方法没有帮助,您可以尝试随机搜索或网格搜索。7.激活函数(1)Vanishinggradientproblem一些激活函数如Sigmoid和Tanh存在饱和问题。在它们的极限下,它们的导数接近于零,从而消除了梯度和学习过程。所以最好检查不同的功能。现在标准的激活函数是ReLU。同样的问题也发生在一个非常深的或循环的网络中,假设你有150层,所有激活都是0.9,那么0.91??=0,000000137。但正如上面提到的,batchnormalization将对此有所帮助,残差层也是如此。(2)Sigmoid、ReLU函数等非零均值的激活值不是零均值。这意味着你在训练期间的所有梯度都将是正的或负的,并导致学习问题。这就是我们使用零均值输入数据的原因。(3)DeadReLUs标准的ReLU函数也不完美。为负ReLU设置零的问题意味着它们不会触发,所以你的部分神经元会死亡并且永远不会被再次使用。发生这种情况的原因可能是高学习率和错误的权重初始化。如果参数调整没有帮助,那么你可以尝试LeakyReLU、PReLU、ELU或Maxout,它们没有这个问题。(4)梯度爆炸的问题和梯度消失的问题是一样的,只不过梯度在每一步都变得越来越大。一个主要的解决方案是使用梯度裁剪,它从根本上对梯度设置了硬限制。8.深度网络的精度下降从某个时候开始,真正深度网络的问题开始表现为一个坏电话,因此添加更多层会降低网络精度。解决方案是使用残差层将输入的一部分传递给所有层。原文:https://hackernoon.com/how-to-debug-neural-networks-manual-dc2a200f10f2【本文为《机器之心》专栏原文翻译,微信公众号《机器之心》(id:almosthuman2014)》】点此阅读该作者更多好文
