有一个网络已经训练了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出现在哪里。 

 
                         
       
          
          
     
     
     
         