深度学习架构师手册——深度学习生命周期

224 阅读1小时+

在本章中,我们将探索深度学习生命周期的复杂性。与机器学习生命周期具有相似特征,深度学习生命周期既是一个框架,也是一个方法论,它将使深度学习项目的创意能够取得巨大成功,或者在合适的时候被完全废弃。我们将深入理解为什么这个过程是循环的,并更深入地了解生命周期中的一些初始过程。此外,我们还将对生命周期后期的一些高层次内容进行简单的预览,这些内容将在未来的章节中进行更深入的探讨。

本章将帮助你完成以下目标:

  • 理解深度学习生命周期与其机器学习生命周期对比的相似性与差异性
  • 理解领域知识在深度学习项目中的作用
  • 理解规划深度学习项目的几个关键步骤,确保项目能够在现实世界中创造实际价值
  • 高层次掌握深度学习模型开发的细节
  • 高层次掌握模型解释的重要性及其各种深度学习解释技术
  • 探索模型部署及其治理的高层次概念
  • 学会选择执行深度学习生命周期过程中所需的工具

我们将通过以下几个部分来覆盖这些内容:

  • 机器学习生命周期
  • 深度学习生命周期的构建策略
  • 数据准备阶段
  • 深度学习模型开发
  • 模型洞察的交付
  • 风险管理

技术要求

本章包括一些用Python编程语言实现的实际案例。要完成这些内容,你需要安装以下库:

  • pandas
  • matplotlib
  • seaborn
  • tqdm
  • lingua

代码文件可以在GitHub上找到:github.com/PacktPublis…

理解机器学习生命周期

深度学习是机器学习这一更广泛类别的一个子集。它与其他机器学习算法的主要区别在于其基础构建块——神经网络。自从2000年代初以来,深度学习取得了巨大的进展,通过其机器学习的对口技术,实现了许多之前无法完成的成就。具体来说,深度学习在识别复杂模式方面取得了突破,这些模式存在于复杂和非结构化的数据中,如文本、图像、视频和音频。如今,深度学习的一些成功应用包括基于图像的人脸识别、音频数据的语音识别以及基于文本数据的语言翻译。

另一方面,机器学习是人工智能这一更广泛类别的一个子集。其算法,如基于树的模型和线性模型,虽然不被认为是深度学习模型,但仍广泛应用于处理表格数据的各种用例,而表格数据正是大大小小组织存储的主要数据类型。这些表格数据可能存在于多个结构化数据库中,涵盖从1年到10年的历史数据,这些数据有潜力被用来构建预测性机器学习模型。机器学习算法的一些显著预测应用包括金融行业的欺诈检测、电商中的产品推荐以及制造业中的预测性维护。图1.1展示了深度学习、机器学习和人工智能之间的关系,帮助清晰地将它们区分开来:

image.png

现在我们已经简要了解了深度学习和机器学习的概念,接下来我们可以来看看机器学习生命周期的概览,如图1.2所示:

image.png

尽管深度学习算法相较于其他机器学习算法更为先进和复杂,但确保两个领域成功所需的指导方法论无疑是相同的。机器学习生命周期包括六个阶段,这些阶段以不同的方式相互作用:

  • 规划
  • 数据准备
  • 模型开发
  • 提供模型洞察
  • 模型部署
  • 模型治理

图1.2展示了这六个阶段,以及用箭头表示的可能阶段过渡。通常,机器学习项目会根据业务需求在各个阶段之间进行迭代。在深度学习项目中,大多数创新性的预测用例需要手动收集数据和进行数据标注,这一过程属于数据准备阶段。由于这个过程通常非常耗时,尤其是在数据本身并不容易获得的情况下,解决方案通常是从一个可接受的初始数据量开始,并过渡到模型开发阶段,随后进入提供模型洞察阶段,以确保从这些创意中获得的结果是合理的。

经过初步验证后,根据业务需求,实践者会决定是否重新进入数据准备阶段,并继续在不同的数据量里程碑之间循环迭代,直到模型开发和业务指标的结果令人满意。一旦获得相关利益相关者的批准,项目就会进入模型部署阶段,此时构建好的机器学习模型将会被服务化,以便其预测结果可以被消费。最后的阶段是模型治理,在此阶段,实践者会进行管理已部署的机器学习模型的风险、性能和可靠性的任务。模型部署和模型治理都值得深入探讨,将在本书接近尾声时的单独章节中详细介绍。每当关键指标未能维持在一定的置信水平时,项目将回到生命周期中的数据准备阶段,并重新开始相同的流程。

理想的机器学习项目会根据业务应用需求在各个阶段之间循环流转。然而,机器学习项目通常容易面临较高的失败概率。根据Dimensional Research和Alegion进行的一项调查,涵盖了来自20个不同行业的约300名机器学习从业者,78%的机器学习项目在部署之前的某个阶段被延误或阻碍。此外,Gartner预测85%的机器学习项目将失败(venturebeat.com/2021/06/28/…)。通过预期不确定性并在失败发生之前做出预测,实践者可以在规划阶段提前规避潜在的失败因素。这也将我们带到了图1.2中与垃圾桶图标一起出现的部分。合理的项目通常只有在“提供模型洞察”阶段才会被丢弃,当模型和项目无法提供令人满意的结果时才会如此。

现在我们已经概述了机器学习生命周期,接下来我们将深入探讨每个阶段,并将其分解为若干部分,帮助你发现完成每个阶段所需的关键技巧和技术。这些阶段将以抽象的方式讨论,并非具体描述你最终应该为项目做的事情,因为每个项目都是独特的,策略应始终根据具体情况评估。

构建深度学习系统的战略

深度学习模型只有成为一个执行某种操作的系统的一部分,才能实现实际的价值。将深度学习模型从研究论文应用到实际的真实世界中并非易事。因此,在进行任何项目之前进行适当的规划,是实现预期目标更可靠、更有结构的方式。本节将讨论在开始规划深度学习项目时,有助于成功的考虑因素和策略。

开始旅程

如今,深度学习从业者往往过于专注于算法模型构建的过程。在面对如pix2pix这样的技术时,它能够从简单的草图或图像蒙版生成高分辨率的真实感图像,或者像GPT-3这样的自然语言处理(NLP)技术,后者是OpenAI推出的一个拥有1750亿个参数的文本生成模型,以及继GPT-3之后的多模态文本生成模型GPT-4,它能够生成从文本摘要到代码生成几乎任何你要求的文本格式,面对这些令人振奋的技术,谁不想尝试一下呢?

开个玩笑,成为一个真正的深度学习架构师,我们需要达成共识:任何成功的机器学习或深度学习项目都始于业务问题,而不是你刚刚在线上阅读的那篇炫目的新研究论文,或者带有公开GitHub仓库的论文。规划阶段通常涉及许多不太了解机器学习算法细节的业务高层,而这些人往往对算法本身并不感兴趣。这些算法对于以业务为导向的利益相关者来说是令人望而生畏的,尤其是在人工智能技术本身的采纳上已经存在心理障碍时,这使得项目更难被采纳。

评估深度学习的价值

深度学习在处理非结构化数据方面最为出色。这包括图像数据、文本数据、音频数据和视频数据。这主要得益于模型能够从原始数据中自动学习并提取复杂的高级特征。在图像和视频的情况下,深度学习模型能够捕捉空间和时间模式,识别物体、场景和活动。对于音频数据,深度学习能够理解语音、噪声以及各种声音元素的细微差别,这使得构建语音识别、语音助手和音频分类系统成为可能。对于文本数据,深度学习模型能够捕捉上下文、语义和句法,从而实现情感分析、机器翻译和文本摘要等NLP任务。

这意味着,如果这些数据存在并且在你的公司业务流程中得到了利用,那么有可能通过深度学习来解决相关问题。然而,绝不能为了用深度学习解决问题而让问题变得更加复杂。用一个更容易理解的例子来说明,你不会用一个巨大的大锤把钉子钉进木头。它可能有效,你或许能够应付,但你也有可能弄弯钉子或者在使用过程中受伤。

一旦问题被确定下来,评估解决它的商业价值是非常重要的。并非所有问题都是一样的,它们可以根据商业影响、价值、复杂性、风险、成本以及深度学习的适用性进行排名。通常,你会寻找那些高影响、高价值、低复杂性、低风险、低成本和高适用性的深度学习问题。不同指标之间的权衡是可以预期的,但简而言之,确保你发现的问题值得用深度学习来解决。一个普遍的经验法则是,总是尽量选择更简单的解决方案,即使这意味着放弃使用深度学习技术。简单的方案通常更可靠、成本更低、风险更小,且更容易实现。

考虑一个需要解决的问题,要求在视频流中移除背景场景,只留下人类或必要的物体不受影响,以便可以将更合适的背景场景叠加上去。这是如今各类电影行业中一个常见的问题。

语义分割是指在图像的宽度和高度维度上给每个像素分配标签的任务,是解决此类问题所需要的方法。在这种情况下,任务需要分配标签,以帮助识别需要移除的像素。随着许多公开的语义分割数据集的出现,深度学习在语义分割领域取得了显著的进展,使得它能够对世界进行非常精细的理解,以至于能够在自动驾驶和机器人导航行业中应用。然而,深度学习并不是100%无误的,几乎总是会有一些错误,即使是在受控的评估数据集中的情况也不例外。例如,在人体分割的情况下,模型可能会在细发区域产生最多的错误。大多数电影制作人追求影片的完美呈现,要求每个像素都被恰当地移除,因为演员的时间非常宝贵,花费了大量资金。此外,如果场景拍摄时没有使用绿幕,那么需要花费大量时间和金钱手动移除物体,而这些物体本可以通过简单地使用绿幕来解决。这是一个不应让问题过于复杂的案例。实际上,绿幕就是解决问题的关键:特别是那种罕见的绿色色调。当绿幕正确准备好后,图像处理技术就能有效地移除那些位于基于绿色色调的小光强范围内的像素,从而实现语义分割,采用的是基于规则的解决方案。绿幕是一个简单、经济、高效的解决方案。

话说到这,考虑一个更简单的问题。假设我们需要自动检测何时下雨。在这个用例中,理解识别雨水的实际需求和目标是非常重要的:仅仅检测降雨时刻是否足够?还是我们需要预测是否会在近期发生降雨?我们将如何利用雨水事件的信息?这些问题将决定是否需要深度学习。我们作为人类知道,通过观察雨滴的存在或云层的状况可以预测降雨。然而,如果用例仅需要检测下雨时刻,而且检测雨水的目的是决定何时给植物浇水,那么一个更简单的方法是使用电子传感器检测水分或湿度的存在。只有当你想要预测未来是否会下雨,比如15分钟后,深度学习才会更合适应用,因为降雨受到多个气象因素的影响。只有通过头脑风暴每个用例并分析所有潜在的解决方案,甚至包括深度学习之外的解决方案,才能确保深度学习带来了相较于其他解决方案更具实际商业价值的方案。不要仅仅因为想用深度学习就应用它。

有时,当直接考虑一个用例时,价值不明确,或者虽然价值明确但你不知道如何执行时,可以考虑寻找同一行业公司中的参考项目。同一行业的公司很可能希望优化相同的流程或解决相同的痛点。类似的参考项目可以作为设计深度学习系统的指导,并证明正在考虑的用例值得应用深度学习技术。当然,并非每个人都能获得这些细节,但你会惊讶于今天Google能为你提供多少信息。即使没有类似的项目可作为直接参考,你仍然能够借鉴已有的机器学习项目参考,这些项目已经在同一行业内证明了其为业务带来的价值。

不可否认,拒绝深度学习有时是一件难以接受的事,毕竟大多数从业者是为了实施深度学习解决方案而被支付报酬的。然而,越早拒绝深度学习,你就可以将时间集中在那些真正需要深度学习来解决的、更有价值的问题上,并防止在简易解决方案能够超越深度学习的情况下,削弱深度学习的潜力。深度学习的价值应当根据具体情况逐一评估,作为实践者,最好的建议就是要遵循常识。花足够的时间进行问题探索和价值评估过程。最糟糕的情况就是你花费大量时间准备数据、构建深度学习模型,并提供非常有说服力的模型洞察,最终发现你试图预测的标签对业务并没有提供足够的价值,无法进一步投资。

定义成功

你是否曾听到过类似“我的深度学习模型在验证数据集上达到了99%的准确率!”这样的句子?数据科学家们常常犯一个错误,就是仅通过他们在模型开发过程中使用的验证指标来判断机器学习项目的成功。诸如准确率、精确度或召回率等模型构建指标是机器学习项目中需要考虑的重要指标,但除非它们能为业务创造价值并以某种方式与业务目标相连接,否则它们通常并不代表什么。一个项目可能会取得良好的准确率,但仍未能实现预期的业务目标。这种情况往往发生在没有明确早期定义成功指标的情况下,导致在数据准备和模型开发阶段使用了错误的标签。此外,即便模型指标直接影响业务流程,仍然有可能这些成就没有有效地传达给业务利益相关者,最糟糕的情况是,当结果如实报告时,被认为并不成功。

成功指标一旦及早定义,就能作为机器学习项目的护栏,确保项目目标与业务目标对齐。一个护栏的作用是帮助选择一个合适的标签,在推理时能够切实改善业务流程或为业务创造价值。首先,我们需要确保对标签的定义达成一致,标签是你希望机器学习模型预测的值。机器学习模型的目标是根据某种输入数据自动分配这些标签,因此在数据准备和模型开发阶段,必须选择一个标签来实现这一目标。选择错误的标签可能会给深度学习项目带来灾难,因为有时当数据不可用时,意味着项目必须从数据准备阶段重新开始。标签应始终间接或直接与成功指标相关联。

如其名所示,成功指标可以是复数,范围从基于时间的成功定义或里程碑到整个项目的成功,既有无形的也有有形的。通常的最佳做法是从低层次到高层次进行头脑风暴并记录所有可能的成功标准。另一项最佳做法是确保始终与无形指标一起定义有形成功指标。无形指标有助于提高意识,而有形指标则确保事物是可衡量的,从而使目标更易于实现。以下是一些无形且难以衡量的指标示例:

  • 提高客户满意度
  • 提高员工表现
  • 改善股东前景

指标是衡量某事的方式,并与目标紧密相连,以达成目标。目标本身可以是无形的,类似前面列出的一些例子,但只要它与有形指标相关联,项目就已经起步良好。当你有明确的目标时,问问自己,目标可以通过何种方式证明已经达成、展示或衡量。以下是一些与业务目标对齐的机器学习项目的有形成功指标示例:

  • 增加客户停留时间,作为客户满意度的代理指标
  • 增加公司收入,作为员工表现的代理指标
  • 增加点击率(CTR),作为定向营销活动效果的代理指标
  • 增加客户生命周期价值(CLTV),作为长期客户满意度和忠诚度的代理指标
  • 增加转化率,作为促销活动和网站用户体验成功的代理指标

这一概念并不是新鲜事,也不限于机器学习项目——几乎所有公司进行的项目都需要与业务目标对齐。许多基础的项目管理技巧同样适用于机器学习项目,花时间培养一些来自机器学习领域以外的项目管理技能将对机器学习项目有益,并且这些技能是可以转移的。此外,由于机器学习被视为一种基于软件的技术,软件项目管理方法论也同样适用。

最后值得记住的一点是,机器学习系统的核心不在于你的机器学习模型有多先进,而在于人类与机器智能如何协同工作,以实现更大的社会价值并创造价值。

规划资源

深度学习通常涉及具有大量参数的神经网络架构,这些参数也称为权重。这些架构的规模从包含几个参数到包含数百亿个参数不等。例如,OpenAI的GPT-3文本生成模型包含1750亿个神经网络参数,占用约350GB的计算机存储空间。这意味着,要运行GPT-3,你需要一台至少具有350GB随机访问内存(RAM)的机器!

深度学习模型框架,如PyTorch和TensorFlow,已经被构建为能够与图形处理单元(GPU)配合使用,GPU能够极大地加速神经网络模型的训练和推理速度。现成的GPU设备通常具有12GB的GPU内存,远不足以加载一个GPT-3模型并以GPU模式运行。然而,仍然有方法可以将大模型划分到多个GPU上并在GPU上运行。此外,还有一些方法允许进行分布式GPU模型训练和推理,以支持在任何给定使用点上更大的数据批次大小。GPU并不便宜,最常用的GPU品牌Nvidia的价格从几百美元到数十万美元不等。随着加密货币技术的兴起,GPU的供应也因人们在有库存时立即购买而显著减少。所有这些都强调了在训练和推理深度学习模型之前规划计算资源的必要性。

在项目初期,重要的是将你的模型开发和部署需求与计算资源分配对齐。首先通过浏览研究论文或提供技术总结的网站,评估适合当前任务的深度学习架构大小范围,并为模型开发过程预留计算资源。

小贴士: paperswithcode.com提供了广泛的技术总结,按任务分类汇总!

当计算资源不可用时,确保你提前进行购买计划,尤其是当涉及GPU时。但如果不想使用物理机器呢?一个替代方案是使用付费云计算资源提供商,你可以随时在世界任何地方轻松访问。在模型开发阶段,拥有更多GPU和更多RAM资源的好处之一是,可以通过使用更大的数据批次大小进行训练,或者允许同时训练多个模型,从而加快模型训练速度。虽然仅使用CPU进行深度学习模型训练也可以,但模型训练时间不可避免地会更长。

在推理时间,当模型部署时,所需的GPU和CPU计算资源通常被认为是过剩的。不同的应用程序有不同的部署计算需求,决定分配什么资源规格可以通过问自己以下三个问题来评估:

  • 推理请求的频率是多少? 如果在短时间内有多个推理请求,可能需要在多个计算设备中并行运行多个推理服务
  • 每次请求的预测样本量是多少? 设备的RAM需求应与批次大小预期匹配
  • 你需要多快的响应? 如果要求秒级或更快的响应时间,需要GPU 如果不关心响应时间,CPU也能完成任务

资源规划不仅仅限于计算资源规划,它还包括人力资源规划。假设深度学习工程师和数据科学家的团队人数,最终将影响在模型开发过程中使用的软件库和工具的选择。选择这些工具的类比将在后续部分中介绍。

下一步是准备数据。

准备数据

数据对于机器学习模型,就像是汽车的燃料、电子设备的电力和身体的食物。机器学习模型通过尝试捕捉提供的输入和输出数据之间的关系来工作。类似于人类大脑的工作方式,机器学习模型会试图遍历收集到的数据示例,并逐渐建立起将输入数据映射到目标输出数据所需的模式记忆。数据准备阶段包括为构建机器学习模型所需的准备工作,具体包括以下内容:

  • 获取原始输入数据和目标输出数据
  • 对获取的数据进行探索性数据分析
  • 数据预处理

我们将在接下来的子章节中讨论这些主题。

深度学习问题类型

深度学习可以大致分为两种问题类型,即监督学习和无监督学习。这两种问题类型都涉及构建一个深度学习模型,能够根据明确的数据输入进行有根据的预测输出。

监督学习是一种涉及标签的类型,标签作为学习的真实来源。标签可以有多种形式,并可以进一步细分为两种问题类型,即分类和回归。分类是指在给定输入数据时,在多个类别中预测一个特定的离散类别。许多更复杂的问题源自基本的分类问题类型,如实例分割、多标签分类和目标检测。另一方面,回归是指在给定输入数据时,预测一个连续的数值。同样,复杂问题类型也可以源自基本的回归问题类型,如多重回归和图像边界框回归。

无监督学习则是指没有标签参与,目标可以变化很大的问题类型。异常检测、聚类和特征表示学习是无监督学习类别中最常见的问题类型。

我们将在第8章《探索监督深度学习》和第9章《探索无监督深度学习》中分别讨论这两种深度学习问题类型。

接下来,让我们了解在获取数据时需要考虑的事项。

获取数据

在深度学习中,获取数据通常涉及非结构化数据,包括图像数据、视频数据、文本数据和音频数据。有时,数据可以通过一些业务流程在数据库中方便地获取和存储,但通常,数据需要从零开始从环境中手动收集。此外,这些数据的标签通常也不可直接获得,必须进行手动标注。与机器学习相比,深度学习算法能够处理和消化高度复杂的数据,但这也意味着它需要比机器学习更多的数据。大量的数据收集和数据标注需求是深度学习目前被认为有较高入门门槛的主要原因。

在机器学习项目中,不要急于选择算法。花时间正式定义可以获取的特征,以预测目标变量。在这个过程中,向领域专家寻求帮助,并集思广益,寻找与目标变量相关的潜在预测特征。在实际项目中,通常会花费大量时间进行数据规划和获取,同时确保所获得的数据适合机器学习模型的使用,然后将其余时间用于模型构建、模型部署和模型治理。虽然在模型开发阶段,已经进行了大量关于如何处理低质量数据的研究,但这些技术通常并不全面,且在掩盖数据固有质量方面存在局限性。在数据获取阶段忽视质量保证,并且在数据科学部分充满热情,是项目从一开始就注定会失败的强烈信号。

当你不知道什么是高质量数据时,制定数据获取策略是一项艰巨的任务。让我们通过一些数据质量的支柱来看看你应该在实际业务用例和机器学习背景下考虑哪些方面的数据质量:

  • 代表性:数据在多大程度上代表了真实世界的数据群体?
  • 一致性:标注方法有多一致?相同的模式是否匹配相同的标签,还是存在一些不一致?
  • 完整性:收集的数据集是否涵盖了特定标签的所有变体?
  • 唯一性:数据中是否包含大量重复或相似的数据?
  • 公平性:收集的数据是否偏向于某些特定标签或数据群体?
  • 有效性:数据中是否包含无效字段?数据输入是否与标签匹配?是否存在缺失数据?

接下来,我们将详细分析每个方面。

代表性

数据应该尽可能模拟模型部署时将接收到的数据。在基于研究的深度学习项目中,研究人员常常在一个封闭的环境中收集数据,并控制环境变量。研究人员偏好在控制环境中收集数据的原因之一是,他们可以构建更稳定的机器学习模型,并通常试图证明某个观点。最终,当研究论文发布时,看到令人惊叹的结果,往往是通过精心挑选的数据来展示的。这些建立在控制数据上的模型在应用到随机且无控制的真实世界示例时往往会失败。不要误解我的意思——这些控制数据集在某些时候对构建更稳定的机器学习模型是有帮助的,但将无控制的真实世界示例作为训练和评估数据集的主要部分,是实现通用模型的关键。

有时候,获取的训练数据有过期时间,并不会永远保持代表性。这个现象叫做数据漂移,将在本章接近结尾时的“风险管理”部分进一步讨论。数据质量的代表性指标也应根据模型在部署过程中接收到的数据的未来预期进行评估。

一致性

数据标签如果没有一致地标注,会使机器学习模型难以从中学习。这种情况发生在多个标注者的领域理念和标注策略不同,且没有正确定义的情况下。例如,“Regular”和“Normal”意味着相同的事物,但对机器来说,这两个是完全不同的类别;就像“Normal”和“normal”仅有大小写的差别!

在执行实际标注过程之前,最好在规划阶段就正式化一个正确的标签标注策略。数据标注后清理简单的一致性错误是可行的,但一些一致性错误可能很难检测,并且修正起来也很复杂。

完整性

机器学习在构建能够应对多个标签变体和视图的决策机制时表现最佳。能够做到这一点和成功做到这一点是两件不同的事。决策鲁棒性的一个前提是,用于训练和评估的数据本身必须足够全面,能够覆盖每个标签的所有可能变体。那么,如何判断完整性呢?这取决于标签的复杂性以及它们在模型部署时自然呈现出来的变体。更复杂的标签自然需要更多的样本,而较简单的标签则需要更少的样本。

在深度学习的背景下,一个好的起点是每个标签至少有100个样本,并尝试构建模型并从模型中得出洞察,看看是否有足够的样本让模型能够泛化到未见过的标签变体。当模型未能产生令人信服的结果时,就需要回到数据准备阶段,收集更多关于特定标签的变体。机器学习生命周期本质上是一个循环过程,在不同的阶段之间进行实验、探索和验证,以获得解决问题所需的答案,因此不要害怕循环执行这些不同的阶段。

唯一性

虽然拥有完整且全面的数据有助于构建一个能够应对数据变异的强健机器学习模型,但在收集的数据集中,拥有重复版本的同一数据变体,会使模型产生偏差。一个有偏的模型会做出有偏的决策,这可能是不道德和非法的,有时甚至使得这些决策毫无意义。此外,当所有数据都被重复或非常相似时,对于任何特定标签获取的数据量也就没有意义了。

机器学习模型通常是在收集的数据子集上进行训练,然后在其他数据子集上进行评估,以验证模型在未见数据上的表现。当数据集中不唯一的部分恰好被放入评估分区时,模型可能会报告对重复数据输入产生偏见的评分。

公平性

收集到的数据集是否适当地代表了少数群体?数据集是否偏向于人口中的多数群体?机器学习模型产生偏见的原因有很多,但其中一个主要原因是数据表示偏见。确保数据公平和公正地表示是所有机器学习从业者的道德责任。有许多类型的偏见,关于这一主题的内容将有专门的章节,并将在第13章《探索偏见与公平性》中介绍以及减少偏见的方法。

有效性

数据集中是否存在离群值?数据集中是否缺失数据?你是否不小心将一个空白的音频或图像文件加入到已经正确收集和标注的数据集中?数据输入的标注标签是否是有效标签?这些是你在考虑数据集有效性时应该问的一些问题。

无效数据对机器学习模型是无用的,其中一些会使得预处理变得更加复杂。无效数据的原因可以从简单的人为错误到复杂的领域知识错误不等。减少无效数据的方法之一是将已验证和未验证的数据分开。在数据样本被包括在已验证的数据集类别中之前,应包括某种形式的自动或手动数据验证过程。部分验证逻辑可以来自业务流程或常识。例如,如果我们以年龄作为输入数据,有些年龄范围是可以接受的,而有些则完全不可能,如1000岁。通过设立简单的“护栏”并在收集数据时早期验证这些值,可以在收集时进行纠正,从而获得准确和有效的数据。否则,这些数据可能会在模型构建阶段被丢弃。保持一个结构化的框架来验证数据,确保大多数数据保持相关性并能为机器学习模型使用,并且避免简单的错误。

对于更复杂的无效性问题,如领域意识错误,领域专家在确保数据保持理性和逻辑方面发挥着重要作用。在定义数据输入和输出时,始终确保在讨论如何收集和标注数据以供模型开发时,邀请领域专家参与。

通过探索性数据分析(EDA)理解数据

数据获取后,分析数据以检查其特征、存在的模式和数据的总体质量至关重要。了解你正在处理的数据类型,能够帮助你为随后的模型构建阶段规划策略。绘制分布图、计算统计数据,进行单变量和多变量分析,以了解数据之间固有的关系,这可以进一步确保数据的有效性。不同变量类型的分析方法是不同的,可能需要一些领域知识。接下来的子章节中,我们将通过对基于文本的数据进行探索性数据分析(EDA),实际演示执行EDA任务的好处。

实用文本EDA

在本节中,我们将使用Python代码手动探索和分析一个特定于文本的数据集,目的是在本书后续部分使用相同的数据集构建深度学习模型。我们使用的数据集将根据印度电商网站上物品的文本描述预测物品的类别。这个用例对于自动分组广告物品以便用于用户推荐非常有用,可以帮助增加电商网站的购买量:

首先,让我们定义在笔记本中将使用的库。我们将使用pandas进行数据处理和结构化,matplotlib和seaborn用于绘制图表,tqdm用于可视化迭代进度,lingua用于文本语言检测:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm import tqdm
from lingua import Language, LanguageDetectorBuilder
tqdm.pandas()

接下来,让我们使用pandas加载文本数据集:

dataset = pd.read_csv('ecommerceDataset.csv')

pandas有一些方便的函数可以用来可视化和描述加载的数据集;我们将使用它们。首先,我们通过显示三行原始数据来开始:

dataset.head(3)

这将在你的笔记本中显示以下内容:

image.png

接下来,让我们通过可视化数据列的统计信息来描述数据集:

dataset.describe()

这将在你的笔记本中显示以下内容:

image.png

通过这些可视化,我们可以明显看出数据集的描述与数据集中的内容一致,其中类别列包含四个唯一的类别,这些类别与名为“description”的文本描述数据列配对,并且有证据表明它们是字符串类型。通过描述函数,我们可以得出一个重要的洞察——文本描述中存在重复项。我们可以通过保留所有重复项中的第一个示例行来去除重复项,但我们还必须确保这些重复项具有相同的类别,因此我们可以执行以下操作:

for i in tqdm(range(len(unique_description_information))):
    assert(
        len(
            dataset[
                dataset['description'] == unique_description_information.keys()[i]
            ]['category'].unique()
        ) == 1
    )
dataset.drop_duplicates(subset=['description'], inplace=True)

接下来,让我们检查列的数据类型:

dataset.dtypes

这将在你的笔记本中显示以下内容:

image.png

当某些样本本身不是字符串数据类型时,比如空数据或可能是数字数据,pandas会自动使用Object数据类型,将整个列分类为pandas未知的数据类型。让我们检查空值:

dataset.isnull().sum()

这将给我们以下输出:

image.png

看起来描述列中有一个空值,正如预期的那样。这可能是在获取数据时的一个错误,或者它可能确实为空。无论如何,既然我们无法恢复它,就让我们删除这一行,并将列转换为字符串类型:

dataset.dropna(inplace=True)
for column in ['category', 'description']:
    dataset[column] = dataset[column].astype("string")

之前,我们发现了四个独特的类别。让我们通过可视化每个类别的分布来确保每个类别都有足够的样本:

sns.countplot(x="category", data=dataset)

这将生成以下图形:

image.png

每个类别都有相当数量的数据样本,看起来没有任何异常类别。

这里的目标是通过印度电商网站上物品的描述来预测销售物品的类别。从这个背景出发,我们知道印度公民讲印地语,因此数据集可能不仅包含英语数据。让我们尝试使用一个开源的语言检测工具——Lingua,来估算和验证数据集中可用的语言。Lingua使用基于规则和基于机器学习模型的方法,能够检测70多种文本语言,适用于短语、单词和句子。由于这个原因,Lingua具有更好的运行时和内存性能。让我们从初始化Lingua库中的语言检测实例开始:

detector = LanguageDetectorBuilder.from_all_languages(
).with_preloaded_language_models().build()

现在,我们将随机抽取数据集的一小部分来进行语言检测,因为检测算法需要一定时间来完成。使用10%的数据应该能够充分了解数据:

sampled_dataset = dataset.sample(frac=0.1, random_state=1234)
sampled_dataset['language'] = sampled_dataset[    'description'].progress_apply(lambda x: detector.detect_language_of(x))

接下来,让我们可视化语言的分布:

sampled_dataset['language'].value_counts().plot(kind='bar')

这将显示以下图表:

image.png

有趣的是,Lingua检测到了一些异常样本,它们不是英语。这些异常语言看起来可能是Lingua的检测错误。在这些样本中,也检测到了印地语;由于数据来自印度电商网站,这比其他语言更具说服力。让我们查看这些样本:

sampled_dataset[    sampled_dataset['language'] == Language.HINDI
].description.iloc[0]

这将显示以下文本:

image.png

看起来这里混合了印地语和英语。那么,另一个语言,比如法语呢?

sampled_dataset[    sampled_dataset['language'] == Language.FRENCH
].description.iloc[0]

这将显示以下文本:

image.png

看起来“potpourri”是这里的重点词汇,因为这是一个借用自法语的词,但文本整体上仍然是英语。

由于语言列表中不包括那些不使用空格作为逻辑词单元分隔符的语言,让我们尝试通过使用基于空格的单词分隔来估算单词的分布。单词数和字符数可能会影响深度学习神经网络的参数,因此在进行探索性数据分析(EDA)时,了解这些值会很有用:

dataset['word_count'] = dataset['description'].apply(
    lambda x: len(x.split())
)
plt.figure(figsize=(15,4))
sns.histplot(data=dataset, x="word_count", bins=10)

这将显示以下柱状图:

image.png

通过对文本数据的探索和分析,我们可以推导出几个有助于在模型开发阶段确定使用的模型类型和结构的原因:

  • 标签样本相对较为均衡,每个标签有5,000到11,000个样本,适合用于深度学习算法。
  • 原始数据不干净,存在缺失数据和重复项,但可以通过手动处理来修复。直接使用原始数据进行模型开发可能会导致创建一个有偏的模型。
  • 数据集包含多种语言,但大部分是英语文本,这将在模型开发阶段帮助我们做出合适的模型选择。
  • 大多数样本的单词数少于1,000个,而一些样本有1,000到8,000个单词。在一些非关键性用例中,我们可以安全地将单词数限制在大约1,000个,以便构建一个具有更好内存和运行时性能的模型。

前面的实际示例应为执行EDA提供了一个简单的体验,这足以帮助理解在进入模型开发阶段之前进行深入EDA的好处和重要性。类似于实际文本EDA,我们为其他数据集(包括音频、图像和视频数据集)准备了一个实际的EDA样本工作流程,存储在我们的Packt GitHub仓库中,您可以探索这些资源以亲自实践。

本节要掌握的一个重要概念是EDA的重要性以及在探索数据真相时应表现出的好奇心。一些方法可以推广到其他类似数据集,但将任何特定的EDA工作流程视为万金油会让你忽视人们在这一领域日益增长的研究。当你怀疑数据存在问题时,向数据提出问题,并通过手动或自动化检查来尝试发现答案。用创造性的方法获取这些答案,并保持渴望学习新方法,以便从数据中提取关键信息。

在本节中,我们方法性和实际地讨论了不同类型数据的EDA过程。接下来,我们将探索为实际模型消费准备数据所需的步骤。

数据预处理

数据预处理包括数据清洗、数据结构化和数据转换,以便深度学习模型能够使用处理后的数据进行模型训练、评估和部署时的推理。处理后的数据不仅仅是为了机器学习模型的接受而准备的,还应该以优化学习潜力和提高机器学习模型度量性能的方式进行处理。

数据清洗是一个旨在提高获取数据质量的过程。EDA(探索性数据分析)是找出数据集中问题的前提,只有在进行某种形式的数据清洗之前,才能进行数据清洗。数据清洗和EDA通常是迭代执行的,直到达到令人满意的数据质量水平。清洗的工作可以简单如去除重复值、空值或移除在常识或业务逻辑上不合逻辑的值。这些概念我们之前已经解释过,其中的风险和问题是相同的。

另一方面,数据结构化是一个组织数据摄取和加载过程的过程,来自已经清理和验证其质量的存储数据。这个过程决定了数据应该如何从一个或多个数据源加载,并输入到深度学习模型中。听起来很简单,对吧?如果这是一个小型的、单一的CSV数据集,并且没有性能或内存问题,那么这确实很简单。实际上,在数据可能由于存储限制而被划分并存储在不同的来源中的情况下,这个过程可能会非常复杂。以下是你在这个过程中需要考虑的一些具体因素:

  • 你的计算机是否有足够的RAM来处理所需的批量大小,以提供数据给模型?确保你还考虑到模型的大小,以免发生内存溢出和内存不足(OOM)错误!
  • 你的数据是否来自不同的来源?确保你有权限访问这些数据源。
  • 访问这些数据源时的速度延迟是否可以接受?考虑将数据迁移到可以更高速度访问的更好硬件资源上,例如使用固态硬盘(SSD)代替硬盘驱动器(HDD),以及从远程可访问的网络源迁移到本地硬件源。
  • 你是否有足够的本地存储来存储这些数据?确保你有足够的存储空间存储数据,避免超载存储,防止性能下降或更糟糕的是计算机崩溃。
  • 优化数据加载和处理过程,使其更快速。存储并缓存那些固定的输出数据,以节省可以用于重新计算这些输出的时间。
  • 确保数据结构化过程是确定性的,即使某些过程需要随机性。随机确定性是指随机性可以在重复周期时重现。确定性有助于确保已获得的结果可以复现,并确保模型构建方法可以公平可靠地进行比较。
  • 记录数据,以便在需要时调试过程。

数据分割方法:确保选择一个适合你数据集的交叉验证策略。如果包含基于时间的特征,考虑是否应该构建一个基于时间的分割方法,其中训练数据包括早期时间的示例,而评估数据则包含未来的数据。如果没有,分层分割方法将是最合适的选择。

不同的深度学习框架,如PyTorch和TensorFlow,提供不同的应用程序接口(API)来实现数据结构化过程。一些框架提供更简单的接口,允许轻松设置数据管道,而另一些框架则提供复杂的接口,提供更高的灵活性。幸运的是,许多高级库试图在保持灵活性的同时简化复杂的接口,比如基于TensorFlow的Keras,基于PyTorch的Catalyst、FastAI、PyTorch Lightning,以及基于PyTorch的Ignite。

最后,数据转换是一个过程,应用特定数据变量的预处理,将原始清理后的数据转换为更具表现力、可用且可学习的格式。执行数据结构化和转换过程时,一个重要的因素是你打算使用的深度学习模型类型。任何形式的数据转换通常依赖于深度学习架构,并且依赖于它能接受的数据类型。最广为人知和常见的深度学习模型架构是为特定数据类型设计的,例如卷积神经网络用于图像数据、变压器模型用于基于序列的数据、以及基本的多层感知器用于表格数据。然而,深度学习模型被认为是灵活的算法,即使在多模态数据条件下,也能弯曲和调整以接受不同形式和大小的数据。通过与领域专家的合作,深度学习专家已经能够构建创造性的深度学习架构,能够处理多种数据模态,甚至多种非结构化数据模态,成功学习跨模态模式。以下是两个例子:

  • **Meta AI(前Facebook)提出的“鲁棒的自监督视听语音识别”(arxiv.org/pdf/2201.01…

    • 该模型通过构建基于深度学习变压器模型的AV-HuBERT,解决了多语音情况下的语音识别问题,能够同时接收音频和视觉数据。
    • 视觉数据作为补充数据,帮助深度学习模型辨别应该关注哪个发言人。
    • 它在LRS3-TED视觉和音频唇语数据集上取得了最新的最先进成果。
  • **DAMO Academy与阿里巴巴集团提出的“通过简单的序列到序列学习框架统一架构、任务和模态”(arxiv.org/pdf/2202.03…

    • 他们构建了一个能够接收文本和图像数据的模型,并发布了一个预训练模型。
    • 它在COCO字幕数据集上的图像描述任务上取得了最先进的成果。

话虽如此,数据转换主要分为两部分:特征工程和数据缩放。深度学习以其特征工程能力广为人知,这使得它能够替代手动从原始数据中为学习构建自定义特征的需求。然而,这并不意味着永远不进行特征工程是明智的。许多成功的深度学习模型已经利用了工程化的特征作为输入。

现在我们知道了数据预处理的内容,让我们理论和实践地讨论和探索针对非结构化数据的不同数据预处理技术。

文本数据预处理

文本数据可以使用不同的语言,并存在于不同的领域,从描述数据到信息文档以及自然的人工文本评论。以下是一些常用于深度学习的文本数据预处理方法:

  • 词干提取(Stemming) :一种去除单词后缀的过程,旨在将单词还原为其基本形式。这促进了相同单词的不同形式在特征中的交叉使用。
  • 词形还原(Lemmatization) :一种将单词还原为其基本形式的过程,产生真实的英文单词。词形还原具有与词干提取类似的许多好处,但被认为更好,因为它产生的单词还原结果是语言学上有效的。
  • 文本分词,使用字节对编码(BPE) :分词是将文本拆分为不同部分的过程,这些部分将被编码并供深度学习模型使用。BPE是一种基于子词的文本拆分算法,它允许常见单词作为一个单独的标记输出,而稀有单词则拆分为多个标记。这些拆分后的标记可以重用匹配子词的表示。这是为了减少在任何时间点可能存在的词汇量,减少词汇外的标记,并更高效地学习标记表示。

一种不常见的预处理方法,能够帮助构建更具泛化性的文本深度学习模型,是文本数据增强。文本数据增强可以通过几种方式进行:

  • 用同义词替换动词:可以使用NLTK库的WordNet英语词汇数据库中的同义词字典集来实现。这种增强后的文本将通过动词同义词替换保持相同的意义。
  • 反向翻译:这涉及将文本翻译成另一种语言,然后再翻译回原语言,使用像Google翻译或开源翻译模型等翻译服务。获得的反向翻译文本将以略有不同的形式呈现。

音频数据预处理

音频数据本质上是基于序列的数据,在某些情况下,可能存在多个序列。音频最常用的预处理方法之一是将原始音频数据转换为不同形式的声谱图,使用短时傅里叶变换(STFT),这是一种将音频从时域转换到频域的过程。声谱图音频转换允许将音频数据分解并表示为一系列频率,而不是将所有音频频率的信号组合成单一波形表示。这些声谱图是二维数据,因此可以将其视为图像,并输入到卷积神经网络中。数据缩放方法,如对数缩放和对数-梅尔缩放,通常也应用于这些声谱图,以进一步强调频率特性。

图像数据预处理

图像数据增强是一种图像特征工程技术,能够增加原始数据的全面性。应用此技术的最佳实践是通过批量随机应用图像增强,在训练过程中动态地增强数据,而不是为深度学习模型提供固定的增强数据集。选择图像增强类型需要一定的业务需求理解。以下是一些不适合应用某些增强的例子:

  • 当图像的方向影响目标标签的有效性时,旋转和图像翻转等方向修改类型的增强不适用。
  • 当图像的颜色影响目标标签的有效性时,灰度化、通道混洗、色调饱和度变化和RGB偏移等颜色修改类型的增强不适用。

在排除明显不合适的增强类型后,找出最佳增强集的常见且有效的方法是进行迭代实验和模型比较。

开发深度学习模型

让我们从简要回顾一下深度学习是什么开始。深度学习的核心基础构建块是神经网络。神经网络是一种旨在模拟人脑的算法。它的构建块被称为神经元,模拟了人脑中包含的数十亿个神经元。在神经网络的上下文中,神经元是存储简单信息的对象,这些信息被称为权重和偏置。可以把它们看作是算法的记忆。

深度学习架构本质上是拥有三层或更多神经网络层的神经网络架构。神经网络层可以分为三大类——输入层、隐藏层和输出层。输入层是最简单的层组,其功能是将输入数据传递给后续的层。这个层组不包含偏置,可以视为被动神经元,但它的连接到后续层神经元的连接仍然包含权重。隐藏层由包含偏置和连接到后续层神经元的权重的神经元组成。最后,输出层由与类别数和问题类型相关的神经元组成,并包含偏置。在计算神经网络层时,最佳实践是排除输入层。因此,具有一个输入层、一个隐藏层和一个输出层的神经网络被视为一个两层神经网络。下图展示了一个基本的神经网络,称为多层感知器(MLP),包含一个输入层、一个隐藏层和一个输出层:

image.png

作为更广泛机器学习类别的一个子集,深度学习模型能够通过损失函数和优化器算法从数据中学习模式,优化损失函数。损失函数定义了模型所犯的错误,以便更新其记忆(权重和偏置),以便在下次迭代中表现更好。优化器算法则决定了在给定损失值的情况下,更新权重的策略。

通过这段简短的回顾,让我们深入了解常见的深度学习模型家族。

深度学习模型家族

这些层可以有多种形式,因为研究人员已经能够发明新的层定义来应对新的问题类型,并且几乎总是配有非线性激活函数,这使得模型能够捕捉数据之间的非线性关系。随着层的变化,出现了许多不同的深度学习架构家族,针对不同的类型问题。以下是一些最常见且广泛使用的深度学习模型:

  • 多层感知器(MLP) :用于表格数据类型。将在第2章《深度学习架构设计》中进行探讨。
  • 卷积神经网络(CNN) :用于图像数据类型。将在第3章《理解卷积神经网络》中进行探讨。
  • 自编码器(Autoencoders) :用于异常检测、数据压缩、数据去噪和特征表示学习。将在第5章《理解自编码器》中进行探讨。
  • 门控循环单元(GRU)、长短时记忆(LSTM)和变压器(Transformers) :用于序列数据类型。这些将在第4章《理解循环神经网络》和第6章《理解神经网络变压器》中分别进行探讨。

这些架构将是第2到第6章的重点,我们将讨论它们的方法论并进行一些实践评估。接下来,让我们了解可以在深度学习中处理的不同问题类型。

模型开发策略

如今,由于深度学习框架如PyTorch和TensorFlow的出现,以及它们的高级库包装器,深度学习模型的发明和创建变得更加容易。你应该选择哪个框架,主要是根据它们的接口来做出偏好选择,因为这两个框架都经过多年的改进,已经成熟。只有在需要为独特问题类型执行非常定制化的功能时,才需要选择能够执行你所需功能的框架。一旦选择了深度学习框架,深度模型的创建、训练和评估过程基本上就涵盖了所有方面。

然而,这些框架并不自带模型管理功能。模型管理是一个技术领域,允许团队、企业和深度学习从业者可靠、快速和高效地构建模型、评估模型、交付模型洞察、将模型部署到生产环境并进行模型治理。模型管理有时也被称为机器学习操作(MLOps)。你可能仍然在想,为什么需要这些功能,尤其是如果你曾在Kaggle这样的平台上构建过一些深度学习模型,Kaggle是一个举办数据和机器学习竞赛的平台。那么,以下是一些推动使用这些功能的因素:

  • 手动比较模型非常繁琐

    • 手动在Excel表格中输入性能数据以跟踪模型性能既慢又不可靠。
  • 模型工件难以跟踪

    • 一个模型有很多工件,如训练的权重、性能图表、特征重要性和预测解释。
    • 同样,比较模型工件也很麻烦。
  • 模型版本控制是必需的,以确保不会重复进行模型构建实验

    • 覆盖表现最好的模型并用最可靠的模型洞察替代是你最不希望经历的情况。
    • 版本控制应根据数据分割方法、模型设置和软件库版本来进行。
  • 部署和治理模型并不直接

    • 根据项目中参与团队的规模以及组件需要被重复使用的频率,不同的软件和库将适合不同的需求。 这些软件和库分为付费和免费(通常是开源)两类。Metaflow是一个开源软件,适用于较大的数据科学团队,这些团队在其他项目中有更多的组件需要重复使用;MLFlow(开源软件)则更适用于小型或单人团队。其他著名的模型管理工具包括Comet(付费)、Weights & Biases(付费)、Neptune(付费)和Algorithmia(付费)。

通过以上内容,我们简要回顾了深度学习模型开发的方法论和策略;接下来,我们将在接下来的几章中深入探讨模型开发的主题。在此之前,让我们继续概览一下交付模型洞察的主题。

交付模型洞察

当模型指标性能仅用于模型比较和选择过程时,它通常不是最有效的方式来可靠地获得最佳模型。当人们关心机器学习模型可能做出的决策时,他们通常需要更多的信息和洞察,最终才能相信模型做出决策的能力。最终,当模型不被信任时,它们就不会被部署。然而,信任不仅仅依赖于模型的洞察。建立对模型的信任需要确保模型能够做出准确、可靠且无偏的预测,这些预测必须与领域专业知识和业务目标对齐,同时向利益相关者提供模型的性能指标、决策逻辑以及预测背后的理由。解决潜在偏差并展示公平性对于获得对模型可靠性的信心至关重要。这个持续的信任建立过程超出了初步部署阶段,因为模型必须持续展示稳健的决策过程,能够解释预测,并保持无偏的性能。通过建立信任,模型成为现实应用中有价值且可靠的工具,从而促进其在各个领域和行业中的采用和使用。

交付对业务有意义的模型洞察。除了交付确保模型信任和消除信任问题的模型洞察外,实际的性能指标同样重要。确保你将模型指标转化为通俗易懂的业务指标,以便有效地传达模型可能对业务带来的正面影响。在这一阶段,应该使用实际值报告之前在规划阶段定义的成功指标。

建立对模型的信任过程不会在模型部署后结束。就像人类在生活中需要解释他们的决策一样,机器学习模型(如果预期要取代人类自动化决策过程)也需要这样做。这个过程被称为预测解释。在某些情况下,模型的决策被期望作为参考使用,其中有一个人类专家在环节中,以便在执行决策之前验证决策。在这些条件下,预测解释几乎总是必需的,尤其是当模型的用户关心为什么模型做出预测,而不是直接使用预测时。

模型洞察还可以帮助你改进模型的性能。记住,机器学习生命周期本质上是一个迭代过程。以下是一些可能出现这种情况的具体例子:

  • 你意识到模型对某一特定群体存在偏见,并回到数据获取阶段,从代表性较少的群体中获取更多数据,或者切换到对偏见具有鲁棒性的建模技术。
  • 你意识到模型在某一类别上的表现不佳,并回到模型开发阶段,使用不同的深度学习模型损失函数,专注于表现不佳的类别。

深度学习模型通常被认为是“黑箱”模型。然而,实际上,今天已经有很多关于深度学习解释方法的研究论文,允许深度学习突破“黑箱”的局限性。在本书的第二部分,我们将深入探讨不同的方式来解释深度学习模型,并为其提供洞察。

现在我们已经了解了深度学习生命周期中涉及的过程,在下一节中,我们将讨论你需要关注的项目生命周期中可能存在的风险。

管理风险

深度学习系统从一开始到系统采用,都面临着多种风险。通常,被分配到深度学习项目的人员仅负责机器学习生命周期的特定阶段,如模型开发或数据准备。这样的做法可能会带来不利影响,因为生命周期中的一个阶段所产生的问题,往往会影响到后续阶段,这种情况通常发生在参与的团队成员对整体工作没有足够的认知时。深度学习系统涉及的风险通常包括机器学习生命周期各个阶段之间的互动,并遵循“垃圾进,垃圾出”的概念。确保每个参与构建系统的人都对最终系统输出的结果负责,而不仅仅是单独阶段的结果,是管理机器学习系统风险的基础之一。

但这些风险具体是什么呢?让我们从一个可以在任何实际工作开始之前就解决的问题开始——当评估一个用例是否值得实施时可能出现的风险。

伦理和监管风险

深度学习几乎可以应用于任何行业,但最难实现深度学习采用的行业往往是那些受高度监管的行业,如医疗和金融行业。这些行业施加的法规最终决定了深度学习系统在这些行业中可以或不能做什么。法规通常是由政府引入的,且通常涉及伦理和法律的考虑。在这些高度监管的行业中,通常会经历每月、每周甚至每天进行的审计,以确保公司遵守所施加的法规。某些行业被更严格地监管的主要原因之一是,行业中的任何行动可能对人们或国家的福祉带来沉重的成本。深度学习系统需要以符合这些法规的方式构建,以避免面临停用的风险、无法获得采纳的风险,以及最糟糕的情况——面临监管部门的巨额罚款。

有时,深度学习模型的表现要远远优于人类,但另一方面,没有任何深度学习模型是完美的。人类会犯错误,这一点大家都知道,但我们还需要意识到的是,机器无疑也会犯错误。最大的风险是,当人类过于信任机器,甚至将决策权完全交给它们时!那么,我们如何考虑这些错误,并且谁将对这些错误负责呢?

让我们看看在没有机器的情况下,人类会怎么做。当风险较高时,重要决策总是会经过一层层审批后才能做出最终决定。这些审批层次表明,需要让重要决策有责任可追,并且能够确保决策的可靠性。我们在做决策时获得的批准越多,我们就越能说自己对做出这个重要决策充满信心。一些常见的需要层层审批的重大决策包括公司雇佣员工的决定、保险费率的决定,或者是否向某个业务投资的决定。在这个背景下,深度学习系统需要在深度学习模型在高风险场景下做出预测性决策时,拥有类似的审批工作流程。这些工作流程可以包括任何形式的洞察,并且可以通过解释预测结果,帮助领域专家判断决策的有效性。加入人为的审查可以使深度学习系统更加符合伦理并且值得信赖,足以成为高风险决策工作流程的一部分。

让我们以医疗行业的用例为例——例如,通过X光扫描预测肺部疾病。从伦理角度来看,让一个深度学习模型完全掌握剥夺某人生命希望的权力,预测极其有害的疾病(如末期肺癌),是非常不合适的。如果预测的极端疾病被误诊,患者可能会不必要地陷入悲痛,或者花费不必要的费用进行昂贵的检测来验证该结果。通过在深度学习系统中设立审批工作流程,允许医生将这些结果作为辅助方法使用,可以解决使用自动化决策系统的伦理问题。

业务上下文不匹配

重申在《定义成功》部分中提到的观点,将深度学习的输入数据和目标标签选择与业务上下文对齐,以及如何消费目标预测,使得深度学习系统能够被采纳。这里的风险在于,当业务价值没有得到恰当定义或深度学习系统没有与其匹配时,系统就可能无法被采纳。即使目标对于业务上下文是合适的,如何消费这些预测是创造价值的关键。未能在任何方面匹配业务上下文,只会导致系统的拒绝。

理解业务上下文涉及了解目标用户群体是谁,以及他们不是谁。这个过程中的关键步骤是记录和构建用户画像。用户画像包含关于他们工作流程、历史、统计数据和关切的信息,这些信息应提供构建与潜在用户特定需求对齐的系统所需的上下文。在构建这些用户画像的过程中,不要害怕进行市场调研并适当验证目标用户的需求。毕竟,构建一个深度学习系统需要大量的努力,浪费时间去构建一个没有人愿意使用的系统显然不是明智的选择。

数据收集与标注风险

你的机器学习模型的好坏取决于数据的质量。深度学习相比机器学习需要更大量的数据。此外,对于新的深度学习应用场景,数据通常无法现成获得,必须手动收集并精心标注。确保数据以能够保证质量的方式收集和标注是一项非常艰巨的任务。

用于收集和标注深度学习数据的策略和方法因应用场景而异。有时,数据收集和标注过程可以同时进行。这种情况发生在存在自然标签时,或者在数据收集之前已经预先指定标签:

  • 自然标签:通常是随着时间的推移自然产生的标签。例如,婴儿性别可以通过超声图像获得;另一个用例是房屋价格作为标签,房屋的多张图像作为输入数据。
  • 预先指定的标签:是指在数据收集时已经预先指定标签。例如,可能是通过控制环境收集的语音数据的性别标签,或者在拍摄面部照片之前在调查中获取的人的年龄标签。

这两种类型的标签相对较少存在风险,因为这些标签通常是准确的。

一种具有较大风险的数据收集和标注方法是数据收集后进行后标注。后标注需要一些领域知识来了解所需标签的特征,并且由于人为评估错误,通常不能百分之百确保正确性。无意识的标注错误发生在标注员偶然犯错时。另一方面,有意识的标注错误发生在标注员有意做出错误的标签决策时。这种意图可能来自对数据中某个模式的强烈或松散的信念,或者仅仅是出于某种原因故意犯的错误。这里呈现的风险是标签可能被错误标注。幸运的是,有一些策略可以执行,以消除这些风险;这些将在接下来的段落中介绍。

无意识的标注错误是难以避免的,因为人类容易犯一定程度的错误。然而,不同的人通常有不同的专注程度,选择标注员时可以作为一个可行的选择。如果标注员是为了标注数据而获得经济报酬的,另一种可行的选择是在标注员标注数据时,定期提供已标注的数据,来评估标注员的表现,并根据他们的标注准确度提供补偿(是的,我们也可以使用评估机器学习模型的指标)。作为积极的副作用,标注员也会因得到激励而提高他们的标注工作表现。

有意识的标注错误是这里最危险的风险,因为它们可能影响整个数据集的质量。当整个标注过程使用了错误的数据模式共识时,标签的合法性通常要到机器学习生命周期的后期才能被发现。机器学习模型只配备了学习将输入数据映射到目标标签所需模式的技术,并且即使标签不正确,它们也可能在某些条件下表现得很好。只要在标注过程中有一个模式,无论对错,机器学习模型都会尽力学习所需的模式,以执行准确的输入到输出映射。那么,如何减轻这一风险呢?确保在领域专家的帮助下,正确定义意识形态在减轻这一风险的过程中起着重要作用,但仅凭这一策略的效果各异,具体效果取决于参与的领域专家人数、领域专家本身的专业水平、标注员人数以及收集数据的异常程度或质量。

即使是领域专家有时也可能出错。以医生为例——你有多少次听说医生开错处方或做错医疗评估?你有多少次因为听错别人的话而不得不猜测别人刚刚说了什么?在最后一个例子中,领域专家是你,而领域是语言听力理解。此外,当标注员人数超过一个人并形成标注团队时,最显著的风险之一是不同的领域意识形态在数据标注上的不匹配。有时,这种情况发生是因为某些标签在数字格式中可能存在不同的变体,或者存在可能干扰标注员分析能力的混乱模式。有时,也可能是由于标注员或领域专家对某一标签或输入数据的固有偏见。随后,数据中的偏见会在模型中产生偏见,并引发伦理问题,削弱人们对机器学习模型决策的信任。当对机器学习模型缺乏信任时,项目就无法被采纳,并且失去其业务价值。偏见、公平性和信任的问题将在第13章《探索偏见与公平性》中进行更广泛的讨论,详细说明其来源及减轻方法。

带有错误标签但仍包含正确标签的数据被称为噪声标签。幸运的是,深度学习中有一些方法可以帮助你应对噪声标签,例如弱监督学习。然而,记住,最好的做法是在数据收集和标注时解决问题,而不是事后解决。让我们深入探讨另一个可以减少标注风险的策略。深度学习项目的数据标注过程通常涉及使用一个软件工具,允许标注特定的所需标签。软件工具使标注工作更加快速和简便,使用协作标注软件工具可以使标注工作更不容易出错。一个好的协作标注工具将允许标注员以某种方式协调他们对数据的理解,从而促进统一的标注意识形态。例如,当识别出易于误解的模式时,自动提醒整个标注员团队,可以帮助防止更多数据被错误标注,并确保所有相关数据被重新审查。

最后一点,这不是一种风险,而是未标注数据为机器学习提供了巨大的潜力。尽管它缺少特定标签来实现某个特定目标,但数据之间仍然存在固有的关系,可以被学习。在第9章《探索无监督深度学习》中,我们将探索如何使用无监督学习将这些数据作为后续监督学习的基础,这形成了更广为人知的半监督学习工作流程。

接下来,我们将讨论与机器学习模型数据消费相关的安全性风险。

数据安全风险

在机器学习的上下文中,安全性与防止数据未经授权的使用、保护数据隐私以及防止与数据使用相关的任何不希望发生的事件或攻击有关。这里的风险是,当数据安全受到破坏时,可能导致无法遵守监管标准、模型性能的下降,或者业务流程的损坏和破坏。在本节中,我们将讨论四种类型的数据安全风险,即敏感数据处理、数据和软件许可、软件许可以及对抗性攻击。

敏感数据处理

一些数据比其他数据更为敏感,并且可能与监管风险相关。敏感数据引发了数据隐私法规,这些法规管理着不同司法管辖区中个人数据的使用。具体的法规内容有所不同,但通常围绕着合法保护个人数据使用权,要求在采取任何行动之前获取这些数据的使用同意,并规定在使用这些数据时所需的条款。例如,**通用数据保护条例(GDPR)**涵盖了欧盟,**个人数据保护法案(PDPA)**涵盖新加坡,**加利福尼亚消费者隐私法案(CCPA)**仅涵盖美国加利福尼亚州,**消费者数据保护法案(CDPA)**涵盖美国弗吉尼亚州。这意味着,你不能随意收集被归类为个人的敏感数据,进行标注,构建模型并进行部署,而不遵守这些法规,因为在某些司法管辖区这样做可能会被视为犯罪。除了请求同意外,减轻这一风险的常见方法之一是对数据进行匿名化处理,以确保数据无法被任何个人识别。然而,匿名化必须可靠进行,以便在可靠移除任何可能重建个人身份的可能性的同时,保持关键信息的通用性。确保敏感和个人数据得到适当处理,在建立对机器学习模型决策的信任方面起着至关重要的作用。在处理敏感和个人数据时,要保持极度谨慎,以确保你的机器学习项目的长期有效性。

数据和软件许可

特别是在深度学习项目中,需要大量数据来构建高质量的模型。公开数据集的可用性帮助缩短了项目的时间和复杂度,部分消除了收集和标注数据所需的成本和时间。然而,大多数数据集和软件一样,都附带许可证。这些许可证规定了与之相关的数据可以如何使用。对于商业问题的机器学习模型来说,数据许可证最重要的标准是数据是否允许商业使用。由于大多数商业用例被认为是商业用例,因为它们能从中获得利润,所以那些限制商业使用的数据集是无法使用的。比如,所有衍生自**知识共享署名-非商业性(CC-BY-NC)**许可证的数据集,都包含了阻止商业使用的条款。同样,开源软件也给深度学习项目带来了风险。在使用任何公开数据或软件时,一定要仔细核对许可证。使用有禁止商业使用条款的数据或代码进行商业项目,可能会面临罚款或因许可证侵犯而被起诉的风险。

对抗性攻击

当机器学习的应用广泛为人知时,它就会暴露于针对性的攻击,这些攻击意图恶意干扰并操控模型的决策。这就引出了影响已部署深度学习模型的一种攻击,称为对抗性攻击。对抗性攻击是一种通过特定方式操控数据输入来影响机器学习模型预测的攻击类型。最常见的对抗性攻击是由对抗性数据示例引起的,这些示例是从实际输入数据中修改而来,它们看似保持了输入数据的合法性,但却能够扭曲模型的预测。这类攻击的风险级别因用例而异,并取决于用户与系统的交互程度,最终这些数据会传递给机器学习模型。深度学习模型的一个广为人知的对抗性例子是经过优化的图像,看起来像是随机的颜色噪声,并且当它被用来扰动另一图像的像素值时,会通过覆盖其自己的像素值生成对抗性示例。经过扰动后的原始图像从视觉上看似没有任何改变,但却能够产生错误的分类。以下图像展示了这一扰动示例,作为第14章《分析对抗性性能》中的一个教程的一部分。该图展示了一个训练用于分类面部身份的神经网络ResNet50的结果,当给定面部图像时,模型正确预测了身份。然而,当将另一个噪声图像数组与其结合,并且该噪声图像数组是通过仅访问预测类别概率来自动生成的时,模型错误地预测了面部图像的身份,即使组合后的图像在视觉上与原始图像相同:

image.png

理论上,对抗性攻击可以使用任何类型的数据,并不限于图像。随着机器学习用例的风险增高,攻击者更有可能愿意投资研究团队,产生新型的对抗性示例。

一些对抗性示例和生成它们的方法依赖于对深度学习模型本身的访问,以便可以制造针对性的对抗性示例。这意味着,除非攻击者能够访问模型,否则他们不可能成功地干扰别人创建的模型。然而,许多企业使用公开可用的预训练模型并应用迁移学习方法,以减少满足业务用例所需的工作量。任何公开可用的预训练模型也将对攻击者开放,使他们能够为单独的模型构建针对性的对抗性示例。这些预训练模型的示例包括所有公开可用的ImageNet预训练卷积神经网络模型和权重。

那么,我们如何减轻这一风险呢?

我们可以使用的一种方法是用来自公共研究的已知对抗性示例来训练深度学习模型。通过训练这些已知的对抗性示例,模型将在学习过程中学会如何忽略这些对抗性信息,并在验证和推理时不受这些示例的影响。评估对抗性示例的不同变体也有助于设定模型何时会失败的预期。

在本节中,我们深入探讨了处理和消费机器学习数据时的安全问题。在第14章《分析对抗性性能》中,我们将对不同数据模态的对抗性攻击技术进行更深入的实践评估,并讨论如何在深度学习的背景下减轻这些攻击。接下来,我们将深入讨论与模型开发过程核心相关的另一类风险。

过拟合与欠拟合

在模型开发过程中,即训练、验证和测试机器学习模型的过程中,最基础的风险之一是过拟合和欠拟合。

过拟合是指机器学习模型对提供的训练数据集示例和学习到的模式产生过度偏倚,使得它只能区分训练数据集中的示例,而无法区分验证和测试数据集中的任何示例。

欠拟合是指机器学习模型未能捕捉到提供的训练、验证和测试数据集中的任何模式。

学习一个可泛化的模式到输出映射能力是构建有价值和可用机器学习模型的关键。然而,并没有一种万无一失的方法可以达到一个良好拟合的模型,通常它需要在数据准备、模型开发和交付模型洞察阶段之间进行迭代。

以下是防止过拟合并确保泛化的一些建议:

  • 在预期的最终部署条件下增强数据。
  • 收集足够的数据,涵盖你目标标签的每一个可能变体。
  • 与领域专家合作,理解关键指标和模式。
  • 使用交叉验证方法,确保模型在未见数据上得到公正评估。
  • 尽可能使用更简单的神经网络架构。

以下是防止欠拟合的一些建议:

  • 评估多种不同的模型。
  • 与领域专家合作,理解关键指标和模式。
  • 确保数据干净且尽可能低错误。
  • 确保数据足够。
  • 在构建模型时从一小部分数据输入开始,逐步增加更复杂的数据,确保模型能够在数据上适当拟合。

在本节中,我们讨论了在构建模型时遇到的问题。接下来,我们将讨论另一种类型的风险,这种风险会影响在训练后构建的模型。

模型一致性风险

机器学习过程的一个主要特征是它是循环的。模型不断进行重新训练,以期找到更好的设置。这些设置可以是不同的数据分割方法、不同的数据转换方法、不同的模型,或者是同一个模型的不同模型设置。通常,构建的模型需要公平地进行比较。模型一致性是确保可以对不同模型版本和性能指标进行公平比较的一个特征。在获得模型之前的每一个过程都必须保持一致,以确保当任何人尝试使用相同的设置执行相同的过程时,可以得到相同的模型,并且可以复现。我们需要重申的是,即使某些过程在构建模型时需要随机性,它也必须是随机确定性的。这样做是为了确保设置的唯一差异是目标设置,其他一切都不变。

模型一致性不仅仅停留在模型的可复现性上——它还扩展到模型预测的一致性。当使用不同批量大小设置进行预测时,预测结果应当是相同的,相同的数据输入应始终产生相同的预测。模型预测中的不一致性是一个重大警告,表明模型所产生的任何结果都不能代表你在部署时所得到的结果,任何派生的模型洞察都可能是错误的信息。

为了应对模型一致性风险,请确保在可能的情况下通过为随机数生成器设置种子,始终确保代码产生一致的结果。在模型开发阶段,构建模型后,始终手动或自动验证模型的一致性。

模型退化风险

当你构建好一个模型,验证其效果并展示它对业务的影响后,你将其带入模型部署阶段并使其投入使用。一个常见的错误是认为这就是深度学习项目的结束,你可以放手让模型自己运行。遗憾的是,大多数机器学习模型会退化,这取决于你的模型在模型开发阶段对现实世界数据的泛化能力。模型部署后的常见情况是,最初,模型的性能和在部署期间接收到的数据特征保持不变,但随着时间推移,它们会发生变化。时间有可能改变环境条件和世界上的任何事物。机器会变旧,季节会变化,人们也会变化,期望机器学习模型周围的条件和变量发生变化,可以确保模型对业务保持相关性和影响力。

模型如何退化可以分为三类:数据漂移、概念漂移和模型漂移。从概念上讲,漂移可以与船只慢慢偏离理想位置相联系。在机器学习项目中,漂移不是船只偏离,而是数据或模型偏离其最初的预期行为或模式。我们简要了解一下这三种漂移类型。

数据漂移

数据漂移是与模型需要提供预测值的输入数据相关的退化形式。当一个已部署的模型遭遇数据漂移时,意味着在部署过程中接收到的数据不再属于训练和验证时机器学习模型的固有数据分布。如果能在部署过程中使用新的数据来验证模型,数据漂移可能会导致模型验证期间获得的原始期望性能指标发生变化。一个深度学习模型中数据漂移的例子是需要预测户外人类动作的用例。在这个用例中,数据漂移意味着原始数据是在夏季收集的,包含穿着夏季衣物的人们,而随着冬季来临,人们穿上了冬季衣物。

概念漂移

概念漂移是与输入数据与目标输出数据之间交互方式变化相关的退化形式。在规划阶段,领域专家和机器学习从业者会合作定义可能影响目标输出数据的输入变量。这个定义的输入和输出设置随后将用于构建机器学习模型。然而,有时由于数据的可用性或缺乏领域知识,并没有将所有可能影响目标输出数据的上下文作为输入变量。这引入了对缺失上下文条件的依赖,当缺失上下文的条件偏离了训练和验证数据中存在的基础值时,便会发生概念漂移,使得原有的概念变得不相关或发生变化。简单来说,这意味着相同的输入不再映射到训练数据中的相同输出。在深度学习的背景下,我们可以举一个基于文本数据的情感分类用例。假设一个评论或演讲可以根据所处的司法管辖区和文本本身分为负面、中立或正面情感。这意味着在一些司法管辖区,人们对什么是负面、中立或正面有不同的标准,并且评分的方式也不同。仅用文本数据来训练模型将无法准确泛化到不同的司法管辖区,因此每次在另一个司法管辖区部署时,都会面临概念漂移。

模型漂移

模型漂移是与操作指标和易于测量的指标相关的退化形式。模型退化的一些因素可以归类为模型漂移,包括模型延迟、模型吞吐量和模型错误率。与其他两种漂移类型相比,模型漂移指标通常比较容易衡量和跟踪。

减轻这些风险的最佳工作流程之一是跟踪这三种漂移类型下的指标,并为新模型的构建提供清晰的路径,这个过程我称之为“漂移重置”。现在我们已经对模型退化做了简要概述,在第16章《深度学习模型治理》和第17章《在动态环境中有效管理漂移》中,我们将深入讨论这些风险,并实际探讨如何在深度学习的背景下减轻这些风险。

总结

在本章中,你了解了完成一个深度学习项目所需的条件,如何以一种可重复且一致的方式成功完成项目,内容涵盖了中到高级的视角。本章讨论的主题在深度学习生命周期的早期阶段进行了更为全面的结构化,涵盖了规划和数据准备阶段。

在接下来的章节中,我们将更全面地探索生命周期的中后期阶段。这包括数据准备阶段之后的一切内容,涉及模型开发、模型洞察、模型部署,最后是模型治理。

在下一章中,我们将开始更深入地探讨常见且广泛使用的深度学习架构。

进一步阅读

  • Bowen Shi, Wei-Ning Hsu, Abdelrahman Mohamed. Robust Self-Supervised Audio-Visual Speech Recognition, 2022. Toyota Technological Institute at Chicago, Meta AI: arxiv.org/pdf/2201.01….
  • Peng Wang, An Yang, Rui Men, Junyang Lin, Shuai Bai, Zhikang Li, Jianxin Ma, Chang Zhou, Jingren Zhou, Hongxia Yang. Unifying Architectures, Tasks, and Modalities Through a Simple Sequence-to-Sequence Learning Framework. DAMO Academy, Alibaba Group: arxiv.org/pdf/2202.03….