有没有什么技巧可以提前知道需要多少训练样例才能让深度学习获得好的性能?

Is there any technique to know in advance the amount of training examples you need to make deep learning get good performance?

深度学习是最近的一场革命,它的成功与我们目前可以管理的海量数据和GPU的泛化有关。

这就是我面临的问题。我知道深度神经网络具有最好的性能,这是毫无疑问的。但是,当训练示例数量巨大时,它们具有良好的性能。如果训练样例数量较少,最好使用 SVM 或决策树。

但是什么是巨大的?什么是低?在这个 paper 的人脸识别(FaceNet by Google)中,他们展示了性能与失败的对比(这可能与训练示例的数量有关)

他们使用了 1 亿到 2 亿个训练样本,数量庞大。

我的问题是: 有没有什么方法可以提前预测我需要多少训练样例才能在深度学习中有好的表现???我问这个的原因是如果性能不好,手动分类数据集是浪费时间。

My question is: Is there any method to predict in advance the number of training examples I need to have a good performance in deep learning??? The reason I ask this is because it is a waste of time to manually classify a dataset if the performance is not going to be good.

简短的回答是。这种知识你没有,而且你永远不会。这类问题永远无法解决。

你能掌握的只是一些一般性的heuristics/empirical知识,如果深度学习可能无法正常工作(因为可以预测方法失败,而几乎不可能预测成功)仅此而已。在当前的研究中,DL 很少适用于小于数百 thousands/milions 个样本的数据集(我不计算 MNIST,因为 MNIST 上的一切都很好)。此外,深度学习实际上只在两种类型的问题中得到大量研究——NLP 和图像处理,因此你不能真正将它外推到任何其他类型的问题(没有免费的午餐定理)。

更新

只是为了让它更清楚一点。您要问的是预测给定的估计器(或一组估计器)是否会在给定特定训练集的情况下产生良好的结果。事实上,你甚至只限制大小。

最简单的证明(基于您的简化)如下:对于任何 N(样本量)我可以构造 N 模式(或 N^2 使其更明显)分布,其中没有估计器可以合理地估计(包括深度神经网络),我可以只用一个标签构造琐碎的数据(因此完美的模型只需要一个样本)。证明结束(同一个 N 有两个不同的答案)。

现在让我们假设我们确实可以访问训练样本(目前没有标签)而不仅仅是样本大小。现在我们得到了大小为 N 的 X(训练样本)。我可以再次构建 N 模式标签,从而产生无法估计的分布(通过任何方式)和简单的标签(只是一个标签!)。同样 - 完全相同的输入有两个不同的答案。

好的,也许给定训练样本和标签,我们可以预测什么会表现良好?现在我们不能操纵样本或标签来表明没有这样的功能。所以我们必须回到统计数据以及我们试图回答的问题。我们正在询问 损失函数在生成我们的训练样本的整个概率分布 上的期望值。所以现在又一次,整个 "clue" 是为了看到,我可以操纵底层分布(构建许多不同的分布,其中许多无法通过深度神经网络很好地建模)并且仍然期望我的训练样本来自它们.这就是统计学家所说的从 pdf 中获取不可表示样本的问题。特别是在 ML 中,我们经常将这个问题与维数灾难联系起来。简而言之 - 为了很好地估计概率,我们需要 大量 个样本。 Silverman 表明,即使您 知道 您的数据只是一个正态分布并且您问 "what is value in 0?" 您需要指数级的许多样本(与 space 维度相比)。在实践中,我们的分布是多模态的、复杂的和 未知 因此这个数量甚至更高。我们可以很肯定地说,给定我们可以收集到的样本数量,我们永远无法合理估计超过 10 个维度的分布。因此 - 无论我们做什么来最小化 预期误差 我们只是在使用 heuristics,它将经验误差(拟合数据)与某种类型联系起来正则化(消除过度拟合,通常通过对分布族进行一些先验假设)。总而言之,我们无法构建一种能够区分我们的模型是否表现良好的方法,因为这需要确定哪个 "complexity" 分布生成了我们的样本。当我们可以做到时,会有一些简单的情况 - 可能他们会说 "oh! this data is so simple even knn will work well!" 之类的话。对于 DNN 或任何其他(复杂)模型,您不能拥有通用工具(严格来说 - 我们可以为非常简单的模型提供这样的预测器,因为它们非常有限,我们可以轻松检查您的数据是否遵循这种极端简单性或不是)。

因此,这几乎可以归结为同一个问题 - 实际构建模型......因此您将需要尝试验证您的方法(因此 - 如果 DNN 运行良好,则训练 DNN 来回答). 你可以在这里使用交叉验证、自举或其他任何东西,但所有的本质都是一样的——构建你想要的类型的多个模型并验证它。

总结

我并不是说我们不会有很好的启发式算法,启发式算法可以很好地驱动 ML 的许多部分。我只回答是否有一种方法能够回答您的问题 - 没有这样的东西也不存在。可以有很多经验法则,这对于某些问题(类 个问题)会很有效。我们已经有了:

  • 对于 NLP/2d 图像,您至少应该有大约 100,000 个样本才能使用 DNN
  • 有很多未标记的实例可以部分替代上面的数字(因此你可以有大约 30,000 个标记的实例 + 70,000 个未标记的实例)得到相当合理的结果

此外,这并不意味着给定这种数据规模,DNN 将优于核化 SVM 甚至线性模型。这正是我之前提到的 - 您可以轻松构建分布的反例,其中 SVM 将在尽管样本数量的情况下工作相同甚至更好。这同样适用于任何其他技术。

然而,即使您只是对 DNN 是否运行良好(而不是优于其他)感兴趣,这些也只是经验性的、微不足道的启发式方法,最多基于10 (!) 种问题。将这些视为规则或方法可能非常有害。这只是通过过去十年中发生的极其非结构化的随机研究获得的粗略的第一直觉。

好的,所以我现在迷路了...我应该什么时候使用 DL?答案非常简单:

仅在以下情况下使用深度学习:

  • 您已经测试了"shallow"技术,但它们效果不佳
  • 您有大量数据
  • 您拥有巨大的计算资源
  • 您有使用神经网络的经验(这是非常棘手和不友好的模型,真的)
  • 您有大量空闲时间,即使作为效果您只会获得好几个 % 的结果。