深度学习的一些调试技巧总结

1,遇到Nan怎么办?

  1. 除0问题。这里实际上有两种可能,一种是被除数的值是无穷大,即Nan,另一种就是除数的值是0。之前产生的Nan或者0,有可能会被传递下去,造成后面都是Nan。请先检查一下神经网络中有可能会有除法的地方,例如softmax层,再认真的检查一下数据。我有一次帮别人调试代码,甚至还遇到过,训练数据文件中,有些值就是Nan。。。这样读进来以后,开始训练,只要遇到Nan的数据,后面也就Nan了。可以尝试加一些日志,把神经网络的中间结果输出出来,看看哪一步开始出现Nan。后面会介绍Theano的处理办法。
  2. 梯度过大,造成更新后的值为Nan。特别是RNN,在序列比较长的时候,很容易出现梯度爆炸的问题。一般有以下几个解决办法。
    1. 对梯度做clip(梯度裁剪),限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15。
    2. 减少学习率。初始学习率过大,也有可能造成这个问题。需要注意的是,即使使用adam之类的自适应学习率算法进行训练,也有可能遇到学习率过大问题,而这类算法,一般也有一个学习率的超参,可以把这个参数改的小一些。
  3. 初始参数值过大,也有可能出现Nan问题。输入和输出的值,最好也做一下归一化。

2,神经网络学不出东西怎么办?

  1. 请打印出训练集的cost值和测试集上cost值的变化趋势,正常情况应该是训练集的cost值不断下降,最后趋于平缓,或者小范围震荡,测试集的cost值先下降,然后开始震荡或者慢慢上升。如果训练集cost值不下降,有可能是代码有bug,有可能是数据有问题(本身有问题,数据处理有问题等等),有可能是超参(网络大小,层数,学习率等)设置的不合理。
    请人工构造10条数据,用神经网络反复训练,看看cost是否下降,如果还不下降,那么可能网络的代码有bug,需要认真检查了。如果cost值下降,在这10条数据上做预测,看看结果是不是符合预期。那么很大可能网络本身是正常的。那么可以试着检查一下超参和数据是不是有问题。
  2. 如果神经网络代码,全部是自己实现的,那么强烈建议做梯度检查。确保梯度计算没有错误。
  3. 先从最简单的网络开始实验,不要仅仅看cost值,还要看一看神经网络的预测输出是什么样子,确保能跑出预期结果。例如做语言模型实验的时候,先用一层RNN,如果一层RNN正常,再尝试LSTM,再进一步尝试多层LSTM。
  4. 如果可能的话,可以输入一条指定数据,然后自己计算出每一步正确的输出结果,再检查一下神经网络每一步的结果,是不是一样的。

 改善模型的步骤:1、最先应该分析的是,训练数据的预处理是否有不合理之处?2、判断模型是偏差高还是方差高?偏差高意味着模型欠拟合,换一个更好的梯度下降算法、降低学习率、减弱正则化、增加隐藏节点数、增加网络层数都可以降低偏差;3、方差高意味着过拟合了,可以増广训练数据、增强正则化;5、暴力一点可以超参搜索;6、傻瓜化一点,直接换一个更好的网络模型,也许就是质的飞跃。

3、根据人类表现估计贝叶斯最优错误率。

       贝叶斯最优错误率是理论上可能达到的最优错误率,也就是说没有办法设计出一个x到y的函数,让它能比这个最优错误率还低。比如一个猫狗识别训练集中有些图片确实很模糊,无论是人还是机器都无法判断某张图的类别,那么最优错误率就不可能是0。估计人类在某个数据集上的表现,是为了了解该数据的准确率上限是多少,以此判断模型的准确率还差多远。

4、训练时每隔一定步数记录一次训练集错误率和验证集错误率,一直训练,直到在训练集上的错误率不再下降,停止训练;

5、计算贝叶斯错误率与训练错误率之差,该差值称为模型偏差,计算训练错误率与验证错误率之差,该差值称为模型方差,将训练时记录的训练集错误率和验证集错误率绘制成曲线,分析下一步应该调小模型的偏差还是方差,假设偏差是10%、方差是3%,那么应该优先降低偏差,在偏差较小之后再去考虑降低方差。

6、减少偏差的方法有:(有可能是欠拟合了)

(1)更好的优化算法,如mometum、RMSprop、Adam;

(2)更好的超参数,如降低学习率、减弱正则化;

(3)改变激活函数;

(4)增加隐藏节点数;

(5)增加层数;

(6)使用新的网络架构。

7、减少方差的方法有:(有可能是过拟合了)

(1)使用更多的训练数据或数据增广;

(2)使用正则化,如L1、L2、dropout;

(3)超参搜索;

(4)使用新的网络架构。

减少偏差和方差的可调试项解释如下表所示:

 8、如何训练集错误率可接受了,与验证集错误率相差也不大了,接下来可以分析在测试集上的错误率,最好是对每张预测出错的图进行分析,总结模型出错的原因,对错误类型进行分类归纳,再决定下一步调试模型的计划。

9,在调试代码时,一开始就该用小数据集去训练,尽管过拟合吧,就是需要网络能过拟合,能够过拟合,说明网络还是可以提取一些特征,说明设计的思路没有问题,如果小数据集过拟合不了,那么说明网络设计有问题(可能提取不了有效的特征),或者训练参数设置有问题,或者就是方案设计有问题。一旦小数据集能够过拟合,剩下就好办了,加大数据集,增加训练迭代次数就基本上OK了。

10,在达到相同感受野的情况下,多层小卷积核的性能一定比大卷积核更好,因为多层小卷积核的非线性更强,而且更有利于特征共享。

11,分辨率很重要,尽量不要损失分辨率,为了保住分辨率,在使用下采样之前要保证在这一层上有足够的感受野,这个感受野是相对感受野,是指这一个下采样层相对于上一个下采样层的感受野,把两个下采样之间看成一个子网络的话,这个子网络必须得有一定的感受野才能将空间信息编码到下面的网络去,而具体需要多大的相对感受野,只能实验,一般说来,靠近输入层的层空间信息冗余度最高,所以越靠近输入层相对感受野应该越小。同时在靠近输入层的层,这里可以合成一个大卷积核来降低计算量,因为在输入端,每一层卷积的计算量都非常大。另外相对感受野也必须缓慢变换。

12,

参考:https://www.jianshu.com/p/e9e6d8db9f6f

猜你喜欢

转载自blog.csdn.net/wzhrsh/article/details/110948287