来源:CSDN http://geek.csdn.net/news/detail/68181
原文链接: Introduction to debugging neural networks
译者:刘翔宇 审校:刘帝伟
责编:周建丁
以下建议是针对神经网络初学者的,这些建议都来自于我在行业应用和斯坦福大学里为神经网络初学者提供建议所获得的经验。本质上讲,神经网络要比大多数程序难以调试,因为大多数神经网络bug不会导致类型错误或运行时错误。只会导致不良的收敛。特别是你刚入门,碰到这些问题会非常令人沮丧!但经验丰富的神经网络训练者能够系统地克服这些困难,尽管有许多看似模棱两可的错误信息:
性能错误:你的神经网络没有训练好(Performance Error: your neural net did not train well.)。
对于门外汉来说,这条错误信息令人畏惧。但是对经验丰富的人来说,这是一个巨大的错误。它意味着样板代码不能正常工作,是时候深入代码调试了!
到目前为止,我的学生提出的最常见的一个问题就是,“我为什么会得到NaN错误。”有时,这问题有复杂的原因。但多数情况下,NaN错误在前100次迭代中出现,原因很简单:你的学习率过高了。当学习率非常高的时候,就会在前100次迭代的时候出现NaN错误。用因子为3来降低学习率,直到前100次迭代不再出现NaN错误。这么做一旦有效,你就有了一个非常好的学习率作为开端。根据我的经验,最好的学习率是你得到NaN错误的范围的一到十分之一。
如果你在100次迭代之后碰到了NaN错误,又有两种常见原因。
一旦你没有了NaN错误,那么你的神经网络就可以在上千次迭代中平稳运行,而且不会在前几百次迭代后减少训练损失。当你第一次构建代码库的时候,最好别使用2000次迭代。这并不是因为所有的网络可以从低于2000次迭代开始学习。相反,从开头开始编码网络很可能出现bug,在达到高迭代次数之前,你会想要过早进行调试。现在的目的是一次又一次地缩小问题范围,直到你得到了一个在2000次迭代以下训练出来的网络。幸运地是,有两种方式来降低复杂性。
将神经网络运用于其他新场景的技巧是合理使用上面介绍的两个步骤。这是一种协调机制,并且效果不错。首先,你表明这个神经网络至少可以记住几个例子。然后这个神经网络可以泛化到更简单问题的验证集中。你慢慢在取得稳步进展时提升难度。这并没有高手第一次使用的Karpathy风格那么有趣,但至少它起作用。有时候你会碰到棘手的问题,你会发现它在2000次迭代中不会继续学习了。那很棒!但它的迭代次数很少会是这个问题之前复杂度下迭代次数的10倍。如果你发现是这种情况,尝试搜索中等水平的复杂度。
现在你的网络可以学习东西了,你可能会得意忘形。你还可能发现你训练的网络并不能够解决大多数复杂的问题。超参数调整就是解决问题的关键。有些人直接下载一个CNN的包然后在他们的数据集上运行,然后告诉你说使用超参数调整并没有带来什么不同。这是因为它们使用已经存在的架构来解决已经存在的问题。 如果你要解决的问题需要新的架构呢,通过超参数调整来得到良好的设置就是必须的了。 你最好确保针对你要解决的问题阅读了超参数教程,不过我还是会在下面列出一些基本思想。
调试神经网络比传统的程序更费劲,因为大部分错误发生在整个网络的单一维度上。然而,二分查找仍然是你的朋友。通过 改变问题的难度 和 使用少量的训练样例 的交替,你能快速解决最初的bug。超参数调整和长时间耐心等待可以解决余下的问题。