train loss与test loss结果分析:

train loss 不断下降,test loss不断下降,说明网络仍在学习; 
train loss 不断下降,test loss趋于不变,说明网络过拟合; 
train loss 趋于不变,test loss不断下降,说明数据集100%有问题; 
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目; 
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

train loss 趋于不变,train accuracy不断上升,说明网络学习能力不强,正确分类多数是大于0.5多一点,就会造成train loss趋于不变,而train accuracy不断上升

train loss很低,test loss却很高,说明网络的泛化能力低或者是过拟合

调整模型的一些心得:

很多人在刚开始训练自己的模型的时候都容易进入一个误区:一开始训练数据准备的很大,训练时间消耗太多,最后发现train loss不收敛,测试效果也理想。在进行大规模数据训练的时候,应该先用少量的数据进行测试,证明你设计的模型是有学习能力的,在这基础上把各个参数调到最佳,最后才是进行大规模的数据训练。很多人都省略了开始的一步,造成许多麻烦,而且还很费时间。

训练的神经网络的常见问题:

数据集问题:

  检查馈送到网络的输入数据是否正确。你的数据也许很好,但是读取输入数据到网络的代码可能有问题,所以我们应该在所有操作之前打印第一层的输入并进行检查。检查少许输入样本是否有正确的标签,同样也确保 shuffling 输入样本同样对输出标签有效。相较于随机的部分(可以认为股票价格也是这种情况),输入与输出之间的非随机部分也许太小,即输入与输出的关联度太低。没有一个统一的方法来检测它,因为这要看数据的性质。我曾经遇到过这种情况,当我从一个食品网站抓取一个图像数据集时,错误标签太多以至于网络无法学习。手动检查一些输入样本并查看标签是否大致正确。如果你的数据集没有被 shuffle,并且有特定的序列(按标签排序),这可能给学习带来不利影响。你可以 shuffle 数据集来避免它,并确保输入和标签都被重新排列。一张类别 B 图像和 1000 张类别 A 图像?如果是这种情况,那么你也许需要平衡你的损失函数或者尝试其他解决类别失衡的方法。如果你在从头开始训练一个网络(即不是调试),你很可能需要大量数据。对于图像分类,每个类别你需要 1000 张图像甚至更多。这可能发生在排序数据集中(即前 10000 个样本属于同一个分类)。可通过 shuffle 数据集轻松修复。巨大的批量大小会降低模型的泛化能力

调参问题:

  过拟合数据的一个小子集,并确保其工作。例如,仅使用 1 或 2 个实例训练,并查看你的网络是否学习了区分它们。然后再训练每个分类的更多实例。如果不确定,请使用 Xavier 或 He 初始化。同样,初始化也许会给你带来坏的局部最小值,因此尝试不同的初始化,看看是否有效。或许你正在使用一个很糟糕的超参数集。如果可行,尝试一下网格搜索。太多的正则化可致使网络严重地欠拟合。减少正则化,比如 dropout、批规范、权重/偏差 L2 正则化等。也许你的网络需要更多的时间来训练,在它能做出有意义的预测之前。如果你的损失在稳步下降,那就再多训练一会儿。一些框架的层很像批规范、Dropout,而其他的层在训练和测试时表现并不同。转换到适当的模式有助于网络更好地预测。监督每一层的激活值、权重和更新。确保它们的大小匹配。例如,参数更新的大小(权重和偏差)应该是 1-e3。考虑可视化库,比如 Tensorboard 和 Crayon。紧要时你也可以打印权重/偏差/激活值。寻找平均值远大于 0 的层激活。尝试批规范或者 ELUs。优化器的选择不应当妨碍网络的训练,除非你选择了一个特别糟糕的参数。但是,为任务选择一个合适的优化器非常有助于在最短的时间内获得最多的训练。描述你正在使用的算法的论文应当指定优化器;如果没有,我倾向于选择 Adam 或者带有动量的朴素 SGD。检查隐蔽层的最新情况,过大的值可能代表梯度爆炸。这时,梯度截断(Gradient clipping)可能会有所帮助。检查隐蔽层的激活值。Deeplearning4j 中有一个很好的指导方针:「一个好的激活值标准差大约在 0.5 到 2.0 之间。明显超过这一范围可能就代表着激活值消失或爆炸。低学习速率将会导致你的模型收敛很慢;高学习速率将会在开始阶段减少你的损失,但是可能会导致你很难找到一个好的解决方案。试着把你当前的学习速率乘以 0.1 或 10。

克服 NaNs:

  • 减小学习速率,尤其是如果你在前 100 次迭代中就得到了 NaNs。
  • NaNs 的出现可能是由于用零作了除数,或用零或负数作了自然对数。

 

最后在我经过无数次调参过后的心得:过拟合是训练神经网络的一个好的开始,过拟合总比欠拟合好