如何提前知道深度学习需要多少训练样本才能获得良好性能?

近年来,深度学习掀起了一场革命,其成功与我们当前能够处理的庞大数据量以及GPU的普及密切相关。

所以我面临的问题是这样的。我知道深度神经网络的表现是最好的,这一点毫无疑问。然而,当训练样本数量庞大时,它们的表现才好。如果训练样本数量少,使用SVM或决策树会更好。

但什么是庞大?什么是少?在这篇关于人脸识别的论文(Google的FaceNet)中,他们展示了性能与计算量(这可以与训练样本数量相关联)的对比。

enter image description here

他们使用了1亿到2亿之间的训练样本,这已经是庞大的数量了。

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


回答:

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

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

你能拥有的只是一些一般的启发式/经验知识,这些知识只能告诉你深度学习可能不会表现得很好(因为可以预测方法的失败,而几乎不可能预测成功),仅此而已。在当前的研究中,深度学习在数据集小于数十万/数百万样本时很少能表现得很好(我不计算MNIST,因为在MNIST上一切都表现得很好)。此外,深度学习实际上只在两种类型的问题上被深入研究——NLP和图像处理,因此你不能真正将其推广到任何其他类型的问题上(没有免费的午餐定理)。

更新

为了让它更清楚。你问的是预测给定的估计器(或一组估计器)在给定的训练集上是否会产生好的结果。实际上,你甚至只限制在样本大小上。

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

现在假设我们确实可以访问训练样本(暂时没有标签),而不仅仅是样本大小。现在我们得到了大小为N的X(训练样本)。同样,我可以构造N模态的标签,产生无法估计的分布(任何东西都无法估计)和简单的标签(只有一个标签!)。同样——对于完全相同的输入有两个不同的答案。

那么,如果给定训练样本和标签,我们可以预测什么会表现得好吗?现在我们不能操纵样本或标签来证明没有这样的函数。所以我们必须回到统计学,我们试图回答的问题。我们问的是生成我们训练样本的整个概率分布上的损失函数的期望值。所以现在再次,整个“线索”是看到,我可以操纵底层分布(构造许多不同的分布,其中许多深度神经网络无法很好地建模),仍然期望我的训练样本来自它们。这就是统计学家所说的从pdf中获取不可代表的样本的问题。特别是在机器学习中,我们经常将这个问题与维度灾难联系起来。简单来说——为了很好地估计概率,我们需要巨大的样本数量。Silverman证明了即使你知道你的数据只是一个正态分布,你问“0处的值是多少?”你需要指数级的样本(与空间维度相比)。在实践中,我们的分布是多模态的、复杂的和未知的,因此这个数量甚至更高。我们可以相当安全地说,给定我们能收集到的样本数量,我们永远无法合理地估计超过10个维度的分布。因此——无论我们做什么来最小化期望误差,我们只是在使用启发式,这些启发式将经验误差(拟合数据)与某种正则化(通常通过对分布家族施加一些先验假设来去除过拟合)联系起来。总结起来,我们无法构造一个能够区分我们的模型是否会表现良好的方法,因为这需要决定哪个“复杂性”分布生成了我们的样本。有些简单的情况我们可以做到——而且它们可能会说一些像“哦!这个数据如此简单,即使是knn也会表现得很好!”的话。你不能有一个通用的工具,对于DNN或任何其他(复杂的)模型也是如此(严格来说——我们可以为非常简单的模型拥有这样的预测器,因为它们非常有限,我们可以很容易地检查你的数据是否遵循这种极端的简单性)。

因此,这几乎归结为同样的问题——实际上是构建一个模型…因此你需要尝试并验证你的方法(因此——训练DNN来回答DNN是否表现良好)。你可以在这里使用交叉验证、自举法或其他任何方法,但所有这些本质上都是做同样的事情——构建你所需类型的多个模型并验证它。

总结

我不认为我们不会有好的启发式,启发式驱动着机器学习的许多部分表现得相当好。我只是回答是否有能够回答你的问题的方法——没有这样的东西,也不可能存在。可能会有许多经验法则,对于某些问题(问题类别)会表现得很好。我们已经有了这样的规则:

  • 对于NLP/2D图像,你应该至少有10万个样本来使用DNN
  • 拥有大量未标记的实例可以部分替代上述数量(因此你可以有3万个标记的+7万个未标记的),结果相当合理

此外,这并不意味着给定这个数据量DNN会核化SVM甚至线性模型更好。这正是我之前提到的——你可以很容易地构造分布的反例,其中SVM的表现相同甚至更好,尽管样本数量相同。这同样适用于任何其他技术。

然而,即使你只是对DNN是否会表现得好感兴趣(而不是比其他方法更好),这些只是经验性的、简单的启发式,基于最多10种(!)类型的问题。将这些视为规则或方法可能会非常有害。这些只是通过过去十年中极其非结构化、随机的研究获得的粗略的、初步的直觉。

好的,所以我现在迷失了…我什么时候应该使用深度学习?答案非常简单:

只有在以下情况下才使用深度学习:

  • 你已经测试了“浅层”技术,它们表现得不好
  • 你有大量数据
  • 你有巨大的计算资源
  • 你有神经网络经验(这些模型真的非常棘手且不讨人喜欢)
  • 你有大量的时间可以浪费,即使你只会得到几个百分点的更好结果作为效果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注