欢迎访问我的个人博客:zengzeyu.com
前言
当你进入深度学习领域,准备好深度神经网络,开始进行训练时,遇到这样一个大部分新手都会遇到的问题:你的神经网络没法正常工作,而你不知道该如何去修正它。你去问你的老板或者导师,他们也不知道该如何处理,因为在深度神经网络面前,他们和你一样也是新手。那么现在该如何来处理呢?
幸运的是我来啦!我列出了几乎所有新手都会犯的错误,以及我自己和身边一些学生在同样情况下遇到过的问题:
- 没有对数据进行标准化处理(Normalize)
- 没有检查结果(Results)
- 没有对数据进行预处理(Preprocess)
- 没有使用正则化方法(Regularlization)
- Batch Size 取值过大
- 学习率(Learning Rate)设置有误
- 最后一层 Layer 使用了错误的激活函数(Activation Function)
- 网络结构中包含了有害的梯度(Bad Gradient)
- 初始化网络权重(Network Weights)有误
- 神经网络结构过深(Too Deep)
- 使用了错误数目的隐藏单元(Hidden Units)
检查结果(Results)
What?
现在你已经把你的网络训练了一段时间了,并且看到误差(error)在下降——成功!这是否就意味着你已经完成了吗?颁一个博士奖给你?不幸的是,即可可以肯定你的代码仍然有问题。这个问题可能存在于数据预处理,训练代码,或者甚至是预测(inference)阶段。因为误差的减小并不意味着你的网络一定在学习着有用的东西。
How?
在网络结构管道(pipeline)的每个阶段检查数据是非常重要的。通常的方法就是找到一些方法来将这些结果进行可视化输出。如果你的数据是图像,那么显示它就没那么麻烦。如果数据是其他较奇特形式,你必须找到一种方法来检查它,确保在预处理,训练和预测阶段相对于真实数据(ground truth)都正确。
Why?
与传统编程方式不同,机器学习系统大多数情况失败情况都不会有明显的标志。当我们进行传统方式的编程时,习惯于当出现问题时计算机会抛出错误,以便用它来进行debug。不幸的是,这种方式并不适用于机器学习方面的应用,相反,我们应该非常小心地用肉眼去检查每个过程,只有这样我们才能到底哪个阶段出了bug,以便回头去彻底校正代码。
And?
有许多方法来检查你的网络结构是否真的正常工作。其中一种就是找到报告的错误代表的确切含义。将应用与训练集(training set)网络输出结果进行可视化——你的网络输出结果与真实数据(ground truth)相比结果如何?可能你看到网络在训练过程中,误差从 1.0 下降到 0.01 ,但如果误差结果为 0.01 仍然是不可接受的,那么训练模型仍然是无法使用。如果结果在训练集上能正常工作,那么通过验证集来检查它——看看是否仍然适用于它之前没见过的数据。我的建议是,从一开始就将所有东西都可视化,不要在网络没法正常工作时才去想到可视化,确保在尝试不同的网络结构之前,已经完全掌握了整个网络结构流程,并顺便从头至尾检查。这是准确评估多种潜在不同网络结构的唯一方法。