CMU-17-691-机器学习实践笔记-全-

CMU 17-691 机器学习实践笔记(全)

01:课程介绍与背景 🎯

在本节课中,我们将学习这门课程的目标、结构以及机器学习产品化的核心背景。我们将探讨为什么构建一个成功的机器学习产品不仅仅是技术问题,更涉及商业价值、组织考量和用户体验。


课程概述

大家好,我是Isaac,在接下来的七周里,我将担任你们的讲师。我们将讨论“机器学习实践”。这是我第二次教授这门课程。我的一个导师曾说过,第一次教课没人能学到东西,第二次教课老师才能真正掌握内容,第三次学生才能最终学会。所以这是第二次,请多包涵,我们会在过程中做一些调整。去年教这门课非常有趣。

这门课程的目标是让你们在离开时,对构建一个机器学习产品意味着什么有深刻的理解。当我说“实践”时,指的就是这个。我指的不是机器学习的机制或选择不同模型类型,而是如何将机器学习呈现给那些不懂机器学习的人。我们将触及这些领域。

我们会涵盖一些技术内容,并深入探讨产品架构、模型评估时机与方法,以及如何建立系统。但最重要的是,目标是:你是否在为不懂机器学习的人提供价值?

我们将通过多种方式实现这一点。最重要的是,你们将构建自己的产品,并在学期末进行展示。这门课程没有考试,但有作业。作业将支持一些概念,我期望你们在期末产品中融入这些概念。作业是相互关联的,是一个贯穿始终的案例研究,你们将扮演机器学习工程师的角色,为一家企业构建产品。

你们还会看到辅导课。去年我们没有辅导课,今年会有。在辅导课中,我们将介绍在构建产品时有用的工具。因此,你们将通过三种方式学习:构建自己的产品、完成作业、以及通过讲座和辅导课学习相关主题。

此外,我计划只在课堂上讲授一部分内容,大部分时间旨在互动。会有阅读材料,我期望你们在课前完成。我稍后会介绍评分细则,但很大一部分成绩将基于你们在课堂上的参与度。因此,这将比典型的单向授课更具互动性。


今日课程安排

第一节课,我们将介绍关于我的信息、课程目标、背景动机、作业安排、机器学习产品的现状,最后是问答环节。第一节课相对轻松,但希望能为这门课程的实用性做好铺垫。

我获得了斯坦福大学管理科学与工程系的博士学位,我的论文是关于人工智能在网络安全中的应用,特别是使用AI进行预警系统。我不是全职讲师,而是兼职教员。我的全职工作是担任美国陆军人工智能集成中心的首席数据科学家和AI开发总监。在这个职位上,我从事从自动驾驶汽车到用于AI生成技术的大型语言模型等各种产品工作。我还有一些行业经验,在斯坦福期间联合创立了一家风险投资公司,该公司构建了一个用于数据科学和AI开发的工作台。我现在还担任多家初创公司的董事会成员。


课程目的

本课程的目的是涵盖与构建并部署到实际运营中的机器学习系统相关的主题。这类系统有技术要求,包括数据管理、模型开发和部署。然而,也必须考虑业务和组织影响。仅仅构建并部署一个机器学习模型是不够的,你必须证明为此所需的费用和资源是合理的。这是你们从这门课中应该学到的一点:理解其中的权衡。如果你要对基础设施进行大量投资,你能用产品部署后创造的价值来证明这笔投资的合理性吗?我们将在第三部分深入探讨,但我会给你们一些工具来明确地进行这些计算。


相关背景与课程

这里的目标是,我们不仅要关注机器学习技术和方法——这通常是你们在CMU上任何机器学习课程会学到的内容。因为机器学习非常流行,其流行很大程度上是由底层机制驱动的,比如我们关心的神经架构。最近,这涉及到人类反馈的强化学习。在某种程度上,这些都是非常重要的考虑因素。但我们希望确保,在理解模型开发中这些细微的架构考虑时,我们也关注组织层面的考虑。这就是我们要做的。

有一些相关课程,我会在过程中引用。据我所知,去年在CMU,你可以上一门类似的课程——“大规模机器学习与数据科学”,但它会更侧重于计算机科学的产品架构技术层面。然而,关于“你是否在构建一个有用的产品”这种理念,我认为这门课相当独特。还有两门不在CMU的课程,我认为会很相似,我也会引用它们:一门在斯坦福,一门在伯克利。我稍后会谈到我们将使用的书,这本书的作者之一就在斯坦福教授那门课程。因此,你们会在第一次作业中看到这两门课程作为参考,该作业是提出你们计划构建的产品提案。

人们正在做这些事情,只是因为机器学习发展如此之快,提出这类问题还相当新。


学习目标

如果我们在七周后能实现这些目标,我们这个班级就是成功的:

  • 你们能否部署包含机器学习和AI组件的产品?
  • 你们是否理解如何实现支持这些产品的数据管道和数据工程系统?
  • 你们能否以美元为单位,近似计算出机器学习为组织带来的价值?
  • 你们是否理解如何持续评估已部署机器学习系统的价值和品质?

课程结构与评分

小组形式,2到4人一组。我看到有些人已经和认识的人一起来了,所以你们可以自己组队。如果没有现成的小组,我们的助教Herer会帮助你们组建。Canvas上有一个小组讨论区,或者你们可以联系寻找组员。如果有问题,请联系我或Herer,我们会确保你们能加入小组。

课程理念更偏向实践和案例研究,而非理论。我们会在课堂上做一些练习,但通常的方式是:我会进行大约30分钟的讨论,然后你们会以产品小组为单位,讨论当天的阅读材料并给我一个总结,然后我们全班一起讨论这个总结。这通常会持续到下课。

课程时间是周二和周四下午3:30到4:50,辅导课在周三下午5点。我计划亲自到场,但有时我会出差,即便如此我也会坚持上课,只是改为Zoom会议,但我会提前充分通知。去年只有一节课是线上的,但今年可能发生,请注意。辅导课也会通过Zoom录制,时间是周三下午5点,之后会提供录像。我们计划进行现场辅导,但周三不要求必须出席,不过你们会发现这些内容对构建最终要展示的小组产品非常有用。

评分细则如下:

  • 60% 为小组项目成绩。这实际上分为两部分:提案(占成绩的一小部分)和实际的小组展示。小组展示基本上包括两件事:幻灯片演示和产品演示。这就是我期望的所有文档,随着课程进行你们会得到更多指导。
  • 20% 为课堂参与。我期望大家在讨论中积极发言。我的意思是,我知道有些人不喜欢在公开场合讲话,所以除非你们愿意,否则我不会强迫你们发言。但我们会使用一个实时Google幻灯片来记录,就像我们今天要做的那样,随着课堂活动的进行,每个人都要参与。
  • 20% 为作业成绩。有三份作业,如我所说,将是案例研究。
  • 另外一件事是,从下节课开始,我们会指定一名课堂记录员。你们需要为那节课做笔记,然后通过拉取请求将笔记推送到班级的GitHub仓库。


课程资源

班级有一个GitHub站点,描述了课程的分解。我想指出的第一点是,课程有指定教材《Designing Machine Learning Systems》。实际上这本书不是必需的,书中的大部分内容都可以在线找到,但书本是这些在线信息的更成熟版本。它相当便宜,30美元。我有几本副本,如果对你们来说太贵或者不想买,可以借阅。但我强烈推荐购买这本书,它是我们这门课的绝佳资源。当我们布置阅读作业时,会有文章和书中的章节需要阅读。

仓库里还有什么?你们完成作业所需的信息。例如,有一个SQLite数据库和一些数据,用于训练机器学习系统。你们还有去年的所有资料,例如,去年所有课堂记录员的笔记,你们可以进去看看其他人是怎么做笔记的。内容可能会有些许不同,但我们会涵盖很多相同的东西。去年的小组项目展示也在这里,所以如果你们在寻找灵感时好奇想看看,可以浏览。不是每个人都做得很好,所以浏览某些小组项目时需自行判断质量高低。

当你们被指定为记录员时,会进入今年的文件夹。比如被指定负责第二节课的人,我们会提前分配好。你们需要分叉这个仓库,做好笔记,然后通过拉取请求将笔记推回仓库,我们会接受。

整个课程通过Canvas运行。我没有其他系统,我会在这里评分,你们在这里得到反馈,所有作业提交都在这里。我按周设置了模块,每周的模块会变得可用。你们不一定能提前访问后续内容,但能看到主题是什么,只有当前活跃的内容可以访问。这样你们不会因为过早学习而感到不知所措。每周,每节课会有两个模块。例如,“我们在这里做什么”是今天的课,“什么是好的ML产品”是周四的课,随着课程进行,我们还会为辅导课添加内容。

有几件事:小组产品提案作业现在已经发布。当你们组好队后,在28号之前(即两周内)制定提案并提交,从现在到那时任何时间都可以。课堂记录员作业也已发布。另外,如我所说,有一个小组成员讨论区,如果你们在寻找小组,可以来这里与人聊天和联系。


课堂活动与讨论

现在,让我们看看今天要做什么。稍后会有一个环节,我会让你们至少以初步的小组形式进行活动。这是今天要求的阅读材料类型的例子,有四篇文章,我们将在课堂上阅读。然后,你们将进入小组幻灯片,这是一个开放的Google幻灯片文档。在课堂上,你们的小组将复制第一张幻灯片,通过讨论回答这些问题。然后,我们将讨论你们所有人对文章的反馈和想法。

到目前为止有任何问题吗?如果没有,我们来谈谈课程的历史和背景。

我大约一年前整理了这个背景。总的来说,我们是如何达到现在这个地步的?在过去的几年里,我们看到机器学习系统的采用出现了巨大的加速。这其实已经酝酿了一段时间。我专业从事数据科学已经十多年了,刚开始时,大多数数据科学实际上只是应用统计分析,有一点机器学习,但非常不成熟。有趣的是,第一批数据科学家使用R作为编程语言,而现在R成了少数语言,几乎每个人都使用Python或其他变体。但你可以看到,总的来说,这始于很久以前,几百年前,我们看到了早期统计方法的基础,包括贝叶斯和频率主义方法。这些方法后来演变为估计的似然方法。当时,收集数据的能力显然非常有限,早期的数据收集都是手动的。有记录的第一批数据收集,实际上是人类历史与前历史的分界线。历史就是人类收集关于自身数据的程度。我们知道收集的第一批数据是刻在石头上的。快进几千年,我们开始说,如果我们收集数据,我们可以开始回答关于这些数据的有趣问题,从而告诉我们更多关于宇宙的信息。当然,从那里开始演变。随着二战期间图灵机的出现,以及个人电脑的出现,机器学习作为一个学科在1950年代和1960年代开始。这实际上是第一个人工神经网络或感知机发明的时候。神经网络与许多其他当时流行但现在不再那么时髦的技术一起被发明,比如支持向量机,以及其他将模型拟合到数据的方法。然后在2000年左右,数据管理出现了繁荣。这与机器学习和人工智能没有直接关系,但为了进行更大规模的工作,需要访问更多的数据。我想在座的每个人都知道个人电脑和计算能力总体上增长得有多快。同时,我们看到存储数据的成本和产生的数据量显著下降。因此,就目前而言,组织产生PB级的数据并不罕见,例如仅仅作为一个保险公司。而在过去,这是相当罕见的。所以,我们正处于这三件事的汇合点:算法技术、计算能力的扩展以及数据的可用性。这使得这门课程非常及时,因为这些因素正汇聚在一个我们可以构建10年前根本无法构建的产品的时代,这非常令人兴奋。关于我们如何做、为什么做以及什么是好的方法,有很多开放性问题。我想用接下来的几张幻灯片来证明这是一件有用的事情,这三者的结合确实能提供价值,而不仅仅是一种新颖的学术追求。

我想从亚里士多德的一个故事开始。米利都的泰勒斯是个有趣的人。有人听过这样一句话吗:“如果你那么聪明,为什么你不富有?”泰勒斯被一个同时代的人这样说过,并被亚里士多德记录下来流传后世。故事可能是杜撰的,泰勒斯说:“我随时都可以变得富有,我会证明给你看。”于是他去了。根据亚里士多德的记载,他“观察了星象”,然后说:“好吧,今年橄榄会大丰收。”带着从星象中获得的信息,他出去购买了使用他们所在城镇所有橄榄压榨机的期权。到了收获季节,每个人都获得了橄榄大丰收,而拥有所有压榨机使用权的人是泰勒斯。他说:“没问题,你们都可以用,但必须支付很高的溢价。”于是,他从未种过一棵橄榄,却通过“观察星象”赚了一大笔钱。从高层次来看,这实际上就是我希望你们思考的。在我们的世界里,我们收集数据(来自星象的信息),我们开发模型(从数据中产生洞察),然后我们将这种洞察转化为行动。在他的案例中,行动就是购买这些橄榄压榨机的期权。所以,不仅仅是星象的有趣细节,也不仅仅是从星象中获得的洞察,而是整个循环:收集数据、建立洞察,然后将洞察转化为后来可以从中获利的产品,为你自己和组织创造价值。

这是真的吗?也许是杜撰的,你真的能从星象中判断橄榄收成吗?我不知道,我对星象或橄榄了解不多,但因为是亚里士多德说的,我姑且相信。然而,我知道在其他背景下,我们开始看到这种说法的历史回响。弗朗西斯·高尔顿爵士,著名的统计学家,如果你从事任何历史科学,你绝对会遇到他。他除了创造了至今仍在我们的机器学习技术中使用的许多统计基础之外,还有一个有趣的观察。他在英国参加一个活动,有一个猜公牛体重的比赛。我想弗朗西斯·高尔顿爵士那时大概是17、18世纪,一头公牛在当时是宝贵的财产。今天我不知道如果有人给你一头公牛,如果你没有农场,你会用它做什么。但他注意到,在这个过程中数据被收集了,而且这是问题附带产生的。人们猜测公牛的重量,谁猜得最接近谁就得到公牛。所以你有动机去尽量准确地猜测。成千上万的人猜测了这头公牛的重量。他作为统计学家注意到,猜测的平均值非常、非常接近公牛的实际真实重量。为什么会这样?为什么当你收集数据时,数据中包含的信息是数据收集目的之外的?所以,有些信息可以被利用来创造价值,而生成数据的人甚至可能没有意识到。同样,这可能看起来是杜撰的,但让我向你们证明这是真的。NPR做了同样的事情。他们让17,000人猜测一头奶牛的重量。我想他们没有把奶牛送人。但这很有趣,这是猜测的直方图。你可以看到,从18,000人那里,这条实线是1300磅,虚线是1287磅。所以平均猜测值只与实际奶牛重量有很小的偏差。这里很酷的一点是,当我们说要做机器学习时,我们认为这是理所当然的:数据很特别,它包含了你直到探索之前都不知道的信息和洞察。过去几年令人难以置信的是,我们有了越来越好的模型,使我们能够从最初甚至不认为存在的信息中提取越来越有趣的洞察。当然,我们现在看到的许多可用产品都体现了这一点,我们稍后会讨论其中的一些。但你可以看到,这甚至不是深度学习,这只是平均值。所以,如果我们甚至可以从像汇总统计这样的简单方法开始提取洞察,那么用更强大的工具我们能做更多什么呢?

每个人都知道艾伦·图灵。我们离现在更近了一些。所以,我们讲了泰勒斯、弗朗西斯·高尔顿爵士,现在是艾伦·图灵。显然,他是图灵机的发明者,可能是过去一百年最重要的计算机科学家之一,很可能就是最重要的。他对许多至今仍在使用的技术的创造起到了关键作用。他最著名的可能是图灵测试。有人知道图灵测试是什么或者能解释一下吗?很好,区分能力。完全正确。图灵测试是:一个人能否合理地区分他们正在交互的实体是机器还是人?当你无法区分时,就是机器通过图灵测试的时刻。所以它非常模糊。十年前,大多数计算机科学家会告诉你这可能是不可能的。即使在那个时候,数据科学刚刚兴起,现在我会说不仅已经通过了,而且生成能够实现这一点的实体变得微不足道。现在最著名的就是ChatGPT。这里每个人都用过ChatGPT。只用于好的方面,而不是坏的。是的,我相信这个房间里没有人用,但我知道系里收到了一些入学申请文章,肯定是用它生成的,改动不大。让我们来看看。这是一个内置了机器学习的产品的例子,非常流行,用户从零增长到几亿,非常疯狂。显然我们可以问它任何事情。让我们问点有趣的。创建一个教学大纲。好的。我们看看我猜得有多接近。好的,我们不会用任何微积分。但欢迎你们用。好的,我不确定它会写多长,令牌数相当大。但这应该很接近,只是我们不会深入某些细节。然后,实际上它要求我们做的很多事情将是你们已经涵盖的内容。好的,我想这些参考文献都是真实的。有人有这些书吗?我想我有第一本。是的,我不知道Andre在2020年出版了一本书,他写了《100页机器学习书》。Collette是《The Elements of Statistical Learning》的主要作者。好的,很酷。如果我们回到,我想我们实际上大部分模型部署监控、深度学习技术、无监督、监督、数据准备、机器学习,好的,我们很接近了。那么,是什么让这个产品有价值?在你们回答之前,让我给这个问题加点料。每个人都知道Yann LeCun吗?如果你们能看到这个,好的,他当时(我想现在也是)对大家喜欢ChatGPT这件事很生气。这是他的推文:“澄清一下,我不是在批评OpenAI的工作,也不是在批评他们的声明。我是在试图纠正公众和媒体的看法,他们认为ChatGPT是一项极其新颖、创新和独特的技术突破,远远领先于其他人。事实并非如此。”然后Scott Wner(我不认识他,因为这是推特,他可以回复Yann)说:“是的,你们没有发布任何类似的东西。它非常有用。你们一直藏着掖着,这是Meta的问题。”所以Yann现在是Meta的AI负责人。我们可以看到这些互动,因为我们生活的就是这个时代。那么,首先,Yann显然认为Meta在做的事情是等效的。但如果谷歌或Meta想做就能做到,为什么ChatGPT如此有价值?

所以,你可以替换搜索引擎。它更易于访问。它更易于使用。它更易于交互。它更易于集成。它更易于定制。它更易于扩展。它更易于维护。它更易于更新。它更易于改进。它更易于测试。它更易于部署。它更易于监控。它更易于调试。它更易于优化。它更易于安全。它更易于隐私。它更易于合规。它更易于审计。它更易于报告。它更易于分析。它更易于可视化。它更易于解释。它更易于理解。它更易于学习。它更易于教学。它更易于研究。它更易于开发。它更易于创新。它更易于创造。它更易于发明。它更易于发现。它更易于探索。它更易于实验。它更易于验证。它更易于验证。它更易于确认。它更易于证明。它更易于证伪。它更易于反驳。它更易于支持。它更易于反对。它更易于辩论。它更易于讨论。它更易于交流。它更易于沟通。它更易于表达。它更易于描述。它更易于叙述。它更易于讲述。它更易于写作。它更易于阅读。它更易于聆听。它更易于观看。它更易于观察。它更易于感知。它更易于感受。它更易于思考。它更易于推理。它更易于判断。它

02:什么是好的机器学习产品

在本节课中,我们将探讨机器学习在产品和商业环境中的定位,并定义构成一个优秀机器学习产品的关键特征。我们将从基础概念入手,分析不同类型的数据产品,并通过实际案例来理解如何将机器学习有效地整合到产品中,以创造真正的用户价值。

机器学习在上下文中的角色

上一节我们概述了课程的整体结构,本节中我们来看看机器学习在更广泛的数据生态系统中的具体角色。

机器学习是数据产品这一大类中的一个子集。数据产品是指主要通过数据来体现其核心价值的产品。机器学习的作用在于,它并非简单地提供原始数据,而是通过算法从数据中提取洞察或进行预测,并将这些结果作为价值交付给用户。

当我们考虑构建数据产品时,通常存在一个从简单到复杂的演进路径。以下是不同类型数据产品的分类:

  • 描述性产品:这类产品通常处理单一数据流,并以可视化的形式向用户展示“发生了什么”。例如,显示标准普尔500指数历史走势的股票价格图表。
  • 诊断性产品:这类产品整合多个数据流,通过组合信息来讲述一个故事或解释原因。例如,在股票价格图表上叠加相关新闻事件,以解释市场波动的原因。它通常以仪表盘的形式呈现。
  • 预测性产品:这是机器学习的核心领域。产品利用数学模型,基于多个数据流对未来结果进行预测。例如,基于新闻和市场数据预测标准普尔500指数的未来走势。
  • 规范性产品:在预测的基础上,这类产品会进一步给出行动建议。例如,在预测股价下跌后,建议用户卖出或做空股票。
  • 人工智能产品:这是最高级别的自动化,系统基于预测和规则自主做出决策并执行。例如,一个自动执行买卖指令的交易机器人。

随着产品类型从描述性向人工智能演进,计算机承担的计算工作越来越多,产品架构也变得更加复杂。一个优秀的机器学习产品可以位于这个光谱的任何位置,其核心价值在于提供准确且有意义的预测。

核心概念定义

在深入讨论产品特性之前,我们先明确几个基本术语,确保我们在同一层面进行交流。

  • 机器学习:一个研究领域,关注如何让计算机通过经验(即数据)进行学习。
  • 应用机器学习:使用自动化算法,通过预测性、规范性或人工智能产品来交付价值的过程。这涉及到将模型从开发环境部署到生产环境。
  • 人工智能:一个研究领域,关注如何让计算机执行通常需要人类智能才能完成的任务,关键在于赋予计算机做出决策的“代理权”。
  • 深度学习:机器学习的一个分支,利用大规模神经网络和数据集来构建模型,例如当前的大型语言模型。

在机器学习中,我们主要关注以下两种学习范式:

  • 监督学习:这是产品中最常见的形式。我们收集带有标签的历史数据,训练一个模型,然后用该模型对新数据进行预测。随着新标签数据的收集,模型可以持续改进。
  • 无监督学习:虽然不如监督学习常见,但在数据预处理和特征工程中可能发挥作用,以辅助监督学习过程。

优秀产品的关键特征

了解了机器学习的定位和基本范式后,我们现在可以聚焦于构成一个优秀机器学习产品的具体特征。

一个优秀的机器学习产品不仅仅是一个技术先进的模型,它是一个完整的、以用户为中心的解决方案。其核心特征包括:

  • 提供准确且有价值的预测:模型的预测质量必须根据其解决的具体问题来定义。预测必须对用户有实际用处,无论是估计汽车价格、生成图像还是完成文本。
  • 拥有高质量的用户界面:无论底层技术多么复杂,产品必须易于使用,直观地将机器学习的能力交付给用户。良好的用户体验是产品成功的关键。
  • 具备持续改进的能力:产品应能通过用户交互收集新的数据,这些数据可以用来重新训练和优化模型,从而形成一个自我强化的“数据飞轮”或网络效应。产品应随时间推移而变得更好。
  • 架构可靠、可扩展、可维护且适应性强:产品的技术基础必须稳固,能够处理用户增长,易于维护更新,并能适应未来的需求变化。
  • 明确机器学习组件的角色:在产品设计中,需要明确机器学习是核心功能还是辅助功能;是主动提供服务还是响应用户请求;其运作对用户是可见的还是隐形的。

实践中的挑战与平衡

构建机器学习产品并非没有挑战。在实践中,需要在技术理想与工程现实之间取得平衡。

一个经典的例子是Netflix的推荐算法竞赛。Netflix悬赏100万美元征集更好的推荐算法。虽然竞赛产生了精度更高的模型,但最终获奖的复杂方案并未被投入生产。Netflix团队发现,离线评估中额外的精度提升,并不足以证明将其工程化、部署到生产环境所需付出的巨大努力是合理的。

这个案例揭示了机器学习产品化的一个关键原则:一个在理论上精度略高的模型,如果无法被高效、可靠地集成到产品中,那么它对终端用户的价值可能为零。产品的成功取决于预测准确性、工程可行性和用户体验三者的结合。

总结

本节课中,我们一起学习了机器学习在产品开发中的定位。我们明确了机器学习是数据产品的一种高级形式,其核心在于通过预测来交付价值。我们探讨了从描述性到人工智能的数据产品光谱,并定义了机器学习、人工智能等核心概念。最重要的是,我们总结了一个优秀机器学习产品的关键特征:它必须通过准确的预测来提供价值,这些预测需通过高质量的用户界面进行交付,并且产品本身应具备持续学习和改进的能力。记住,最终的成功不在于模型的复杂程度,而在于它是否为用户解决了真实的问题。

03:机器学习项目如何运作

在本节课中,我们将学习一个机器学习项目从构思到部署的完整工作流程。我们将重点探讨数据在其中的核心作用,以及如何将技术工作与商业价值清晰地联系起来。

项目启动与团队协作

在深入技术细节之前,我们需要完成一些准备工作。请确保你的小组已经提交了成员名单。项目提案即将截止,因此团队需要尽快开始沟通与合作。

此外,课程将开始安排课堂笔记记录员。笔记需要涵盖课堂讨论的主题和必读材料的概述,并在下次课前提交。

数据驱动项目的核心

上一节我们介绍了数据驱动项目的概念,本节中我们来看看它在机器学习项目中的具体体现。机器学习项目是数据驱动项目的一个子集,其核心特征是数据

软件开发的范式正在从“软件1.0”向“软件2.0”演进。在“软件2.0”中,代码逻辑越来越多地由数据本身驱动,而非完全由程序员手动编写。这意味着,构建一个成功的机器学习产品,数据质量和数据管道的建设往往比模型架构本身更为关键。

企业利用机器学习解决的问题多种多样,从内容过滤、成本削减到欺诈检测和客户体验优化。无论目标是什么,组织都需要一个清晰的数据战略,即在构建具体模型之前,就系统地规划收集哪些数据、如何收集,并明确这些数据将如何为业务创造价值。

标准项目流程:CRISP-DM

为了系统化地开展数据项目,业界广泛采用一个称为CRISP-DM的标准流程。这是一个迭代循环,包含以下阶段:

  1. 业务理解:明确商业问题和项目目标。
  2. 数据理解:收集并初步探索可用数据。
  3. 数据准备:清洗、转换数据,为建模做准备。
  4. 建模:选择并应用各种建模技术。
  5. 评估:评估模型是否满足业务目标。
  6. 部署:将模型集成到业务环境中。

部署后产生的新数据和反馈,会再次流入“业务理解”阶段,开启新一轮循环。这个自我强化的过程也被称为数据飞轮:更多的用户带来更多的数据,更好的数据训练出更好的模型,更好的模型吸引更多的用户。

简化的工作流程与团队角色

对于本课程的小组项目,我们可以将上述流程简化为三个核心环节及对应的团队角色:

  • 数据收集与管理:负责构建数据管道,获取和整理高质量数据。
  • 建模:负责选择合适的算法,训练、评估和优化预测模型。
  • 用户界面/部署:负责将模型集成到可用的产品中,让用户能够与之交互。

一个成功的初创产品原型,往往就是这三个环节紧密协作的成果。

关键第一步:定义问题与用户探索

整个流程的起点是定义问题。我们将其比喻为“驱散战争迷雾”——通过数据来减少决策中的不确定性。

在技术层面定义问题之前,必须进行用户探索。这是了解真实需求、确保产品能解决实际痛点的唯一途径。

以下是几种有效的用户探索方法:

  • 一对一访谈:与潜在用户深入交流,了解他们的日常工作流程和痛点。
  • 焦点小组:将一组目标用户聚集起来进行讨论。
  • 问卷调查:以更广泛的规模收集用户反馈。
  • 最小可行产品测试:构建一个简单的产品原型,让用户试用并收集反馈。

未能真正理解用户和他们的使用场景,是导致产品失败的最常见原因之一。

数据收集的实践考量

数据是项目的基石。在收集数据时,需要注意:

  • 利用公开数据:许多网站(如雅虎财经)提供API或允许网络爬虫抓取公开数据。这是构建初始数据集的常用方法。
    # 示例:使用 requests 库进行简单的网络请求(需遵守目标网站robots.txt协议)
    import requests
    response = requests.get('https://api.example.com/data')
    data = response.json()
    
  • 遵守规则:务必检查目标网站的robots.txt文件和服务条款,确保爬取行为被允许。
  • 维护成本:基于网络爬虫的数据管道非常脆弱,网站结构的任何改动都可能导致其失效,需要持续维护。
  • 数据标注:对于监督学习,数据标注可能是一项昂贵且耗时的工作,需要在项目规划中提前考虑。

机器学习项目的具体步骤与挑战

将机器学习集成到产品中,通常涉及数据工程、数据科学和软件工程三个部分的协作。一个典型的机器学习项目流程包括:

  1. 问题定义:确认项目解决真实用户问题,并与商业价值挂钩。
  2. 数据收集与标注:获取并准备训练数据。
  3. 模型构建:开发并训练机器学习模型。
  4. 部署与监控:将模型集成到应用中,持续监控其性能并迭代优化。

在这个过程中,团队可能面临诸多挑战:

  • 问题范围过大:试图一次性解决过于复杂的问题。
  • 数据可及性与标注困难:无法获得可靠数据,或标注成本过高。
  • 缺乏支持扩展的架构:原型无法支撑大规模用户访问。
  • 价值主张不匹配:产品与组织的核心战略或用户需求脱节。

总结

本节课中我们一起学习了机器学习项目的完整运作流程。我们认识到,数据驱动项目,尤其是机器学习项目,有其独特的考量。项目的成功始于对商业价值的深刻理解和对用户需求的深入探索。高质量的数据收集与管理是构建有价值预测模型的基石。标准化的流程如CRISP-DM和“数据飞轮”概念,能帮助我们系统化地推进项目并实现持续改进。在接下来的课程中,我们将深入MLOps,学习如何将模型有效地投入生产并维持其长期价值。

04:你真的需要机器学习吗?🤔

在本节课中,我们将学习如何评估一个项目是否真的需要机器学习解决方案。我们将探讨机器学习项目的工作流程、如何选择合适的评估指标,以及一个至关重要的概念——建立性能基线。通过理解这些,你将学会在投入复杂模型之前,先用简单、低成本的方法验证问题的可行性和价值。


项目回顾与工作流程 🔄

上一节我们介绍了机器学习项目的核心组件。现在,我们来回顾一下一个标准机器学习项目的工作流程。

一个典型的机器学习项目包含三个基本组成部分:数据工程数据科学软件工程。在本课程中,我们将主要关注前两者。

项目的工作流程始于一个植根于用户需求的问题。你需要通过用户发现过程来理解如何提供最大价值。流程如下:

  1. 问题定义与用户发现:与潜在用户交流,了解他们的工作流程和痛点。
  2. 数据创建与整理:通过数据管道收集、整理数据,并进行必要的标注。
  3. 模型开发:基于数据构建和训练模型。
  4. 模型部署与监控:将模型投入实际使用,并持续监控其性能。

这个流程是一个良性循环,其有效运行的关键在于持续评估模型产出的价值。如果模型的评估指标不能直接反映其为预期结果创造的价值,你就需要重新思考衡量标准。


评估指标与价值关联 📊

在开始构建模型之前,甚至在决定采用何种架构或方法之前,你应该先思考以下问题。

评估模型质量至关重要,但你必须先定义“质量”如何衡量。这不仅仅是选择一个数学上的损失函数。

例如,在大型语言模型的开发中,最初的训练可能基于复杂的损失函数,但最终的输出效果并不理想。通过引入基于人类反馈的强化学习,让人类评估和调整模型输出,才产生了质的飞跃。这说明,评估指标必须与人类对输出的感知价值相关联。

因此,选择指标时需要考虑:

  • 模型出错的成本:是准确率更重要,还是减少假阳性或假阴性更重要?在商业场景中,总体准确率可能不错,但在自动驾驶场景中,漏检行人(假阴性)的代价是巨大的。
  • 模型对异常值的敏感度:模型如何处理边缘情况?这在计算机视觉等领域仍是挑战。
  • 是否使用了正确的损失函数:损失函数的选择是一门“艺术”,它需要根植于业务逻辑。例如,在回归问题中:
    • 使用普通最小二乘法会更多地受到异常值的影响。
    • 使用最小绝对误差则对异常值不那么敏感。
    • 选择哪种取决于异常值在你的业务场景中的影响程度。

混淆矩阵与常用指标 🧮

大多数人都熟悉混淆矩阵,它帮助我们在真正例、假正例等之间进行权衡。混淆矩阵能很好地指示“出错”的成本。

你可以从混淆矩阵中计算出一些常见指标:

  • 准确率(TP + TN) / (TP + TN + FP + FN)
  • 精确率TP / (TP + FP)
  • 召回率TP / (TP + FN)

以下是三个在同一数据集上训练的不同模型的指标对比示例:

模型 准确率 精确率 召回率
模型A 72% 67% 71%
模型B 80% 75% 73%
模型C 76% 80% 65%

哪个模型最好?这完全取决于模型的应用场景。例如,美国FDA对医疗AI设备的精确率和召回率有最低门槛要求。因此,理解业务背景是选择核心指标的关键。

你也可以组合多个指标,例如使用F1分数(精确率和召回率的调和平均数)、加权平均,或设定行业要求的最低阈值。


基线模型:你的第一个模型 🎯

在定义了问题、收集了一些数据并确定了质量指标后,你需要建立第一个模型——基线模型

基线模型的目标是:以较低的成本和复杂度,快速验证问题的可行性,并为后续改进提供一个比较的基准。它不需要非常复杂,但应足以让你了解要达到目标性能所需的大致努力程度。

建立基线模型有多种方法,以下是一些常见策略:

  • 行业标准或已发表成果:参考现有研究中的性能指标作为目标。但需注意,这些结果有时难以复现。
  • 启发式规则:这是非常重要且常被忽视的方法。向领域专家请教,将他们长期积累的“经验法则”编码成规则。例如,在泰坦尼克号生存预测中,一个简单的启发式规则是:“如果是女性或儿童,则预测生存”。如果你的机器学习模型无法超越这个简单规则,那么你可能根本不需要复杂的ML。
  • 简单的机器学习模型:避免一开始就使用深度学习。尽可能使用决策树等简单方法,只要其API与你未来的架构兼容即可。
  • 自动化机器学习:如果你的问题确实需要深度学习,可以考虑使用AutoML工具来快速生成一个初始架构作为基线,而不是手动设计。

实践:构建启发式基线 👩💻

为了让大家更好地理解如何构建启发式基线,我们将在课堂上进行一个练习。

我们将使用泰坦尼克号数据集。你的任务是:编写一个比“所有女性生存”更好的启发式规则函数,并计算其准确率。

以下是步骤概要:

  1. 从课程代码库的in-class文件夹获取Jupyter笔记本和数据文件。
  2. 在Docker容器中运行笔记本,以确保环境一致。
  3. 修改提供的启发式函数,尝试结合更多特征(如年龄、舱位等级等)来提升预测准确率。
  4. 运行评估代码,查看你的规则性能。

通过这个练习,你会发现,一个精心设计的规则函数可以像机器学习模型一样被调用和评估,这为后续无缝切换到真正的ML模型打下了基础。


自动化机器学习简介 🤖

AutoML旨在自动化机器学习流程中的部分环节,特别是模型架构的搜索和优化,在深度学习领域常被称为神经架构搜索

AutoML通常包含以下几个组件:

  • 数据准备
  • 特征工程
  • 模型生成(架构搜索)
  • 模型评估

对于专家来说,手工设计的模型可能优于AutoML的结果。但对于初学者或需要快速建立基线的情况,AutoML是一个强大的工具。它可以为你提供一个不错的起点,让你无需深入架构细节就能获得一个可工作的模型。

需要注意的是,AutoML也可能引入偏见,或不一定能产生最优的初始架构,因此它更适合作为基线开发的辅助,而非最终解决方案。


总结 📝

本节课我们一起学习了机器学习项目初期评估的关键步骤。

核心要点是:在投入复杂模型之前,务必先建立基线。一个优秀的基线通常始于对业务逻辑的深入理解,并将其编码成启发式规则。通过这种方式,你可以快速、低成本地验证问题的价值,并获得一个性能基准。

只有当简单的规则无法满足需求时,才需要考虑更复杂的机器学习方法。记住,我们的目标是解决问题、提供价值,而不是为了使用机器学习而使用它。

05:工具与基础设施(第二部分)

在本节课中,我们将学习机器学习项目中的团队协作、关键角色以及构建MLOps系统所需的核心工具和基础设施。我们将从MLOps的概述开始,然后探讨常见的团队成员角色、他们的协作方式,最后深入了解构成MLOps技术栈的各个组件。

MLOps概述

上一节我们介绍了机器学习产品的基础概念。现在,我们来看看如何持续改进这些产品,这个过程就是MLOps。

MLOps是DevOps方法论在机器学习领域的扩展。它将机器学习与数据科学资产视为DevOps生态中的一等公民。DevOps是一套结合软件开发(Dev)与IT运维(Ops)的实践,旨在缩短系统开发生命周期,实现高质量的持续交付。

在MLOps中,这个循环的核心机制围绕机器学习展开:收集新数据、模型训练与质量评估、验证、部署以及通过反馈进行监控。这个基本流程构成了一个“数据飞轮”,是大多数生产级机器学习应用的工作方式。

团队角色与协作

要成功运行一个MLOps项目,需要不同角色的团队成员紧密合作。以下是您可能会遇到的关键角色:

数据所有者与管理者

  • 首席信息官(CIO):负责组织内的整体技术战略、数据生态系统,并确保符合法律和伦理标准。他们通常是数据的最终所有者。
  • 首席数据官(CDO):通常隶属于CIO,专门负责数据聚合、管理策略以及数据访问与安全合规。
  • 系统所有者:负责维护特定业务系统(如CRM、ERP)的人员。您需要从他们那里获取数据访问权限,并确保您的操作不会影响其系统性能。
  • 产品经理:通常是MLOps项目的日常负责人,负责与用户沟通、确保产品提供价值,并领导产品开发过程。

数据使用者与构建者

  • 数据工程师:构建和维护数据管理系统(如数据库、数据仓库)和数据管道。他们通常精通Java和Python。
  • 数据库管理员(DBA):管理和维护大型关系数据库系统,控制数据访问权限。
  • 数据分析师:通过商业智能工具(如Tableau)查询和分析数据,为业务问题提供洞察。他们是了解数据细节的重要资源。
  • 数据科学家:通常拥有统计学背景,专注于通过统计建模和假设检验提供决策支持,产出多为分析报告或一次性模型。
  • 机器学习工程师:设计与构建可投入生产的机器学习模型以解决业务挑战。目标是自动化预测过程,并将其集成到软件产品中。他们更侧重于模型的工程化、部署和持续迭代。

软件开发者

负责构建和部署最终应用程序(如网站、移动应用)。优秀的软件开发者、机器学习工程师和数据工程师的组合是打造出色产品的关键。

机器学习项目的协作工具

由于机器学习项目的工作流程(如探索性、实验性)与传统软件开发不同,其协作工具也存在差异。

以下是机器学习项目中常用的协作工具:

  • Jupyter Notebooks与版本控制:机器学习开发主要在Jupyter Notebook中进行,但Notebook文件(JSON格式)与传统的Git版本控制系统配合不佳。nbdiff 等工具可以帮助更好地对Notebook进行版本控制。
  • 数据版本控制:模型性能依赖于训练数据,因此对数据集进行版本管理至关重要。DVC(Data Version Control) 是一个流行工具,它像管理代码一样管理数据和模型文件,跟踪数据集的变更历史。
  • 一体化协作平台DAGsHub 是一个专为机器学习项目设计的协作平台,集成了Git、DVC、实验跟踪和模型注册等功能,类似于“机器学习版的GitHub”。

MLOps基础设施栈

机器学习系统不仅包含模型代码,还需要大量支持性组件。一个典型的MLOps技术栈可以分为三大领域:数据管理、模型开发和软件部署。

以下是一个基础的基础设施栈框架,您需要为您的产品决定每个框内的具体技术选型:

基础设施层
├── 计算资源(云服务器、容器编排)
├── 存储资源(对象存储、数据库)
└── 网络与安全

平台与服务层
├── 数据工程
│   ├── 数据管道编排(如 Apache Airflow)
│   ├── 数据处理(如 Spark, dbt)
│   └── 数据仓库/湖(如 Snowflake, BigQuery)
├── 模型开发
│   ├── 开发环境(如 JupyterLab, VS Code)
│   ├── 实验跟踪(如 MLflow, Weights & Biases)
│   └── 特征存储(如 Feast)
└── 软件部署
    ├── 持续集成/持续部署(CI/CD,如 GitHub Actions, Jenkins)
    ├── 模型服务(如 TensorFlow Serving, TorchServe)
    └── 监控与日志(如 Prometheus, Grafana)
应用层
├── 数据标注工具
├── 模型监控仪表盘
└── 最终用户应用程序

在数据工程领域,关键的组件包括:

  • 数据源(Sensors):API、数据库、日志文件等。
  • 数据管道:负责数据提取、转换和加载(ETL)的任务序列。
  • 管道编排:调度和监控数据管道(例如使用Apache Airflow)。
  • 数据存储:存储原始和处理后数据的地方(数据湖、数据仓库)。
  • 数据版本控制:管理数据集和模型的版本。

总结

本节课我们一起学习了构建和维护生产级机器学习系统所需的人员、流程和工具。我们了解到MLOps是实现机器学习模型持续改进的工程实践,它需要数据工程师、机器学习工程师和软件开发者等多个角色的协作。由于机器学习项目的特殊性,我们需要使用像DVC、nbdiff和DAGsHub这样的专门工具来管理代码、数据和实验。最后,我们介绍了一个结构化的MLOps基础设施栈,它涵盖了从数据管理到模型部署和监控的所有关键环节,为您设计和规划自己的机器学习系统提供了清晰的蓝图。

06:模型部署与监控

在本节课中,我们将学习机器学习模型部署与监控的核心概念。我们将回顾MLOps技术栈,并深入探讨如何将训练好的模型转化为实际产品,以及如何持续监控其性能。

MLOps技术栈回顾与课程安排

上一节我们介绍了MLOps的基本流程。本节中,我们来看看本周的具体安排和课程背景。

首先,关于辅导课安排:

  • 周三下午进行了一次关于封装常见API的Docker容器的辅导课。
  • 应学生要求,计划在下周三增加一次关于迁移学习和使用PyTorch训练自定义模型的辅导课。

其次,关于课程作业与项目:

  • 第一个个人作业将于下周二截止。
  • 项目提案已收到,将在作业截止前提供反馈。反馈重点在于项目范围是否合理,是否涵盖了数据收集、数据飞轮、价值主张和客户定义等已学主题。
  • 后续将有一个非计分的最终项目检查点。

模型部署:策略与架构

在机器学习工程流程中,我们将工作分解为数据工程、数据科学和软件开发三部分。部署与监控是独特的MLOps环节,它关乎将模型打包并投入产品,同时获取反馈。不同的架构选择会影响成本和性能。

以下是主要的模型部署策略:

1. 批量预测
在这种策略中,模型会预先计算所有可能的预测结果并存入数据库。当用户请求时,应用只需进行快速的数据库查询。

  • 公式预测 = 查询(数据库[预计算表])
  • 优点: 用户体验快,推理时间与用户请求分离。
  • 缺点: 仅适用于可穷举的、有限的预测场景(如Zillow房价估算)。
  • 适用场景: MVP产品初期,用户选项有限。

2. 实时推理(模型在服务器端)
当无法预先计算所有预测时,需要实时推理。最常见的方式是将模型作为应用服务的一部分部署在服务器上。

  • 代码(概念): 客户端请求 -> 应用服务器 -> 模型服务 -> 返回预测
  • 优点: 灵活,可处理动态、无限的预测请求。
  • 缺点: 基础设施和管理成本高,模型故障可能影响整个应用(如ChatGPT服务中断)。

3. 模型即服务
这种策略将模型解耦为一个独立的服务,通过API与主应用通信。它可能由独立的团队维护,并可被多个应用调用。

  • 优点: 易于扩展,技术栈独立,类似OpenAI API的工作方式。
  • 缺点: 依赖第三方或需自行维护完整服务,在中小规模下可能优势不明显。

4. 边缘部署
将模型直接部署在终端设备上,如手机或物联网设备。

  • 优点: 低延迟,隐私性好,可离线工作。
  • 缺点: 受设备硬件限制,模型通常需要优化和剪裁,可能损失精度。
  • 常用工具
    • TensorFlow Lite / PyTorch Mobile: 用于移动端的优化框架。
    • Core ML: 苹果的机器学习框架,便于在iOS生态中集成。
    • NVIDIA Jetson: 用于自主开发IoT设备的开发套件。

部署技术实践

从“拥有一个模型”到“部署一个模型”是关键的软件化步骤。当前最主流的方式是将模型封装为微服务。

主流方法:容器化微服务

  1. 使用 Flask/FastAPI 编写模型服务API。
  2. 使用 Docker 将API和模型打包成容器。
  3. 使用 Kubernetes 等工具管理容器编排。
  4. 这种方法在可维护性和可靠性上表现很好,覆盖了95%以上的实际应用场景。

模型格式标准化
为了便于移植和部署,常将不同框架的模型转换为通用格式。

  • ONNX 是当前最流行的开放模型格式。
  • 代码(概念): PyTorch/TensorFlow模型 -> 导出为ONNX格式 -> 封装至Docker容器 -> 部署

模型监控

模型部署后,其性能可能不符合预期,因此监控至关重要。核心问题是数据漂移,即输入数据分布随时间发生显著变化。

漂移的类型

  • 瞬时漂移: 部署后性能立即变化,表明训练与生产环境存在根本差异。
  • 渐进漂移: 性能随时间缓慢下降,表明环境持续变化,需调整重训练策略。
  • 周期性漂移: 性能周期性变化(如昼夜、性别差异),提示数据收集存在盲区。
  • 临时漂移: 由系统突发冲击(如事故、活动)导致,属罕见事件。

监控内容与难度
监控的深度和广度需要权衡:

  1. 模型指标: 准确率、精确率等。需要详细日志,测量成本较高。
  2. 业务指标: 用户留存、转化率等。通常为聚合数据,较易测量。
  3. 特征分布: 检测输入数据漂移。可通过统计抽样进行,成本适中。
  4. 系统性能: API响应延迟、吞吐量。非常容易测量。

漂移检测方法
检测漂移本质上是统计假设检验。

  1. 可视化检查: 直接观察分布图表。
  2. 配对T检验: 比较两个时间窗口数据的均值差异。推荐使用。
  3. K-S检验: 比较两个分布的整体差异。
  4. 距离度量: 计算分布间的距离(如p-范数)。

实施监控
在将模型打包为服务时,必须内置日志记录功能,用于收集预测结果、输入特征和性能指标。工具如 MLflow 能自动化此过程。

课堂练习总结

在小组讨论中,我们探讨了以下核心见解:

关于部署

  • 部署前需明确目标、受众和方式(全量/部分更新)。
  • 在批量预测与在线预测间权衡:批量预测适合结果可延迟、请求可枚举的场景(如Netflix推荐);在线预测适合实时性要求高、请求动态的场景,但成本更高。
  • 发布策略应与监控指标(如性能衰减阈值)联动,以触发重训练。

关于监控

  • 监控旨在确保模型持续表现符合预期,并预警数据漂移。
  • 除了监控模型性能,还需监控数据管道的完整性,防止上游数据异常导致模型失效。
  • 自动化监控和部署管道便于快速回滚。
  • 监控可触发模型重训练,例如当收集到大量新标注数据时,可通过影子部署先测试新模型性能。

关于权衡

  • 在线预测虽灵活,但会引入无法预先审查所有输出的风险,可能导致模型产生意外行为。
  • 边缘部署需在模型复杂度、精度与设备资源间取得平衡。
  • 成本是关键的权衡因素,需确保产品运营成本可控。

总结

本节课中我们一起学习了机器学习模型部署与监控的全过程。

我们首先回顾了部署在MLOps流程中的位置,然后深入探讨了多种部署策略:从批量预测实时推理模型即服务边缘部署,并分析了各自的优缺点和适用场景。我们了解到,将模型容器化为微服务是当前最主流的实践方式。

接着,我们强调了模型监控的重要性。模型性能在部署后可能因数据漂移而下降。我们学习了漂移的几种类型(瞬时、渐进、周期性、临时)以及如何通过统计方法(如T检验、K-S检验)进行检测。监控内容涵盖模型指标、业务指标、特征分布和系统性能,需要根据产品需求进行权衡和实施。

最后,通过课堂讨论,我们整合了这些概念,思考了在实际产品中如何根据需求选择部署方案、建立监控体系,并管理相关的成本与风险。记住,部署不是终点,而是一个通过持续监控和迭代来维持模型价值的开始。

07:测试与可解释性(第二部分) 🧪

在本节课中,我们将继续探讨机器学习运维(MLOps)栈中的关键环节:测试与可解释性。我们将了解为什么模型的可解释性至关重要,以及如何构建有效的测试策略来确保模型在生产环境中的可靠行为。


概述 📋

上一节我们介绍了可解释性的基本概念及其重要性。本节中,我们将深入探讨可解释性模型与黑盒模型的区别,并学习如何为机器学习系统设计全面的测试方案。


可解释性模型与黑盒模型

机器学习模型在可解释性上存在一个明显的二分法。一些经典模型在设计之初就考虑了可解释性,而许多现代复杂模型则更像“黑盒”。

可解释模型的特点

以下是可解释模型通常具备的几个特征:

  • 线性:模型系数与输出成比例。例如,线性回归模型 y = β₀ + β₁x₁ + ... + βₙxₙ 中,系数 βᵢ 直接反映了特征 xᵢ 对输出 y 的影响。
  • 单调性:模型系数变化方向一致。这意味着特征值增加,预测输出总是朝同一个方向变化。
  • 可包含特征交互:模型可以轻松地纳入并解释特征之间的相互作用。

最常见的可解释模型包括线性回归、逻辑回归和决策树。它们允许我们直接理解模型做出决策的依据。

黑盒模型与可解释性挑战

诸如集成方法(随机森林、梯度提升)和深度神经网络等模型,虽然通常具有更强的预测能力,但其内部工作机制难以直接理解。这就是所谓的“黑盒”问题。

当模型应用于自动驾驶、医疗诊断或司法系统等高风险领域时,仅仅知道模型“表现良好”是不够的。我们必须能够解释为什么模型会做出某个特定决策,这既是监管要求,也是建立用户信任和排查模型缺陷(如数据偏见)的关键。

为了解决黑盒模型的可解释性问题,研究者们开发了多种事后(Post-hoc)解释方法。这些方法在模型训练完成后,通过分析其输入输出来推断其行为逻辑。


可解释性方法的分类

在应用事后解释方法时,需要考虑几个关键维度:

  • 模型特定 vs. 模型无关:有些方法只适用于特定类型的模型(如针对神经网络的激活最大化),而另一些(如LIME、SHAP)则可以应用于任何黑盒模型。
  • 全局解释 vs. 局部解释:这是最重要的区分之一。
    • 全局解释旨在描述模型的整体行为,例如哪些特征对模型的预测总体上最重要。这有助于理解模型的平均表现。
    • 局部解释则关注单个预测实例,解释模型为何对某个特定输入做出特定输出。这对于调试边缘案例或向用户解释某个具体决策至关重要。

一个常见的例子是,在医疗诊断中,我们可能既需要全局解释来了解模型整体上依赖哪些指标,也需要局部解释来向一位特定患者说明其诊断结果的依据。


机器学习测试策略

测试是确保机器学习系统在生产环境中可靠、安全运行的另一支柱。与测试传统软件不同,机器学习测试需要覆盖数据、模型和代码三个层面。

测试内容

以下是构建测试方案时需要考虑的核心方面:

  • 数据测试:确保输入数据的格式、质量和分布符合预期。这包括检查数据漂移,防止模型因输入数据变化而性能下降。
  • 模型测试:验证模型本身的行为。
    • 功能测试:模型在常见输入下是否产生预期输出?
    • 行为测试:模型在极端或特殊情况下是否表现合理?
    • 边缘案例测试:专门测试模型决策边界附近的情况,这是发现模型弱点的关键。
  • 代码/集成测试:确保将模型集成到整个应用系统后,代码逻辑正确,API调用正常。

测试时机

测试应贯穿机器学习系统的整个生命周期:

  • 开发与实验阶段:采用类似测试驱动开发(TDD)的理念,在模型迭代过程中持续验证。自动化实验跟踪工具(如MLflow)在此阶段非常有用。
  • 部署阶段
    • A/B测试:比较新模型与旧模型的实际表现。
    • 金丝雀发布:将新模型先部署给一小部分用户,观察效果。
    • 影子部署:让新模型并行处理生产流量,但其预测结果不影响实际业务,仅用于对比验证。

总结 🎯

本节课我们一起学习了机器学习中测试与可解释性的核心概念。

我们认识到,模型的可解释性并非“锦上添花”,而是在许多高风险或受监管应用中的必需品。根据需求选择可解释模型或为黑盒模型配备事后解释工具,是系统设计的重要决策。

同时,健全的测试策略是模型可靠性的基石。我们需要超越传统的代码测试,构建覆盖数据、模型推断和系统集成的端到端测试框架,并在开发、部署和监控的全周期中贯彻测试实践。

将可解释性与测试相结合,不仅能提升模型性能、规避风险,更是构建可信、负责任的人工智能系统的关键步骤。

08:Docker 容器化入门教程 🐳

在本节课中,我们将要学习 Docker 的基础知识,并了解如何将一个机器学习模型打包成容器化的服务。我们将从 Docker 的核心概念讲起,然后通过一个具体的例子,演示如何将一个训练好的模型封装为可通过 API 访问的 Web 服务。


概述:什么是 Docker 及其优势

Docker 是一种容器化技术,它允许你将应用程序及其所有依赖项打包到一个标准化的单元中,这个单元称为容器。与传统的虚拟机相比,容器更加轻量、高效和灵活。

上一节我们介绍了 Docker 的基本概念,本节中我们来看看它与虚拟机的区别以及其核心优势。

容器 vs. 虚拟机

虚拟机通过虚拟机监控程序在物理硬件上模拟出完整的操作系统环境。每个虚拟机都预先分配了固定的计算资源(如 CPU、内存、存储),这导致了资源利用缺乏灵活性。

相比之下,容器共享宿主机的操作系统内核,将应用程序及其依赖打包成一个独立的进程。容器只在需要时才动态地使用资源,就像你电脑上同时运行的多个应用程序一样,这使得资源利用效率更高。

对于机器学习应用来说,这种灵活性至关重要。你的模型服务可能在不同时间需要不同的计算资源,容器化可以确保前端应用不会因模型推理的资源消耗而变慢,同时避免在模型空闲时过度分配资源。

Docker 的核心优势

以下是使用 Docker 容器化应用的主要好处:

  • 标准化:Docker 容器提供了一致的运行时环境,确保应用在任何支持 Docker 的平台上都能以相同的方式运行。
  • 轻量级:容器只包含运行应用所必需的组件,没有传统操作系统的冗余,因此体积更小,启动更快。
  • 可移植性:容器解决了“在我机器上能运行”的经典问题。你可以在本地开发环境构建容器,然后轻松地将其部署到云端服务器,只要目标环境有 Docker 运行时,应用就能一致地工作。
  • 可复现性:通过一个名为 Dockerfile 的声明式文件来定义如何构建容器。这确保了构建过程是可重复和可追溯的。

实践:将机器学习模型容器化

理解了 Docker 的优势后,我们通过一个具体项目来学习如何操作。我们将把一个基于泰坦尼克号数据集训练的随机森林模型,打包成一个可通过 HTTP API 提供预测服务的 Docker 容器。

第一步:准备模型与 Web 服务

首先,我们需要一个训练好的机器学习模型和一个简单的 Web 服务来包装它。

  1. 训练并保存模型:我们使用 Scikit-learn 训练一个随机森林分类器,并将训练好的模型对象保存为文件(例如使用 pickle 库)。生成的模型文件(如 model.pkl)包含了所有学习到的参数。

    import pickle
    # 假设 clf 是已训练好的模型
    with open('model.pkl', 'wb') as f:
        pickle.dump(clf, f)
    
  2. 创建 Flask Web 应用:我们使用 Flask 框架创建一个简单的 Web 服务。这个服务主要提供一个 /predict 端点,当收到 POST 请求时,它会加载保存的模型,对传入的数据进行预测,并返回结果。

    from flask import Flask, request, jsonify
    import pickle
    
    app = Flask(__name__)
    model = pickle.load(open('model.pkl', 'rb'))
    
    @app.route('/predict', methods=['POST'])
    def predict():
        data = request.get_json()
        prediction = model.predict([data['features']])
        return jsonify({'prediction': int(prediction[0])})
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8080)
    

第二步:编写 Dockerfile

Dockerfile 是一个文本文件,包含了一系列指令,用于告诉 Docker 如何构建我们的容器镜像。

以下是本例的 Dockerfile 内容:

# 使用官方的轻量级 Python 镜像作为基础
FROM python:3.8-slim

# 在容器内设置工作目录
WORKDIR /app

# 将当前目录的所有文件复制到容器的 /app 目录下
COPY . /app

# 安装 Python 依赖包
RUN pip install --no-cache-dir -r requirements.txt

# 声明容器运行时监听的端口
EXPOSE 8080

# 定义容器启动时执行的命令
CMD ["python", "app.py"]

其中,requirements.txt 文件列出了所有必需的 Python 包,例如 flask, scikit-learn, pandas 等。

第三步:构建与运行容器

有了 Dockerfile 和应用程序代码,我们就可以构建 Docker 镜像并运行容器了。

  1. 构建镜像:在包含 Dockerfile 的目录下执行以下命令。-t 参数用于给镜像命名和打标签。

    docker build -t ml-api:latest .
    
  2. 运行容器:基于构建好的镜像启动一个容器实例。-p 参数将宿主机的 8080 端口映射到容器的 8080 端口,这样我们就可以从外部访问服务。

    docker run -p 8080:8080 ml-api:latest
    

  1. 测试 API:容器运行后,我们的机器学习服务就已经在后台启动了。我们可以使用 curl 或其他 HTTP 客户端工具来测试预测接口。
    curl -X POST http://localhost:8080/predict \
         -H "Content-Type: application/json" \
         -d '{"features": [1, 0, 25, 0, 0, 10]}'
    
    服务将返回一个 JSON 响应,包含模型的预测结果。

总结

本节课中我们一起学习了 Docker 在机器学习实践中的基础应用。我们首先了解了容器化技术相较于虚拟机的优势:更高的资源利用效率和灵活性。接着,我们通过一个端到端的示例,演示了如何将一个机器学习模型(随机森林分类器)与一个轻量级 Web 框架(Flask)结合,并通过编写 Dockerfile 将其打包成一个独立的、可移植的容器。

最终,我们得到了一个封装完整的机器学习微服务。这个服务可以在任何安装了 Docker 的环境中运行,确保了开发、测试和生产环境的一致性,为集成到更大型的应用程序架构中打下了坚实的基础。在接下来的课程中,我们将探索如何使用 Docker 来构建更复杂的数据流水线和服务编排。

09:使用 Docker Compose 编排 Airflow 数据管道

在本节课中,我们将学习如何使用 Docker Compose 来编排多个 Docker 容器,并部署一个名为 Airflow 的流行数据管道管理工具。我们将从 Docker 的单容器概念扩展到多容器应用,理解微服务架构如何帮助管理和监控复杂的机器学习数据工作流。

概述

上一节我们介绍了 Docker 容器的基础知识。本节中,我们来看看如何将多个容器组合成一个协同工作的应用程序,这个过程称为容器编排。我们将以 Apache Airflow 为例,这是一个用于编排、调度和监控批处理工作流的开源平台,在数据工程和机器学习项目中非常常见。

从 Docker 到 Docker Compose

Docker 容器代表了应用程序中的独立组件。当多个组件需要协同工作时,我们就需要容器编排。Docker Compose 是一个工具,允许我们使用一个 YAML 配置文件来定义和运行多个 Docker 容器,使它们能够像单个应用程序一样相互通信。

以下是 Docker Compose 的核心概念,通过一个 YAML 配置文件来定义:

version: '3'
services:
  webserver:
    image: apache/airflow:latest
    ports:
      - "8080:8080"
  postgres:
    image: postgres:13

为什么使用 Airflow 作为微服务框架

将 Airflow 部署为微服务框架有几个关键优势。首先,它具有模块化特性,便于分离关注点和独立监控各个数据管道。其次,这种架构便于快速识别和修复故障。最后,它保证了可复现性,因为所有管道都通过代码定义,变更可以通过 Git 追踪。

部署 Airflow 实例

现在,让我们动手部署一个 Airflow 实例。这个过程涉及下载配置文件、初始化环境并启动多个容器。

首先,我们需要准备工作目录和必要的文件夹结构。以下是需要执行的步骤:

  1. 创建一个项目目录。
  2. 在该目录下创建 dagslogsplugins 文件夹。
  3. 下载官方的 Docker Compose YAML 配置文件。

准备工作完成后,在包含 docker-compose.yaml 文件的目录中执行以下命令即可启动所有服务:

docker-compose up

此命令会读取 YAML 文件,拉取所需的镜像(如果本地没有),并启动定义的所有容器(如 PostgreSQL 数据库、Redis、Airflow 网页服务器、调度器等)。启动后,我们可以通过浏览器访问 localhost:8080 来打开 Airflow 的 Web 界面。

理解 Airflow 的核心:DAG

在 Airflow 中,工作流被定义为有向无环图。一个 DAG 包含一系列任务及其依赖关系,决定了任务的执行顺序。

在 Airflow 的 Web 界面中,我们可以查看、触发和监控 DAG 的运行状态。每个任务的状态会以不同颜色高亮显示(例如,深绿色代表成功)。我们可以点击任务来查看其详细日志,了解执行过程和输出。

创建和运行自定义 DAG

DAG 使用 Python 代码定义,这使得它非常灵活。我们可以创建一个简单的 DAG 来演示如何从外部 API 获取数据。

以下是一个示例 DAG 的 Python 代码框架,它定义了两个任务:

from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
import requests
import json

def fetch_cat_fact():
    response = requests.get("https://catfact.ninja/fact")
    data = response.json()
    print(f"Cat Fact: {data['fact']}")

def fetch_current_time():
    response = requests.get("http://worldtimeapi.org/api/timezone/Etc/UTC")
    data = response.json()
    print(f"Current UTC time: {data['datetime']}")

![](https://github.com/OpenDocCN/dsai-notes-pt2-zh/raw/master/docs/cmu-17691-mlprac/img/ce38838bd1264b152b88a78816a035e9_28.png)

# 定义DAG
with DAG('my_sample_dag', start_date=datetime(2023, 1, 1), schedule_interval=None) as dag:
    task1 = PythonOperator(task_id='run_this_first', python_callable=fetch_cat_fact)
    task2 = PythonOperator(task_id='run_this_last', python_callable=fetch_current_time)

    task1 >> task2  # 设置任务依赖关系

将写好的 Python 文件放入 dags 文件夹,Airflow 会自动加载它。我们可以在 Web 界面上找到对应的 DAG,手动触发它,并观察任务的执行顺序和日志输出。

管理依赖:扩展 Airflow 镜像

有时我们的 DAG 可能需要额外的 Python 库(如 pandas, scikit-learn),而基础 Airflow 镜像并未包含。这时,我们需要通过创建自定义 Docker 镜像来添加依赖。

首先,我们需要创建一个 Dockerfile 来扩展基础镜像。以下是一个安装 scikit-learn 的示例:

FROM apache/airflow:latest
USER root
RUN pip install --no-cache-dir scikit-learn
USER airflow

接着,需要修改 docker-compose.yaml 文件,将服务指向我们要构建的镜像,而不是直接使用远程镜像。主要修改 buildimage 配置项。

修改完成后,按顺序执行以下命令来重建镜像并重启服务:

docker-compose down
docker-compose build
docker-compose up

重启后,新的容器就包含了我们所需的额外依赖库,可以在 DAG 中自由使用了。

总结

本节课中我们一起学习了容器编排的核心概念。我们使用 Docker Compose 工具部署了一个多服务的 Apache Airflow 应用。我们了解了 Airflow 如何通过 DAG 来定义、调度和监控数据管道,并实践了创建自定义 DAG 和扩展 Airflow 镜像以满足特定项目需求的方法。掌握这些工具对于构建可维护、可监控的机器学习数据流水线至关重要。

posted @ 2026-03-26 01:39  绝不原创的飞龙  阅读(1)  评论(0)    收藏  举报