有一个网络已经训练了12个小时。一切看起来都很好:梯度是逐渐变化的,损失在减少。但接下来的预测:都是零,所有的图像背景都没有被检测到。“我做错了什么?”——我问我的电脑,但它没有回答我。
目录
-
1. 如何使用本指南?
-
2. 数据集问题
-
3. 数据 规范化 或增强的问题
-
4. 实现问题
-
5. 训练问题
1.如何使用本指南?
很多方面都可能出错。但是其中一些比其他的更有可能被防范。我通常从以下简短的清单开始,作为紧急的第一反应:
-
1. 从一个已知适用于这类数据的简单模型开始(例如,图像的 VGG )。如果可能,使用标准损失。
-
2. 关闭所有的附加功能,例如 正则化 和数据增强。
-
3. 如果对一个模型进行微调,要仔细检查预处理,因为它应该与原始模型的训练相同。
-
4. 验证输入数据是否正确。
-
5. 从一个非常小的数据集(2-20个样本)开始。对它进行过度拟合,并逐渐添加更多的数据。
-
6. 开始逐步添加所有被省略的部分:增强/ 正则化 、自定义 损失函数 、尝试更复杂的模型。
2.数据集问题
-
1.检查你的输入数据
-
2.尝试随机输入
-
3. 检查数据加载程序
-
4. 确保输入连接到输出
-
5. 输入和输出之间的关系是否过于随机?
-
6. 数据集中是否有太多 噪音 ?
截止点是有争议的,因为此文(https://arxiv.org/pdf/1412.6596.pdf)使用50%损坏的标签使MNIST的准确度达到50%以上。
-
7. 打乱数据集
-
8. 减少类别不平衡
-
9. 你有足够的训练样本吗?
-
10. 确保你的 批次 中不只包含一个标签
-
11. 减少批量大小
3.数据则 正则化 或增强
-
12. 规范的功能
-
13. 你的数据增强太多了吗?
-
14. 检查预训练模型的预处理
-
15. 检查训练/验证/测试集的预处理
4.实现问题
-
16. 试着解决这个问题的简单版本
-
17. “随机”寻找正确的损失
-
18. 检查 损失函数
-
19. 验证损失输入
-
20.调整损失 权重
-
21. 监视其他指标
-
22. 测试任何自定义层
-
23. 检查“冻结”层或变量
-
24. 增加网络的大小
-
25. 检查隐藏的维度错误
-
26. 进行梯度检查
1 http://ufldl.stanford.edu/tutorial/supervised/DebuggingGradientChecking/
2 http://cs231n.github.io/neural-networks-3/#gradcheck
3https://www.coursera.org/lecture/machine-learning/gradient-checking-Y3s6r
5.训练问题
-
27. 解决一个非常小的数据集
-
28. 检查 权重 初始化
-
29. 更改超 参数
-
30.减少正规化
-
31. 给它时间
-
32. 从训练模式切换到测试模式
-
33. 可视化训练
-
监视每一层的激活、 权重 和更新。
确保它们的大小匹配。
例如, 参数 更新的大小( 权重 和偏差)应该是1-e3。
-
考虑一个可视化库,比如Tensorboard和Crayon。
在紧要关头,你还可以打印 权重 /偏差/激活。
-
注意那些平均值远远大于0的层激活。尝试Batch Norm或ELUs。
-
Deeplearning4j指出了在 权重 和偏差的直方图中应该期望什么:
检查层的更新,他们应该形成一个 高斯分布 。
-
34. 尝试不同的 优化器
你选择的 优化器 不应该阻止你的网络进行训练,除非你选择了特别糟糕的超 参数 。然而,合适的任务 优化器 有助于在最短的时间内获得最多的训练。该论文指出你正在使用的算法应该指定 优化器 。如果没有,我倾向于使用Adam或带 动量 的普通SGD。
查看这篇由Sebastian Ruder撰写的优秀文章,了解更多关于 梯度下降 优化器 的知识。
-
35. 爆炸/消失的梯度
-
检查层的更新,因为非常大的值可以说明梯度爆炸。梯度剪切可能会有所帮助。
-
检查层激活。Deeplearning4j提供了一个很好的指导方针:“激活的良好标准偏差在0.5到2.0之间。明显超出这一范围可能意味着消失或爆炸的激活。”
-
36. 升高/降低 学习率
-
37. 克服NaN
-
降低学习速度,特别是如果你在前100次迭代中得到了NaNs。
-
NaNs可以由除以0,或0或负数的自然对数产生。
-
Russell Stewart在如何应对NaN中有很好的建议。
http://get.mysecurify.com/view/item_81593.html
-
试着一层一层地评估你的网络,看看NaNs出现在哪里。