如何调试神经网络(深度神经网络)?

神经网络的调试基本上难于绝大多数的程序,因为大部分的神经网络的错误不会以类型错误或运行时错误显现,他们只是使得网络难以收敛。

如果你是一个新人,这可能会让你非常沮丧。一个有经验的网络训练者可以系统的克服这些困难,尽管存在着大量似是而非的错误信息,比如:

你的网络训练的不太好。

对缺少经验的人来说,这个信息令人却步;但对有经验的人来说,这是一个非常好的错误消息。它意味着样板代码已经偏移了正确道路,而且是时候去深入发掘一下原因了。

如何应对NaN

“为什么出现了NaN?”有时候,这个问题的答案很复杂。但大多数情况是,NaN在前100轮迭代中就出现了,这时候这个答案就非常简单:学习率太高了。当学习率很高的时候,在训练的前100轮迭代中就会出现NaN。尝试不断的把学习率除以三,直到前一百轮迭代中不再得到NaN,当这样的尝试起作用的时候,就得到了不错的初始学习率。我的经验是,最优的学习率一般在你得到NaN的学习率的1-10倍以下。

如果是在100轮迭代后出现了NaN,可能有两个更深层的原因

1. 如果你训练的是RNN,请确保使用的是“梯度剪裁(clip gradient )”,这可以把全局的梯度二范数限制在一定的范围内。RNN倾向于在训练早期产生梯度,其中10%或者更少的batch会出现学习尖峰,这些尖峰上的梯度值非常大。如果没有限制幅度,这些尖峰就可能导致NaN。

clip gradient工作的具体细节如下:
a. 在solver中先设置一个clip_gradient
b. 训练中会把所有权值的梯度diff相加,如果这个值大于clip gradient,就会求一个缩放因子 s = clip_gradient/sum_diff
c. 最后将所有的权值梯度乘以这个缩放因子,这时得到的梯度才是最后的梯度信息。

2. 如果你写了定制化的later,这个问题很可能是由这些定制化的layer中一些除零错误引发的。还有一个著名的产生NaN的layer就是softmax layer。 softmax的计算在分母和分子中都含有指数函数exp(x),当inf除以inf时就会产生NaN。所以要确定你用的是一个稳定版本的softmax的实现。

当神经网络不再学习的时候该怎么做?

当你不再碰到NaN的时候,很可能就会遇到这样一种情况,你的网络平滑的训练的几千次,但是loss却在前几百个回合后不再减小。如果你是初次构建代码库的话,超过2000次的等待很难给出答案。这不是因为所有网络都能在2000次迭代内开始学习,而是因为你在编码中引入bug的几率很高,与其等待长时间的迭代,不如早早的进入调试模式。现在你应该不断缩小问题的范围,直到你的网络可以在2000次迭代内开始学习。幸运的是,有两个不错的维度来减小复杂度:

  1. 把训练集的样本量减小到10。任何一个可用的网络通畅都能在几百个迭代后过拟合十个样本。而bug则会阻止过拟合发生。如果网络仍然不能过拟合十个样本,再次确认样本和label是正确对应的。然后把batch size设为1 来检查batch计算中的错误。在code中加入一些log输出以确保是以你期望的方式运行的。一般来说,通过暴力排查总会找到这些错误。一旦网络可以拟合10个样本,它也可以拟合100个。如果现在可以训练但不如预期,则可以进入下一个步骤了。
  2. 解决你感兴趣的问题的最简单版本。如果你在做句子翻译,先建立一个目标语言的语言模型。当上一步成功了,只给出三个源语言的单词,尝试着去预测翻译的第一个词。如果你打算从图像中检测物体,训练回归网络之前试着去分类图像中有多少个物体。在得到网络可以解决的好的子问题以及花费最少的时间来使用代码挂接数据之间存在着平衡点。创造力可以起到帮助作用。

为一个新的想法扩大网络的小技巧就是缓慢的缩小上述两步中的简化。这是坐标上升法的一种形式,而且十分有用。一开始,你可以证明这个网络可以记住少量的样本,然后可以证明它在一个简化版的子问题中可以在验证集上具有泛化能力。缓步提升难度,稳步前进。

有些时候你会发现有些问题本身十分困难,难以在2000次迭代内完成学习。这很棒,但这也很少需要以前那些难度的问题训练时间的十倍以上的时间。如果真需要这么多时间,可以尝试寻找一个中间的复杂度。

微调超参数

也许你的网络现在开始学习东西了,但你可能发现它不能解决这个问题中最困难的部分。超参数的调整就是其中的关键。也许有人下载了一个cnn包然后在上面跑自己的数据集,并告诉你超参数的调整并不会带来改变。你要认识到他们在用已有的框架解决已有的问题。如果你在使用新架构解决新问题,则必须调试超参数来获得一个良好的配置。

  1. 可视化是关键。不要怕浪费时间去写一些好用的训练过程中的可视化工具。如果你还是从terminal中打印出来的loss裸眼的做可视化,那那你该考虑一下升级了。
  2. 权值初始化很重要。一般来说,大一点幅度的初始化权值会好一些,但太大了就会导致NaN。因此初始化权值应该要和学习率一起调试。
  3. 确保权值看起来是“健康的”。要了解这是什么意思,我推荐ipython notebook打开现有网络的权值。花一些时间来熟悉在标准数据集(如ImageNet或Penn Tree Bank)上训练的成熟网络中的组件的权值直方图应该是什么样子。
  4. 神经网络不是对输入的尺度不敏感的,尤其当它使用SGD训练而不是其他的二阶方法训练,因为SGD不是一个尺度无关的方法。在确定缩放尺度之前,花点时间来尝试多次缩放输入的数据和输出。
  5. 在训练结束之前减小学习率总能带来提升。最佳的decay策略是:在k个epoch后,每n个epoch之后学习率除以1.5(k > n)。
  6. 使用超参数配置文件,也可以把超参数写在code里。我使用https://github.com/Russell91/tensorbox 中的json文件,使用命令行加载。应该避免因为超参数的问题来重构代码。
  7. 随机的搜索超参数。随机搜索可以组合出你想不到的超参数组合,并且能减少你考虑在已有超参数训练带来什么样的影响时花费的大量精力。

总结

调试神经网络花费的劳力比调试传统程序要多,因为几乎所有的错误都会反应成一个问题:网络的表现不够好。尽管如此,二分查找仍然起作用。

1. 调整问题的难度

2. 使用少量的样本

这两个方法可以帮助你找到最初的问题。然后超参数调整和长时间的等待就可以解决你剩下的问题了。

原文发布时间为:2017-04-26

本文来自合作伙伴极市网,了解相关信息可以关注极市网。

时间: 2024-09-20 12:42:53

如何调试神经网络(深度神经网络)?的相关文章

深度神经网络可视化工具集锦

  TensorBoard:TensorFlow集成可视化工具 GitHub官方项目:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tensorboard TensorBoard 涉及到的运算,通常是在训练庞大的深度神经网络中出现的复杂而又难以理解的运算. 为了更方便 TensorFlow 程序的理解.调试与优化,Google发布了一套叫做 TensorBoard 的可视化工具.你可以用 TensorBoard 来

Top 100论文导读(一):纯干货!深度神经网络中的理解,泛化以及迁移学习

更多深度文章,请关注:https://yq.aliyun.com/cloud 作者:Adrian Colyer, 著名阿克赛尔合伙公司(Accel Partners)的投资合伙人,该公司致力于帮助杰出的企业家创建世界级的高科技企业,在加入Accel之前,Adrian拥有20年技术人员工作经验,如担任Pivota , VMware, SpringSource的CTO.如果你对科技企业感兴趣,可以和他联系.邮箱:acolyer@accel.com. 他的领英主页. 前言:作者从top 100 优秀深

YouTube推出基于深度神经网络的推荐系统

YouTube的推荐系统是是世界上规模最大.最复杂的推荐系统之一.最近Google的研究人员公布了他们投到今年ACM会议的一篇文章,详细介绍了他们最近利用深度神经网络实现YouTube推荐系统的技术细节.相关会议也会将于本月15号至19号在美国波士顿召开. YouTube的全球用户已经超过十亿,每秒上传的视频长度以小时计.视频"语料"库存日益增长,就需要一个推荐系统及时.准确地将用户感兴趣的视频不断推荐给用户.相比其他商业推荐系统,Youtube推荐系统面临三个主要的挑战: 规模.现有

由深度神经网络想到的人生意义和哲理

◆ ◆ ◆ 导读 几周前,我经历工作项目的调动,恰好给了我空余时间重拾那些很久没有碰过的感兴趣的话题.机器学习是我兴趣列表中的第一项.这是一个已经广泛渗入科技领域的话题,但我对其一无所知.仅几周的泛读,已经让我相信我们正加速朝向一个通用人工智能的时代.随着物联网(IOT)设备的快速普及产生了极大量数据,在这方面深度挖掘的进步将会保证这一未来越来越近. 但是基于这篇文章的论述范围,我将把话题限制在讨论以下假设:围绕在我们周围的所有事情构成一张深度神经网络,以及这一观点带来的形而上学的意义. ◆ ◆

【深度神经网络 One-shot Learning】孪生网络少样本精准分类

传统观点一般认为,深度神经网络通常比较擅长从高维数据中学习,例如图像或者语言,但这是建立在它们有大量标记的样本来训练的情况下.然而,人类却拥有单样本学习的能力--如果你找一个从来没有见过小铲刀的人,给他一张小铲刀的图片,他应该就能很高效的将它从其他厨房用具里面鉴别出来. 这是一种对人类来说很容易的任务,但是直到我们想写一个算法让它去做这件事--那就GG了 .很明显,机器学习系统很希望拥有这种快速从少量样本中去学习的能力,因为收集和标记数据是一个耗时费力的工作.而且,我认为这是通往通用人工智能的漫

人工智能破译人类思维:深度神经网络可识别人的想象

外媒称,日本研究人员已经成功借助人工智能破译了人类的思维和想象,从而在理解人类思想及其背后的大脑机制领域获得了重大突破. 据阿根廷21世纪趋势网站 6月6日报道,破解人类思维的内容是科学界长久以来的愿望.事实上,此前的种种研究也已经实现了破译人类所见.回忆.想象和梦境的内容. 例如另一个日本科学家团队早在 2008 年就成功地在电脑屏幕上直接重现了从人类大脑活动中获取的图像. 但包括这一研究在内的其他以往研究都遭遇了难以逾越的障碍,因为每个个体的大脑内容都具有其独特性,因此思维模式的目录创建很难

终于盼来了Hinton的Capsule新论文,它能开启深度神经网络的新时代吗?

本文讲的是终于盼来了Hinton的Capsule新论文,它能开启深度神经网络的新时代吗?, 眼见"深度学习教父"Geoffery Hinton在许多场合谈到过自己正在攻关的"Capsule"之后,现在我们终于等到了这篇论文,得以具体感受Capsule的特性.雷锋网 AI 科技评论把这篇论文主要成果介绍如下. 背景 目前的神经网络中,每一层的神经元都做的是类似的事情,比如一个卷积层内的每个神经元都做的是一样的卷积操作.而Hinton坚信,不同的神经元完全可以关注不同的

机器视觉与深度神经网络—洗去浮华,一窥珠玑

近年来机器学习.AI领域随着深度神经网络(DNN)的崛起而迎来新一波的春天,尤其最近两年无论学界还是业界,或是各大媒体,甚至文盲老百姓都言必称"智能".关于这方面,可讨论的东西实在太多太多,我不想写成一本厚厚的书,所以在此仅以机器学习在计算机视觉和图像领域的人脸识别应用作为一个例子,来陪着大家看看这场热潮.浮华背后有哪些被专家学者们忽视或轻视,但却有着根本性重要的东西,并同时提出本领域的若干值得展开的创新性研究方向.好了,废话少说,且看DNN的大戏上演. 2014年对于人脸识别领域来讲

《白话深度学习与TensorFlow》——2.2 深度神经网络

2.2 深度神经网络 2016年3月,随着Google的AlphaGo以4∶1的悬殊比分战胜韩国的李世石九段,围棋--这一人类一直认为可以在长时间内轻松碾压AI的竞技领域已然无法固守,而深度学习(deep learning)这一象征着未来人工智能领域最重要.最核心的科技也越来越成为人们关注的焦点.这里所谓的深度学习实际指的是基于深度神经网络(deep neural networks,DNN)的学习,也就是深度人工神经网络所进行的学习过程,或称作Deep Learning.这个Deep指的是神经网

SAS:深度神经网络赋予大数据分析更多可能

在工商银行的反欺诈系统中,几百个数据分析模型不间断地分析着来自四面八方的数据,从中挑拣出有可能发生金融欺诈的交易.但是,如此巨大的模型"战队",其管理和维护成本之高也是令人咋舌. 6月8日,在SAS Forum China 2017峰会上,中国工商银行软件开发中心上海开发二部副总经理苏彦告诉ZD至顶网记者,工商银行用更加智能和自动化的机器学习平台构建出可以自学习的模型,并保证所有的模型都是最新的,这种做法不仅使工商银行的防欺诈系统的准确率高出业内平均水平的20%,同时也大大降低了传统静