十二、为您的应用选择最佳算法
软件工程过程中有三个不同的阶段:构思、实现和部署。这本书主要关注过程的实现阶段,即软件工程师开发项目的核心功能(即机器学习 ( ML )算法)和特性的阶段。在最后一章中,我们讨论了与部署阶段相关的问题。我们的学习接近完成。
在这最后一章中,我们将转向概念阶段,以完善我们对完整的 ML 开发过程的理解。具体来说,我们将讨论如何为给定的问题选择最佳算法。ML 生态系统正在发展,令人生畏,充满了即使是有经验的软件开发人员也不熟悉的行话。我经常看到 ML 的学生在这个过程的开始就被卡住了,在一片广阔而陌生的风景中不知道从哪里开始。他们还不知道的是,一旦你克服了选择算法和解密行话的最初障碍,剩下的旅程就容易多了。
这一章的目标是提供一个指南针,一个简单的向导,人们可以用它来找到一条绕过风景的路。选择正确的算法并不总是容易的,但有时确实如此。本章的前几节将教你四个简单的决策点——基本上是四个选择题——你可以用它们来专注于最适合你的项目的算法。大多数情况下,在完成这个过程后,你最终只会有一两个算法可供选择。
然后,我们将通过讨论与规划 ML 系统相关的其他主题来继续我们的教育。我们将讨论您选择了错误算法的迹象,以便您可以在早期识别错误。您还将学习如何区分使用错误的算法和糟糕的算法实现。
我还将向您展示一个组合两个不同的 ML 模型的例子,这样您就可以用最适合自己任务的单个模型组成更大的系统。如果仔细设计,这种方法可以产生很好的效果。
我称这一章为指南针——而不是地图——是有原因的。它不是一个全面的指南,涵盖了计算机科学家已知的每一个 ML 算法。和指南针一样,你也必须用你的诡计和技巧来找到你的路。用这一章找到自己项目的出发点,然后进行自己的研究跟进。虽然我们在本书中讨论的大约 20 种算法和技术给了你一个相当广阔的视野,但它们只是生态系统的一小部分。
在这本书即将结束的时候,我想给你最后一条建议。要成为某方面的专家,需要始终如一地致力于练习和玩耍。如果你想成为一名世界级的钢琴家,你必须花无数个小时用节拍器进行细致的死记硬背练习,练习指法练习,学习具有挑战性的学习。
但你也要玩,这是探索发生和创造力发展的地方。经过 30 分钟的跑步训练,钢琴家可能会花 30 分钟即兴演奏爵士乐,尝试旋律和对位法,学习音乐中音阶和音型的情感本质。这种有趣的探索,创造性的实验,以一种死记硬背的方式发展了音乐的直觉。死记硬背的练习——细致的工作和学习——反过来培养了玩耍所不能培养的机械感和技能。练习和玩耍在良性循环中互相提升。有技能的人能够比没有技能的人探索得更远、更深,更深层次的兴奋是发展技能的动力。时间和耐心、练习和玩耍、动力和纪律是你从新手变成专家唯一需要的东西。
ML 是爵士钢琴的对立面,但专业的道路是一样的。ML 的死记硬背练习——相当于练习音阶——就是构建和实现算法。我特别推荐从零开始写算法作为练习;这是了解内心真实情况的唯一真实方法。不要只写一次从头开始的算法,向自己证明自己可以。在不同的环境、不同的编程语言、不同的体系结构、不同的数据集下,把算法写好几次,然后一直写下去,直到你几乎可以把整个事情从头写起。我相当确定,我可以用三种编程语言中的任何一种蒙着眼睛编写一个朴素贝叶斯分类器,就像你已经编写了几十个这样的分类器一样。
ML 的玩法在于实验。这一章是关于为你的应用选择最佳算法,但这不是法律规则。如果你从不做实验,你永远不会对算法或数据产生丰富的直觉。用其他方法、参数或算法变体进行实验,并从实验中学习。你会惊讶于一个实验能成功的频率,但更重要的是,实验应该成为你实践和教育的一部分。
让我们从讨论四个主要决策点开始这一章,你可以用它们来磨练你的算法技能:
- 学习方式
- 手头的任务
- 数据的格式或形式
- 可利用的资源
此外,我们将讨论当一切都出错时该怎么办,最后我们将讨论将多个模型组合在一起。
学习方式
选择 ML 算法时首先要访问的决策点是学习过程的模式:有监督、无监督或强化学习。这些模式几乎没有重叠;一般来说,一个算法要么是有监督的,要么是无监督的,但不是两者都有。这将你的选择范围缩小了大约一半,幸运的是,很容易判断哪种学习模式适用于你的问题。
监督学习和非监督学习的区别在于你是否需要有标签的训练例子来教授算法。如果你只有数据点,而没有标签或类别与之关联,那么你只能执行无监督学习。因此,您必须选择无监督学习算法之一,如 k 均值聚类、回归、主成分分析 ( 主成分分析)或奇异值分解。
监督学习和非监督学习之间的另一个明显区别是是否有一种方法可以判断语义的准确性。如果判断准确性的概念在您的应用中没有意义(因为您没有标记的训练或参考数据),那么您将面临无监督的学习问题。
但是,在某些情况下,您将没有训练数据,但是这个问题最好通过有监督的学习问题来解决。认清有训练数据和需要训练数据的区别很重要。当你需要训练数据时,你可能会看到一个有监督的学习问题。如果你需要训练数据但没有,你必须想办法得到训练数据。
为问题生成训练数据的最简单方法是自己生成。在图像分类任务中,您可以简单地手工标记几百幅图像来生成训练数据。这很耗时,但适用于小型训练集。
一种更具可扩展性的方法是使用像亚马逊机械土耳其人这样的服务,通过这种服务,您可以向人工支付 0.05-0.10 美元来标记每个图像。机械 Turk 方法已经非常受 ML 研究人员和数据科学家的欢迎,因为它是一种以合理的成本生成大量训练数据的快速且可扩展的方法。为 5000 张图片生成标签可能需要花费 250 美元,在 Mechanical Turk 上需要一两天时间。如果你认为 250 美元很贵,考虑一下你个人给这 5000 张图片贴标签所花费的时间。
还有更聪明的方法来生成训练数据,比如将责任转移给应用的用户。几年前,当脸书第一次引入给照片中的人贴标签的功能时,他们要求照片上传者在每个对象的脸上画一个方框,然后给他们贴标签。在上传了数十亿张照片后,脸书有了一个庞大的训练集,不仅能识别面部形态,还能识别照片中的特定人物。如今,在给照片贴标签时,没有必要在人们的脸上画方框,通常情况下,脸书能够自动找出照片中的每个主体是谁。我们,用户,为他们提供了这个庞大的训练集。
监督学习是显而易见的,通过在预先标记的数据上训练算法,目标是从标签中学习算法,并且能够扩展知识并将其应用于新的、看不见的例子。如果你发现自己有很多数据点,并且有一些(但不是全部)正确的答案或标签可用,你可能需要一个监督学习算法。如果你有一百万封电子邮件,其中 5000 封被手动过滤为垃圾邮件或非垃圾邮件,并且如果目标是将该知识扩展到其他 995000 封邮件,你正在寻找一种监督学习算法。
如果有需要判断算法语义准确性的情况,还必须使用监督学习算法。无监督的算法没有真理的来源;那些算法会对数据进行聚类、平滑或外推,但如果没有规范的参考,就无法判断算法的准确性。另一方面,监督学习算法可以根据语义准确性来判断,因为预先标记的训练数据是真理的来源。
虽然我们在本书中没有涉及强化学习算法,但它们的特点是算法必须影响其环境才能优化行为。算法的输出和动作的结果之间有一定程度的分离,因为环境本身就是一个因素。强化学习的一个例子是教人工智能通过扫描屏幕和使用鼠标和键盘控制来玩视频游戏。一个玩超级马里奥兄弟的 AI 只能通过敲击控制板上的上、下、左、右、A、B 的组合来与环境互动。算法的输出在环境中采取行动,环境将奖励或惩罚这些行动。因此,该算法试图最大限度地提高其回报,例如通过收集硬币,在关卡中取得进展,击败敌人,而不是掉进无底洞。
强化学习算法是应用机器人学、控制系统设计、基于仿真的优化、硬件在环仿真以及将物理世界与算法世界相融合的许多其他领域中的主要课题。当你研究的系统——环境——是一个无法直接建模的复杂黑箱时,强化学习是最有效的。例如,强化学习用于优化将在任意环境中使用的系统的控制策略,例如必须自主导航未知地形的机器人。
最后,有些任务只需要对模型已知或可直接观察的系统进行优化。这些只是切入口考虑的 ML 问题,更恰当的称呼是优化问题。例如,如果你必须根据当前的交通状况选择从 A 点到 B 点的最佳行驶路线,你可以使用遗传算法。如果必须优化配置不同模型的少量参数,可以尝试网格搜索。如果你必须确定一个复杂系统的边界条件,蒙特卡罗方法可能会有所帮助。如果你必须找到一个连续系统的全局最优解,那么随机梯度下降可能会达到你的目的。
优化算法常用于最大似然算法来解决问题。事实上,用于训练人工神经网络的反向传播算法使用梯度下降作为其优化器。给 k-means 或其他无监督算法的参数可以通过网格搜索自动调整,以最小化方差。我们在本书中没有深入讨论优化算法,但是您应该了解它们及其用例。
在为您的应用选择算法时,从最简单的问题开始:我需要有监督的学习还是无监督的学习?确定您是否有或可以生成培训数据;如果你不能,你将被迫使用无监督的算法。问问自己是需要判断算法输出的准确性(有监督学习),还是单纯的探索数据(无监督)。
在你确定了学习模式之后,这将把你的可用选择大致减少一半,你可以通过思考手头的具体任务或你的研究目标来进一步完善你需要的算法。
手头的任务
划分 ML 算法世界的最有效方法是考虑手头的任务,或者算法的预期结果和目的。如果您能够确定问题的目标,即您是否需要基于输入预测连续值、对数据进行分类、对文本进行分类、降维等,那么您将能够将选择减少到只有少数算法。
例如,在需要预测连续输出值的情况下,例如预测未来某个日期的服务器负载,可能需要回归算法。只有少数回归算法可供选择,本指南中的其他决策点将有助于进一步减少这些选项。
在需要检查数据和识别看起来相似的数据点的情况下,聚类算法是最合适的。您选择的具体聚类算法将取决于其他决策点,例如数据的格式或形式、关系的线性或非线性以及您可用的资源(时间、处理能力、内存等)。
如果您的算法的目的是用十几个可能的标签中的一个对数据点进行分类,那么您必须从几个分类算法中选择一个。同样,从您可用的分类算法系列中选择正确的算法将取决于数据的形式、您对准确性的要求以及强加给您的任何资源限制。
新手研究人员在这个阶段面临的一个常见问题是,项目的实际目标与单个算法的能力之间缺乏明确性。有时,问题的业务目标是抽象的,并且只是部分定义的。在这些情况下,业务目标通常只能通过使用几个单独的算法来实现。学习语言的学生可能很难确定为实现目标必须完成的具体技术步骤。
一个说明性的例子是编写分析图像并返回图像内容的自然语言描述的应用的业务目标。例如,当上传穿过公园的路径图片时,目标可能是将文本返回到背景为树木的路径上的公园长椅和垃圾桶。关注项目的单一业务目标并假设单个业务目标映射到单个算法是很容易的。
然而,这个例子至少需要两三个 ML 算法。首先,卷积神经网络必须能够识别图像中的物体。然后,另一种算法必须能够确定对象之间的空间关系。最后,NLP 或 ML 算法必须能够获取前两种算法的输出,并根据这些信息组成自然语言表示。
理解业务目标并将其转化为具体技术步骤的能力需要时间和经验来发展。您必须能够解析业务目标并向后工作,以便将其分解为各个子任务。一旦确定了子任务,确定哪种算法最适合每个子任务就成了这个决策过程中的一个简单练习。我们将很快讨论合成算法的主题,但目前重要的一点是,一些业务目标将需要多种 ML 算法。
在某些情况下,手头的任务会将你的选择缩小到只有一个算法。例如,图像中的目标检测最好通过美国有线电视新闻网来实现。当然,有许多不同的专门的 CNNs 子类型可以执行对象检测(RCNN、快速 RCNN、遮罩 RCNN 等),但在这种情况下,我们能够将竞争范围缩小到只有 CNNs。
在其他情况下,手头的任务可以通过几种或多种算法来完成,在这种情况下,您必须使用额外的决策点来选择最适合您的应用的决策点。例如,情感分析可以通过许多算法来实现。朴素贝叶斯分类器、最大熵模型、随机森林和人工神经网络都可以解决情感分析问题。
您可能还需要编写多种算法,以便为您的情感分析器实现最佳精度。因此,决定使用哪种方法不仅取决于手头的任务,还取决于您的合成中其他算法使用的数据的形式和格式。并不是每一种算法都与所有其他算法兼容,因此表单和格式决策点实际上是递归的,您需要将其应用于您在追求业务目标时确定的每一个子任务。
格式、形式、输入和输出
我一直描述的数据格式和形式封装了几个概念。最表面上,数据的格式与应用的输入和输出的特定数据类型(例如,整数、连续数字/浮点数、文本和离散类别)相关。数据的形式封装了数据结构和问题或解决方案空间的整体形状之间的关系。这些因素可以帮助您选择合适的算法,即使手头的任务已经为您提供了几种算法选择。
例如,在处理文本(格式)时,你必须考虑如何根据文本与问题空间和手头任务的关系来处理文本;我称之为数据的形式。过滤垃圾邮件时,通常不需要映射单个单词之间的关系。当分析文本的情感时,可能确实有必要映射单词之间的一些关系(例如,处理否定或其他语言修饰语),这将需要额外的维度。当为了构建知识图而解析文本时,您不仅需要仔细映射单个单词之间的关系,还需要映射它们的概念意义,这需要更高的维度。
在这些示例中,数据的格式是相同的——所有三个示例都处理文本——但是形式不同。问题空间的形状不同。垃圾邮件过滤器具有更简单的问题空间,具有更低的维数和线性可分的关系;每个单词都被独立对待。情感分析器具有不同的形式,需要在问题空间中增加一些维度,以便对一些单词之间的关系进行编码,但不一定是所有单词之间的所有关系。知识图问题需要一个高维空间,单词之间复杂的语义和空间关系必须映射到这个空间中。
在这些文本分析案例中,你可以经常问自己一系列简单的问题,帮助你缩小正确算法的范围:每个单词可以独立对待吗?我们是否需要考虑词语被其他词语修饰(像对不像,或者好对很好)?我们是否需要维护相隔很远的单词之间的关系(例如,维基百科的一篇文章在第一段中介绍了一个主题,但在许多段之后继续引用该主题)?
您跟踪的每个关系都会给问题空间增加一个维度级别,因此您必须选择一个能够在问题维度中有效工作的算法。在诸如知识图问题的高维问题上使用诸如朴素贝叶斯的低维算法不会产生好的结果;这类似于一个人一生都生活在三维空间中,试图想象物理学中超弦理论的 10 维空间。
相反,像长短期记忆 ( LSTM ) RNN 这样的高维算法可以解决垃圾邮件过滤等低维问题,但它也有代价:训练高维算法所需的时间和资源。他们与问题的难度不相称。贝叶斯分类器可以在几十秒钟内对数百万个文档进行训练,但 LSTM RNN 分类器可能需要几个小时的训练才能完成相同的任务,并且评估数据点的速度要慢一个数量级。即便如此,也不能保证 LSTM·RNN 在准确性方面会优于贝叶斯分类器。
使用数字数据时,还必须考虑形式和维度。与统计分析相比,时间序列分析需要一个额外的维度,以便除了获取数据的值之外,还获取数据的平凡性。这类似于诸如朴素贝叶斯之类的单词包文本算法与诸如 LSTM RNN 之类的保持文本顺序的算法之间的区别。
最后,数据的结构格式可能是一个考虑因素,尽管格式通常可以成功地转换成更易处理的格式。在第 10 章、实践中的自然语言处理中,我们讨论了 Word2vec 单词嵌入算法,该算法将文本转换为数字向量,以便它们可以用作神经网络(需要数字输入)的输入。格式转换实际上使我们的决策过程更加困难,因为它允许我们从更广泛的算法中进行选择。使用 Word2vec 意味着我们可以使用文本作为通常不接受文本的算法的输入,因此给了我们更多的选择。
另一种常见的格式转换是连续数值的量化或分组。例如,范围从 0–10 的连续数值可以量化为三个桶:小、中、大。这种转换允许我们在只处理离散值或类别的算法中使用连续值数据。
您还应该考虑算法要求的输出形式和格式。在分类任务中,分类器的标称输出将是描述输入的离散标签。但并不是所有的分类器都是平等产生的。决策树分类器将产生一个标签作为其输出,而贝叶斯分类器将产生所有可能标签的概率作为其输出。在这两种情况下,名义输出是一个可能的标签,但贝叶斯分类器也返回其猜测的置信度以及所有可能猜测的概率分布。在一些任务中,你唯一需要从算法中得到的是一个单一的标签;在其他情况下,概率分布是有用的,甚至是必需的。
算法输出的形式与模型的数学机制密切相关。这意味着,即使没有对算法本身的深刻理解,您也可以通过查看模型输出的形式来评估模型的数学属性。如果一个分类器返回概率作为其输出的一部分,那么它很可能是一个概率分类器,可以用于您怀疑非确定性方法比确定性方法更有效的任务。
类似地,如果一个算法返回语义有序的输出(与无序的输出相反),这是算法本身建模和记住某种形式的排序的线索。即使您的应用不直接要求有序输出,您仍然可以选择这种算法,因为您认识到数据的形式包含嵌入在数据的序数中的信息。另一方面,如果你知道你的数据的有序性不包含任何相关信息,那么一个返回有序输出的算法(因此将有序性建模为一个维度)可能会被过度扼杀。
如果此时您还有一些算法可供选择,那么磨练最佳算法的最后一步将是考虑您可用的资源,并根据您对准确性和速度的要求来平衡它们。
可利用的资源
通常情况下,从一系列算法选项中没有明显的赢家。例如,在情绪分析问题中,有几种可能的方法,通常不清楚应该采取哪种方法。您可以从带有嵌入式否定的朴素贝叶斯分类器、使用二元模型的朴素贝叶斯分类器、LSTM RNN、最大熵模型和其他几种技术中进行选择。
如果格式和表单决策点在这里对您没有帮助,例如,如果您不需要概率分类器,您可以根据可用资源和性能目标做出决定。贝叶斯分类器是轻量级的,具有快速的训练时间、非常快的评估时间、小的内存占用以及相对小的存储和 CPU 需求。
另一方面,LSTM·RNN 模型是一个复杂的模型,需要很长时间来训练,评估时间适中,对中央处理器/图形处理器的要求很高,尤其是在训练期间,并且比贝叶斯分类器对内存和存储的要求更高。
如果没有其他因素为您提供如何选择算法的明确指导,您可以根据您或您的应用用户可用的资源(CPU、GPU、内存、存储或时间)做出决定。在这种情况下,几乎总会有一个取舍;更复杂的模型通常比简单的模型更精确。当然,这并不总是正确的,因为朴素贝叶斯分类器始终优于其他垃圾邮件过滤方法;但这是因为垃圾邮件检测问题空间的形式和维度。
在某些情况下,您的申请的限制因素将是培训或评估时间。要求在 1 毫秒或更短时间内进行评估的应用可能不是人工神经网络的合适用例,而允许 50 毫秒评估的应用要灵活得多。
在其他情况下,限制因素或可用资源是算法所需的精度。如果您认为不正确的预测是一种资源消耗形式,您可能能够确定算法所需精度的下限。ML 的世界和高性能运动的世界没有太大的不同,金牌和铜牌的差距可能只是几分之一秒的事情。
ML 算法也是如此:针对特定问题的最先进的算法可能有 94%的准确率,而更普通的算法可能有 90%的准确率。如果错误预测的成本足够高,那么这四个百分点的差异可能是你选择哪种算法以及你在这个问题上投入多少时间和精力的决定因素。另一方面,如果错误预测的成本很低,那么根据实现它所需的资源、时间和精力,更常见的算法可能是您的最佳选择。
如果你仔细考虑这四个决策点——学习的模式、手头的任务、数据的格式和形式,以及你可以利用的资源——你通常会发现,最好的算法显然会脱颖而出。情况不会一直如此;有时你会被迫根据你最熟悉的算法和流程做出判断。
有时候,在选择了算法之后,你会发现你的结果是不可接受的。立即扔掉你的算法并选择一个新的算法可能很有诱惑力,但是这里要小心,因为通常很难区分算法的错误选择和算法的错误配置。因此,当系统出现问题时,您必须准备好调试系统。
当它出错时
ML 中有各种各样可能的不良结果。这些模型可以是简单地不起作用的模型,也可以是起作用但在过程中使用不必要的资源的模型。负面结果可能由许多因素造成,例如选择不适当的算法、不良的特征工程、不适当的训练技术、预处理不足或对结果的误解。
在最好的情况下,即负面结果的最好情况下,问题会在实施的早期阶段变得明显。您可能会发现,在培训和验证阶段,您的人工神经网络的准确率从未超过 50%。在某些情况下,一个人工神经网络将很快稳定在一个值,如 25%的准确性后,只有几个训练时期,永远不会改善。
以这种方式在训练中变得明显的问题最容易调试。总的来说,这些都表明你为你的问题选择了错误的算法。就人工神经网络而言,它们很少是错误的选择,因为它们非常灵活,这种类型的平台可能表明您设计了错误的网络拓扑(层太少或隐藏神经元太少),或者为您的层选择了错误的激活函数(例如,当 sigmoid 更合适时使用 tanh)。在这种情况下,您做出了使用人工神经网络的合理决定,但配置不正确。
有时这个问题更难调试,尤其是当你没有从第一性原理编写算法的时候。在第 5 章、分类算法中,我向您介绍了随机森林分类器,我们发现对于我们的示例问题,它的准确性低得不可接受。使用随机森林的决定仅仅是一个糟糕的决定吗?还是因为参数选择不正确而阻碍了合理的决策?在那种情况下,答案是也不是。我对使用随机森林的选择以及参数选择很有信心,所以我用不同的编程语言通过随机森林库运行相同的数据和参数,得到的结果更符合我的预期。这指出了第三种可能的可能性:我选择演示的库中随机森林算法的具体实现肯定有问题。
不幸的是,如果没有经验带来的信心,很容易认为随机森林只是解决这个问题的一个糟糕的算法选择。这就是为什么我鼓励实践和游戏,理论和实验。如果没有彻底理解随机森林背后的概念,我可能会被骗相信算法本身是罪魁祸首,如果没有实验的倾向,我可能永远不会确认算法和参数确实是合适的。
当事情出错时,我的建议是回到第一原则。回到工程设计过程的最开始,依次考虑每一步。算法的选择合适吗?数据的形式和格式是否合适?算法是否能够充分解决问题空间的维数问题?我是否对算法进行了适当的训练?问自己这些问题,直到你确定了一个你最没有信心的问题,然后开始探索和实验。
在我看来,ML 最糟糕的情况是算法无声地失败。在这些情况下,一个算法成功地完成了它的训练和验证,被部署到一个真实的应用中,但是从真实世界的数据中产生了很差的结果。该算法不能概括其知识,只能很好地记忆训练数据以通过验证。静默失败的发生是因为算法在验证过程中表现出良好的准确性,从而让你产生一种虚假的安全感。然后,您将算法部署到生产中,信任它的结果,却发现一个月或一年后,算法表现严重不佳,做出了影响真实人员或流程的糟糕决策,现在需要纠正。
因此,您必须始终监控算法在真实工作负载下的性能。您应该定期抽查算法的工作,以确保其真实世界的准确性与您在训练中观察到的相当。如果一个算法在训练过程中显示出 85%的准确性,并且对 20 个数据点的生产抽样检查产生 15 个正确答案(75%),那么该算法可能如预期的那样工作。但是,如果您发现只有 50%的真实评估是正确的,您应该扩展对算法的审核,并根据从更真实的数据点提取的更新的训练集对其进行潜在的重新训练。
这些无声的失败往往是由于过度训练或训练不良造成的。即使您已经遵循了培训的最佳实践,并将预先标记的数据集分成单独的培训和验证集,仍然有可能过度训练和不足概括。在某些情况下,源数据本身会受到指责。例如,如果您的整个培训和验证集是根据大学生的调查结果生成的,则该模型可能无法准确评估老年人的调查结果。在这种情况下,即使您已经在独立的数据集上验证了您的模型,训练和验证数据本身也不是真实世界条件的适当随机抽样。在实际使用中,您将看到比验证结果更低的准确性,因为您用来训练模型的源数据已经被选择偏差所损害。
类似的事情也可能发生在其他类型的分类任务中。基于电影评论训练的情感分析算法可能不能推广到餐馆评论;行话和语气——数据的形式——在这两个数据源之间可能是不同的。
*如果你的模型表现不佳,你真的不知道下一步该做什么,那就转向实验和探索。用相同的训练集测试不同的算法并比较结果。尝试生成一个新的训练集,要么更宽,要么更窄。尝试不同的标记化技术、不同的预处理技术,甚至同一算法的不同实现。在网上搜索,看看其他研究人员如何处理类似的问题,最重要的是,永远不要放弃。挫折是学习过程的一部分。
组合模型
有时候,为了实现一个单一的业务目标,你需要结合多种算法和模型,并协同使用它们来解决一个单一的问题。实现这一点有两种广泛的方法:串联组合模型和并联组合模型。
在一系列模型的组合中,第一个模型的输出成为第二个模型的输入。一个非常简单的例子是在分类器人工神经网络之前使用的 Word2vec 单词嵌入算法。Word2vec 算法本身就是一个人工神经网络,其输出被用作另一个人工神经网络的输入。在这种情况下,Word2vec 和分类器是分开训练的,但一起评估,串联。
你也可以把一个 CNN 看成是模型的串联组合;每个层的操作(卷积、最大池化和完全连接)都有不同的目的,本质上是一个独立的模型,其输出为下一层提供输入。然而,在这种情况下,整个网络作为一个单元被评估和训练。
并行运行的模型通常被称为集合,随机森林就是一个简单的例子。在随机森林中,许多独立的决策树并行运行,它们的输出合并在一起。然而,更一般地说,不要求并行运行的模型具有相同类型的算法。例如,在分析情绪时,您可以并行运行二元模型朴素贝叶斯分类器和 LSTM RNN 分类器,并使用它们输出的加权平均值,以便产生比单独返回的结果更准确的结果。
在某些情况下,您可以组合模型,以便更好地处理异构数据。让我们想象一个商业目标,其中一个用户应该根据他们的书面内容和从他们的个人资料中得到的许多其他特征被分类到十个心理测量类别之一。也许目标是分析推特上的用户,以确定将他们放在哪个营销垂直领域:时尚达人、周末战士、体育迷等等。你可以获得的数据是他们推文历史的文本内容、他们的好友列表和内容交互,以及一些派生指标,如平均发帖频率、平均 Flesch-Kincaid 阅读难易程度、好友与关注者的比例等等。
这个问题是一个分类任务,但它是一个需要多个技术步骤才能实现的业务目标。因为输入的数据不是同质的,所以我们必须把问题分成几部分,分别求解。然后,我们将这些部分结合起来,组成一个精确而高效的 ML 系统。
首先,我们可以获取用户推文的文本内容,并通过朴素贝叶斯分类器来确定这 10 个类别中哪一个最适合该内容。分类器将返回一个概率分布,如 5%时尚达人,60%运动迷,25%周末战士。这个分类器本身可能不足以解决问题;周末战士和体育迷倾向于写类似的话题,贝叶斯分类器无法区分两者的区别,因为有太多的重叠。
幸运的是,我们可以将文本分类与其他信号结合起来,例如用户在推特上发布图像的频率,他们在周末和工作日发布推特的频率,等等。像随机森林这样可以处理异构输入数据的算法在这里会很有用。
我们可以采取的方法是使用贝叶斯分类器生成的 10 个概率,将它们与直接从用户简档数据中导出的另外 10 个特征相结合,并将 20 个特征的组合列表馈送给随机森林分类器。随机森林将学习何时信任贝叶斯分类器的输出,以及何时更加依赖其他信号。例如,在贝叶斯分类器难以辨别体育迷和周末战士的情况下,随机森林可能能够基于额外的上下文来区分两者。
此外,随机森林将能够学习何时信任贝叶斯概率,何时不信任。当贝叶斯分类器以 90%的概率判断时尚达人时,随机森林可能会知道它通常是正确的。同样,它可能会了解到,即使在高概率下,贝叶斯分类器在判断周末战士时也是不可靠的,而且在很大一部分时间里,周末战士可能会被误认为是体育迷。
从直观的角度来看,对于这个用例,随机森林是一个很好的选择算法。因为它基于决策树,所以它能够基于特定属性的值创建决策点。随机森林可能会生成如下逻辑结构:
- 如果贝叶斯 _ 时尚达人 _ 概率 > 85%,返回时尚达人
- 如果贝叶斯 _ 周末 _ 战士 _ 概率 > 99%,返回周末战士
- 如果贝氏 _ 周末 _ 战士 _ 概率T2【99% 】,继续:
- 如果推特 _ 周末 _ 帖子 _ 频率 > 70%,返回周末战士
- 否则,如果贝叶斯 _ 运动 _ 瘾君子 _ 概率 > 60%,返还运动瘾君子
在这个简化的例子中,随机森林已经学会相信贝叶斯分类器对时尚达人类别的判断。然而,如果概率很高,森林只会相信贝叶斯分类器对周末战士的判断。如果贝叶斯分类器对周末战士分类不太确定,那么随机森林可以将用户在周末的推文频率作为用于区分周末战士和体育迷的单独信号。
如果经过深思熟虑的设计,像这样的组合模型可以成为非常强大的工具,能够处理许多情况。这种技术允许您将一个业务目标分解成多个技术目标,为每种类型的数据或分类选择最佳算法,并将结果组合成一个连贯而自信的响应。
摘要
本书的大部分内容都集中在用于解决特定问题的 ML 算法的实现上。然而,算法的实现只是软件工程设计过程的一部分。工程师还必须熟练地为她的问题选择正确的算法或系统,并能够在问题出现时进行调试。
在本章中,您学习了一个简单的四点决策过程,它可以帮助您为特定的用例选择最佳算法。使用消除过程,您可以通过基于每个决策点取消算法的资格来逐步减少您的选项。最明显的是,当你面临监督学习问题时,你不应该使用无监督算法。您可以通过考虑手头的特定任务或业务目标、输入和输出数据的格式和形式或问题空间,并对您可用的资源进行成本效益分析,来进一步消除选项。
我们还讨论了在现实世界中使用 ML 模型时可能出现的一些问题,例如由不良的训练实践导致的静默失败的阴险问题,或者由不适当的算法选择或网络拓扑导致的更明显的失败。
最后,我们讨论了以串行或并行方式组合模型的想法,以便利用算法的特殊优势,尤其是在呈现异构数据时。我展示了一个随机森林分类器的例子,它使用直接信号和单独贝叶斯分类器的输出作为输入;这种方法有助于消除来自贝叶斯分类器的混淆信号,贝叶斯分类器本身可能无法准确解析重叠的类别。
我希望我能教你更多的东西。这本书只是一个概述,对 ML 的核心概念和算法的旋风式介绍。我向你们展示的每一个算法都是它自己的研究领域,比仅仅用 10 到 20 页就能教授的内容要深入得多。
我不指望这本书能解决你所有的 ML 问题,你也不应该。然而,我希望这本书给了你一个坚实的理解基础,在此基础上你可以建立你未来的教育。在像 ML 这样既深奥又充满行话的领域,最大的挑战往往是知道从哪里开始。希望这些页面中的信息已经给了你足够的理解和清晰,能够独自在更广阔的 ML 世界中导航。
当你读完最后几页时,我并不指望你能流利地使用语言,但希望你现在会说话。虽然你可能还不能自己设计奇特的人工神经网络拓扑,但你至少应该熟悉核心概念,能够与其他研究人员交流,并找到自己的资源方法,以便继续深入学习。你也可以解决许多你以前可能无法解决的问题,如果是这样的话,那么我已经实现了我的目标。
我对你有最后一个要求:如果你真的继续你的 ML 教育,特别是在 JavaScript 生态系统中,请为社区做出贡献。正如您所看到的,目前有许多高质量的 JavaScript ML 库和工具可用,但在生态系统中也存在重大差距。一些算法和技术在 JavaScript 世界中还不存在,我鼓励你寻找机会尽可能地填补这些空白,无论是通过贡献开源软件还是编写教育材料供他人使用。
感谢您花时间阅读这篇用 JavaScript 编写的机器学习的简单介绍——我希望它对您有很好的帮助。*
版权属于:月萌API www.moonapi.com,转载请注明出处