CS231n 指出了一个常见的陷阱:「任何预处理数据(例如数据均值)必须只在训练数据上进行计算,然后再应用到验证、测试数据中。例如计算均值,然后在整个数据集的每个图像中都减去它,再把数据分发进训练、验证、测试集中,这是一个典型的错误。」此外,要在每一个样本或批量(batch)中检查不同的预处理。 III. 实现的问题 16. 试着解决某一问题的更简易的版本。 这将会有助于找到问题的根源究竟在哪里。例如,如果目标输出是一个物体类别和坐标,那就试着把预测结果仅限制在物体类别当中(尝试去掉坐标)。 17.「碰巧」寻找正确的损失 还是来源于 CS231n 的技巧:用小参数进行初始化,不使用正则化。例如,j2直播,如果我们有 10 个类别,「碰巧」就意味着我们将会在 10% 的时间里得到正确类别,Softmax 损失是正确类别的负 log 概率: -ln(0.1) = 2.302。然后,试着增加正则化的强度,这样应该会增加损失。 18. 检查你的损失函数 如果你执行的是你自己的损失函数,那么就要检查错误,并且添加单元测试。通常情况下,损失可能会有些不正确,并且损害网络的性能表现。 19. 核实损失输入 如果你正在使用的是框架提供的损失函数,那么要确保你传递给它的东西是它所期望的。例如,在 PyTorch 中,我会混淆 NLLLoss 和 CrossEntropyLoss,因为一个需要 softmax 输入,而另一个不需要。 20. 调整损失权重 如果你的损失由几个更小的损失函数组成,那么确保它们每一个的相应幅值都是正确的。这可能会涉及到测试损失权重的不同组合。 21. 监控其它指标 有时损失并不是衡量你的网络是否被正确训练的最佳预测器。如果可以的话,使用其它指标来帮助你,比如精度。 22. 测试任意的自定义层 你自己在网络中实现过任意层吗?检查并且复核以确保它们的运行符合预期。 23. 检查「冷冻」层或变量 检查你是否无意中阻止了一些层或变量的梯度更新,这些层或变量本来应该是可学的。 24. 扩大网络规模 可能你的网络的表现力不足以采集目标函数。试着加入更多的层,或在全连层中增加更多的隐藏单元。 25. 检查隐维度误差 如果你的输入看上去像(k,H,W)= (64, 64, 64),那么很容易错过与错误维度相关的误差。给输入维度使用一些「奇怪」的数值(例如,每一个维度使用不同的质数),并且检查它们是如何通过网络传播的。 26. 探索梯度检查(Gradient checking) 如果你手动实现梯度下降,梯度检查会确保你的反向传播(backpropagation)能像预期中一样工作。 IV. 训练问题 27. 一个真正小的数据集 过拟合数据的一个小子集,并确保其工作。例如,仅使用 1 或 2 个实例训练,并查看你的网络是否学习了区分它们。然后再训练每个分类的更多实例。 28. 检查权重初始化 如果不确定,请使用 Xavier 或 He 初始化。同样,初始化也许会给你带来坏的局部最小值,因此尝试不同的初始化,看看是否有效。 29. 改变你的超参数 或许你正在使用一个很糟糕的超参数集。如果可行,尝试一下网格搜索。 30. 减少正则化 太多的正则化可致使网络严重地欠拟合。减少正则化,比如 dropout、批规范、权重/偏差 L2 正则化等。在优秀课程《编程人员的深度学习实战》()中,Jeremy Howard 建议首先解决欠拟合。这意味着你充分地过拟合数据,并且只有在那时处理过拟合。 31. 给它一些时间 也许你的网络需要更多的时间来训练,在它能做出有意义的预测之前。如果你的损失在稳步下降,那就再多训练一会儿。 32. 从训练模式转换为测试模式 一些框架的层很像批规范、Dropout,而其他的层在训练和测试时表现并不同。转换到适当的模式有助于网络更好地预测。 33. 可视化训练 监督每一层的激活值、权重和更新。确保它们的大小匹配。例如,参数更新的大小(权重和偏差)应该是 1-e3。 考虑可视化库,比如 Tensorboard 和 Crayon。紧要时你也可以打印权重/偏差/激活值。 寻找平均值远大于 0 的层激活。尝试批规范或者 ELUs。 (责任编辑:本港台直播) |