A Recipe for Training Neural Networks-Andrej Karpathy
https://karpathy.github.io/2019/04/25/recipe/
- 训练神经网络2个坑
- 训练神经网络2个leaky abstraction
据说开始训练神经网络很容易。许多库和框架都觉得使用30行代码来解决数据问题很了不起,这给人一种即插即用的(错误的)印象。常见的做法是:在我们的脑子里,标准的软件就应该是这样的,通常可以获得干净的api和抽象。使用Requests库演示一下:
确实很酷!开发人员承担了理解查询字符串、url、GET/POST请求、HTTP连接等重担,并在很大程度上隐藏了几行代码背后的复杂性。这是我们所熟悉和期望的。不幸的是,神经网络不是这样的。如果你稍微和训练ImageNet分类器不太一样的话,那么它们就不是“现成的”技术了。我试图在我的帖子" Yes you should understand backprop "中指出这一点,通过选择反向传播并将其称为“泄漏的抽象”,但真实情况要糟糕得多。Backprop + SGD不会神奇地让你的网络工作。Batch norm并不能神奇地使其更快地收敛。RNNs也不会神奇地让你的文本即插即用。仅仅因为你可以用增强学习表示你的问题并不意味着你应该这样做。如果你坚持使用这种技术而不了解它的工作原理,你很可能会失败。r = requests.get('https://api.github.com/user', auth=('user', 'pass')) r.status_code
- 神经网络训练失败的不容易让人发觉
但是,这些对于神经网络的训练远远不够。从语法上来说一切都是正确的,但整个代码是否可以按照期望的运行是很难判断的。“坑” 非常多,需要一步一步的确认逻辑,并且很难进行单元测试和很难定位问题。例如,在数据增强过程中,当从左到右翻转图像时,可能忘记了翻转标签。神经网络仍然可以很好地工作,因为你的网络可以在内部学会检测翻转的图像,然后左右翻转它的预测。或者你试着修剪你的梯度但是却错误的修剪了 loss,导致异常值的样本在训练中被忽略。或者你从一个预训练的 checkpoint 初始化权重但没有使用原始平均值。或者你只是没有设置合适的正则化参数、学习率、衰减率、模型大小等。因此,只有在非常幸运的情况下错误配置的神经网络才会抛出异常。但是大多数情况下,它会正常的进行训练并难以发现问题。
因此,用“简单粗暴”的方法来训练神经网络是行不通的,它的性能可能会非常差。但是它可以通过全面的,防御性的,对几乎所有可能的事情的可视化的方式来减轻。根据我的经验,耐心和对细节的关注是深度学习成功最重要的因素。
- 对应的解决方案
基于以上两个观点,我为自己开发了一个特定的开发流程,每当我将神经网络应用到一个新的问题时,我将遵循这个过程,我将尝试描述它。你将看到,它非常认真地对待上述两个原则。特别是,它从简单到复杂,每一步我们都对将要发生的事情做出具体的假设,然后通过实验验证它们,或者进行调查,直到我们发现一些问题。我们极力避免的是同时引入大量“未经验证”的复杂性,这必然会引入错误/错误配置,而这些错误/错误配置将永远无法找到。写代码要像训练模型一样,用非常小的学习率去验证你的想法,再在每次迭代之后评估完整的测试集。- 检查数据
训练神经网络的第一步是完全不接触任何神经网络代码,而是从彻底检查数据开始。这一步非常重要。我喜欢花大量的时间(以小时为单位)浏览数千个样本,理解它们的分布并寻找一些规律。有一次,我发现数据中包含重复的样本。另一次我发现了损坏的图像/标签。我寻找数据的不平衡和偏差。
我通常还会注意我自己对数据进行分类的过程,看是不是会对模型训练有一些启发。
举个例子,非常局部的特征是否足够,或者我们是否需要全局上下文?有多少多样性,它以什么形式出现?哪些多样性是假的,是不是可以可以通过预处理挑出来?空间位置重要吗,我们用不用平均池化?纹理有多重要,我们能在对图像降采样多少倍?标签的噪声程度怎么样?
一旦你有了一个定性的感觉,写一些简单的代码来搜索/过滤/排序也是一个好主意,不管你能想到什么(例如标签的类型,标注的尺寸,标签的数量,等等),然后可视化它们的分布,看看在每一个维度上的异常值。异常值几乎总是会发现数据质量或预处理中的一些bug
由于神经网络实际上是对数据集的压缩/编译版本,你可以查看你的网络的预测,并思考它们在数据集中来源。如果你的网络给你的预测与你在数据中看到的不一致那可能说明代码有问题。 - 配置端到端的训练/评估框架+获取一个基线
1、确定img_size 小障碍物尺寸太小确认,按照输入模型的尺寸,人分析几乎都分辨不了的标准,确定最小 小障碍物大小尺寸 如下图,存在2个问题:1、框不紧致 2、缩放到模型输入尺寸224,人几乎分辨不了 2、确定检出上限,按照以上尺寸大小,找出按照测试集,精度的上限 3、有多少多样性,前景多样性和背景多样性?哪些多样性是假的? 连续帧是假多样性,实际前景只有4种多样性的连续帧,背景也是4中多样性的连续帧,多样性是不够的 4、标签的噪声程度怎么样? 噪声还行,框不紧致
- 检查数据