如何更好地调试神经网络?
声明:本文适用于神经网络初学者 。神经网络的调试要比绝大多数程序更困难,因为大多数bug不会导致运行错误,只会导致不良的收敛 。也许还会有许多看似模棱两可的错误信息:性能错误:你的神经网络没有训练好(Performance Error: your neural net did not train well.) 。
如果你经验丰富,就应该知道这表示代码还需要大改动 。一、处理NaN?多数情况下,NaN错误在前100次迭代中出现,原因很简单:你的学习率过高了 。当学习率非常高的时候,就会在前100次迭代的时候出现NaN错误 。用因子为3来降低学习率,直到前100次迭代不再出现NaN错误 。这么做一旦有效,你就有了一个非常好的学习率作为开端 。
根据我的经验,最好的学习率是你得到NaN错误的范围的一到十分之一 。如果你在100次迭代之后碰到了NaN错误,又有两种常见原因 。如果你使用的是RNN,确保你使用了梯度下降,并对梯度使用L2正则化 。RNN似乎在训练早期会产生梯度,10%或更少的批次有学习峰值,此时的梯度幅值是相当高的 。没有对梯度削减,这些峰值会产生NaN 。
如果写的是自定义的网络层,那么很有可能因为除以0而引发NaN 。另一个众所周知会产生Nan错误的层是Softmax层 。Softmax计算包括分子分母的exp(x)操作,它可以用无穷大除以无穷大,会产生NaN 。确保你使用了稳定的Softmax实现 。二、神经网络无法学习?一旦你没有了NaN错误,那么你的神经网络就可以在上千次迭代中平稳运行,而且不会在前几百次迭代后减少训练损失 。
当你第一次构建代码库的时候,最好别使用2000次迭代 。这并不是因为所有的网络可以从低于2000次迭代开始学习 。相反,从开头开始编码网络很可能出现bug,在达到高迭代次数之前,你会想要过早进行调试 。现在的目的是一次又一次地缩小问题范围,直到你得到了一个在2000次迭代以下训练出来的网络 。幸运地是,有两种方式来降低复杂性 。
将训练集大小减小到10个实例 。在几百次的迭代中,在这10个实例上,神经网络通常会出现过度拟合的情况 。许多编码错误不会导致过拟合的出现 。如果你的网络在10个实例的训练集上没有出现过度拟合,那么确保你使用的数据挂上了正确的标签 。将批次大小减小到1来检查批次计算错误 。在代码中添加打印语句确保输出与你期望的一致 。
通常情况下,你可以通过上面介绍的纯粹蛮力来找出错误 。一旦网络可以在10个实例上训练,你可以试着让它在100个实例上训练 。如果这种方式运行正常,但效果不是很好,你可以试试下面的方法 。解决你感兴趣的最简单的问题 。如果你想翻译句子,首先可以建立一个针对特定语言的语言模型 。如果你完成了,那么试着在给出3个词语的情况下预测翻译出来的第一个词 。
如果你想检测图像中的物体,那么在训练回归网络之前,你可以对图像中物体数目进行分类 。在网络能够解决的棘手问题和使用最少的时间让代码得到合适的数据之间需要权衡 。这个时候就要发挥你的创造能力了 。将神经网络运用于其他新场景的技巧是合理使用上面介绍的两个步骤 。这是一种协调机制,并且效果不错 。首先,你表明这个神经网络至少可以记住几个例子 。
然后这个神经网络可以泛化到更简单问题的验证集中 。你慢慢在取得稳步进展时提升难度 。这并没有高手第一次使用的Karpathy风格那么有趣,但至少它起作用 。有时候你会碰到棘手的问题,你会发现它在2000次迭代中不会继续学习了 。那很棒!但它的迭代次数很少会是这个问题之前复杂度下迭代次数的10倍 。如果你发现是这种情况,尝试搜索中等水平的复杂度 。
推荐阅读
- KMS激活工具,kms激活工具
- 新入坚果不能激活
- 苹果官网激活时间查询 苹果官网技术支持查询激活日期
- 家用摄像头遭破解入侵,精品摄像头ip交流群
- 电池充不进电了,手机充不进电怎么办
- 大战神骑兵怎么激活码,骑砍2游戏怎么作弊刷
- 弹弹堂怎么得激活码,4399弹弹堂
- apple110激活时间查询 苹果110查询激活日期
- yq603恢复出厂设置之后激活不了了。
- 手机激活时间查询,iphone激活时间查询