Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow 第二版(机器学习的主要挑战)学习笔记(二)

机器学习的主要挑战

  • 简而言之,由于你的主要任务是选择一种学习算法并在某些数据上对其进行训练,因此可能出错的两件事是“错误算法”和“错误数据”。让我们从坏数据的例子开始。

训练数据的数量不足

  • 为了让幼儿知道苹果是什么,你所做可能是指着一个苹果然后说“苹果”(可能重复这个过程很多次)。现在孩子能够识别各种颜色和形状的苹果。
  • 机器学习是完全不同的;大多数机器学习算法都需要大量的数据才能正常工作。即使对于非常简单的问题,你通常也需要上千个样本。对于像图像和语音识别这样复杂的问题,你可能需要上百万的样本(除非你可以重用现有模型的某些部分)。
数据不合理的有效性
  • 在2001年发表的著名论文中,微软的研究者Michele Banko和Eric Brill表明一旦提供足够多的数据,非常不同的算法(哪怕非常简单的算法)在自然语言歧义消除这一复杂问题上的性能几乎相同(如图Figure 1-20 所示)。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow 第二版(机器学习的主要挑战)学习笔记(二)_第1张图片
  • 正如作者所说:“这些结果表明,我们可能需要重新考虑在算法开发上花费时间和金钱与在语料库开发上花费之间的权衡。”
  • Peter Norvig等人在2009年出版的论文“The Unreasonable Effectiveness of Data”中进一步提出对于复杂的问题而言数据比算法更重要的想法。值得注意的是,小型和中型数据集是很常见的,但是获得额外的训练数据并不总是容易和便宜,因此也不要放弃算法。

没有代表性的训练数据

  • 为了获得好的泛化性能,至关重要的是,你的训练数据要能够很好的表示你想要泛化的新案例。无论你使用的是基于实例学习还是基于模型学习,这都是相当正确的。
  • 例如,我们先前用于训练线性模型的国家集合没有很好的代表性,其中一些国家是缺失的。Figure 1-21 展示了添加缺失国家之后的情况。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow 第二版(机器学习的主要挑战)学习笔记(二)_第2张图片
  • 如果你在这些数据上训练线性模型,你得到实线,而老的模型是用虚线表示的。如您所见,添加几个缺失的国家不仅会大大改变模型,而且很明显,这样一个简单的线性模型可能永远无法正常工作。似乎非常富裕的国家并不比中等富裕的国家幸福(事实上,它们似乎并不幸福),相反,一些穷国似乎比许多富裕国家更幸福。
  • 使用没有代表性的训练集,我们的模型是不可能做出准确的预测,特别是对那些非常贫穷和富有的国家。
  • 使用能够代表你想要泛化样本的训练集是至关重要的。这通常比听起来难得多:如果样本太少,则会产生抽样噪音(例如,偶然的机会获得非代表性的样本),但是如果抽样方法有缺陷,即使是非常大的样本也可能无代表性。这也就是所有的采样偏差(sampling bias)。
采样偏差的一个著名例子
  • 抽样偏差最著名的例子也许发生在1936年美国总统大选上,那次选举是Landon对抗Roosevelt:Literary Digest做了一个非常大的民意调查,向1000万人发送了邮件。它得到了240万的答复,并且自信的预测Landon将得到57%的选举票。相反,Roosevelt赢得了62%的选举票。缺陷在于Literary Digest’s 的抽样方法:(1)首先,为了获得发送名义调查的地址,Literary Digest使用了电话薄、杂志订阅者列表、俱乐部成员列表等。所有这些名单都倾向于较富有的人,他们更有可能投票给共和党人(因此,Landon)。(2)其次,不到25%的人接受了民意调查。同样,通过排除那些不太关心政治的人,不喜欢Literary Digest的人以及其他关键群体,这会带来抽样偏差。这种特殊类型的抽样偏差称为无响应偏差(nonresponse bias)。
  • 还有另外一个例子:你想建立一个识别时髦(funk)音乐视频的系统。构建你训练集的一个方式是在YouTube上搜索"funk music"并使用这些结果视频。但这是假设YouTube的搜索引擎返回了一组代表YouTube上所有时髦音乐视频的视频。实际上,这个搜索结果可能会偏好于著名艺术家(如果你居住在巴西,则会收到很多“funk carioca”视频,听起来像詹姆斯·布朗)。另一方面,你还能如何获得大量训练数据呢?

低质量的数据

  • 显然,如果你的训练数据充满了错误、离群值和噪音(例如,由于低质量的度量),这将使得系统更难检测潜在的模式,因此,你的系统更少的可能性会执行的很好。清洗训练数据总是值得做的事情。事实是,大多数数据科学家都将大量时间用于此目的。例如:(1)如果一些实例是明显离群的,简单的丢弃它们或者尝试去修正错误总是有帮助的;(2)如果一些实例缺失一些特征(例如,5%的顾客没有年龄特征),你必须觉得你是否想要忽视这个属性、忽视这些实例、填充缺失值(例如,使用年龄的均值)、或者训练一有这个特征的模型和没有这个特征的模型等等。

不相关的特征

  • 俗话说:垃圾进,垃圾出。仅当训练数据包含足够的相关特征而没有太多不相关的特征时,您的系统才能学习。机器学习项目成功的关键在于提供一个好的特征集合来训练。这个过程也被称为特征工程(feature engineering)包括:(1)特征选择(Feature selection),在所有存在的特征中选择最有用的特征来训练;(2)特征抽取(Feature extraction),联合存在的特征来产生一个更有用的特征(正如我们先前所说的,降维算法能够提高帮助)。(3)通过聚集新的数据来创造新的特征。
  • 现在我们已经看到了很多坏数据的例子,接下来让我们看一些坏算法的例子。

训练数据的过拟合

  • 假设你去国外旅游,的士司机抢了你的东西。你可能会说这个国家的所有出租车司机都是小偷。过度泛化是人类总是在做的事情,不幸的是,如果我们不小心的话机器也可能陷入同一个陷阱。在机器学习中也被称为过拟合(overfitting):这意味着模型在训练数据上执行的很好,但是它泛化能力不佳。
  • Figure 1-22 展示了一个高度多项式生活满意度模型,它在训练数据上严重过拟合。即使它在训练数据上比简单线性模型执行的更好,你真的能够信任它的预测吗。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow 第二版(机器学习的主要挑战)学习笔记(二)_第3张图片
  • 像深度神经网络这样的复杂模型能够检测数据中细微的模式,但是,如果训练集是噪音或训练集太小(引入了抽样噪音),那么这个模型可能检测到噪音本身的模式。显然这些模式将不能够泛化到新的实例。例如,假设你为生活满意度模型提供了更多的属性,包括诸如国家名称之类的无信息的属性。在这种情况下,一个复杂的模型可能会检测到这样的模式,例如,训练数据中所有国家/地区名称中带有w的国家/地区的生活满意度都大于7:New Zealand (7.3), Norway (7.4), Sweden (7.2), and Switzerland (7.5)。您对W满意度规则适用于Rwanda或Zimbabw的信心如何?显然,这种模式纯粹偶然的出现在训练集中,但是模型没法辨别模式时真实的还是噪音的简单结果。
  • 当模型相对于训练数据的数量和噪声而言太复杂就会出现过拟合。可能的解决方案是:(1)选择一个参数更少的模型(例如,一个线性模型而不是一个高度多项式模型)、通过减少训练集中属性的数量、或者通过约束模型来简化模型;(2)收集更多的训练数据;(3)减少训练数据中的噪音(例如,修正错误数据和删除离群点)。
  • 约束一个模型使其更简单以及减少过拟合的风险被称为正则化(regularization)。例如,我们早期定义的线性模型拥有两个参数, θ 0 \theta_0 θ0 θ 1 \theta_1 θ1。这个给定了学习算法两个自由度(degrees of freedom)来适应训练数据:模型能够调整高度( θ 0 \theta_0 θ0)和斜率( θ 1 \theta_1 θ1)。如果我们强迫 θ 1 = 0 \theta_1 = 0 θ1=0,那么算法就只有一个自由度,并且它更难恰当地拟合数据:它所能做的就是将线向上或向下移动,以使其尽可能接近训练实例,因此最终将围绕均值。确实是一个非常简单的模型!如果我们允许算法修改 θ 1 \theta_1 θ1,但强迫它保持很小的值,则学习算法将有效地在一到两个自由度之间的某个位置。这将产生一个比两个自由度更简单的模型,但比一个自由度更复杂。你想在完美拟合训练数据和使模型足够简单以确保将其很好地泛化之间找到适当的平衡。
  • Figure 1-23 展示了3个模型:点线表示使用缺失国家数据训练的原始模型、虚线是使用所有国家数据训练的第二个模型、以及实线是使用和第一个模型相同的训练数据训练的一个线性模型,但是它具有正则化约束。你可以看到正则化迫使模型具有较小的斜率,这与模型训练所依据的训练数据相比要少一些,但实际上可以使模型更好地泛化新示例。
    Hands-on Machine Learning with Scikit-Learn, keras, and Tensorflow 第二版(机器学习的主要挑战)学习笔记(二)_第4张图片
  • 训练过程中应用的正则化数量能够通过一个超参数(hyper-parameter)来控制。一个超参数是学习算法的一个参数(不是模型)。因此,它不受学习算法本身影响。必须在训练之前进行设置,并且在训练过程中保持不变。如果你设定正则化超参数一个非常大的值,你可能得到一个几乎平整的模型(斜率接近0);这个学习算法肯定不会过拟合训练数据,但它也不太可能发现一个好的结果。构建机器学习系统中微调超参数是一个很重要的部分(在下一章你将看到详细的例子)。

训练数据的欠拟合

  • 你可能会猜到,欠拟合与过拟合相反:当你的模型对于学习数据的潜在结构而言太简单的时候,欠拟合将出现。例如,一个生活满意度的线性模型倾向于欠拟合;现实比模型往往要复杂的多,即使在训练数据上它的预测也是不准确的。
  • 解决这个问题的主要方法包括:(1)选择一个更强大的模型,该模型具有更多的参数;(2)喂更好的特征给学习算法(特征工程);(3)减少模型的约束(例如,减少正则化参数)。

回顾(Stepping Back)

  • 到目前为止,你已经知道了深度学习的许多内容。但是,我们经历了太多的概念,你可能会感到有些迷茫,因此我们回顾下所讲的内容:(1)机器学习旨在通过从数据中学习,使机器在某些任务上变得更好,而不必明确地编写规则;(2)有许多不同类型的机器学习系统:监督或非监督、批量或在线、基于实例或基于模型等等;(3)在一个机器学习项目中你在训练集中收集数据,并且将训练集喂给学习算法。如果算法是基于模型的,则它会调整一些参数以使模型拟合训练集(即对训练集本身做出好的预测),然后希望它也能够对新样例做出好的预测。如果算法是基于实例的,它们仅仅认真的学习样本,并且使用一个相似性度量来比较新样例和已学习的样例;(4)如果你的训练集太少、或者如果数据没有代表性,具有噪音、亦或者具有不相干的特征那么学习系统将不会有好的性能。最后,你的模型既不必太简单(在这种情况下将欠拟合),也不必太复杂(在这种情况下将过拟合)。
  • 最后还有一个重要的主题需要讨论:一旦你已经训练了一个模型,你不想只是“希望”将其泛化到新样例上。你需要评估它,并在必要时对其进行微调。 让我们看看如何做。

测试和验证

  • 知道模型对新样例的泛化程度的唯一方法是在新样例上进行实际尝试。一种方法是将模型投入生产并监视其性能。这很好用,但是如果你的模型非常糟糕,你的用户将抱怨-这并非是一个最佳的注意。
  • 一个更好的选择是去划分你的数据为两个集合:训练集和测试集。和名字所暗示的一样,你使用训练集训练你的模型,同时使用测试集测试你的模型。新样例的错误率称为泛化误差(或样本外错误),通过在测试集上评估模型,您可以估算出该错误。这个值告诉你模型在从未见过的样本上会执行的多好。
  • 如果训练误差是很低的(例如,你的模型在训练集上没有什么错误),但是泛化误差是很高的。这意味着你的模型在训练数据上过拟合了。
  • 通常,使用80%的数据来训练,留出20%的数据来测试。但是,这取决于数据集的大小:如果数据集中包含1000万个实例,则保留1%表示您的测试集将包含100,000个实例:这可能足以对泛化误差进行良好的估算。

超参的调节和模型的选择

  • 评估模型非常简单:仅仅使用一个测试集。现在假设你在两个模型之间犹豫不决(一个线性模型和一个多项式模型):你如何决定?一个可能的选择是训练这两个模型,接着使用测试集对比它们的泛化能力有多好。
  • 现在假设线性模型的泛化能力更好,但是你想要应用一些正则化来避免过拟合。这个问题是:你如何选择正则化参数的值?1个选择是使用这个参数100个不同的值来训练100个不同的模型。假设你发现最好的超参数值产生了一个具有最低泛化误差的模型,只有5%的错误率。
  • 因此,你将该模型投入生产,但不幸的是,它的性能不及预期,并产生15%的错误率。这是为什么了?
  • 问题是你在测试集上多次测量了泛化误差,并且对模型和超参数进行了调整,以针对该特定集生成最佳模型。这意味着该模型不太可能在新数据上表现良好。
  • 这个问题一个通用的解决方案是留出验证(holdout validation):你简单的留出一部分训练集去评估多个候选模型并且选出最好的一个。新的保留集称为验证集(有时也称为开发集)。更具体地说,您在简化的训练集(即完整的训练集减去验证集)上训练具有各种超参数的多个模型,然后选择在验证集上表现最佳的模型。在留出验证过程之后,你在整个训练集上训练最好的模型(包括验验证集),并且给出你最终的模型。最好,你在测试集上评价最终的模型来得出一个泛化误差的估计。
  • 这个解决方案通常工作的相当好。然而,如果验证集太小,那么模型的评估可能不准确:你可能最终会错误的选择次优的模型。相反,如果验证集太大,那么留下的训练集可能比整个训练集小得多。为什么这样不好? 由于最终模型将在完整的训练集上进行训练,因此在较小的训练集上训练的候选模型并不理想。这就像选择最快的短跑运动员参加马拉松比赛一样。解决这个问题的一个方法是执行重复的交叉验证(cross-validation),使用许多小的验证集。在对其余数据进行训练后,每个模型对每个验证集评估一次。通过平均模型的所有评估,我们可以更准确地衡量模型的性能。但是,这样有一个缺点,那就是训练时间会成倍速的增长。

数据不匹配

  • 在某些情况下,很容易获得大量用于训练的数据,但是并不能完全代表将在生产中使用的数据。例如,假设您要创建一个移动应用程序来拍摄花朵图片并自动确定花朵的种类。你可以轻松地在网络上下载数以百万计的鲜花图片,但是它们并不能完全代表实际在移动设备上使用该应用程序拍摄的图片。也许你只有10,000张具有代表性的图片(即实际上是使用该应用程序拍摄的)。在这种情况下,要记住的最重要规则是,验证集和测试必须尽可能代表你希望在生产中使用的数据。因此它们应仅由代表性图片组成:你可以将它们混洗并且一半放入验证集中、一般放入测试集中(确保两个集中都没有重复或接近重复)。在网站图片上训练模型之后,如果你观察到模型在验证集上的性能不好,你将不会知道这个原因是因为模型过度拟合训练数据还是仅仅因为网站图片和移动应用图片的不匹配。一个解决方案是留出部分训练图片(来源于网站),这个集合被Andrew Ng称为训练开发集合(train-dev set)。在模型被训练之后(在训练集上,不是在训练-开发集上),你能在训练-开发集上评估它。如果它执行的很好,那么这个模型没有在训练集上过拟合。因此,如果在训练集上性能不佳,这个问题一定来源于数据不匹配。您可以通过预处理网络图像以使其看起来更像移动应用程序将要拍摄的照片来尝试解决此问题,然后重新训练模型。相反,如果模型在训练-开发集上性能不佳,那么这个模型一定是过拟合了训练数据。因此,你需要尝试简化模型、添加正则化、得到更多训练数据和清洗训练数据等等。
没有免费午餐理论(No Free Lunch Theorem)
  • 模型是观测值的简化版本。简化是指丢弃不太可能推广到新样例的多余细节。但是,要决定丢弃哪些数据以及保留哪些数据,你必须进行假设。例如,线性模型假设数据基本上是线性的,并且实例与直线之间的距离只是噪声,可以放心地忽略它。
  • 在1996年著名的论文中,David Wolpert 证明了如果你不对数据做假设,那么没有理由说哪个模型更好。这也被称为没有免费午餐理论(NFL)。一些数据集的最优模型是线性模型,其他一些数据集是神经网络。没有任何一种模型可以保证先验地工作更好(因此,定理的名称也是如此)。要确定哪种模型最好,唯一的方法就是对它们全部进行评估。由于这是不可能的,因此在实践中你对数据做出一些合理的假设,并且仅评估一些合理的模型。例如,对于简单的任务,你可以评估具有各种正则化级别的线性模型,而对于复杂的问题,则可以评估各种神经网络。

你可能感兴趣的:(机器学习,机器学习,深度学习)