一网打尽!深度学习常见问题!
1 前言
在传统软件工程中,程序问题(即Bugs)会导致程序崩溃,但开发人员可以通过检查错误来了解原因。 然而,在深度学习中,代码可能会在没有明确原因的情况下崩溃。虽然这些问题可以手动调试,但深度学习模型通常会因为输出预测不佳而失败。更糟糕的是,当模型性能较低时,通常没有任何信号表明模型失败的原因或时间。 开发过程中我们很经常要花80-90%的时间在数据处理及调试模型,而只花费10-20%的时间推导数学方程和实现功能。 2 为什么模型的问题排查困难• 很难判断是否有错误
• 造成相同性能下降的原因有很多
• 结果可能对超参数和数据集构成的微小变化很敏感







-
网络张量的形状不正确:可以无声地失败。例如,无声广播, x.shape = (None,), y.shape = (None, 1), (x+y).shape = (None, None)
-
错误地预处理输入:例如,忘记进行规范化,或进行过多的预处理;
-
模型损失函数的输入不正确:例如,Softmax 输出用于预期对数的损失;
-
忘记正确设置网络的训练模式:例如,切换训练/评估模式或控制批次范数依赖;
- 数值不稳定-inf/NaN:通常源于使用exp、日志或div操作。
-
轻量级实现。第1个版本尽可能少的新代码行,经验法则是少于200行,不包括测试基础组件或TensorFlow/PyTorch代码;
-
使用现成的组件。使用Keras等现成组件,避免手动计算,以减少数值不稳定问题;
- 稍后构建复杂的数据管道。从可以加载到内存中的数据集开始。
-
形状不匹配/转换问题:在调试器中逐步完成模型创建和推理,检查张量的形状和数据类型是否正确。
-
内存不足问题:逐个缩减内存密集型操作。例如,如果在代码中的任何位置创建大型矩阵,可以减小其维度的大小或将批量大小减半。
- 其他问题:标准调试工具包( Stack Overflow + interactive debugger)
- 误差上升: 可能是由损失函数/梯度中的符号翻转引起的、学习率过高、softmax使用了错误的维度;
- 误差爆炸:数值问题,检查所有的exp、日志和div操作、学习率过高;
- 误差振荡:数据或标签有误(例如,归零或错误打乱)、学习率过高;
- 误差不动:学习率过低、梯度没有在整个模型传播、过分正则化、损失函数的输入错误、数据或者标签有误。
• 在相似数据集上评估的官方模型实施;
• 根据基准评估官方模型实施(例如 MNIST);
• 非官方模型实施;
• 论文结果(无代码);
• 基准数据集(例如 MNIST)上的模型结果;
• 类似数据集上的类似模型的结果;
• 超级简单的基线(例如,输出平均值或线性回归)。 3.3 评估 偏差-方差分解

- 使模型更大(即添加层或每层使用更多单元)
- 减少正则化
- 误差分析
- 选择不同的(更接近最先进的)模型架构(例如,从 LeNet 迁移到 ResNet)
- 调整超参数(例如学习率)
- 添加特征
-
添加更多训练数据(如果可能!)
-
添加归一化(例如批量归一化、层归一化)
-
添加数据增强
-
增加正则化(例如,dropout、L2、权重衰减)
-
误差分析
-
选择不同的(更接近最先进的)模型架构
-
调整超参数
-
提前停止(不推荐)
-
删除特征(不推荐)
- 减小模型尺寸(不推荐)
- 分析测试-验证集错误并收集更多训练数据进行补偿
- 分析测试-验证集错误并综合更多训练数据进行补偿
- 将领域适应技术应用于训练


重新 平衡数据集
-
如果 (test)-val 看起来明显比 test 好,则说明验证集过度拟合
-
这种情况发生在小验证集或大量超参数调整时
- 当它发生时,重新收集验证集数据
3.5 超参数优化 超参数优化面临如下问题:
网络:ResNet——多少层?如何参数初始化?卷积核大小?
优化器:Adam——batch size?学习率?beta1,beta 2?
正则化:用哪种正则化方式?
应该调整哪些超参数 ? 首选 模型更敏感的参数;与选择的模型相关;经验法则;灵敏度与默认值相关。 有关超参数及其对模型的影响如下:
方法1 手动超参数优化
步骤: 了解算法(例如,更高的学习率意味着更快、更不稳定的训练);训练和评估模型;猜测更好的超参数值并重新评估;可以与其他方法结合使用(例如,手动选择要优化的参数范围)。 优点: 对于经验丰富的人,只需要最少的计算就能获得良好的结果。 缺点: 需要对算法有深刻的见解且费时。方法2 网格搜索

方法3 随机搜索

缺点:不太好解释;可能需要有关参数的先验知识才能获得良好的结果
方法4 由粗到细搜索
步骤: 定义一个大范围进行随机搜索,然后在结果池中找到N个最佳结果,并重复这个过程。 优点:可以缩小性能非常高的超参数范围;实践中最常用的方法 缺点:有点手动过程方法5 贝叶斯超参数优化
步骤: 从参数分布的预先估计开始;维护超参数值与模型性能之间关系的概率模型;交替 使用最大化预期改进的超参数值进行训练并 根据训练结果来更新概率模型。 优点: 选择超参数最有效的 hands-of 方式。 缺点: 很难从头开始实施;可能很难与现成的工具集成。 总之,超参数方面应该从粗到细的随机搜索,随着项目代码完备后,再考虑贝叶斯等方法做更细致的超参数优化。更多精彩内容请点击:AI领域文章精选!