前言
许多神经网络不WORK的原因在于逻辑与语法的错误,我们可以分单元逐个测试排除错误。但这只是训练神经网络的一个开始。一切都可能在语法上正确,但整个事情没有妥善安排,而且很难说清楚。“可能的错误表面”是大的,逻辑的(与语法相反),并且对单元测试非常棘手。例如,在数据增强期间左右翻转图像时,您可能忘记翻转标签。您的网络仍然可以(令人震惊地)工作得非常好,因为您的网络可以在内部学习检测翻转的图像,然后左右翻转其预测。或许你的自回归模型会因为一个错误的错误而意外地将它想要预测的东西作为输入。或者你试图剪切你的渐变但是修剪了损失,导致在训练期间忽略异常值的例子。或者您从预训练检查点初始化了您的权重,但没有使用原始均值。或者你只是搞砸了正则化强度,学习率,衰减率,模型大小等设置。因此,错误配置的神经网络只有在你运气好的时候才会抛出异常; 大部分时间它会训练,但默默地工作有点糟糕。
结果,(并且这在过去很难过分强调),训练神经网络的“快速和激烈”方法不起作用,只会导致痛苦。现在,痛苦是让神经网络运作良好的一个非常自然的部分,但它可以通过彻底,防御,偏执和痴迷基本上所有可能的事物的可视化来减轻。在我的经验中,与深度学习成功最相关的品质是耐心和对细节的关注。
一些建议
鉴于上述两个事实,我已经为自己开发了一个特定的过程,我将神经网络应用于新问题,我将尝试描述。你会发现它非常重视上述两个原则。特别是,它从简单到复杂构建,并且在每一步我们对将要发生的事情做出具体假设,然后通过实验验证它们或进行调查直到我们发现某些问题。我们试图非常努力地防止的是同时引入了许多“未经验证的”复杂性,这必然会引入需要永远查找的错误/错误配置(如果有的话)。如果编写您的神经网络代码就像训练一样,您需要使用非常小的学习速率并猜测,然后在每次迭代后评估完整的测试集。
-
与数据成为一体
训练神经网络的第一步是根本不接触任何神经网络代码,而是从彻底检查数据开始。这一步至关重要。我喜欢花费大量时间(以小时为单位)扫描数千个示例,了解它们的分布并寻找模式。幸运的是,你的大脑非常擅长这一点。有一次我发现数据包含重复的例子。另一次我发现损坏的图像/标签。我寻找数据不平衡和偏见。我通常也会关注我自己的数据分类过程,这些过程暗示了我们最终会探索的各种架构。作为一个例子 - 是非常本地的功能还是我们需要全球背景?有多少变化,它采取什么形式?什么变化是假的,可以预处理?空间位置是否重要,或者我们是否想要将其平均化?细节有多重要,我们可以在多大程度上对图像进行缩减采样?标签有多吵?
此外,由于神经网络实际上是数据集的压缩/编译版本,因此您将能够查看网络(错误)预测并了解它们的来源。如果你的网络给你的预测看起来与你在数据中看到的