🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎
📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】 深度学习【DL】
🖍foreword
✔说明⇢本人讲解主要包括Python、机器学习(ML)、深度学习(DL)、自然语言处理(NLP)等内容。
如果你对这个系列感兴趣的话,可以关注订阅哟👋
文章目录
衡量成功
经营业绩
模型性能
新鲜度和分销转移
速度
估计范围和挑战
利用领域专业知识
向专家学习
检查数据
站在巨人的肩膀上
开放数据
开源代码
把两者结合起来
ML 编辑器规划
编辑的初步计划
总是从一个简单的模型开始
定期取得进展:从简单开始
从一个简单的管道开始
训练
推理
ML 编辑器的管道
结论
在在上一章中,我们介绍了如何估计 ML 是否必要,找到最适合使用它的地方,以及将产品目标转换为最合适的 ML 框架。在本章中,我们将介绍如何使用指标来跟踪 ML 和产品进度,并比较不同的 ML 实现。然后,我们将确定构建基线和规划建模迭代的方法。
我有不幸的是,由于产品指标和模型指标之间的不一致,许多 ML 项目从一开始就注定要失败。更多的项目失败是因为产生了对产品没有帮助的好模型,而不是由于建模困难。这就是为什么我想专门用一章来介绍指标和规划。
我们将介绍一些技巧,以利用现有资源和问题的限制来构建可操作的计划,这将大大简化任何 ML 项目。
让我们从更详细地定义性能指标开始。
衡量成功
什么时候谈到机器学习,我们建立的第一个模型应该是最简单的模型,可以解决产品的需求,因为生成和分析结果是机器学习取得进展的最快方式。在上一章中,我们介绍了增加 ML 编辑器复杂性的三种潜在方法。在这里提醒一下:
基线;基于领域知识设计启发式
我们可以从简单地自己定义规则开始,基于对什么是写得好的内容的先验知识。我们将测试这些规则,看看它们是否有助于区分写得好的文本和写得不好的文本。
简单模型;将文本分类为好或坏,并使用分类器生成推荐
然后我们可以训练一个简单的模型来区分好问题和坏问题。如果模型表现良好,我们就可以检查它,看看它发现哪些特征可以高度预测好问题,并将这些特征用作建议。
复杂模型;训练从坏文本到好文本的端到端模型
这是最复杂的方法,无论是在模型还是数据方面,但如果我们有资源来收集训练数据并构建和维护复杂模型,我们就可以直接解决产品需求。
所有这些方法都是不同的,并且可能会随着我们从原型中学到更多而不断发展,但是在处理 ML 时,您应该定义一组通用的指标来比较建模管道的成功与否。
笔记
你并不总是需要机器学习
你可能已经注意到基线方法根本不依赖 ML。正如我们在第 1 章中讨论的那样,某些功能不需要机器学习。它重要的是要认识到,即使是可以从 ML 中获益的功能,通常也可以在其第一个版本中简单地使用启发式方法。一旦使用了启发式方法,您甚至可能会意识到您根本不需要机器学习。
构建启发式通常也是构建功能的最快方法。构建并使用该功能后,您将更清楚地了解用户的需求。这将使您能够评估您是否需要 ML,并选择一种建模方法。
在大多数情况下,从不使用 ML 开始是构建 ML 产品的最快方法。
为此,我们将涵盖对任何 ML 产品的实用性有重大影响的四类性能:业务指标、模型指标、新鲜度和速度。清楚地定义这些指标将使我们能够准确地衡量每次迭代的性能。
经营业绩
我们已经谈到了从明确的产品或功能目标开始的重要性。一旦这个目标明确,就应该定义一个指标来判断其成功与否。该指标应与任何模型指标分开,并且仅反映产品的成功。产品指标可能像某个功能吸引的用户数量一样简单,也可能更细微,例如我们提供的推荐的点击率 (CTR) 。
产品指标最终是唯一重要的指标,因为它们代表了您的产品或功能的目标。所有其他指标都应用作改进产品指标的工具。然而,产品指标不需要是唯一的。尽管大多数项目倾向于专注于改进一个产品指标,它们的影响通常根据多个指标来衡量,包括护栏指标,不应下降到给定点以下的指标。例如,一个 ML 项目可以旨在增加给定指标(例如点击率),同时保持其他指标稳定,例如平均用户会话时长。
为了在 ML Editor 中,我们将选择一个指标来衡量推荐的有用性。例如,我们可以使用用户遵循建议的次数比例。为了计算这样的指标,ML 编辑器的界面应该捕获用户是否赞成建议,例如,将其覆盖在输入上方并使其可点击。
我们已经看到,每种产品都适用于许多潜在的 ML 方法。要衡量 ML 方法的有效性,您应该跟踪模型性能。
模型性能
为了对于大多数在线产品,决定模型成功与否的最终产品指标是使用模型输出的访问者占所有可从中受益的访问者的比例。在一个情况下例如,推荐系统通常通过衡量有多少人点击了推荐产品来判断性能(有关这种方法的潜在缺陷,请参见第 8 章)。
什么时候产品仍在构建且尚未部署,因此无法衡量使用指标。为了仍然衡量进展,重要的是定义一个单独的成功指标,称为离线指标或模型指标。一个好的离线指标应该可以在不向用户公开模型的情况下进行评估,并尽可能与产品指标和目标相关联。
不同的建模方法使用不同的模型指标,改变方法可以更容易地达到足以实现产品目标的建模性能水平。
例如,假设您正尝试在用户在在线零售网站上键入搜索查询时向他们提供有用的建议。您将通过衡量点击率(用户点击您提出的建议的频率)来衡量此功能的成功与否。
要生成建议,您可以构建一个模型来尝试猜测用户将键入的单词,并在他们书写时向他们呈现预测的完整句子。您可以通过计算其单词级别的准确性来衡量该模型的性能,计算它预测正确的下一组单词的频率。这样的模型需要达到极高的准确度才能帮助提高产品的点击率,因为一个词的预测错误就足以让建议变得毫无用处。图 2-1的左侧勾勒出了这种方法。
图 2-1。稍微改变产品可以使建模任务更容易
如您所见,对模型和产品之间的交互进行微小的更改就可以使用更直接的建模方法并更可靠地交付结果。以下是更新应用程序以简化建模任务的其他几个示例:
-
更改界面,以便在低于置信度阈值时忽略模型结果。例如,当构建一个模型来自动完成用户输入的句子时,该模型可能只在句子的一个子集上表现良好。如果模型的置信度得分超过 90%,我们可以实现逻辑以仅向用户显示建议。
-
除了模型的最高预测之外,还提供一些其他预测或启发式方法。例如,大多数网站会显示一个模型建议的多个推荐。显示五个候选项目而不是一个候选项目使得建议更有可能对用户有用,即使模型相同也是如此。
-
向用户传达模型仍处于试验阶段的信息,并让他们有机会提供反馈。当自动检测非用户母语的语言并为他们翻译时,网站通常会为用户添加一个按钮,让他们知道翻译是否准确有用。
甚至当建模方法适用于某个问题时,有时值得生成与产品性能更好相关的其他模型指标。
我曾经与一位数据科学家合作,他建立了一个模型,可以从简单网站的手绘草图生成 HTML(请参阅他的帖子“使用深度学习进行自动化前端开发”)。该模型的优化指标使用交叉熵损失将每个预测的 HTML 标记与正确的标记进行比较。然而,该产品的目标是让生成的 HTML 生成一个看起来像输入草图的网站,而不管标记的顺序如何。
交叉熵不考虑对齐:如果模型生成正确的 HTML 序列,除了开始时有一个额外的标记,则所有标记都将相对于目标移动 1。尽管产生了近乎理想的结果,但这样的输出将导致非常高的损失值。这意味着在尝试评估模型的有用性时,我们应该超越其优化指标。在在这个例子中,使用BLEU 分数可以更好地衡量生成的 HTML 和理想输出之间的相似性。
最后,一个设计产品时应考虑到模型性能的合理假设。如果一个产品依赖于一个完美的模型来使用,它很可能会产生不准确甚至危险的结果。
例如,如果您正在构建一个模型,让您可以给药丸拍照并告诉患者它的类型和剂量,那么模型可能具有但仍然有用的最差准确度是多少?如果使用当前方法难以达到此准确性要求,您是否可以重新设计您的产品以确保用户得到良好的服务并且不会因它可能产生的预测错误而面临风险?
在我们的例子中,我们想要构建的产品将提供写作建议。大多数 ML 模型都有他们擅长的某些输入和他们将难以处理的某些输入。从产品的角度来看,如果我们无法提供帮助——我们需要确保我们不会受到伤害——我们希望限制我们输出比输入更糟糕的结果的时间。我们如何在模型指标中表达这一点?
假设我们建立了一个分类模型,试图根据收到的赞成票数来预测一个问题是否好。分类器的精度将定义为真正好的问题在它预测为好的问题中所占的比例。另一方面,它的召回率是它在数据集中所有好问题中预测为好问题的比例。
我们通过在代表性验证集上查看模型的输出来衡量这些指标。我们将在“评估你的模型:超越准确性”中深入探讨这意味着什么,但现在,将验证集视为一组数据,这些数据是从训练中提取出来的,用于估计你的模型在未见数据上的表现。
初始模型性能很重要,但模型在面对不断变化的用户行为时保持有用的能力也很重要。在给定数据集上训练的模型将在类似数据上表现良好,但我们如何知道我们是否需要更新数据集?
新鲜度和分销转移
监督模型从学习输入特征和预测目标之间的相关性中汲取预测能力。这意味着大多数模型需要暴露于与给定输入相似的训练数据才能在其上表现良好。一个被训练为仅使用男性照片从照片中预测用户年龄的模型在女性照片上表现不佳。但是,即使模型是在足够的数据集上训练的,许多问题的数据分布也会随着时间的推移而变化。什么时候数据的分布发生变化,模型也经常需要改变以保持相同的性能水平。
让我们想象一下,在注意到下雨对旧金山交通的影响后,您构建了一个模型来根据过去一周的降雨量预测交通状况。如果您在 10 月使用过去 3 个月的数据构建模型,则您的模型可能是在日降水量低于一英寸的数据上训练的。有关此类分布的示例,请参见图 2-2 。随着冬季的临近,平均降水量将接近 3 英寸,这比模型在训练期间接触到的任何降水量都高,如图 2-2 所示。如果模型没有根据更新的数据进行训练,它将难以保持良好的表现。
图 2-2。改变分布
一般来说,只要模型与它在训练期间接触到的数据足够相似,它就可以在以前从未见过的数据上表现良好。
并非所有问题都具有相同的新鲜度要求。古代语言的翻译服务可以期望他们操作的数据保持相对稳定,而搜索引擎需要建立这样的假设,即它们需要随着用户改变搜索习惯而快速发展。
根据您的业务问题,您应该考虑保持模型新鲜的难度。您需要多久重新训练一次模型,每次我们这样做要花多少钱?
为了ML editor,我们想象“结构良好的英文散文”的定义变化的节奏相对较低,可能在一年的数量级。但是,如果我们针对特定领域,则新鲜度要求会发生变化。例如,与音乐趋势问题的最佳措辞相比,提出数学问题的正确方式的变化要慢得多。由于我们估计模型每年都需要重新训练,因此我们每年都需要新数据进行训练。
我们的基线和简单模型都可以从未配对的数据中学习,这使得数据收集过程更简单(我们只需要找到去年的新问题)。复杂的模型需要成对的数据,这意味着我们每年都必须找到相同句子的例子,以“好”和“坏”的方式说。这意味着满足我们定义的新鲜度要求对于需要配对数据的模型来说要困难得多,因为获取更新的数据集更耗时。
对于大多数应用程序,流行度可以帮助减轻数据收集需求。如果我们的问题短语服务广为传播,我们可以为用户添加一个按钮来评价输出的质量。然后我们可以收集用户过去的输入以及模型的预测和相关的用户评级,并将它们用作训练集。
然而,要使应用程序流行,它应该是有用的。通常,这需要及时响应用户请求。因此,模型可以提供预测的速度是一个需要考虑的重要因素。
速度
在我们的例子中,我们将考虑两种可能的方式来提供建议:通过一个提交框,用户可以在其中输入、单击“提交”并获得结果,或者通过在用户每次输入新字母时动态更新。虽然我们可能希望支持后者,因为我们能够使该工具更具交互性,但它需要模型执行得更快。
我们可以想象,用户在单击提交按钮后会等待几秒钟才能得到结果,但是对于一个在用户编辑文本时运行的模型,它需要在一秒钟内运行。最强大的模型需要更长的时间来处理数据,因此当我们迭代模型时,我们会牢记这一要求。我们使用的任何模型都应该能够在两秒内通过整个管道处理一个示例。
随着模型变得越来越复杂,模型推理运行时间也会增加。即使在每个单独的数据点都可以是相对较小的数据的领域,例如 NLP(与实时视频上的任务相反),这种差异也很显着。例如,在本书案例研究中使用的文本数据上,LSTM 比随机森林慢大约三倍(LSTM 大约 22 毫秒,而随机森林只需要 7 毫秒)。在单个数据点上,这种差异很小,但是当需要一次对数万个示例进行推理时,它们会很快加起来。
对于推理调用将与多个网络调用或数据库查询相关联的复杂应用程序,与应用程序逻辑的其余部分相比,模型执行时间可能会变得更短。在这些情况下,所述模型的速度不再是问题。
根据您的问题,您还可以考虑其他类别,例如硬件限制、开发时间和可维护性。在选择模型之前了解您的需求非常重要,这样您才能确保以知情的方式选择所述模型。
确定需求和相关指标后,就可以开始制定计划了。这需要估计未来的挑战。在下一节中,我将介绍如何利用先前的工作并探索数据集来决定接下来要构建什么。
估计范围和挑战
到目前为止,我们介绍的工具将帮助我们确定一个项目是否值得处理,并衡量我们目前的表现。合乎逻辑的下一步是草拟攻击计划,以估计项目的范围和持续时间并预测潜在的障碍。
在 ML 中,成功通常需要很好地理解任务的上下文、获取良好的数据集并构建适当的模型。
我们将在下一节中介绍这些类别中的每一个。
利用领域专业知识
这我们可以从最简单的模型开始:启发式:基于对问题和数据的了解的良好经验法则。设计启发式方法的最佳方法是查看专家当前正在做什么。大多数实际应用并不完全新颖。人们目前如何解决您要解决的问题?
这设计启发式方法的第二个最佳方法是查看您的数据。根据您的数据集,如果您手动完成此任务,您将如何解决?
为了确定好的启发式方法,我建议要么向该领域的专家学习,要么熟悉数据。接下来我将更详细地描述两者。
向专家学习
对于许多我们可能想要自动化的领域,向该领域的专家学习可以为我们节省几十个小时的工作时间。例如,如果我们试图为工厂设备建立一个预测性维护系统,我们应该首先联系工厂经理,了解我们可以合理地做出哪些假设。这可能包括了解当前执行维护的频率,哪些症状通常表明机器很快需要维护,以及有关维护的法律要求。
当然,有些例子可能很难找到领域专家——例如新用例的专有数据,例如预测独特网站功能的使用情况。然而,在这些情况下,我们经常可以找到不得不解决类似问题并从他们的经验中学习的专业人士。
这将使我们能够了解我们可以利用的有用特性,找到我们应该避免的陷阱,最重要的是防止我们重新发明许多数据科学家得到坏名声的轮子。
检查数据
正如“Monica Rogati:如何选择机器学习项目并确定其优先级”中的 Monica Rogati和“Robert Munro:您如何查找、标记和利用数据?”中的 Robert Munro 一样。提一下,在我们开始建模之前查看数据是关键。
探索性数据分析 (EDA) 是可视化和探索数据集的过程,通常是为了获得对给定业务问题的直觉。EDA 是构建任何数据产品的关键部分。除了 EDA 之外,以您希望模型的方式单独标记示例也很重要。这样做有助于验证假设并确认您选择的模型可以适当地利用您的数据集。
EDA 过程将使您了解数据中的趋势,并且自己对其进行标记将迫使您构建一组启发式方法来解决您的问题。完成前面两个步骤后,您应该更清楚地了解哪种模型最适合您,以及我们可能需要的任何其他数据收集和标记策略。
下一个合乎逻辑的步骤是看看其他人如何解决类似的建模问题。
站在巨人的肩膀上
有人们解决了类似的问题?如果是这样,开始的最佳方式是理解和重现现有结果。寻找具有相似模型或相似数据集或两者的公共实现。
理想情况下,这将涉及寻找开源代码和可用数据集,但这些并不总是很容易获得,尤其是对于非常具体的产品。尽管如此,开始 ML 项目的最快方法是重现现有结果,然后在其基础上构建。
在像 ML 这样动人的领域,站在巨人的肩膀上至关重要。
笔记
如果您计划在您的工作中使用开源代码或数据集,请确保您被允许这样做。大多数存储库和数据集将包含一个定义可接受用法的许可证。此外,注明您最终使用的任何来源,最好是参考他们的原始作品。
在向项目投入大量资源之前建立令人信服的概念证明通常是个好主意。例如,在花费时间和金钱标记数据之前,我们需要说服自己,我们可以构建一个模型,该模型将从所述数据中学习。
那么,我们如何找到一种有效的启动方式呢?与我们将在本书中涵盖的大多数主题一样,这包括两个主要部分:数据和代码。
开放数据
您可能并不总是能够找到符合您需求的数据集,但您通常可以找到一个性质足够相似以提供帮助的数据集。在这种情况下,类似的数据集意味着什么?将 ML 模型视为将输入映射到输出在这里很有帮助。考虑到这一点,相似的数据集仅意味着具有相似输入和输出类型(但不一定是域)的数据集。
通常,使用相似输入和输出的模型可以应用于完全不同的环境。图 2-3的左侧是两个模型,它们都从图像输入中预测文本序列。一个用于描述照片,而另一个用于从该网站的屏幕截图生成网站的 HTML 代码。类似地,图 2-3的右侧显示了一个根据英语文本描述预测食物类型的模型,以及另一个根据乐谱转录预测音乐流派的模型。
图 2-3。具有相似输入和输出的不同模型
例如,假设我们正在尝试构建一个模型来预测新闻文章的收视率,但正在努力寻找新闻文章和相关视图计数的数据集。我们可以从可公开访问的维基百科页面流量统计数据集开始,并在其上训练预测模型。如果我们对它的表现感到满意,就有理由相信给定新闻文章的观点数据集,我们的模型可以表现得相当好。找到相似的数据集可以帮助证明方法的有效性,并使花费资源获取数据更加合理。
在处理专有数据时,此方法也适用。通常,预测任务所需的数据集可能不容易访问。在某些情况下,当前未收集您需要的数据。在这种情况下,构建一个在类似数据集上表现良好的模型通常是说服利益相关者构建一个新的数据收集管道或促进对现有数据收集管道的访问的最佳方式。
什么时候对于可公开访问的数据,新的数据源和集合会定期出现。以下是我发现有用的一些内容:
-
Internet 档案维护着一组数据集,包括网站数据、视频和书籍。
-
subreddit r/datasets专门用于共享数据集。
-
Kaggle 的数据集页面提供了各种领域的大量选择。
-
UCI 机器学习存储库是 ML 数据集的巨大资源。
-
Google 的数据集搜索涵盖了可访问数据集的大量可搜索索引。
-
Common Crawl从网络上抓取和归档数据,并公开结果。
-
维基百科也有一个不断发展的 ML 研究数据集列表。
对于大多数用例,这些来源之一将为您提供与您需要的数据集非常相似的数据集。
训练此切向数据集上的模型将使您能够快速制作原型并验证您的结果。在某些情况下,您甚至可以在切向数据集上训练模型并将其部分性能转移到您的最终数据集(第 4 章对此有更多介绍)。
一旦您知道要从哪个数据集开始,就该将注意力转移到模型上了。虽然简单地从头开始构建自己的管道可能很诱人,但至少观察其他人所做的事情通常是值得的。
开源代码
搜索中对于现有代码可以实现两个高级目标。它让我们看到其他人在进行类似建模时面临哪些挑战,并揭示给定数据集的潜在问题。出于这个原因,我建议寻找解决您的产品目标的管道和使用您选择的数据集的代码。如果找到示例,第一步就是自己重现其结果。
我见过许多数据科学家试图利用他们在网上找到的 ML 代码,结果却发现他们无法将给定模型训练到作者声称的类似准确度水平。由于新方法并不总是伴随着记录完备且功能正常的代码,因此 ML 结果通常难以重现,因此应始终进行验证。
与搜索数据类似,查找相似代码库的一个好方法是将问题抽象为其输入和输出类型,并找到解决具有相似类型问题的代码库。
例如,当尝试从网站的屏幕截图生成 HTML 代码时,论文“pix2code:从图形用户界面屏幕截图生成代码”的作者 Tony Beltramelli意识到他的问题归结为将图像转换为序列. 他利用了一个更成熟领域的现有架构和最佳实践,还从图像生成了序列,即图像字幕!这使他能够在一项全新的任务上取得优异的成绩,并利用在相邻应用程序中多年的工作经验。
查看数据和代码后,您就可以继续前进了。理想情况下,此过程为您提供了一些指导,以帮助您开始工作并获得对问题更细致的看法。让我们总结一下您在寻找之前的工作后可能会遇到的情况。
把两者结合起来
正如我们刚刚讨论的那样,利用现有的开放代码和数据集有助于加快实施速度。在最坏的情况下,如果现有模型在开放数据集上都表现不佳,您现在至少知道该项目将需要大量建模和/或数据收集工作。
如果您找到了解决类似任务的现有模型并设法在最初训练的数据集上对其进行训练,那么剩下的就是使其适应您的领域。为此,我建议执行以下连续步骤:
-
找到一个类似的开源模型,最好与训练它的数据集配对,然后尝试自己重现训练结果。
-
重现结果后,找到更接近您的用例的数据集,并尝试在该数据集上训练之前的模型。
-
将数据集集成到训练代码中后,就可以使用您定义的指标来判断模型的表现并开始迭代了。
ML 编辑器规划
让我们检查常见的写作建议并为 ML 编辑器搜索候选数据集和模型。
编辑的初步计划
我们应该首先根据通用的写作指南实施启发式方法。我们将通过搜索现有的编写和编辑指南来收集这些规则,例如“最简单的方法:成为算法”中描述的指南。
我们完美的数据集将包含问题及其相关质量。首先,我们应该快速找到一个更容易获取的类似数据集。根据对该数据集的观察性能,如果需要,我们将扩展和加深我们的搜索。
社交媒体帖子和在线论坛是与质量指标相关的文本的好例子。由于大多数这些指标的存在都是为了支持有用的内容,因此它们通常包括质量指标,例如“喜欢”或“赞成票”。
Stack Exchange是一个问答社区网络,是一个流行的问答网站。在 Internet Archive上还有 Stack Exchange 的完整匿名数据转储,这是我们之前提到的数据源之一。这是一个很好的数据集。
我们可以通过使用 Stack Exchange 问题并尝试根据问题的内容预测问题的赞成票分数来构建初始模型。我们还将利用这个机会查看数据集并对其进行标记,试图找到模式。
我们想要建立的模型试图准确地对文本质量进行分类,然后提供写作建议。存在许多用于文本分类的开源模型;查看关于该主题的流行 Python ML 库 scikit-learn 教程。
一旦我们有了一个工作分类器,我们将在第 7 章介绍如何利用它来提出建议。
现在我们有了一个潜在的初始数据集,让我们过渡到模型并决定我们应该从什么开始。
总是从一个简单的模型开始
一个本章的重要内容是,构建初始模型和数据集的目的是产生信息丰富的结果,这些结果将指导进一步的建模和数据收集工作,以获得更有用的产品。
通过从一个简单的模型开始并提取 Stack Overflow 问题成功的趋势,我们可以快速衡量性能并对其进行迭代。
尝试从头开始构建完美模型的相反方法在实践中行不通。这是因为 ML 是一个迭代过程,其中取得进展的最快方法是查看模型如何失败。您的模型失败得越快,您取得的进步就越大。我们将在第 III 部分中更详细地探讨这个迭代过程。
但是,我们应该牢记每种方法的注意事项。例如,一个问题的参与度取决于更多的因素,而不仅仅是其表述的质量。帖子的上下文、发布的社区、海报的受欢迎程度、发布的时间以及初始模型会忽略的许多其他细节也非常重要。考虑到这些因素,我们将我们的数据集限制在社区的一个子集。我们的第一个模型将忽略与帖子相关的所有元数据,但如果有必要,我们会考虑合并它。
作为因此,我们的模型使用通常被称为弱标签的标签,即与所需输出仅略微相关的标签。当我们分析模型的性能时,我们将确定该标签是否包含足够的信息以使其有用。
我们有一个起点,现在我们可以决定我们将如何前进。由于建模的不可预测性,在 ML 中取得定期进展通常看起来很困难。很难提前知道给定的建模方法会在多大程度上成功。正因为如此,我想分享一些稳步前进的技巧。
定期取得进展:从简单开始
它值得重申的是,ML 中的许多挑战类似于软件中最大的挑战之一——抵制构建尚不需要的部分的冲动。许多 ML 项目之所以失败,是因为它们依赖于初始数据采集和模型构建计划,并且没有定期评估和更新该计划。由于 ML 的随机性,很难预测给定的数据集或模型能让我们走多远。
出于这个原因,至关重要的是从可以满足您的需求的最简单模型开始,构建一个包含该模型的端到端原型,并不仅根据优化指标而且根据您的产品目标来判断其性能。
从一个简单的管道开始
在绝大多数情况下,查看简单模型在初始数据集上的性能是决定下一步应该处理什么任务的最佳方法。然后,目标是对以下每个步骤重复此方法,进行易于跟踪的小增量改进,而不是尝试一次性构建完美模型。
为此,我们需要构建一个可以接收数据并返回结果的管道。对于大多数 ML 问题,实际上有两个单独的管道需要考虑。
训练
为了让您的模型能够做出准确的预测,您首先需要对其进行训练。
训练管道会摄取您想要训练的所有标记数据(对于某些任务,数据集可能非常大,以至于无法在一台机器上容纳)并将其传递给模型。然后它在数据集上训练所述模型,直到达到令人满意的性能。大多数情况下,训练管道用于训练多个模型并比较它们在保留的验证集上的性能。
推理
这是您的生产管道。它为您的用户提供经过训练的模型的结果。
在高层次上,推理管道从接受输入数据并对其进行预处理开始。预处理阶段通常由多个步骤组成。最常见的是,这些步骤将包括清理和验证输入、生成模型需要的特征,以及将数据格式化为适合 ML 模型的数字表示。更复杂系统中的管道通常还需要获取模型所需的其他信息,例如存储在数据库中的用户特征。然后管道通过模型运行示例,应用任何后处理逻辑,并返回结果。
图 2-4显示了典型推理和训练流水线的流程图。理想情况下,训练和推理管道的清理和预处理步骤应该相同,以确保经过训练的模型在推理时接收具有相同格式和特征的数据。
图 2-4。训练和推理管道是互补的
构建不同模型的管道时会考虑不同的问题,但总的来说,高层基础设施保持相对稳定。这就是为什么首先构建端到端的训练和推理管道以快速评估 Monica Rogati 在“Monica Rogati:如何选择 ML 项目并确定其优先级”中提到的影响瓶颈是有价值的。
大多数管道具有相似的高层结构,但由于数据集结构的差异,功能本身往往没有共同之处。让我们通过查看编辑器的管道来说明这一点。
ML 编辑器的管道
为了作为编辑器,我们将使用 Python 构建训练和推理管道,Python 是 ML 中的一种常用语言。第一个原型的目标是构建一个端到端的管道,而不用太在意它的完美性。
正如在任何需要时间的工作中都应该完成的那样,我们可以并且将会重新审视其中的部分内容以进行改进。对于训练,我们将编写一个非常标准的管道,一个广泛适用于许多 ML 问题并且具有一些功能,主要是:
-
加载数据记录。
-
通过删除不完整的记录来清理数据,并在必要时输入缺失值。
-
以模型可以理解的方式预处理和格式化数据。
-
删除一组不会被训练但用于验证模型结果的数据(验证集)。
-
在给定的数据子集上训练模型并返回经过训练的模型和汇总统计信息。
对于推理,我们将利用训练管道中的一些函数,以及编写一些自定义函数。理想情况下,我们需要以下功能:
-
加载经过训练的模型并将其保存在内存中(以提供更快的结果)
-
将预处理(与训练相同)
-
收集任何相关的外部信息
-
将通过模型(推理函数)传递一个示例
-
将进行后处理,以在将结果提供给用户之前清理结果
通常最容易将管道可视化为流程图,如图 2-5 所示。
图 2-5。编辑器的管道
此外,我们还会编写各种分析探索函数来帮助我们诊断问题,例如:
-
可视化模型表现最佳和最差示例的函数
-
探索数据的功能
-
探索模型结果的功能
许多管道包含验证模型输入并检查其最终输出的步骤。此类检查有助于调试,正如您将在第 10 章中看到的那样,并通过在向用户显示之前捕获任何不良结果来帮助保证应用程序的质量标准。
请记住,在使用 ML 时,模型在看不见的数据上的输出通常是不可预测的,并不总是令人满意。出于这个原因,重要的是要承认模型并不总是有效,并围绕这种潜在的错误来构建系统。
结论
我们现在已经了解了如何定义核心指标,使我们能够比较完全不同的模型并了解每个模型之间的权衡。我们介绍了用于加速前几个管道构建过程的资源和方法。然后我们概述了我们需要为每个管道构建什么以获得第一组结果。
我们现在有了一个构思为 ML 问题的想法、一种衡量进度的方法和一个初始计划。现在是深入实施的时候了。