机器学习面试指南-全-

机器学*面试指南(全)

原文:zh.annas-archive.org/md5/0196a1bf428a6d928bc44b2ad6530c27

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

无论我们是否意识到,机器学*(ML)都是我们日常生活中不可或缺的一部分。每当你访问像 YouTube 和 Amazon.com 这样的网站时,你都在与机器学*互动,这些算法为你提供个性化推荐。这意味着网站上产品的展示方式是基于机器学*算法认为适合你的口味和兴趣。不仅如此,还有基于 ML 的评论审核来标记垃圾评论或有害评论,评论审核等等。在 YouTube 等网站上,还有 ML 生成的字幕和翻译。

机器学*(ML)也存在于我们生活的多个方面,超出了购物和娱乐的范畴。例如,当你在线进行资金转账时,机器学*算法正在检查是否存在欺诈行为。我们生活在一个以数据和机器学*算法为基础构建软件的时代。

所有这些软件都需要专业的人才来设计和构建,这导致了对软件技能的需求增加,并在*年来提升了机器学*职业的地位。技术角色的薪酬也因此提高。这些只是使机器学*职业变得诱人的众多因素之一:构建对我们生活如此重要的产品和产品特性。由于机器学*技术推动了人工智能的进步,这个讨论同样适用于“人工智能职业”。

然而,进入机器学*领域是具有挑战性的。机器学*工作因其要求更高的学术证书而闻名,2010 年代的大多数工作都要求拥有博士学位。即使自 2010 年代后期以来,招聘广告上的资格要求已经降低,但我在网上仍经常看到的建议是至少要有硕士学位。即使拥有丰富的资历,也可能会在数据和机器学*领域找不到合适的角色。网上给出的建议是错误的吗?还是过于概括和模糊?

我已经参加了多次机器学*工作的面试,不论是初级、高级还是专家级别¹和主管级别²。在整个过程中,我第一手经历了那些渴望在机器学*面试中获得成功的候选人所遇到的困难和挫折。我不停地投递简历,却很少收到回复。我在电话面试中失败,经历了焦虑等待回复的时刻,甚至在他们从多伦多把我飞到旧金山后,在现场面试中也失败了。我申请了数据科学家和机器学*工程师(MLE)的工作,却感到困惑,因为面试官似乎更希望找到数据工程师或数据分析师。

除了我作为面试者的经验外,我还作为面试官积累了多年的经验。作为机器学*领域工作的一部分,我审查和筛选了数百份简历,进行了大量的面试,并在许多决策委员会中任职。作为技术领导(在两家公司担任首席级别),我审查了工作描述,并面试了实*生、初级候选人以及资深和高级别聘用者。本书包含了一些基于面试候选人犯的错误的提示,这些错误导致我和其他面试官决定不将其推进下一轮面试。“如果候选人当时做了另一件事情就好了,”我们会说。“除此之外,他们的表现相当有前途。”这本书将帮助你避免一些明显的错误。

事实是,对于求职者来说有很多未明示的标准。例如,良好的沟通和团队合作能力可能不会在一些职位描述中列出。这些期望之所以未被列入职位描述,不是因为恶意,而是因为行业内人士将其视为最低要求。我最*看到一些主要公司的机器学*职位招聘明确将“沟通能力”置于要求清单的最顶端,试图改善职位描述的清晰度。

除了这些对新老求职者都适用的潜在期望外,面试过程可能会令人困惑,因为它在角色和公司之间差异很大。即使是在 Google 从事数据工作多年的作家 Randy Au,在好奇心驱使下查看当前的数据科学家和机器学*职位招聘时也表示,“情况有所不同”³。

许多人希望有一份路线图,一套确保能够进入机器学*领域的详细步骤。例如,最佳的大学专业和实*机会是什么?最好的副业项目是什么?应该学*哪些 Python 库?我能理解这一点 —— 在求职面试的过程中,我询问了许多朋友,尽可能多地获取信息。我担心面试后是否应该发送跟进邮件,并在多个在线论坛中查找答案。我会打扰面试官吗,还是他们在等待这样的邮件?这样一个小事情引起了我很大的焦虑,我希望当时能够有一个清晰的答案,而不是“视情况而定”或“可能不会有害”。这本书就是我当时希望有的,可以解答所有这些问题!

现在我已经作为面试官的身份,我了解在各种情况下招聘方更喜欢工作候选人的什么样的条件。我现在对我过去的很多问题有了第一手的答案,并且对进入机器学*领域有了更多的路线图。尽管即使有这样一个保证的路线图,也不会是你所想象的那种。当我了解机器学*和数据科学领域的时候,我早就选择了我的大学专业,毕业了,并且正在攻读经济学硕士学位。我大学时期没有任何实*经历;相反,我制作和玩电子游戏,并在空闲时间社交。如果有什么的话,通向机器学*工作的路线图是非常灵活的,即使你开始得比较晚,并没有所谓的太晚

当我在寻找我的第一份机器学*工作时,我并没有做所有最直接的事情,但我还是以一名从未做过实*的学生的身份通过了面试。我可能对面试过程的了解比许多人少,但这正是为什么我能够从一个没有做所有“正确”事情的人的角度写作。事实上,没有“正确”的事情,只有适合你情况的事情。

我不会告诉你类似于,“只需在你的大学主修[SUBJECT],然后在[COMPANY]实*,你就能成功。”对于不同类型的人,我需要写一本单独的书。一刀切的预设路线图在你遇到地图上未标明的点时将失败。如果你学会在没有地图的情况下导航,你可以根据情况制定自己的地图。

在本书中,我将向你展示如何成为一个导航者,并创建自己的路线图,无论你是非 STEM[⁴]专业、没有实*经验的 STEM 专业,没有相关工作经验,有机器学*工作经验或非机器学*工作经验等等。只要你坚持下去,即使你主修的不是经常推荐的学科也没关系。如果你有你认为与机器学*无直接关系的前工作经验,也没关系。我将指导你如何增强和利用你的过去经验,以及如何获得额外相关经验。

我主张根据自己的情况制定灵活且量身定制的职业路线图,因为在我的职业生涯中,我遇到过许多情况,其中并没有一个单一的路线图:

  • 作为一名经济学硕士学位的学生,在一家大型公共公司找到一份初级数据科学家(机器学*)的工作[⁵]

  • 在我加入时有大约 200 名员工的初创企业获得更高级别职位,到达顶峰时有大约 400 名员工

  • 在一家新的中大型公共公司作为首席数据科学家找到工作

根据行业、公司规模、机器学*团队规模以及公司的生命周期阶段(例如初创公司),雇主对我的期望各不相同,这是我需要了解的。如果我只是听从网络建议或者那些在使用不同职位面试流程的公司面试的人的建议,我可能会失败(不,我肯定会失败)。每一次,我都不得不改变我的准备方式和面试方式才能成功。通过我所有的个人经历和(字面上的)数百次机器学*面试,我找到了如何在机器学*和数据科学职位面试中表现出色并成为成功候选人的模式。凭借我的经验和我所学到的教训,现在我能够写这本书来帮助那些有志成为职场候选人的人。

成功的职位候选人知道面试过程中每一步都在试图评估他们的情况。不幸的是,仅仅出现并具备技术技能并不总是足够的。这就像学校的考试一样——那些仔细查看教学大纲并理解每场考试范围的人更有可能成功。在这种情况下,你试图为每一个你申请的工作逆向设计一个教学大纲。

随着我在机器学*领域积累了越来越多的经验,我也从更多有志求职者那里得到了更多问题。到目前为止,我已经进行了许多咖啡聊天(超过 100 次),并多年来在我的博客susanshu.com上撰写了职业指南,以帮助更多人。当有机会通过这本书帮助更多人时,对我来说选择是显而易见的。

为什么选择机器学*工作?

我曾经谈过机器学*在我们日常生活中的普遍存在,无论我们是否意识到或喜欢它。你可能也有过一些个人经历让你对此产生了好奇并拿起了这本书!我也将概述我的经历,这可能会强化你的动力或者让你更加关注机器学*领域的更具吸引力的方面。

作为从事技术工作的人,我认为机器学*是开发能够影响数百万用户的高价值产品的一个重要领域。我在毕业后的第一份工作中有机会参与了这样一个项目,如果我没有机器学*的技能,可能在职业生涯的早期就没有这样的责任和机会。

在我看来,机器学*是一个有趣且充实的领域。我喜欢了解新技术和研究,如果你也对此有兴趣,你会喜欢在机器学*领域工作的这一面。我们领域快速创新的另一面是,它可能令人疲惫,因为不断学*新进展,同时还需要专注于家庭或生活中的其他重要方面。如今,即使我在周末非常专注于社交活动或写书,我仍然抽出时间学*,而且不用花费太多时间。我也会利用工作时间听在线讲座或读书。这并不只局限于机器学*,但我听说许多人认为,相较于其他需要学*新框架的技术相关工作,机器学*的持续学*步伐略快一些。

当然,还有工资方面的考量。平均来说,机器学*工作的报酬很可观。我能够自给自足,甚至实现了许多提升生活和我所爱之人生活的财务目标。这是我非常感激我的机器学*职业所赋予的。另外,由于机器学*领域和社区的支持,我也能取得如此多的成就:我被邀请环游世界参加各种会议(有许多次我不得不推迟到未来的年份)。结识在机器学*领域从事有趣工作的酷人和亲眼见证机器学*与人工智能领域的进步,这些都是在这个行业工作的额外好处。

无论你选择读这本书的原因是什么,我希望能成功地与你分享技能和工具,让你在机器学*的工作面试中取得成功,并克服途中的障碍。

在这本书中,我将帮助你理解以下内容:

  • 各种类型的机器学*角色及你最有可能成功的角色

  • 机器学*面试的基本组成部分

  • 如何识别你的技能缺口,并有效地定位你的面试准备工作

  • 如何在技术和行为面试中取得成功

我还将添加我在 O'Reilly 在线直播培训中教授过的常见问题。可以将其看作是我与各方面获得支持见解的咖啡谈话:

  • 如何在拥有“非典型”教育或职业背景的候选人中成功

  • 如何大大增加简历通过初步筛选的机会

  • 高级和更高级别机器学*职位的面试是怎样的。

还有更多内容。

本书适合谁

在我开始深入讲解各章节之前,我想列举几种你可能会觉得有共鸣的情景;这本书的目标读者正是他们:

  • 你是一名急于成为工业界机器学*/人工智能从业者的应届毕业生。

  • 你是一名软件工程师、数据分析师或其他科技/数据专业人士,正在逐步转向以机器学*为日常工作的角色。

  • 你是另一个领域有经验的专业人士,有兴趣转向机器学*领域。

  • 你是一位经验丰富的数据科学家或机器学*从业者,正在重新进入面试阵营,目标是不同的角色或更高的职称和责任,并希望全面复*机器学*的材料。

如果以下情况描述的是你,你也会从本书中受益:

  • 那些希望从本书中获得如何进行机器学*面试灵感的管理者,或者希望在不浪费太多时间在零散在线资源上的非技术人员

  • 如果你已经具备基本的 Python 编程和机器学*理论知识,并且好奇探索进入机器学*领域是否可以成为未来的职业选择。

本书不是什么

  • 本书不是一本统计学或机器学*教科书。

  • 本书不是一本编码教科书或教程书。

  • 虽然有样例面试问题,本书不是一个题库。代码片段将简洁明了,因为它们很快就会过时。

由于我无法从头开始覆盖每个概念,我假设读者对机器学*有基本的了解(高级别理解就足够了)。但不要担心,我会作为快速提醒覆盖基本定义。我还假设观众对 Python 编程语言有些了解,比如在 Jupyter Notebooks 上运行脚本,因为 Python 在机器学*面试和工作中很受欢迎。然而,如果你对此不熟悉,我还包括了一个关于从零开始学* Python 的简短部分。

另外,本书提供了大量外部练*资源的链接库,帮助你为机器学*面试做准备;但首先,我将帮助你确定哪些对你练*和学*超出当前知识和技能水平最有帮助。

因此,与其列出一堆要记住的问题和答案,我更希望通过本书教会你如何钓鱼。作为面试官,我见过许多未能通过面试的候选人,即使他们多练*了几个问题也不会被拯救。事实上,他们甚至不知道自己的差距在哪里。我会教你如何识别自己的优势和不足,以及如何利用本书中的资源来弥补这些不足。

本书中使用的约定

本书中使用以下排版约定:

Italic

指示新术语、URL、电子邮件地址、文件名和文件扩展名。

Constant width

用于程序列表,以及在段落中引用程序元素如变量或函数名、数据库、数据类型、环境变量、语句和关键字。

Constant width bold

显示用户应该直接键入的命令或其他文本。

Constant width italic

显示应由用户提供值或由上下文确定值替换的文本。

提示

这个元素表示一个提示或建议。

注意

这个元素表示一般注释。

警告

这个元素表示一个警告或注意事项。

致谢

很多人的智慧和鼓励帮助本书成为现实!

特别感谢以下审阅者在书籍编写过程中的帮助:玛格丽特·梅纳德-里德、塞雷娜·麦克唐纳、多米尼克·蒙、苏哈斯·派。你们所有的早期反馈和评论都极大地改进了这本书。我还要感谢审阅了部分章节的同事们:尤金·延、普里特维·斯里尼瓦桑、阿玛尔·阿斯姆罗、路易斯·杜克、伊戈尔·伊利奇、杰里米·C. 和马苏德·H. 你们慷慨地花时间审阅了书籍的不同阶段,并回答了我的问题,我非常感激和谦卑!

本书中的所有内容都是我职业生涯中积累的,如果不提及已经提到的朋友、导师和机构,我会感到遗憾:尼克·迈尔斯、丹尼斯·奥西波夫、阿米尔·费兹普尔、香农·艾略特、Python 软件基金会、全球各地的 PyCon 大会以及我所共事的许多优秀同事。你们都很棒!

当然,我要特别感谢 O’Reilly 团队:出色的开发编辑萨拉·亨特,她在我写作这本书的激烈一年里一直鼓励我并帮助我保持专注;制作编辑伊丽莎白·凯利;校对编辑香农·特灵顿;以及收购编辑尼科尔·巴特菲尔德,她给了我很多鼓励,并最初联系我进行 O’Reilly 的“机器学*面试”在线培训——这最终推动了这本书的问世!

  • 感谢我的亲人,在我走过各种人生奇遇时始终支持我。我的家人,他们一直在我身边,特别是在我写这本书的过程中,是我的动力和灵感之源。感谢妈妈、爸爸、我的哥哥和祖父母们。感谢你,苏珊,你是我生命中的阳光。感谢我的朋友们,自从大学时代以来一直是我的支柱和温暖。

最后,我要感谢我在滑铁卢大学和多伦多大学的教师、同行和终身朋友们,他们为我提供了一个激发、严谨又灵活的环境,让我探索我的好奇心和兴趣。正是这种自由让我走上了机器学*的职业道路,如果没有那个环境来追逐我的梦想,我不会在这里。

¹ 高级角色 指的是高于资深级别的角色。

² 技术领域的职级通常从初级/中级 → 资深级 → 高级级别 → 首席级别递进,尽管根据公司的不同可能有细微差异。例如,有些公司合并了高级和首席级别。

³ Randy Au,《老狗出于好奇重返数据科学职场》,Counting Stuff(博客),2022 年 12 月 1 日,https://oreil.ly/yzIsx

⁴ 科学、技术、工程和数学。

上市公司 意味着它有公开交易的股票。

OceanofPDF.com

第一章:机器学*角色与面试过程

在本章的第一部分,我将介绍本书的结构。然后,我将讨论在工业界使用机器学*技能的各种职位名称和角色。¹ 我还将澄清各种职位名称(如数据科学家、机器学*工程师等)的职责,因为这常常是求职者困惑的焦点。这些将通过机器学*技能矩阵和机器学*生命周期进行阐述,并将在整本书中作为参考。

本章的第二部分从头到尾讲解了面试过程。我曾指导过的候选人赞赏这一概述,因为在线资源通常只关注面试的特定片段,而不是它们如何相互连接并最终导致一个工作机会。特别是对于新毕业生² 和来自不同行业的读者来说,本章有助于让每个人都在同一页面,并澄清了整个过程。

面试中各个环节的互联互通非常复杂,取决于你所追求的机器学*角色类型。这个概述将帮助你设定阶段,因此你将知道在哪些方面花时间。例如,一些在线资源专注于“产品数据科学家”专有的知识,但标题会统一称作“数据科学家面试技巧”,而不加以区分。对于新手来说,很难判断这是否与自己的职业兴趣相关。通过本章后,你将能够确定每个职位需要哪些技能,在第二章中,你将能够从工作招聘信息中提取这些信息,并尽可能地使你的简历与职位和职位发布相关。

本书概述

本章重点帮助你区分各种机器学*角色,并详细介绍整个面试过程,如图 1-1 所示:

  • 工作申请和简历(第二章)

  • 技术面试

    • 机器学*(第三章、第四章和第六章的章节 3、4 和 6)

    • 编码/编程(第五章)

  • 行为面试(第七章)

  • 你的面试路线图(第八章)

  • 面试后的跟进(第九章)

本书章节概述及其在机器学*面试过程中的关联

图 1-1. 章节概述及其在机器学*面试过程中的关联。

根据你在机器学*面试旅程中的位置,我鼓励你专注于对你有意义的章节和部分。我还设计了这本书,以便你在需要时进行参考;例如,你可能会多次修改你的简历,然后再翻到第二章。其他章节也适用同样的方式。有了这个概述,让我们继续。

小贴士

这本书的伴随网站https://susanshu.substack.com提供额外内容、辅助资源等。

机器学*和数据科学职称简史

首先,让我们简要回顾一下职称的历史。我决定从这一部分开始,以消除关于“数据科学家”职称的一些误解,并阐明为什么有如此多与机器学*相关的职称。了解了这段历史之后,你应该更清楚地知道自己应该争取哪些职称。如果你曾经困惑于诸如机器学*工程师(MLE)、产品数据科学家、MLOps 工程师等一大堆职称,这一部分就是为你准备的。

机器学*技术并不是什么新鲜事物;1985 年,大卫·阿克利、杰弗里·E·欣顿和泰伦斯·J·塞诺斯基使 Boltzmann 机器算法变得流行。³甚至在此之前,回归技术⁴在 19 世纪就有了早期的发展。长期以来,一直有利用建模技术进行预测和预测的工作和角色存在。数理经济学家、统计学家、金融建模者、物理建模者和生物化学建模者作为职业已有数十年的历史。主要区别在于,与现代相比,数据集要小得多(除了模拟情况)。

直到 21 世纪之前,计算能力开始呈指数级增长。此外,分布式和并行计算的进步创建了一个循环,使得“大数据”变得更加易于获取。这使得从业者能够将这种先进的计算能力应用于数以百万计甚至十亿计的数据点之上。

较大的数据集开始被积累和分发用于机器学*研究,例如 WordNet⁵,随后是由李飞飞领导的 ImageNet⁶项目。这些集体努力为更多机器学*的突破奠定了基础。AlexNet⁷于 2012 年发布,在 ImageNet 挑战赛中取得了高精度,⁸这证明了深度学*在人类任务上能达到前所未有的规模。

许多机器学*从业者认为,这是机器学*、深度学*及相关主题在广泛受众中认可度大幅增加的时期,而不仅仅是人工智能社区。例如,生成式人工智能(如 ChatGPT)在 2022 年和 2023 年的流行并非突如其来,之前的深度伪造、自动驾驶汽车、国际象棋机器人等应用都是*年来许多进展的结果。

“数据科学家”作为一个职位名称,起初是一个总称,在机器学*和数据领域尚不成熟时期使用。衡量搜索术语流行度的Google 趋势显示,“数据科学家”的搜索流行度在 2012 年激增。那一年,哈佛商业评论发表了一篇文章:“数据科学家:21 世纪最性感的职业。”⁹ 到 2013 年 4 月,“数据科学家”的搜索流行度已经与“统计学家”持平,并随后远远超过了后者,如图 1-2 所示。那些日子里,基础设施工作和模型训练之间并没有明显的分野。例如,Kubernetes 于 2014 年首次发布,但公司花了一些时间来采纳它来编排机器学*工作。因此,现在出现了以前不存在的更具体的机器学*基础设施职位名称。

2023 年 8 月 9 日检索的“数据科学家”、“机器学*工程师”和“统计学家”在 Google 趋势上的搜索流行度

图 1-2. 2023 年 8 月 9 日检索的“数据科学家”、“机器学*工程师”和“统计学家”在 Google 趋势上的搜索流行度。

随着社交媒体、网络推荐系统及其他现代应用案例的增加,公司开始收集更加细粒度的数据,例如点击流数据,即用户浏览网站或应用时收集的数据。另一个最*的进展是普通公司能够存储来自机器和物联网(IoT)设备的大量遥测数据。过去,数据科学家可能处理每周或每日更新的数据。现在,随着许多应用程序更新更加频繁或实时,需要更多基础设施来为网络产品和应用程序提供机器学*功能,因此也创造了更多相关职位。

简而言之:随着机器学*生命周期的复杂化,出现了更多用来描述现今完整机器学*团队所需新技能的职位名称。我将在本章稍后详细介绍有关职位名称和机器学*生命周期的内容。

所有这些都发生在过去十年内,公司并不总是为了反映角色如何变得更加专业而更改它们的职称。但是,作为求职者,了解这些历史可以帮助减少由于申请职位时发现该角色与另一家公司的完全相同职称的角色不同而导致的困惑和沮丧。参见 Table 1-1 查看 ML 相关职称的前期趋势和 Table 1-2 查看 ML 职称的当前趋势。

表 1-1. 机器学*和数据工作职称的前期趋势

ML 和数据工作职称 职称的前期趋势
数据科学家 做所有的事情
数据分析师 特别负责与业务决策相关的数据分析

表 1-2. 机器学*和数据工作职称的当前趋势

ML 和数据工作职称 职称的当前趋势

| 数据科学家 机器学*工程师

应用科学家

…等等 | 训练 ML 模型 |

| 机器学*工程师 MLOps 工程师,AI 工程师

基础设施软件工程师

ML 软件工程师,机器学*

…等等 | MLOps 和基础设施工作 |

| 数据分析师(产品)数据科学家

…等等 | 数据分析,A/B 测试 |

| 数据工程师 初创企业的数据科学家

分析工程师

…以及之后 | 数据工程 |

有了这些历史来解释为什么你会遇到不同的职称,我将详细阐述每个职称及其职责。

需要 ML 经验的职称

以下是 ML(或相关)角色的非穷尽职称列表:

  • 数据科学家

  • 机器学*工程师

  • 应用科学家

  • 软件工程师,机器学*

  • MLOps 工程师

  • 产品数据科学家

  • 数据分析师

  • 决策科学家

  • 数据工程师¹⁰

  • 研究科学家

  • 研究工程师¹¹

正如我在 “机器学*和数据科学职称简史” 中所讨论的,每个角色负责 ML 生命周期的不同部分。单凭职称本身无法传达工作内容。作为求职者,请注意:在不同公司,完全不同的职称可能最终会做相似的工作!正如在 Figure 1-3 中所示,您的 ML 职称将取决于公司、团队以及您的角色负责的 ML 生命周期的哪些部分。

为了具体举例说明职称如何取决于雇佣该职位的公司或组织——基于我与真实人士的交谈、职位描述和面试——负责 训练 ML 模型但不负责构建底层平台的人可能被称为以下职称之一:

  • 软件工程师(ML)或数据科学家(Google)

  • 应用科学家(亚马逊)

  • 机器学*工程师(Meta,Pinterest)

  • 数据科学家(Elastic,我所在的团队)

  • 数据科学家(Unity)

机器学*工作标题中有什么?

图 1-3. 机器学*工作标题中有什么?
注意

在这本书出版时,这些公司和团队中的任何工作头衔都可能已经改变。不过,这表明了一个观点,即机器学*的头衔可能会在不同公司甚至同一公司的不同团队之间有所变化。

工作标题也取决于组织、部门等。Google 的一些部门拥有数据科学家¹² 的职位,而另一些则没有。在我工作过的公司中,我的团队有数据科学家负责训练机器学*模型,而机器学*工程师负责构建基础设施(整天在诸如 Kubernetes、Terraform、Jenkins 等工具中工作)。在其他一些公司中,机器学*工程师是负责训练机器学*模型的人员。

作为一个个人例子,我的工作经验主要涉及机器学*模型训练,因此我申请那些拥有“机器学*工程师”或“数据科学家”头衔的工作。在接下来的章节中,我将提供更多关于技能和角色的例子,这些可能非常适合您的兴趣和技能。

机器学*生命周期

在工业界,应用机器学*项目最终期望改善客户体验,例如,一个更好的推荐系统可以向用户展示更相关的视频、新闻和社交媒体帖子。在工业界,“客户”也可以指内部客户:同一公司或组织内的人员。例如,您的团队构建了预测需求的机器学*模型,这有助于公司的物流部门更好地规划其装运时间表。无论用户是外部还是内部的,构建成熟的端到端机器学*产品需要许多组件。我将通过一个简化的示例来解释。

首先,需要数据,因为大多数机器学*是通过大量数据进行训练和测试的。有人需要确保原始数据被导入(摄取),以便以后轻松访问进行数据分析、机器学*、报告和监控等。这在图 1-4 中的 A 步骤(数据)中有所体现。

接下来,有了数据之后,具有机器学*算法和工具知识的人将使用数据开始机器学*开发。这在图 1-4 中的 B 步骤(机器学*开发)中有所体现。这涉及特征工程、模型训练和评估。如果结果不佳,在 B 步骤中会有大量迭代,这个人可能会改进他们的特征工程或模型训练,甚至可能会回到 A 步骤并要求摄取更多数据。

一旦有了令人满意的结果,他们将继续进行步骤 C(机器学*部署),将机器学*模型连接到客户端。根据机器学*项目的类型,可以将其部署到网站、应用程序、内部仪表板等。当然,他们希望确保机器学*正常运行,因此任何优秀的团队都会有一种监控结果的方式。在机器学*中,有两种主要的潜在问题。第一种是软件层面的问题,例如代码中的错误。第二种是数据或机器学*模型的问题——例如,在模型开发阶段,模型输出正常结果,但在部署或发布后,存在数据不平衡,导致模型结果变得不理想。从步骤 C 开始,可能需要多次迭代回到步骤 B,以改进模型并再次在步骤 C 中进行更多实验。

机器学*生命周期(图表已简化以便理解)

图 1-4. 机器学*生命周期(图表已简化以便理解)。

在我刚刚介绍的机器学*生命周期中,需要许多技能。数据管道、模型训练、维护持续集成和持续部署(CI/CD):作为求职者,你应该学*哪些内容来准备面试?幸运的是,正如我在 “机器学*和数据科学职位标题简史” 中提到的,如今的公司 可能 会雇用那些具备部分这些技能的人才。例如,他们需要一些专注于步骤 A(数据工程)、一些专注于步骤 B(ML 开发)、一些专注于步骤 C(ML 部署),依此类推。我强调 可能,因为这仍然取决于公司或团队;我将讲解一些情景。

创业公司

创业公司的角色通常需要兼顾更多职责,这意味着他们需要在机器学*生命周期中的多个步骤中执行工作,就像在 图 1-4 中展示的那样。这里有一个例子:

我们是一支由 5 至 25 名机器学*工程师组成的团队,并且经常参与设置数据标注工作、质量保证测试以及性能优化(在移动设备上),还有进行演示设置。

Dominic Monn,MentorCruise 的 CEO(之前在六年里从事机器学*初创公司工作)

通常,初创公司的目标是发布端到端产品,但由于客户较少,他们可能较少关心规模和稳定性(在早期阶段)。因此,开发和训练机器学*模型的人可能也是进行数据分析并向利益相关者展示的同一人,甚至是构建平台基础设施的同一人。初创公司的机器学*团队可能只有更少的人员。例如,初创公司可能总共只有 30 名软件工程师和数据相关人员,而较大的公司可能仅数据分析团队就有 30 人,以分担工作负荷。

更大规模的机器学*团队

如果公司和/或团队发展足够,ML 角色更可能变得更专业化。一般来说,团队越大,角色越专业化。如果大公司的“机器学*工程师”训练模型,那么他们可能不会像在创业公司那样同时承担两三个角色。相反,大公司会雇用更多人来填补这些角色。这并不意味着在大公司工作更简单。事实上,通常会有更多的数据、更大的规模,如果 ML 功能出现问题,后果也更严重,因此每位 ML 工程师的时间可能完全用于只扮演一个角色。

注意

公司规模较大通常对应更大的 ML 团队,但这取决于情况。例如,在传统非技术行业的大公司,可能在弄清楚 ML 最适合公司运作方式时,首次招聘 ML 团队成员时,他们操作更像是创业公司的环境。

让我们深入一层,并增加更多关于机器学*或数据责任的细节。图 1-5 从图 1-4 扩展,以反映具有更精细化角色的团队或公司。(值得重申,即使这个列表是一个有用和足够常见的启发式方法,它仍然有些简化,仅用于说明目的,因为总会有例外和离群值。)

机器学*生命周期,更精细化角色(图 1-4 的扩展版)

图 1-5. 机器学*生命周期,更精细化角色(图 1-4 的扩展版)。

这里举一个例子,说明你在这些更精细化角色中可能负责的角色,如图 1-5 中所示:

  • 你构建用于分析和机器学*的数据管道(步骤 A)。

  • 你训练 ML 模型(步骤 B)。

  • 你构建用于部署 ML 模型的基础设施(步骤 C.1)。

  • 你设计并进行假设检验,通常是新 ML 产品功能的 A/B 测试(步骤 C.2)。

  • 你进行数据分析,构建报告和仪表板,并向利益相关者展示(步骤 D)。

提示

图 1-5 经常在后续章节中提到,因此请保存或书签!

机器学*角色的三大支柱

为了为本书后续章节做好铺垫,我将讨论我称之为 ML 和数据科学角色的三大支柱:

  • 机器学*算法和数据直觉

  • 编程和软件工程技能

  • 执行和沟通技能

这些是在机器学*工作面试中评估你的广泛技能类别。本书着重帮助你理解这些技能,并填补当前经验和技能与这三大支柱下之间的任何差距(见图 1-6)。所有这些技能将在接下来的章节中详细展开。

机器学*职位的三大支柱

图 1-6. 机器学*职位的三大支柱。

机器学*算法与数据直觉:适应能力

你能够理解机器学*算法和统计理论的基本运作及其各自的权衡,这在工作中面对开放式问题时至关重要。你不只是像完成学校作业那样按步骤进行。

具有数据直觉意味着当你面对新问题时,你知道如何使用数据解决它;当你遇到新数据或数据源时,你知道如何深入评估它们。你会问自己,这些数据适合用于机器学*吗?它可能适合哪些机器学*模型?在使用这些数据进行机器学*之前,是否存在任何问题?你知道该问什么和如何找到答案。

在机器学*的面试过程中,通过各种类型的面试和面试问题来评估候选人在这个支柱上的知识和准备情况,我将在第三章和第四章中涵盖。

编程与软件工程:构建能力

在项目中工作时,你有必要的编程技能,比如用 Python 操纵数据或使用内部部署流程,以便其他团队可以使用机器学*模型的结果。

即使你对理论很了解,没有编程或软件工程¹⁴ 的意识,你也无法让机器学*变成现实。你需要用代码将数据与机器学*算法连接起来,而这些算法也是用代码实现的,也就是说,你必须将理论转化为实践。

对于机器学*角色而言,其他高需求的编程技能包括(软件)工程师从原型到生产的能力——也就是说,机器学*被整合并发布。一些角色负责端到端的机器学*:从研究和训练模型到部署和生产。一些机器学*运维工程师等角色负责构建软件基础设施,以处理大量数据的需求,以便在几秒甚至几毫秒内向用户发送机器学*响应。

在机器学*的面试过程中,通过各种类型的面试和面试问题来评估候选人在这个支柱上的技能,我将在第五章和第六章详细介绍。

执行与沟通:在团队中推动事情完成的能力

你能够与不同职能的人合作。在机器学*中,我们与软件工程师、数据工程师、产品经理以及其他许多同事合作。团队合作能力涵盖了一些软技能,如沟通和一些项目管理技能。

例如,无法与团队成员沟通是项目的真正障碍物¹⁵,可能导致您的机器学*项目停滞不前甚至被降低优先级。即使您只与一个人合作(比如您的老板),您仍然需要能够报告您的项目情况,这就需要沟通技能。因此,在机器学*领域,能够与非技术利益相关者沟通技术概念是一种高需求的技能。

您还需要一些项目管理技能来确保您的任务按计划进行。我们在教育或自学过程中都学会了如何管理待办事项列表和日历,但现在更混乱,因为现在您的项目日历取决于他人的日历和优先事项。即使您有项目和/或产品经理来保持团队进度,您仍然需要在某种程度上管理自己。

没有软技能,事情就不会进展,就此打住。不要成为那些只关注技术技能而忽视在面试中建立和展示软技能的候选人。我将深入探讨机器学*面试如何在这一支柱上评估候选人,详见第七章。

在三个机器学*支柱中达到最低要求

在所有三个机器学*支柱中提升您的技能是一项艰巨的任务,对于入门级别的角色,通常您只需要每个支柱的最低要求(例如 3/10),如图 1-7 所示。例如,即使具有编程经验或技能不强的求职者也可以被教导改进。理想情况下,您至少在一个支柱上更强大(例如编程为 5/10),这与特定的机器学*角色最相关,可以让您从其他求职者中脱颖而出。

机器学*工作的最低技能水平要求(示例)

图 1-7. 机器学*工作的最低技能水平要求(示例)。

对于高级角色,最低要求要更高,但同样的经验法则适用:达到最低技能要求。从那时起,您将根据您在某些技能上的优秀表现与其他候选人进行比较,这取决于角色。仅训练机器学*模型而不部署它们的数据科学家可能不需要像他们的机器学*理论和沟通技能那样发展编程技能。

对于入门级别的角色,我认为沟通能力这一支柱的要求较低(但不是 0/10,请注意!),因为它需要通过与更大团队合作的艰辛经验,包括非技术背景的队友,来提高它。这也使一些候选人在这一支柱上具有优势:对于那些具有非传统背景的候选人,比如自学或从软件工程师或其他领域转换的候选人,能够巧妙讲述故事并展示作品集可以让他们脱颖而出。

现在你已经对三个支柱有了概览,可以利用这个思维模型脱颖而出。

机器学*技能矩阵

恭喜!你已经完成了一个相当密集的章节!现在你已经了解了机器学*生命周期和 ML 技能的三个支柱概述,现在是时候将你的兴趣和技能映射到职称上了。

表格 1-3 将为你提供一个大致的概念,即你需要学*哪些技能才能在特定角色中取得成功。从一星到三星的评分中,一星代表技能的重要性较低,而三星则代表极其重要的技能。

表格 1-3. 机器学*和数据技能矩阵

|

技能 | 职称 |

--- ---
数据科学家(DS) 机器学*工程师(MLE)
--- ---
数据可视化、沟通 ★★★
数据探索、清理、直觉 ★★★
ML 理论、统计学 ★★★
编程工具(Python、SQL) ★★★
软件基础设施(Docker、Kubernetes、CI/CD)
提示

表格 1-3 在后续章节中经常被提及,所以请保存或书签!

查看这些技能,你可以大致将它们映射到前一节 ML 技能的三个支柱中,如表格 1-4 所示。

表格 1-4. 映射到 ML 工作三支柱的机器学*和数据技能

支柱 ML 和数据技能

| 支柱 1 机器学*算法和数据直觉:适应能力 | 数据探索、清理、直觉 机器学*理论、统计学

数据可视化 |

支柱 2 编程和软件工程技能:建立能力 编程工具(Python、SQL) 软件基础设施
支柱 3 执行和沟通技能:团队合作中的执行能力 沟通等

如果你现在还不完全确定每种技能可能包含的具体内容,没关系。在第二章中,我们将重新讨论这个矩阵,并提供详细的自我评估清单。

现在,让我们把所有这些联系起来。我们已经看过了机器学*生命周期(图 1-5)和机器学*技能矩阵(表格 1-3)。剩下的是看看哪些工作最适合现在申请,或者获取相应技能!为此,让我们将一切与当前 ML 和数据职称的趋势联系起来(表格 1-2)。这在图 1-8 中有所体现。

常见 ML 职称及其如何对应机器学*生命周期

图 1-8. 常见的机器学*职位名称及其在机器学*生命周期中的对应关系。

图 1-8 中的字母标注可以映射到图 1-5,以下方便列出:

  • (A) 数据

  • (B) 机器学*开发

  • (C.1) ML/软件基础设施

  • (C.2) ML 假设检验/监控

  • (D) 报告和仪表盘

提示

图 1-8 经常在后面的章节中提到,请保存或者收藏!

当你看到一个职位名称并查看工作发布的详细信息时,你可以将其映射到日常工作中可能负责的内容。此外,根据你感兴趣的机器学*生命周期的部分,你可以更好地准备并针对你的职位申请,这样你就不会误打误撞。

介绍机器学*职位面试

现在我已经介绍了许多可能对你感兴趣的职位名称,是时候全面了解你在整个过程中将遇到的所有步骤和类型的面试了!本书名为机器学*面试,但面试远不止于面试问题。首先是工作申请和你的简历,这是你首次获得面试的途径。如果你不增加获得更多面试的机会,那么你甚至都不会有机会回答任何面试问题!我将从头到尾详细介绍这个过程,包括如何在面试后跟进(第 9 章)。

机器学*职位面试流程

现在让我们深入了解整个面试流程。你将从申请工作开始,然后是面试,经过几轮面试之后最终会收到 offer。这一过程在图 1-9 中有详细说明。

提示

图 1-9 经常在后面的章节中提到,请保存或者收藏!

ML 面试流程

图 1-9. 机器学*面试流程。

通过网站或者职位板申请工作

让我们假设你刚开始在一个拥有成熟的人力资源(HR)¹⁷和招聘流程的公司申请机器学*角色。你可以通过几种方式开始你的申请:通过公司网站或者职位板进行冷申请(在第 2 章讨论过)或者通过团队或者公司内部的推荐。你也可以通过 LinkedIn 的冷消息或者给招聘人员发送电子邮件来获取面试机会。通常,在拥有 HR 跟踪软件系统的公司,即使有人推荐你,你仍然需要将标准申请上传至在线门户,这意味着你需要准备一个更新的简历并填写个人信息。

注意

您也可以选择通过与第三方招聘人员合作来补充您的求职努力,这与为招聘公司工作或签订合同的内部招聘人员是不同的。第三方招聘人员通常同时与多家公司合作。我认识的专业同行建议只与特定信任的第三方招聘人员合作,但也警告我要警惕那些做出过多不切实际承诺或不够信誉的人。您可以在这篇福布斯文章中了解更多关于第三方招聘人员的信息。

网站或招聘网站申请的简历筛选

使用第一种方法——通过公司网站或第三方招聘网站进行冷申请——您已经在像 Indeed[¹⁸]这样的招聘网站上浏览过工作机会,并直接访问了您有兴趣工作的公司的职业页面。在这种情况下,您没有人向您推荐团队或公司(我将在"通过推荐申请"中详细介绍)。您看到了一些与机器学*相关的工作职位,这些职位似乎与您相关,然后您点击链接申请。在您提交申请并且公司拥有您的信息和简历之后,人力资源成员、招聘人员或者负责简历筛选的其他人员将继续下一步操作。

现实情况是工作岗位有很多申请者,您应该假设第一批申请者在招聘经理看到之前已经被筛选掉了。招聘经理是您如果加入团队将与之合作并向其汇报的经理。因此,您通常可以假设通才 HR 合作伙伴或内部或外部招聘人员会先阅读您的简历。这些招聘人员可能对他们筛选简历的职位有一定了解,但他们仍然主要是通才,并不像您将来真正工作的工程师和机器学*专家那样专业。这一筛选过程的一部分导致了简历的几个隐藏标准,这就是为什么即使您具有相关背景,当您的简历未能通过此步骤时,这可能会令人困惑的原因。

重要的是要记住,这些通才很可能会将您的简历传给招聘经理,如果他们:

  • 根据职位发布的工作经验或技术查看您简历上的关键技术或经验。

  • 查看关键技术或经验方面的多年经验,或者在入门级或新毕业工作中,有足够的证据表明您可以轻松接受培训。

  • 了解您的技能和成就是相关的,用简单的语言表达。

为了确定您的简历是否符合条件,招聘人员可能会搜索关键字,并将您的简历与职位描述进行比较。他们不会自动为您“翻译”简历上的技能。例如,如果职位描述中提到“Python”,而您的简历中写着“C++”,在这一步骤,他们可能不会考虑这一点,因为这两种编程语言都是面向对象的,如果您付出努力,可能很快学会 Python。

如果你能够描述你的经验,让人力资源招聘者能够理解与岗位相关的内容,你将增加在简历筛选步骤中的机会。由于职责的性质,人力资源和招聘者了解更高级别的技术和他们正在招聘的角色中流行的内容,但不了解具体细节,因此你的简历优化非常重要。(在第二章中详细阅读如何优化你的简历。)

通过推荐申请

现在我已经介绍了如何直接通过职位发布板或网站进行冷应用,而没有任何推荐,我将提供一些推荐如何帮助您加快进程的例子。

比如说,你对 ARI 公司的一个 ML 职位感兴趣。¹⁹ 你知道你们大学的校友在 ML 团队工作。你和他们交流,并表达了你对这个工作的兴趣。在聊天过程中,你向校友展示了一些你个人的 ML 项目,这些项目与你感兴趣的 ML 工作相关。校友同意推荐你,并告诉你如何被推荐,这取决于公司人力资源系统的设置方式。

由于这位校友认识你,并愿意在看过你的个人项目后为你背书,你的简历将被置于“堆叠的顶端”。根据推荐的强度,你可能完全跳过简历筛选,直接得到招聘人员的高度保证的回调,甚至绕过招聘人员直接进入其他面试轮次。这在图 1-11 中有所说明。请注意,我在这里说“高度保证”是因为这仍然取决于各种因素,如时间安排。例如:也许你得到了推荐,但工作岗位碰巧已经填满。因此,你没有进行下一轮面试。

在第二章中,我将详细讲解推荐人和如何通过专业人脉网络获取推荐。

靠强烈的推荐可以缩短面试过程

图 1-11. 靠强烈的推荐可以缩短面试过程。

面试前检查清单

你收到了一个面试邀请!你怎样才能表现得最好?也许时间有限;你怎样确保你能最大化你的结果?

复*你笨拙地写下的笔记和问题

我个人的策略是先缩小可能被问到的问题类型范围。例如,在亚马逊面试的第一轮中,招聘者已经概述了格式,并且将专注于统计理论问题。我会阅读在线资源,浏览我的笔记,并看看我在哪些话题上最薄弱。我会把注意力放在那些我知道自己能够自信回答的问题上,而不是那些可能被问到但我不太熟悉的问题上。至于我如何“猜测”可能会被问到的问题,这主要基于与招聘者的对话以及我向招聘者或招聘经理提出的后续问题。我并不是很擅长猜测,这类似于试图猜测大学考试中会出现什么——有时会奏效,有时会事与愿违!

无论如何,都要在深入掌握少数问题或大致了解所有问题之间进行权衡(深度与广度)。在审阅我的准备笔记时,我个人偏向于广度,但您的结果可能会因您对材料了解的程度而异。

安排面试时间

根据你的位置和面试官的位置,可能会存在时区差异。我会尽量找到我精力最充沛的时间。有时候可用的面试时间段并不理想,所以我会选择 lesser of the evils(例如,从 GMT+8 进行面试,而对方在国外的 GMT-4 时区)。

提示

为了方便候选人了解面试时区,人力资源调度软件通常会有一个日历功能,您可以输入您的首选时间,并考虑到您的当地时区。然而,有时时间会通过来回的电子邮件设置,诸如 Calendly 或Cal.com等工具可以帮助。

作为面试官和面试者,我在工作日开始时刻会有些警惕。这样我起床后有更多时间准备。但当然,如果没有其他时间段可选,那我会选择早些时候。

面试前技术准备

作为面试官,我见过无数候选人由于连接问题或使用新的网络会议软件而导致面试开始晚了——例如,由于之前没有使用过,未能及时设置好 Zoom。作为候选人,当需要使用 Microsoft Teams 时,我曾因为个人计算机上只有 Zoom 和 Google Meet 而浪费了时间。最后,我使用了浏览器版本,但因为我的 Microsoft 学生账户已过期而登录出现了问题。最终,我们解决了这个问题,但耽搁了几分钟。如果我早些时间尝试登录或在面试前一天就试一下,这个问题本可以避免。

这里有一些小贴士,帮助您的面试更顺利进行:

尽量保持安静的环境。

一些软件,如 Zoom,具有很好的内置噪音抑制功能,一些无线耳机也是如此。

提前检查您的音频和视频。

视频方面,请确保光线良好,摄像头镜头清洁。声音方面,请确保您的麦克风声音清晰。在 Windows 和 Mac 上,有内置的摄像头和语音录制应用程序供我使用。您也可以启动一个新的 Zoom、Google Meet 或 Teams 会话并进行测试。

保持备用选项的心理清单。

在面试前您家里的互联网突然中断了吗?附*是否有一个(最好是安全的)咖啡馆可以去?您可以使用手机数据吗?在日历邀请中是否有通过电话拨入的选项?事先了解这些情况可以帮助您很多。我曾经不得不通过电话参加面试,幸运的是,我知道我有这个选项。

招聘人员筛选

恭喜,您的简历已成功通过简历筛选!现在让我们通过一个示例来说明接下来可能会发生的情况。

假设有 200 名申请者申请这个职位。招聘人员已经筛选了他们并删除了 170 名缺乏相关经验或因某种原因不适合该角色的申请者。请记住,这是基于您的简历给招聘人员的印象;有可能在同样的职位标题和同一个招聘团队下,改进后的简历就能通过。如果您有一个良好的推荐,您的简历可能已经被提前考虑了。现在只剩下 30 名申请者,招聘人员将会电话联系每一位申请者;这通常是一个较短的面试,持续 15 到 30 分钟。我们称之为“招聘人员筛选”或“招聘人员电话”。

通常,招聘人员希望了解您的个人品质以及您是否易于相处。如果有人公然声称拥有他们并没有的经验,电话可能会揭示虚假的工作或学校经历。还有其他物流问题需要筛选,如地点、薪资期望和法律地位。

提示

招聘人员筛选更像是一个“嗅探测试”,而不是对您的技术技能和经验进行深入测试。

我的成功建议是优化一件事情:让招聘人员理解您是一个优秀的候选人,您的经验是相关的(或者您能快速学*),并且您可以很好地适应团队和角色。这与说服招聘经理或高级 MLE 面试小组的方式不同。相反,如果您在这个电话上额外努力将您的简历与职位描述联系起来,您将会成功。

这是职位描述中的一些要点示例:

  • “应聘者具有推荐系统经验。”

  • “具有数据处理经验,如 Spark、Snowflake 或 Hadoop。”

  • “应聘者具有 Python 经验。”

解释此职位的招聘人员电话上的经验的不良示例是:“对于过去的项目,我使用了 ALS 算法,该算法是用 PySpark 实现的。”

在招聘人员电话上解释你在这份工作上的经验的更好例子是:“在那个过去的项目中,我使用了交替最小二乘(ALS)算法,这是一种基于矩阵分解的推荐系统算法,我使用了 PySpark,这是一个包装了 Python API 的 Spark。”注意,斜体短语也出现在职位描述中。

更好的例子可以让招聘人员更好地将你的技能与职位描述相匹配,而糟糕的例子则不能明显地与发布的技能相匹配。当你写简历时,你的空间有限;面试中的实时对话是让你填补招聘人员可能未注意到的空白的机会。

重要的是扩展缩写词。对于与技术人员进行的面试来说也是如此。我相对专注于推荐系统和强化学*,但日常工作中并不处理计算机视觉任务。当我面试的候选人谈论计算机视觉项目并通常解释更专业的技术时,我很欣赏。你可以(也应该)以一种不居高临下的方式向面试官解释这些,无论他们是招聘人员还是未来团队的一部分。

作为候选人,招聘人员电话也是评估工作的好时机。你可以询问你关心的问题,看看是否应该继续面试。例如,我可能会问团队规模和这份工作是否更专注于机器学*还是数据分析职责。你还可以准备一些关于公司及其产品的问题。例如,团队目前的项目是否专注于提高点击率还是长期参与度?如果你是产品的用户,你可能有很多想法和问题可以讨论。这也是展示你对公司的热情和知识的机会。

主要面试流程概述

进入下一步。好消息:招聘人员通过了你!你清楚地解释了你的过去经验,招聘人员能够理解你的过去工作及其与他们手头职位描述的联系。

但故事并没有结束。你是在第一轮招聘人员筛选中成功的 15 名候选人之一。招聘人员通知你即将进行的技术面试包括机器学*理论、编程和案例研究面试。此外还有分散进行的行为面试。如果你通过了这些面试,你将进入现场面试,这通常是最后一轮。如今,还有虚拟的现场/最终轮面试。如果你通过了最后一轮,你将收到一个 offer。

技术面试

让我们详细分析招聘人员筛选后进行的各种类型面试,首先是技术面试。技术面试通常由技术个体贡献者(IC),如 MLE 或数据科学家,进行。

技术面试可能会有多轮;有些可能是以数据为重点的编程轮次,或者面试官展示一些虚构的示例数据,要求你使用 SQL 或 Python 的 pandas/NumPy(有时会有多个问题,你需要在整个面试过程中使用各种编程工具)。我将在第五章中详细展开讨论这类面试结构和面试问题。

除了机器学*和以数据为重点的编程面试外,可能还会遇到智力题类型的问题。在这种类型的面试中,你可能会使用像 CoderPad 或 HackerRank 这样的面试平台,面试官会给你一个问题,并在在线集成开发环境(IDE)中编写代码,你和面试官都能实时看到。有时你会遇到其他形式,比如技术深度剖析、系统设计、私有存储库或 Google Colab 上的回家练*等等。我将在第五章和第六章中详细阐述如何准备这类面试。

这些随后的面试轮次可能会进一步减少候选人数量,直到最终轮。在我们的例子中,十五名候选人通过了招聘人员的筛选,八名通过了第一轮技术面试。经过第二轮技术面试后,我们还剩下三名候选人将进入现场面试。

行为面试

在面试过程中穿插进行的问题旨在评估你在特定情况下的反应。其目的通常是利用过去的经验预测未来的表现,并了解你在高压或困难情况下的反应方式。此外,这些问题还评估你的软技能,如沟通和团队合作能力。你应准备几个过去的经验,并以叙述的方式进行讲述。

例如,在第一次招聘电话中,招聘人员可能会询问你处理项目中困难时间表的经历。一旦你回答完毕,你还没有完全摆脱风险。在现场面试中,通常会有一个小时专门用于行为问题。在某些技术面试中,可能会被问及一些既是纯技术问题又是行为问题的混合问题。我将在第七章中帮助你成功应对行为面试,并提供关于特定公司准备的提示,比如Amazon 的领导力原则

现场最终轮

对于许多公司来说,最终轮面试有“现场”面试或其虚拟等效形式。这些通常是连续进行的面试。例如,从早上开始,您可能会与技术总监进行案例研究面试,然后与高级数据科学家进行编程面试。午餐休息后,您可能会与两位数据科学家会面,他们会询问机器学*理论,然后招聘经理会询问更多关于您过去经验的行为问题。除了技术面试官外,您可能还会与利益相关者交谈(例如,产品经理,与您正在面试的团队密切合作的另一个团队的产品经理)。在我经历过的几轮最终面试中,有产品经理作为面试官,或者是 ML 团队密切合作的其他部门的成员,比如营销或广告部门。

一些公司会在此之后进行额外的迷你面试轮次,例如与直接上级(您的经理的经理)快速交流。

摘要

在本章中,您已了解到各种机器学*角色,机器学*生命周期以及映射到机器学*生命周期的不同责任。您还看到了如何从流程的开始一直走到最终面试。这需要做很多准备和学*,但现在您已经有了概述,希望您能有一些关于如何定位自己准备的想法。

现在本章节已经奠定基础,我将详细介绍求职指南,包括简历指南,帮助您大大增加面试机会。

¹ 本书侧重于机器学*在行业应用中的应用,而不是主要关注研究机器学*算法本身、在会议上发表论文等需要博士学位的工作。

² 在某些地区也被称为“新手”。在本书中,我将使用术语“新毕业生”或“新生”。

³ David H. Ackley, Geoffrey E. Hinton, and Terrence J. Sejnowski,“A Learning Algorithm for Boltzmann Machines”,《认知科学》9 卷(1985 年):147-169,https://oreil.ly/5bY2p

⁴ Jeffrey M. Stanton,“Galton, Pearson, and the Peas: A Brief History of Linear Regression for Statistics Instructors”,《统计教育杂志》9 卷 3 期(2001 年),doi:10.1080/10691898.2001.11910537

⁵ 官方WordNet 网站提供更多信息。

⁶ Jia Deng, Wei Dong, Richard Socher, Li-Jia Li, Kai Li, and Li Fei-Fei,“ImageNet: A Large-Scale Hierarchical Image Database”,《2009 年 IEEE 计算机视觉与模式识别会议》,美国佛罗里达州迈阿密(2009 年):248-255,doi:10.1109/cvpr.2009.5206848

⁷ Alex Krizhevsky,Ilya Sutskever 和 Geoffrey E. Hinton,"用深度卷积神经网络进行 ImageNet 分类",《神经信息处理系统的进展 25》(NIPS 2012),https://oreil.ly/iFMkq

⁸ Alex Krizhevsky,Ilya Sutskever 和 Geoffrey E. Hinton,"用深度卷积神经网络进行 ImageNet 分类",《ACM 通讯》60 卷 6 期(2017 年):84-90,doi:10.1145/3065386

⁹ Thomas H. Davenport 和 DJ Patil,"数据科学家:21 世纪最性感的工作",《哈佛商业评论》,2022 年 10 月 19 日,https://oreil.ly/fvroA

¹⁰ 机器学*和数据科学使用数据;数据工程师不太可能自己使用机器学*技术,但他们的工作和合作对机器学*工作流程至关重要。

¹¹ Serena McDonnell(领导数据科学家,前 Shopify 员工)指出,在对冲基金领域,“研究科学家”和“研究工程师”用于指代机器学*角色。

¹² 我也看到 Google 的研究科学家职位招聘,但这些角色专门用于研究机器学*,负责在大型会议上发表论文,并要求获得博士学位。

¹³ 在软件中,以及由此延伸的机器学*中,“Ship”是一个常见术语,指发布某些东西,如软件产品或代码更新。

¹⁴ 在处理设备端或边缘机器学*的更专业角色中,一些关于硬件的基础知识也可能产生影响。

¹⁵ 商业术语,指阻碍其他事情发生的事物,通常是项目或时间表。

¹⁶ Wayne Duggan,"FAANG 股票发生了什么?它们变成了 MAMAA 股票",《福布斯》,2023 年 9 月 29 日,https://oreil.ly/JzMys

¹⁷ 公司的人力资源部门或等效部门。

¹⁸ 我在第二章中提供了更长的列表和概述。

¹⁹ 虚构名称,但我想尝试使用与 ABC 公司或 Acme 公司不同的东西。

OceanofPDF.com

第二章:机器学*职位申请和简历

要在机器学*领域成功获得工作机会,您不仅需要为面试本身做好准备,还必须首先获得面试机会。在申请过程中,有许多机会可以使您的个人资料脱颖而出,并增加您获得的面试数量。如果您目前在应用程序中缺乏回调,本章将教您如何优化申请,以获得更好和更相关的结果。如果您刚开始,本章提供了一个深入的步骤指南,将帮助您避免错误。

工作在哪里?

您想找一个机器学*工作,但在哪里?您可能知道像 LinkedIn 或 Indeed 这样的在线招聘网站,但我和无数其他机器学*专业人士也在其他地方找到了工作。表 2-1 提供了其他工作网站和了解工作列表的非正式方法的列表。

表 2-1. 了解带有示例的工作列表的方法

如何了解工作列表 示例

| 在线工作申请

(所有类型)| LinkedIn(“简易申请”选项很方便) Indeed

Dice

直接在公司网站上,因为它们可能不会发布到主要的招聘网站

区域性工作网站,如果您所在地区不流行国际网站如 LinkedIn

在社区活动期间分享的职位列表或在 Slack 或 Discord 频道上 |

| 在线工作申请

(专注于初创公司)| Wellfound(以前称为 AngelList TalentWork at a Startup

区域性初创企业招聘网站

直接在初创公司的职业页面上 |

| 网络 | 口口相传 信息面试

咖啡聊天

冷消息 |

机器学*职位申请指南

本节将引导您选择求职策略,以下的简历指南将帮助您创建优化的职位申请。

每次申请的效果

有些人成功地找到工作,完全没有任何人脉。事实上,我的第二份工作是通过直接申请获得的;当时我并不认识任何在该公司工作的人。但从概率的角度来看,如果我只申请那些没有任何推荐的公司,我将需要发送更多的申请和进行更多的面试。以下是我用来评估这一点的心理方程式:

应用程序 × 每次申请的效果(EPA)→ 面试邀请

无论每次申请的效果如何,您发送的申请越多,获得面试的机会就越大。不分青红皂白地发送大量申请——一种“喷射和祈祷”的方法——可能能够弥补低效果每次申请。

另一方面,如果您希望进行相同数量的面试但提交更少的申请,您平均需要增加您的 EPA。通过筛选适合的工作职位或调整您的简历可以提高您的 EPA。您将需要更少的申请来获得相同数量的面试(大多数情况下)。

那么您应该选择哪种策略?您不必获得推荐或调整简历,但在这种情况下,需要准备更多的申请。这是您的选择!如果您更喜欢大规模申请的方法,请随意跳过以下部分,但我建议您阅读它们。

以下是一些增加您的 EPA 的策略,我将在接下来的部分详细阐述(见图 2-1):

获取工作推荐。

获得 ML 工作的推荐并利用网络增加被推荐的机会。

在申请之前审核工作。

如果您投入时间寻找并申请与您的技能更适合的工作,这可以增加您的 EPA。

调整您的简历。

在审核工作时,您可以重新排列您的简历,突出显示与目标工作最相关的关键词和技能。

每个申请的工作申请和其有效性

图 2-1. 每个申请的工作申请和其有效性。

工作推荐

在第一章中,我提到了工作推荐可以帮助您脱颖而出,“简历堆栈”顶部,甚至可以确保您获得招聘人员的电话。在某些情况下,如果您是推荐的候选人,您甚至可以绕过初审电话,直接进入面试流程的后续阶段,如图 1-11 所示。在本章中,我提到了推荐是改善您的 EPA 的一种方式。我个人认为,在可能的情况下利用推荐是非常好的。这确实需要推荐您的人愿意冒风险,因为通过推荐您,他们暗示您一旦被雇用就会取得成功。

以下是三个例子,附有截图,展示了寻求推荐,咖啡聊天导致推荐以及信息面试。

警告

一个常见的误解是推荐是获得工作的万灵药。这不是真的,因为推荐通常只能让您通过第一轮流程;其余的取决于您自己。随后的面试轮次仍然会对您进行严格考验。

工作推荐示例 1:成功的实*生网络和外展

这是我曾经推荐给我的团队的一位实*生候选人的例子。我们是在他参加我共同组织的一个名为 AISC 的 ML 期刊俱乐部聚会时认识的(图 2-2)。在我主持的另一次活动后,我联系了他,因为他做了一个很棒的五分钟“闪电”演讲。我们进行了简短的交流,结束了对话,然后两年后我们再也没联系过!

推荐示例 1:在 ML 期刊俱乐部会议后的简短对话

图 2-2. 推荐示例 1:在 ML 期刊俱乐部会议后的简短对话。

后来,在 2022 年,他联系我聊了聊我当时工作的公司的一个角色。因为我认识他是几年前参加 ML 期刊俱乐部会议时的,还记得我们的对话,所以我很高兴推荐了他(图 2-3)。

推荐示例 1:推荐一位实*生候选人

图 2-3. 推荐示例 1:推荐一位实*生职位候选人。

这是一个很好的例子,说明在你彼此认识并且是职业熟人的情况下,可能会产生推荐、面试或职位提供的机会。

职位推荐示例 2:热情接触以了解更多关于招聘岗位的信息

这是另一个“热情”¹接触的例子(图 2-4)。这位朋友给我发了一条消息,提到我们都参加过的一个会议。我们在会议上只是简单交流了一下,但即使是这样的提到也足以引起我在拥挤的收件箱中的注意。我同意快速通话并回答一些关于招聘岗位的问题。

推荐示例 2:热情联系询问职位招聘

图 2-4. 推荐示例 2:热情联系询问职位招聘。

在电话中,我询问了这个人的过去经验。听完他们相关的数据经验后,我主动提出了推荐,即使他们还没有明确要求过(图 2-5)。

推荐示例 2:我推荐一位求职者的信息

图 2-5. 推荐示例 2:我推荐一位求职者的信息。²

这里是我同意与应聘者交谈并推荐他们的一些理由:

说明一种联系。

他们提到了他们以前见过我的地方。在某些情况下,求职者可能会提到阅读过我的博客或看过我演讲。他们可能会简单地提到看到我在 LinkedIn 上的一篇帖子(关于哪一篇很重要)。

要具体。

他们链接了招聘信息或者提到了为何联系他们的详细信息。有时候我会收到非常泛泛的问题,比如“我如何进入数据科学?”在这些情况下,即使我与他们聊一次咖啡,我也会重复和重复他们可以从我的博客文章或这本书中获取的信息!电话或会议应该用来进行更深入的交流。

礼貌可以走得很远。

他们既不咄咄逼人也不失礼,并且非常尊重我的时间。

实*生候选人在工作推荐示例 1 中也展示了这些特质。

工作推荐示例 3:冷门信息

这里有一个例子,有人之前我没有见过主动要求进行了咖啡聊天(图 2-6)。请注意,她提到看到了我写的特定 LinkedIn 帖子,这也印证了与你联系的人建立联系的建议。这条消息是关于一般性的交流,而不是特定的工作岗位,但她提到了人工智能和游戏开发两个我感兴趣的具体领域,这足以促使我安排一次会议。因为当时我们都在多伦多市中心地区,所以这相对容易实现。

推荐示例 3:咖啡聊天请求

图 2-6. 推荐示例 3:咖啡聊天请求。

在会议期间,我们深入讨论了各种机器学*和人工智能主题以及游戏开发,这让我对他能成为我推荐的人感到有信心。事实上,我的团队当时正在招人,这一点我也提到了。不幸的是,她最*刚开始了一份新工作,所以我无法推荐她,但在一个 UNO 逆转³的情况下,她提出要推荐给她的新雇主(图 2-7)!

推荐示例 3:UNO 逆转推荐提议

图 2-7. 推荐示例 3:UNO 逆转推荐提议。

社交网络

从这三个例子中可以看出,你可以通过一条周到的消息获得推荐。参加活动和会议可以增加你在需要时可以联系到的温暖联系人的数量。

行业内许多经验丰富的领导人都支持推荐。以下是一些例子:

大量的招聘是通过诸如给经理发送冷邮件、通过推荐人介绍或者参加社交活动等渠道进行的。事实上,我建议我的学员们除非绝对必要,否则不要通过招聘网站或公司网站申请工作。

Bedrock AI 的 CTO Suhas Pai

在某些角色中,如果你是一个值得信赖的推荐人,你可以跳过简历筛选和招聘人员的电话面试。

亚马逊高级应用科学家 Eugene Yan

那么,你如何“社交网络”呢?当我还是学生时,这个术语非常让我困惑。“说我去了会议和聚会,那又怎么样呢?人们不会仅仅因为见了我一次而推荐我去工作…” 如果你这样想,那么你可能是对的——人们通常不会在没有理由的情况下推荐你。

幸运的是,许多公司,尤其是大型科技公司和大公司,提供推荐奖金。这意味着如果员工推荐的人被雇佣了,他们会得到金钱或奖励。通常会有一个要求,新员工必须至少留任六个月,以防止滥用奖励制度。推荐计划激励员工在他们的社交网络中找到人才,并推荐到职位空缺。

此外,机器学*目前需求量很大,所以有些公司甚至难以招聘到合适的人才。许多公司和团队通过朋友、前同事、大学同学等推荐合格的候选人。因此,即使你的人际网络不强(目前),人们也有动机留意合适的求职者。

我使用的步骤如下:

  1. 参加现场或在线的聚会、会议等等。

  2. 参加活动(通常是免费的)。

  3. 每次活动时,只认识一个新人。

有了这个小目标,随着时间的推移,你会认识更多来自不同公司的人。即使每月只参加一次活动,一年下来你也会认识 12 个人,未来当你申请他们公司时,他们也许会愿意为你背书。或者你甚至可能会认识到创业公司的创始人,因为他们认识你,更容易雇佣你。

社交网络是一个长期投资,回报将在长期内显现。人们有一个误解,即社交网络仅仅包括这种情况:你找到一些你感兴趣的工作,然后联系相关公司或职位的人。如果你只在已经申请时才进行社交网络,你将会感到压力重重,时间也很紧张——更不用说,这可能已经太迟了。

如果你已经认识了其他公司的人,甚至是你的大学校友、训练营等等,当你看到他们公司的招聘信息时,你可以联系他们。如果你不确定如何开始,可以参考上一节成功案例。

小贴士

即使你认为自己并不“擅长”结交新朋友,这也是一种可以学*和实践的技能。设定一个小目标,在任何社交活动、聚会或会议上只认识一个新人。这确实是一个累积效应。

除了获取推荐之外,网络拓展还有强大的好处。以下是我作为一名新毕业生的一个例子:我在参加会议和聚会时,在申请他们的职位之前,就已经见过两位不同公司的最终面试官(董事级别)。⁴ 我得到了两个职位的提供。他们都没有给我推荐,但我仍然得到了网络拓展的好处,因为他们都曾经与我互动过;这是温暖的联系,而不是我在面试中第一次见面的面试官。

机器学*简历指南

我提到调整您的简历作为提高您的 EPA 的方法,但无论您是否计划调整您的简历,您仍然需要至少一个版本。本节将指导您创建您的第一份简历。如果您已经有了一个简历,您可以浏览本节以获取建议和最佳实践,然后转向您想要调整的简历部分或其他感兴趣的部分。

对过去经验进行清单

在开始撰写简历之前,您应该先列出您过去做过的事情清单。这个清单包括过去的工作经历,在学校或工作中的机器学*项目——任何与机器学*和数据科学相关的内容。如果您在机器学*之外没有个人或学校项目或工作经验,您仍然可以进行清单;这将帮助您确定您当前技能与目标机器学*角色之间的差距。

例如,当我是一名新毕业生(工作经验不到一年时),我的清单看起来是这样的:

大学

  • 关于 Steam 上视频游戏价格的计量经济学研究论文,使用了我自己爬取的数据

  • 关于 Reddit 参与度的计量经济学研究论文,使用了我自己爬取的数据

第一份全职工作

  • 我建立的 ML 流失模型

从您在“练* 2-1”中列出的清单中,选择三到五个您认为与一般机器学*角色相关的经历。再次参考表 1-3,即机器学*和数据技能矩阵。对于您目标的机器学*角色,您列出的经历目前是否相关?如果您觉得自己没有三个相关的机器学*或数据经历,您可以暂时用工作或学校经历填充三个经历,这些经历最为重要和“令人印象深刻”。不必担心在此阶段完美无缺;您可以随时回到您更长的清单中再选择一个。

接下来,列出与这三个主要经历相关的所有事项:这不仅包括与编码、机器学*或数据相关的技术部分,还包括软技能,如向团队呈现结果或组织团队聊天以协调队友。

继续使用我自己最初的未经过修正的清单的例子,这里是我会包括的内容:

大学生经历示例

关于 Reddit 参与度的计量经济学研究论文,使用我自己爬取的数据

  • 使用 Python 爬取 Reddit

  • 使用 Python 清理数据

  • 使用 Python、Stata 进行统计建模

  • 使用 Python 可视化结果

  • 使用 LaTeX 创建项目演示

  • 向 10 人和教授的研讨班介绍项目概述和结果

第一份工作(少于一年经验)示例

我的第一个 ML 流失模型

  • 使用 SQL、Python 进行探索性数据分析(EDA)

  • 使用 SQL 清理数据

  • 使用 SAS 在表格数据上训练逻辑回归模型;在 SAS 中创建集成模型

  • 运行模型评估并分析结果,使用 SAS、SQL、Python

  • 使用 Excel、PowerPoint 创建简化和更干净的可视化用于演示

  • 使用 PowerPoint 展示结果

  • 与 ML 工程师合作将模型投入生产

简历部分概述

现在你已经有了过去经历的起始列表可以完善了,让我们来看看简历的各个部分。以下是你简历的核心部分:

  • 经验

  • 教育

这些是可选部分:

  • 技能摘要

  • 志愿服务

  • 兴趣

  • 其他部分(你选择的名称)

别着急填写可选部分;这取决于你核心部分的内容及其是否已经很长。

经验

使用你在“Exercise 2-1”中提供的前三次经验,你还应该收集以下信息:

  • 职位名称

  • 工作的地方

  • 你在那里工作的时间段(例如,2018 年 5 月至 2021 年 11 月)

  • 来自“Exercise 2-2”的责任条款符号列表

  • 你地区、行业或工作文化中可能期望的任何其他信息

初步简历中的一个部分示例可能是这样的:

数据科学家,ARI 公司(2021 年 5 月至今)

  • 设计和开发用于网页个性化的协同过滤模型

  • 开发 ETL⁵ 生产代码,根据用户规范汇总预测模型分数

  • 开发预测集成模型,优化营销活动规划和触点

现在还不需要按照模板格式化你的简历;先把内容确定下来,再处理格式(有时候只加一个词就会破坏你精心设计的布局,修复起来比值得的时间更多……)。注意,我会在本节末尾链接一些常见的模板。

以下是一些提高你初步要点的提示:

使用动词来开始句子。

例如,不要写“使用 TensorFlow 进行图像识别”,而是写“使用 TensorFlow 开发图像识别模型”。(动作动词斜体用于说明;在简历上不需要斜体。)这可以帮助澄清你在经历中做了什么,而不仅仅是结果(这很可能是团队努力的结果)。

提示

您可以从华盛顿大学获得更多动词的列表:简历写作动词。

详细说明您的影响,最好是以量化且易于理解的方式。

[原文] 为网页个性化设计和开发协同过滤模型

[修改后] 为网页个性化设计和开发协同过滤模型,使参与率比基准提高了 2 倍

添加您使用过的工具和编程语言。

[原文] 为网页个性化设计和开发协同过滤模型

[修改后] 使用 PySpark 和 MLlib 为网页个性化设计和开发协同过滤(ALS)模型,使得参与率比基准提高了 2 倍

在某些时候,字数可能会太长,您必须删减所写的内容。尝试调整措辞,看看保留哪些是最重要的信息。

教育经历

这些点与经验部分非常相似;您还应包括以下信息:

  • 您所就读的学校/机构

  • 地点,国家(可选但建议)

  • 您在那里学*的时间段(例如,2018 年 5 月至 2021 年 11 月)

  • 与机器学*或数据相关的主要项目和任务清单

  • 您所在地区、行业或工作文化中可能期望的任何其他信息

以下是此部分可能看起来像的一个示例:

滑铁卢大学

加拿大滑铁卢,2010 年至 2015 年

  • 使用 Python 和 pandas 清理和抓取销售数据

  • 使用 ARIMA 时间序列模型预测的视频游戏价格

现在您已经有了核心部分,请查看可选部分。您的核心部分是否有很多项目和经验?如果是这样,那么您可能没有空间添加志愿服务。例如,当我刚刚毕业时,我添加了技能总结和志愿服务经验部分来填充空间,因为我几乎没有任何经验。

提示

如果您有其他经验,建议您先专注于完善现有的要点,然后再开始填充与简历无关的内容。太多的附加内容可能会分散招聘者和招聘经理注意力,而忽略了您最重要和最重要的技能。

技能总结

技能总结是列出您曾接触过的大量编程语言和框架的地方。请注意:不要夸大太多;如果您在这里列出了一个与您在要点中详细描述的不符合的框架或库,技术面试官可能会要求您详细说明。您简历上列出的每一项都可能被问及。以下是一个例子:

技能总结

  • Python

  • TensorFlow,PyTorch

  • NumPy/pandas,Polars

  • C++

  • 以及其他...

志愿服务

对于这一部分,你可以只用一行的项目符号,而不是将它们归类到一个经验组中,除非(1)你的志愿经历非常重要和实质性,在这种情况下,我可能会将其放在经验部分下,或者(2)你真的想填充你的简历。这里有一个例子:

志愿服务经历

  • 2023 年 SIGIR 会议志愿者,台北

  • 2020 年多伦多机器学*峰会志愿者

  • 等等……

兴趣爱好

有些人建议包含这一部分,以展示你在工作之外还有一些兴趣爱好。在我看来,一般规则是,如果空间不够,可以放弃这些可选部分而不会产生后果。另一方面,如果你的兴趣爱好像国际象棋大师或马术杯赛冠军这样酷的东西——不管你为何感到自豪——你可以保留它。当我还是学生时,我在这个领域填写了以下内容:

兴趣爱好

  • Team Fortress 2 废金属交易者,2012–2015

  • AISC(前多伦多深度学*系列)博客编辑,2019 年

  • 等等……

是的,我在简历中加入了与视频游戏相关的兴趣爱好。是的,我确实在 Team Fortress 2 这个在线游戏中交易了废金属,一种非正式的在线货币⁶。这背后有整个经济系统。是的,这确实是因为我必须填充空间,没有其他原因。然而,没有人问我这个。

附加简历部分

你可以选择添加其他部分,其格式基本与志愿和兴趣部分相同。如果你有显著的兴趣爱好、志愿服务等等,更名为它们自己的部分可能更合适。例如,一旦我开始公开演讲,我就有足够的条目来称得上新部分,取代我简历上的志愿服务部分:

公开演讲

  • O’Reilly AI Superstream(MLOps)主题演讲嘉宾

  • PyCon DE & PyData Berlin 主题演讲嘉宾

  • 等等……

至此就结束了这一部分。像往常一样,请确保检查是否有任何关于你应该包括的信息的地区性期望。我还在本章末尾包含了与简历相关的常见问题解答。

将简历量身定制到你所期望的角色

现在你已经有了基本的简历,让我们看看如何为常见的机器学*职位标题量身定制它(参见 图 1-8)。如果你寻找的职位标题不在 图 1-8 中,你可以将其映射到机器学*生命周期(参见 图 1-5),并对类似角色使用相同的提示。请记住,你不必为每一个求职岗位定制你的简历,但即使只为你感兴趣的最常见的职位标题定制,你平均可以提高你的 EPA。

如果你回顾技能矩阵(Table 1-3),你可能会明白为什么调整简历很有用:如果你具备“编程工具”和“统计学”技能,你可能可以申请数据科学家和 MLE(机器学*工程师)角色,但要突出两种角色之间的附加技能差异,修改一些重点将有助于更好地营销你的技能。机器学*技能矩阵(Table 1-3)帮助你更精准地匹配适合你过去经验的职位标题,但此后,你的工作搜索取决于实际的职位描述。

一旦你开始查看职位描述,有时你可能会看到涉及到与数据分析师角色(“产品”数据科学)映射的 DS 职位,有时工作职位可能更多地映射到矩阵上的 MLE 角色。

根据我的经验,我的全职角色一直是数据科学家,但我一直专注于构建和部署 ML 模型到产品中或改进 ML 产品。根据矩阵,我从 MLE 到应用科学家,甚至一些与 MLOps 相关的角色都做过。

现在假设我在网上浏览工作,你在我身边看着。我将搜索“Spotify 机器学*”,并开始点击结果,从 Figure 2-8 的示例开始。

Spotify 数据科学家职位贴文的屏幕截图(通过 LinkedIn)

Figure 2-8. Spotify 数据科学家职位贴文的屏幕截图(通过 LinkedIn)。

职位贴文示例 1:数据科学家

在阅读这篇数据科学家的招聘帖子(Figure 2-8)后,我记录下我认为重要的内容:

  • 与利益相关者合作,沟通(多次提到并置于重要的要点之首)

  • 执行数据分析,使用 BigQuery 或 SQL

  • 一些统计建模,如线性、逻辑回归

接下来,我将回顾我的简历经验——例如,我为以前的工作做的第一个 ML 流失模型的要点,并将其映射到数据科学家的职位贴文上。如果你还没有完成你的简历,你可以使用你为“Exercise 2-2”制作的清单清单。

我最初记录下的从我的第一个 ML 流失模型(见“Take Inventory of Your Past Experience”)中最相关的要点是:

  • 使用 SQL、Python 执行探索性数据分析(EDA)

  • 创建简化和更清晰的可视化以在演示中使用 Excel、PowerPoint

  • 使用 PowerPoint 呈现结果

基于机器学*生命周期,感觉这个角色更注重报告和数据分析(Figure 1-5 中的步骤 D),所以在调整简历之前,我应该确保我对生命周期的这部分感兴趣。

如果我对申请这个数据科学家角色感兴趣,我会专注于从职位描述中列出的三个要点,并缩短或删除其他项目。回想一下你为“练* 2-2”创建的清单;如果您有其他与此工作职位更相关的经验,请将其替换。如果您当前的简历与此工作职位相当相关,则可以保持不变。

如果您删除了一些不太相关的内容,请注意简历上剩余的空间。您删除的内容取决于简历上的剩余空间!现在我有了更多的经验,所以我更倾向于删除更多,而早期我选择添加更多的要点,几乎从不删除要点。只要核心内容在那里,删除东西是可以的;如果面试官对我如何训练更复杂的 ML 模型感兴趣——我在工作描述中删除了一个要点,因为它不在工作描述中——他们可以在面试中问我。

职位示例 2:机器学*工程师

让我们继续滚动搜索结果“Spotify 机器学*”,看看另一个在图 2-9 中的职位发布。

Spotify 机器学*工程师职位通过 LinkedIn 上的截图

图 2-9. Spotify 机器学*工程师职位通过 LinkedIn 的截图。

就像第一个例子一样,我通读了机器学*工程师的职位描述,并记录下我认为重要的内容:

  • 在生产中实现 ML

  • 原型设计

  • 测试和工具,平台改进

  • 与跨职能团队合作

基于这些要点,这个角色似乎更侧重于 ML 模型训练,其中一些部分在 ML 基础设施上,分别由机器学*生命周期中的步骤 B 和 C.1 说明(参见图 1-5)。

如果我对申请这个机器学*工程师角色感兴趣,我会专注于这三个相关的要点,并缩短或删除其他要点。为此,我将回顾“我第一个 ML 流失模型”示例中的七个要点,并将其映射到 MLE 职位。最相关的要点是:

  • 使用 SAS 训练模型

  • 使用 SAS、SQL、Python 运行模型评估和分析结果

  • 与 ML 工程师合作将模型投入生产

  • 使用 SQL 清理数据

你为"练* 2-2"创建的清单可以在不同类型的角色中重复使用,而不需要重写任何内容。记住,沟通和协作技能对公司也很重要,你会注意到这些技能在各种工作职位中经常被列出。不要忘记在至少一个简历项目符号中包含你与其他团队合作或向另一个组织展示工作的地方。对于那些认为自己没有足够“机器学*经验”的人来说,这尤其重要!你分析数据以及沟通数据的经验非常重要,可能比你想象的更能增强你的简历。

我建议在你的工作经历项目符号中清楚地列出你在过去角色中使用过的技术。你可以将它们内联列出或者放在项目符号的末尾,具体取决于你的空间和最简洁的方式。另外,如果有空间,可以在简历中包含一个技能部分。

最后的简历润色

现在你已经专注于精心制作和完善你的简历了一段时间,再稍微放开点:你申请的公司和团队之所以发布这份工作,是因为他们团队中存在空缺,希望找到能填补这个空缺的人。

因此,你的申请和简历应该专注于说服招聘委员会,你是一个可以填补这个空缺并成为他们团队的一部分的候选人。这包括:

  • 真实和相关的经验,你可以应用到工作中,包括可转移的技能:这些技能虽然不完全相同,但可以在不同领域之间轻松转移。

  • 软技能——你可以与团队中的人们良好合作,并与更广泛的人群沟通,比如产品经理等等。

  • 技术技能——你可以做出个人的技术贡献。

  • 证据表明你可以适应现有项目或获得足够的背景知识来启动新项目。

这些技能简洁地描述在我们在第一章中探讨的机器学*角色的三大支柱中。

你可以在简历中展示许多技能和经验,但不是所有的都要展示出来。例如,快速浏览一下你的简历:它完全没有任何团队合作的例子吗?还有其他一些可以帮助展示你能够快速学*的点(如果你没有太多相关工作经验)吗?

如果到目前为止一切看起来不错,那就开始申请吧,但如果不行的话,花点时间继续改进你的简历。

申请工作

现在你已经量身定制了你的简历,是时候开始申请了!去工作看板(你可以使用本章开头列出的那些看板作为灵感)。我认为,即使你不确定你的技能和简历是否完美,也可以开始申请;如果你申请了几个工作岗位,但没有接到招聘人员的回复,那就意味着你的简历或技能还需要进一步改进。你可能会发现,继续完善简历并花时间获取推荐足以提升你的 EPA 并开始接到电话。这是一个学*过程,即使一开始并不完美,目标是通过提交的申请数量或更有效的申请来获得回应。

筛选工作岗位

希望你已经完成了前面的练*,这不是你第一次查看你感兴趣的 ML 角色的工作描述。如果你筛选出你正在申请的工作,你可以增加获得面试的机会。根据我的经验,这一步最好与定制简历结合使用,因为如果你不定制简历,你最好大量申请,希望你碰巧申请到最适合你的工作。那么你如何过滤工作?

将你的技能和经验映射到 ML 技能矩阵

还记得在第一章介绍的各种 ML 角色吗?让我们过滤掉噪音,这样你就可以将你的技能重点营销给最符合你经验的角色。

参考图 1-8 中的常见 ML 职称:哪些角色最适合你?如果你最感兴趣的工作目前你没有经验,你有更好的主意在哪里集中学*来弥合这个差距吗?⁷

在技能矩阵中,可以一目了然地看到,数据分析师角色与数据科学家角色有重叠的技能,而后者又与 MLE 角色有很多重叠。好消息是,只要在你的技能清单中具备一些这些技能,你就可以申请其中一个或多个职位。

别担心,入门级角色只要有列出的一两项技能,你就可以申请这些工作。对于新毕业生来说,拥有 ML 技能柱中的一支较强技能而非全部是完全正常的,大多数雇主都能理解并欢迎这一点。虽然将你的技能映射到矩阵只是过程的一部分,但现实是,这个矩阵还要视情况而定。这就是为什么本章的下一部分要求你分析一个真实的工作岗位。

我见过很多求职者遇到这种情况:“这个职位的名称是数据科学家;为什么面试的问题却是关于数据工程(或插入意外内容)?”请记住,一个 ML 职位取决于公司或组织以及角色所在的团队,还有角色在机器学*生命周期中的位置(参见图 1-3)。

举个极端的例子,我曾经参加过一个“数据科学家”的面试,他们没有问任何统计或机器学*理论问题,也没有问任何与数据相关的问题。相反,面试包括几轮 LeetCode 风格(编程测验)的编程问题。⁸ 我想知道他们如何判断我是否是一个在数据方面核心工作围绕的优秀 ML 从业者,当问题完全来自通用软件工程师的循环时。事后看来,这可能是因为那个角色实际上根本不负责训练 ML 模型。

由于职位名称通常具有歧义性,作为求职者很难决定准备哪些主题。当然,你可以花时间复* ML 理论以及进行一些编程测验,但是你的时间很紧张,你可能在准备一些可能根本不会被问到的东西。

我见过一些求职者因为申请了“错误”的角色而被拒绝,这并不是因为他们不是强大的 ML 候选者,而是因为他们申请了与他们实际能成功的职位名称相同的角色。关键在于培养如何根据职位描述分类职位名称的直觉,并找到适合你技能的最佳角色。

有些职位名称出现在多个部分中,这没关系!当它引起混乱和拒绝时,这就不太好了,但是在本章结束时,你将能够更好地审查和定位它们。

当我申请工作时,我会看一眼职位名称,但为了确保我申请适合我的技能的正确工作,我会采取以下步骤:

  • 查看职位描述。

  • 对职责进行分类;它在机器学*生命周期的哪个阶段(参见图 1-4)?

  • 确定职位名称和职位描述是否足够匹配;例如,如果职位名称是机器学*工程师,但描述使其看起来有点像数据工程角色(而我过去的经验与此不相关),我会放弃这个角色。

追踪申请情况

跟踪申请情况可能是值得的,这样更容易记住你申请过的工作。如果你通过了简历筛选,并至少达到了招聘者筛选阶段,在他们告诉你他们会让你知道的时间范围内,跟踪这些申请可以帮助你记得跟进。

我过去跟踪了大部分的申请,但老实说,我现在认为你只应该跟踪那些至少通过了简历筛选的申请。特别是如果你大量申请与 ML 相关的工作,跟踪你的申请会浪费额外时间,而不跟踪它们不会影响你的通过率。跟踪申请可能有用的一个场景是,如果你计划在个人总结或稍后可视化你的旅程和统计数据时使用。

我认为跟踪我已经面试过的人是有用的,这样我可以在有关团队或公司的更多问题时与他们联系。如果几年后我再次与同一家公司面试,我也可以联系他们。记住,网络是一项长期投资,具有长期的展望!

至于跟踪申请和面试的工具,我认为 Google 表格、Microsoft Excel 或其他简单的电子表格工具完全够用了。

表 2-2 是我在 Google 表格中跟踪申请和面试的示例(名称是虚构的)。

表 2-2. 跟踪申请和面试的电子表格示例

申请日期 公司 职位发布网址 面试类型 面试日期 面试官 电子邮件 备注 结果
2023-08-02 ARI Corp https://[url-to-job-description] 招聘经理:行为和过去项目深度挖掘 2023-08-15 雪拉(招聘经理) xue.la@domain.com 招聘人员表示这是广告收入 ML 团队 待定
2023-08-03 Taipaw AI https://[url-to-job-description] 招聘筛选人员 2023-08-05 麦克斯(招聘筛选人员) max@domain.com 询问关于 PyTorch 经验 已通过

当你收到一些工作提议后,可以回顾一下你进行了多少次面试。还有一个好处是,有一个相关面试官及其电子邮件的列表,以防几年后你想联系他们。然而,我听说有些人跟踪他们的申请-面试-提供比例会使他们的情绪更低,而不是更高,所以这取决于你。

其他求职材料、证书和常见问题解答

我已经浏览了简历指南,但仍然有一些与求职相关的额外组件,如项目组合和在线认证。本节提供了一些最佳实践和常见问题解答。

是否需要项目组合?

项目组合基本上是项目示例。作为学生,我有几个副项目(即个人项目)。我把代码放在 GitHub 上,并创建了一些图表/可视化效果。GitHub 是一个很常见的项目托管地点,但有些候选人会将他们的项目组合发布为网站,比如 Heroku 网站。

记住,您的申请和面试的目标是说服雇主您是这份工作的优秀候选人:您具备技能或者可以轻松地接受培训以胜任工作。对于初级、入门级和新毕业的候选人:如果您还没有太多的工作经验,但有项目作品集,这可以帮助展示您的技能,并增加招聘经理和招聘团队对您能力的信心。

但是,如果您已经有了丰富的工作经验,拥有项目作品集可能只会有边际回报;在面试中,雇主更愿意讨论您过去的工作、案例研究、以及过去项目的技术深入分析等。您可能仍然会因为在 GitHub 上有项目作品集而受益,因为您在过去工作经验中开发的大部分代码和模型可能是专有的,因此您可能没有可以分享的代码样本。在这种情况下,展示一个 GitHub 仓库中的个人项目或对开源项目的贡献将是有用的。

要使您的作品集发挥作用并增强您的申请效果,您应该使其易于浏览和一目了然地理解。因此,我建议将重要的可视化内容放在 README 中,并清楚标记审阅者应该点击哪些代码文件。

网上认证有帮助吗?

当我审阅简历时,如果候选人有过机器学*经验或在业余时间做了机器学*项目(副业项目),我对认证的重视就不会太高。如果候选人没有相关的先前经验,那么相关项目和项目作品集将产生最大的差异。我建议您在获得认证的同时,也同步建立起这些内容。

有些认证比其他认证更有分量 — 再次回忆目标是与其他求职者区分开来 — 因此被视为更全面和实用的课程可能会有所帮助。例如,亚马逊网络服务(AWS)、谷歌云平台(GCP)和微软 Azure 云认证。

警告

如果你的整个简历只包括任何人都可以在一个周末完成的认证,那么你的简历就不会突出显示。

Interviewing.io分析了许多求职者的数据,并发现在其数据样本中,将认证放在 LinkedIn 上对候选人的感知质量产生了负面影响。⁹ 他们猜测,更合格的候选人会在他们的个人资料和简历中列出工作经历或相关项目,而那些没有这些经历的较不合格的候选人则会用认证填充他们的个人资料。

无论如何,候选人们发现了通过证书获得成功的途径,尤其是来自非传统教育背景的人。这里有一个关键提示:要注意收益递减。在经济学中,这意味着一旦你完成了更多单位的某事,你会越来越少地从每个后续单位中获益。在这种情况下,如果你已经完成了五个认证,接下来再完成三个或五个认证并不会有太大区别。五个认证在简历上看起来几乎与八个或十个一样。

所以一旦你已经接*完成三到五个在线证书,你应该尝试多样化你的经验:

  • 确保你的证书来自信誉良好的来源;如果看起来像是周末完成的,就不要列出它们。如果这样会清空你当前的认证列表,那么你应该继续以下两个步骤。

  • 参加更专业领域的认证,比如强化学*或自然语言处理(NLP)。

  • 开始一个副业项目,并在 GitHub 上建立一个项目组合。

表格 2-3 总结了我建议的一般决策标准。

表格 2-3. 你是否应该继续参加在线课程和认证?

经验水平 在线证书的好处
如果你的机器学*/数据科学简历上没有项目经历…… 是的,去完成在线课程和作业,并将它们放在你的简历上。
如果你已经学完了三到五门在线课程,但不确定是否要再学更多…… 考虑做一个副业项目,这会是更好的简历项目,也会更有效地利用你的时间投资回报率(ROI)。自我评估一下你的编程和统计技能是否已经达到了一个足够的基线水平。
如果你已经学*了统计学和编程,并且在数据科学简历中有一些相关项目经历…… 在这里暂停,检查一下你是否有足够的相关项目经历或一个良好的项目组合。如果没有,尽快开始!开始申请工作(或者直接朝着你的职业目标采取行动),而不要陷入自我学*循环中,有时被称为“教程地狱”。面试通常是发现你可以改进的好方法,即使你没有得到这份工作。

现在我已经介绍了项目组合和证书,接下来是一些关于简历的额外常见问题解答。

常见问题:我的简历应该有多少页?

我经常听到建议将技术类简历控制在一页。总体上,我同意,并且我个人也保持我的简历在一页之内。然而,我可以看到这会根据你的情况而改变。

你所在地区的期望是什么?

我曾经面试过许多来自欧洲的候选人,他们有两页的简历,他们通过了简历筛选。在美国和加拿大,我倾向于看到只有一页简历的候选人。在北美的技术行业中,*惯上不会在简历上包含个人照片,但我在查看来自亚洲和欧洲的候选人的简历时看到过这种情况。如果您在其他地区找工作,请通过行业内的人或甚至在线论坛双重检查,看看是否有关于简历长度或需要包含的信息的期望,这些信息我这里没有列出。

来自学术界?创建一个适合工业界的简历而不是 CV。

当我在研究生院时,有一种称为CV(履历)的简历类型。您可以使用 CV 申请研究生项目、博士后项目、学术教职等。

简历更加侧重于您的研究出版物,并且往往更长;它很少只有一页长。我见过的一些简历格式使用段落比我在行业中看到的项目符号格式更多。如果您已经有了一份简历,您可以将您的研究职责重新构思为项目符号,压缩它们,并在申请工业岗位时重塑为更常见的行业格式。¹⁰

当然,如果您直接将简历提交为您的简历,可能问题不大。我曾看到候选人成功地通过未修改其学术简历就获得面试的情况,但投资一点时间可能会增加您申请工业岗位时的效果评估(EPA)。

常见问题:我应该为 ATS(申请人跟踪系统)格式化我的简历吗?

正如我在第一章中提到的,我认为没有足够的证据表明,如果您恰好有两列或一列,或者您使用某种字体,或者您使用 PDF 与 Microsoft Word 文档等等,自动过滤将拒绝您的简历。尽管如此,在这本书中,我假设自动 ATS 拒绝可能是可能的。就我个人而言,我迄今为止一直使用由 LaTeX 制作的两列 PDF 简历,甚至在自动将我的简历解析为文本的在线职位网站上也没有任何问题。

但是,如果您认为简历的格式是阻止您获得面试的唯一原因,您可能有更大的问题要担心。¹¹ 首先,让我们使用本章的观点,看看除了 ATS 过滤之外,还有什么原因可能导致您的简历未被注意:

  • 您是否在简历审核人员可以快速看到的部分中包含了最重要和与机器学*/数据相关的信息?

  • 您的简历中是否包含大量相关的 ML/数据相关信息?您是否确保您的简历包含与职位描述中重叠的关键词?您的简历中的项目符号是否清晰?您的简历中是否存在拼写错误或明显的错误?请使用简历检查清单(在简历资源中列出)进行再次检查。

  • 您是否已经尝试过推荐人、调整简历或采取其他能增加您的经验积累(EPA)的行动?

话虽如此,在线表格确实会解析您的简历以查找文本字符串,所以不要发送.png文件或使用前卫的格式和字体(除非您申请的是一个特定的设计角色,这超出了本书的范围)。使用从“简历资源”链接的简单模板,甚至从 Google 文档中导出为 PDF。在这里适用 KISS(保持简单,愚蠢)。总之,遵循在线申请门户的说明¹²,并使用本章提到的最佳实践制作您的简历。

下一步

您已经学会了如何识别最适合您的 ML 角色,并创建了一个与您所瞄准的 ML 工作类型相关且量身定制的简历。

浏览职位发布信息

我的建议是浏览更多的职位发布信息。当我浏览职位发布信息时,我通过简单阅读职位描述学到了很多。例如,我感兴趣的“数据科学家”角色可能与另一位求职者感兴趣的“数据科学家”角色非常不同。回想一下,一个公司的“数据科学家”可能负责数据分析而不是训练 ML 模型的例子。

对我感兴趣的职位描述,我会注意到它们共同具有的要求。可选地,我会尝试创建两到三份定制的简历,可以批量发送到需要相似技能的职位。我之所以有两到三个版本,是因为一个是为那些似乎更需要软件技能的职位描述准备的,另一个是为初创企业职位描述准备的,我可能会强调我的初创经验。

辨别您当前技能与目标职位之间的差距

下一步是诚实地审视您当前的技能和您为您所瞄准的 ML 角色构建的简历。当您阅读 ML 职位描述时,您认为您如何可以增强您的简历?在浏览“练* 2-4”中的职位发布信息时,您认为您可以学*更多并添加到您的简历中的关键词是什么?

总结

本章重点介绍了机器学*职位申请的步骤。这发生在您获得面试之前,是获得面试机会的关键。您了解到在网上找工作的途径,以及通过人际网络和推荐增加面试机会的一些方法。您还阅读了一些简历的最佳实践,希望您已经创建了简历的初版。如果您已经准备好了,我鼓励您开始申请机器学*的工作,即使您觉得自己的技能或简历还不完美也没关系。

接下来的几章中,我将详细介绍各种类型的面试,涵盖技术面试和行为面试。首先是机器学*算法和理论,这是技术面试的一部分。

¹ 与“冷”相对,双方在接触时互不了解。

² 在我工作的公司,推荐人可以在招聘网站上自行输入员工 ID。然而,我也曾经使用过其他人力资源系统,那种情况下,推荐人(比如我)必须自己把被推荐人输入到系统中。再次强调!务必与您的推荐人确认。

³ 在 UNO 卡牌游戏中,有一张可以改变人们轮流顺序的卡片。它也可以指一种情况,即意图行动或后果被发起者扭转回去!

⁴ 您可以在我的博客文章中详细了解:“为什么网络就像投资指数基金——我如何通过参加活动遇见多位面试官”

ETL指的是提取、转换和加载数据。

⁶ 我在思考,我的经济学同好是否会将虚拟在线材料定义为商品货币。在游戏中,废弃金属物品可以用来增强游戏武器,因此它们是有用的。

⁷ 资源和指南将在本书后面介绍。

⁸ 这种类型的面试在第五章中有详细介绍。

⁹ Aline Lerner,“为什么你不应该在 LinkedIn 上列出证书”,interviewing.io,更新于 2023 年 5 月 15 日,https://oreil.ly/AQi3Q

¹⁰ 根据行业工作,我指的不是像在 Google DeepMind 这样的研究职位。

¹¹ 我在网上看到了一些窍门,例如将整个职位描述复制粘贴到您的简历上,将字体变小,将字体颜色设为白色以便隐形,然后导出 PDF,这样 ATS 系统可能会“通过”您的简历。但我还没有看到有人证明通过这些技巧获得了更多的机器学*面试邀请。

¹² Kerri Anne Renzulli,《75%的简历从未被人类阅读——如何确保您的简历击败机器人》,CNBC,2019 年 3 月 14 日更新,https://oreil.ly/XwLWw

OceanofPDF.com

第三章:技术面试:机器学*算法

在 Chapter 1 中,你了解了作为 ML 面试一部分将要经历的各个步骤。在 Chapter 2 中,你学*了如何将你的经验与感兴趣的角色联系起来,以及如何制作相关的简历。前几章的目标是让你受邀参加面试。在本章中,我将专注于 ML 算法。正如你记得的那样,面试流程如 Figure 1-9 所示,ML 算法面试仅仅是技术面试的一部分;其余部分,如 ML 训练和评估、编码等,将在随后的章节中讨论。

机器学*算法技术面试概述

如果你申请以下任何工作,可能会被问及 ML 算法技术问题:

  • 构建 ML 模型的数据科学家

  • 机器学*工程师

  • 应用科学家

  • 以及类似的角色

回顾常见的机器学*职位标题(Figure 1-8),有一些职位的责任是在机器学*生命周期中训练 ML 模型。本章重点评估这些技能的候选人;如果你申请的职位不太侧重于训练 ML 模型,你可能会得到这种类型面试的简化版本,或者完全跳过。

这个面试旨在评估你对 ML 算法的理解,特别是理论方面。关于如何用代码实现算法的问题,我在 Chapter 6 的模型部署问题和 Chapter 5 的编程技术面试中进行了讨论。作为受访者,你的目标是让面试官确认你理解 ML 算法背后的概念。确实存在一些角色,你只需知道如何用 Python 导入库即可,但对于更高级的项目,理解其背后的原理可以帮助你定制各种 ML 方法,更好地调试和排查模型问题。正如在 Chapter 1 中所述,在机器学*角色的三个支柱中,这是 ML 算法和数据直觉的支柱,展示了你适应能力(参考 Figure 1-6)。这种能力在有复杂 ML 用例和定制解决方案的公司尤为重要,在这些公司中,你可能需要修改或组合各种现成的方法,或者从头开始创建某些内容。

注意

我尽量提到尽可能多的常见算法,但是世界上还有更多的技术。请务必查看链接的资源,以扩展你的学*和面试准备!

还要注意的是,除了理解机器学*算法的内部工作原理和基础统计方法之外,你还需要成功地将这种理解传达给面试官。是的,我知道在这本书中已经多次提到沟通技巧,但这正是帮助你脱颖而出成为成功候选人的关键。

一个经验法则是,重要的是能够以两个层次解释算法和机器学*概念:一个简单的“像我五岁时解释”的水平,以及更深入、更技术的水平,更适合大学课程。第二个经验法则是要准备好回答这些机器学*算法面试问题的跟进问题。这样面试官就知道你不仅仅是记住并复述答案,而是能够将其应用到工作中的各种实际场景中。

在本章中,我详细讨论了以下技术问题,这样你就可以在面试集中讨论某个特定主题时轻松查阅:

  • 统计技术

  • 监督学*、无监督学*和强化学*

  • 自然语言处理(NLP)

  • 推荐系统

  • 强化学*

  • 计算机视觉

注意

在非常结构化的技术面试中,比如亚马逊数据科学初步电话筛选中,他们会明确问你一些范围明确的问题,比如要求你定义特定的算法。在你回答后,他们通常会继续下一个问题而不会有额外的跟进问题。有些公司会混合结构化问题和自由讨论,面试官可能会深入探讨你的回答,对话也可能从你的过往经验扩展开来。

统计和基础技术

统计技术在每一个数据角色中都被使用,并且这些技术是机器学*项目的基础。因此,在机器学*面试中,你很可能会被问及涵盖这个主题的问题¹。统计技术帮助构建基准模型,用于与更昂贵的模型和算法进行比较,或者帮助发现首先是否有足够有意义的数据来构建机器学*模型。

为了本书的目的,我将把基础回归技术放在本节,以及用于训练和改进机器学*模型的各种技术。简而言之,这些是(1)基础技术和(2)模型训练期间使用的方法,如训练集拆分、正则化等。这些概念是任何类型的机器学*算法的基础知识,后面提到的 ML 面试问题也是如此。

本节涵盖了统计技术的基础知识,特别是对于那些不确定是否具有足够背景知识的人。如果你已经在这些领域有专业知识,可以跳过子章节。无论你的专业水平如何,我都在提示框中强调了 ML 面试的具体建议,以帮助你应用你在每个 ML 领域的知识并在面试中表现出色。

现在,让我们开始吧。

总结独立变量和因变量

这里是机器学*算法基础之一——变量的概述,以及拟合模型的一个简单示例。

假设你有一个关于苹果的数据集,包括每个苹果的重量高度。你还有每个苹果的过去销售价格列表。有了苹果重量、高度和过去销售价格的列表,你想要在它们被卖出之前猜测新苹果的销售价格。为了这个例子,忽略大型连锁超市自动计算价格的情况,假设你是在向朋友和家人出售,或者你正在经营祖父留给你的农场。因此,你正在利用每个新苹果的重量和高度来预测其价格。在那一时刻,重量和高度是固定的观察结果(一个苹果不能同时既是 100 克又是 150 克)。

现在,为了连接所有这些概念,让我们加入一些术语。变量指的是在计算苹果价格模型中考虑的所有内容。因此,在这种情况下,变量包括重量、高度和价格。在这些变量中,你知道每个新苹果的重量和高度,并且它们在那个时刻是固定的。因此,重量和高度是独立变量。然后,你有另一个变量,价格,你希望在卖出之前预测新苹果的价格。预测的价格依赖于新苹果的高度和重量。例如,重量更重、高度更高的苹果卖得更贵。因此,价格是一个因变量(在表 3-1 中显示)。

表 3-1. 独立变量和因变量示例

独立变量 因变量

| 苹果重量 苹果高度

苹果颜色

苹果品种 | 价格 |

定义模型

模型是使用过去的数据点来描述“世界运作方式”的一种方式,或者说是一种找出过去信息的模式和联系的方式。前面章节中的苹果示例使用了描述定价方式的模型。模型是一种了解“真相”的方式 — 即使它不是完全的真相,而是我们对真相的最佳尝试的*似。因此,模型可以用来预测我们对未来数据点的最佳*似。这适用于所有的 ML 模型。“推荐系统”模型试图预测用户在访问网站时会喜欢或点击什么。“卷积神经网络”(CNN)用于图像识别,“学*”各种像素代表的模型:这个像素群和布局是猫还是狗?

对于独立和依赖变量,就像在面试中有一个共享的“模型”定义是很重要的,以防止误解,比如混淆算法与模型。² 模型是运行和拟合 ML 算法后的结果。

总结线性回归

我想确保包括回归模型。我很高兴我学到了线性回归和逻辑回归的详细内部和外部,甚至手动计算它们(这是我在大学经济学专业第二年统计课程中的要求)。这些知识已经累积并帮助我理解我遇到的新 ML 算法以及如何在实践中应用它们。所有我的学*都源于理解这些入门级概念,所以我强烈建议不要在学*回归模型的数学方面退缩。如果你已经在这个领域有专业知识,可以随时跳过这一部分。

让我们在图表中使用前面章节的苹果示例。为了简化起见并将其压缩到二维图表中,我们只使用一个独立变量,重量,来预测依赖变量,价格。图中的每个点代表过去销售的数据点,因此你已经知道它们的销售价格。例如,图中带有标注的点重量为 80 克(在 x 轴上的交点),售价为$1(在 y 轴上的交点)。请注意,这只是一个简单的例子;大多数线性回归的使用会有多个独立变量(“多变量”),如果可视化,将会是在N维空间中的一条线,其中N = 变量数 + 1(当有一个输出变量时)。此外,此示例有一个依赖变量;当有多个依赖/输出变量时,回归任务被称为多元。请注意,多元是与前面提到的“多变量”概念分开的。

线性回归

图 3-1. 用于线性回归的数据点。

线性回归的下一步是将“线”拟合到数据点。在幕后,像 Python、Stata、IBM SPSS、SAS、MATLAB 等软件工具将计算“最佳拟合线”。根据本节先前给出的模型定义,该线是模型,它是使用你拥有的数据点最好地逼*“真相”的最佳*似。从初始线开始,软件将计算残差:数据点与线之间的 y 轴距离,如 图 3-2 所示。在口语中,残差也称为残差误差

在线性回归中拟合最佳拟合线;直到找到最小二乘法为止迭代线条

图 3-2. 在线性回归中拟合最佳拟合线;直到残差尽可能小为止迭代线条。

所有残差都是平方的,以便预测值和线不会因为具有相反符号(正、负)而互相抵消。目标是使残差的总和尽可能小,因为如果你有一条明显偏离数据点的线,这意味着该线与尽可能多的数据点的拟合不佳、不准确。从数学上讲,评估线条拟合程度的常见技术是称为最小二乘法的过程。实现最小二乘法意味着找到导致平方残差总和最小的线,这反过来意味着你有了“最佳拟合线”:该线以最小距离适合数据点,如 图 3-3 所示。

最小二乘法和术语;y 表示观测数据点,而 ŷ(y-hat)表示预测/估计值

图 3-3. 最小二乘法和术语;y 表示观测数据点,ŷ(y-hat)表示预测/估计值。

最终的结果是一条线,它对数据点的最小二乘和最小,如 图 3-4 所示。

从图 3-2 的数据得出的最小二乘法得到的最佳拟合线

图 3-4. 从 图 3-1 的数据得到的最小二乘法得到的最佳拟合线。

未来,您可以使用这个“最佳拟合线”作为预测新苹果价格的模型!您可以将苹果重量插入该线条(以方程形式),以获得预测价格的数值。这是从数据点计算模型的最基本方式之一,但与下一章涵盖的更深入的 ML 模型和算法具有相同的模式。换句话说,您将初始化一条线(您不知道这是否是最佳模型),并计算残差或其拟合程度。接下来,您将通过稍微倾斜线条来更改它—在数学上称为更新系数权重—并再次计算残差,如图 3-2 所示。

此更新过程称为训练,这也是常用短语“训练/训练 ML 模型”来自的地方。如果平方残差的总和变小,则您正走在正确的道路上。当您无法再缩小平方残差时,您已经达到了最小二乘法,这就是您可以说该线条是您在该数据集上的最佳*似的方式(如图 3-4 所示)。这就像一个游戏,房间里有一个隐藏的物品,当你在房间里走动尝试找到它时,你的朋友会说“热”,如果你越来越接*,而在你走远时则说“冷”。您希望朝着房间里越来越热的地方走,直到达到最终位置。

在第四章中,我将介绍通过诸如均方误差(MSE)、均方根误差(RMSE)等误差项来评估模型的方法,这些概念与残差非常相似。主要区别在于,残差是过去观察数据与模型估计值之间的差异,而误差是模型估计值与模型之前未见的实际数据之间的差异。换句话说,在将模型应用于先前未见数据以评估模型性能后,误差即为这些差异。

定义训练集和测试集分割

总结一下,在使用监督机器学*³,例如前一节中简单线性回归示例时,通常会从数据集开始,希望 ML 算法能学*事物运作的模型。然后,您将使用模型计算因变量的值,例如预测苹果在实际销售前的售价。换句话说,您有过去数据点的数据集,当然没有未来数据点。在 ML 模型训练时,它正在学*“拟合”您当前拥有的数据。当模型在真实世界中使用时,可能会出现一些问题。首先,真实世界中总会有离群值或变化事件。

例如在使用机器学*进行金融预测时:市场可能突然转向熊市(下跌市场),而我们在牛市(上涨市场)中用金融数据训练的模型会产生可怕且极不准确的预测。另一个例子是,你手上的数据集可能不足以代表现实世界的行为。在前一节中关于苹果的例子中,你假设凭借苹果的重量和高度数据可以预测新苹果的销售价格。但如果你手上的数据不够,像富士或者蜜脆(我最喜欢的之一)这样的苹果品种售价更高怎么办?你的数据集中并没有追踪每个苹果的品种名称,所以一旦投入使用,你的模型可能是错误的。

但目前,你只有当前的数据集。为了充分利用它,你需要保留一些数据用于测试目的。这意味着你可以拿出 80%的苹果数据点用于模型训练,然后保留 20%的苹果数据点用于运行训练后模型的预测。模型训练的 80%数据称为训练集(有时称为训练数据集),在训练阶段模型未见过的 20%数据称为测试集。这模拟了在真实世界中运行模型以预测新数据点的情景;测试集就是为此目的而存在的。在许多情况下,你甚至可能将数据分成三个部分:80%作为训练数据集,10%作为验证(保留)数据集,另外 10%作为测试数据集(图 3-5)。

验证集允许你在训练过程中监控模型的性能,而不是“正式”评估它,并且它能帮助你诊断模型的弱点并调整其参数。如前所述,测试集在训练过程中模型未见过,因此用于正式评估模型性能,尽可能模拟真实世界环境。当然,拥有测试集和验证集并非绝对可靠,这引出了更强大的技术以及模型过拟合和欠拟合的概念。

训练、验证和测试集的划分

图 3-5. 训练、验证和测试集的划分。
提示

对于关于训练和测试集的面试问题,请确保你能够命名简单分割的常见方式,例如使用交叉验证:⁴将数据分成较小的块并依次作为训练集。

定义模型欠拟合和过拟合

模型在真实数据(甚至验证或测试集)上表现不佳的原因有很多。解决过拟合或欠拟合是一个常见的起点。欠拟合 是指模型拟合得不好。这可能意味着模型无法捕捉数据集的自变量(例如重量、高度等)与因变量(例如价格)之间的关系。因此,减少欠拟合的一些方法与帮助模型在训练过程中学*更多微妙或模式有关。

例如,添加更多变量或模型特征,例如苹果变种或苹果的年龄,可能有助于模型从训练数据中学*更多模式,并潜在地减少欠拟合。减少欠拟合的第二种方法是增加模型训练的迭代次数在停止训练之前⁵。

过拟合 是指模型过于密切地适应训练数据,可能找到只存在于训练集中而不在其他地方的模式。一个简化的例子是,训练数据恰好包含许多尽管重量不同但价格昂贵的苹果(例如,Sekai Ichi 苹果⁶)。模型从这些数据中学*并过拟合于此,因此导致不正确的预测,对便宜的苹果变体定价过高。简而言之,模型过于记忆训练数据,无法推广到新的数据点。有许多技术可以使模型更好地推广,例如添加更多训练数据,数据增强或正则化⁷。接下来我将详细介绍正则化。

正则化总结

正则化 是减少机器学*模型过拟合的一种技术。一般来说,正则化会对模型的权重/系数施加一个阻尼作用。到这里,你可能已经知道我接下来要做什么了——那就是再次提到苹果!苹果是我最喜欢的水果,这可能是为什么我经常使用这个例子的原因。所以让我们假设模型已经学会更重视“苹果的重量”(不经意的双关语,但模型的“权重”是合法的术语);然后苹果的重量在数学上会显著增加机器学*模型对价格的预测结果。如果通过正则化减少苹果重量增加模型对价格预测的影响量,那么可以使模型更具普遍性,并更均衡地考虑其他变量。

基础技术的样本面试问题

现在我已经在更高层次上涵盖了各种统计和机器学*技术,让我们来看一些样例问题。在这里,我将深入探讨由本节涵盖的概念引发的常见面试问题的细节。这些细节可能之前没有提到过,所以我希望这些样例问题也能帮助解释这些新概念。

面试问题 3-1:L1 正则化与 L2 正则化有何区别?

示例回答

L1 正则化,也称为套索正则化,是一种将模型参数收缩至零的正则化类型。L2 正则化(也称为岭正则化)向目标函数添加一个与模型系数平方成比例的惩罚项。这个惩罚项将模型系数收缩至零,但与 L1(套索)正则化不同,它不会使任何系数完全等于零。

L2 正则化有助于减少过拟合并通过保持系数不会变得过大来改善模型的稳定性。L1 和 L2 正则化都常用于防止过拟合并提高机器学*模型的泛化能力。

提示

关于模型过拟合和欠拟合的面试问题可能会引发跟进问题。例如,如果你提到了 L1 和 L2 正则化,面试官可能会问:“还有哪些类型的正则化可以起作用?”在这种情况下,你可以提到弹性网,它是 L1 和 L2 技术的结合体。或者对于过拟合的情况,集成技术也可以帮助(参考“面试问题 3-3:解释提升和装袋以及它们可以帮助解决什么问题。”)。

面试问题 3-2:如何处理不平衡数据集带来的挑战?

示例回答

在机器学*中,不平衡数据集指的是某些类别或类别比其他类别多。处理不平衡数据集的技术包括数据增强、过采样、欠采样、集成方法等:

数据增强

数据增强涉及生成更多示例以供机器学*模型训练,例如旋转图像,使数据集包括正常直立的人类图像以及倒立的图像。没有数据增强,模型可能无法正确识别侧卧或做倒立头站的人类图像,因为数据向正常直立的人类倾斜。

过采样

过采样是通过合成生成技术增加少数类数据点数量的一种技术。例如,SMOTE(合成少数过采样技术)¹⁰ 使用少数类的特征向量生成位于真实数据点及其 k *邻之间的合成数据点。这可以通过合成增加少数类的大小,并提升在过采样处理后训练的机器学*模型的性能。

下采样

下采样则相反:它减少了多数类的示例数量,以平衡多数类和少数类的数据点数量。在实践中通常更喜欢过采样,因为下采样可能导致有用的数据被丢弃,特别是当数据集已经很小时,这种情况会更加严重。

集成方法

集成方法还可以在处理不平衡数据集时提升模型性能。¹¹ 集成中的每个模型可以在数据的不同子集上训练,并有助于更好地学*每个类别的细微差别。

面试问题 3-3:解释 boosting 和 bagging,以及它们可以帮助解决的问题。

示例答案

Bagging 和 boosting 是用于提升机器学*模型性能的集成技术:

Bagging

Bagging 训练多个模型在训练数据的不同子集上,并组合它们的预测以进行最终预测。

Boosting

Boosting 训练一系列模型,其中每个模型试图纠正前一个模型的错误。最终的预测由所有模型共同完成。集成技术可以帮助解决机器学*训练过程中遇到的各种问题。例如,它们可以帮助处理不平衡数据¹² 和减少过拟合¹³。

注意

更多关于模型评估的深入问题,请参阅第四章。

监督学*、无监督学*和强化学*

在机器学*角色中,了解何时以及从每个技术家族中选择什么是一项重要技能——包括监督、无监督或强化学*。在我的之前的工作中,我使用监督学*来防止欺诈和客户流失,但在其他时候,我根据数据和情况使用无监督学*如异常检测解决同样的问题。有时候(随着你在机器学*职业中的成长),你甚至可能创建一个包含监督和无监督学*的机器学*管道。在强化学*管道中,你可能会在前一步骤使用监督学*来标记特征。理解底层机制可以帮助你在使用不同技术可能比坚持便捷更有效时,适应新情况。

因此,在面试中经常会有关于监督学*和非监督学*的问题。增强学*(RL)被认为是一个稍微高级的主题,在许多面试中可能不会被触及。然而,由于 RL 在行业应用中的增长,如与推荐系统结合使用,我曾在相当多的面试中被问及此问题。正如我在第二章中提到的,如果某事出现在您的简历中,那么在面试中讨论它是公平的!有关 RL 的更全面的概述,请参见“增强学*算法”。

提示

无论您面试的是哪种类型的机器学*职位,了解监督学*和非监督学*都是必备的知识。优先了解增强学*概念。

本节涵盖了标记数据、监督学*、非监督学*、半监督学*、自监督学*和增强学*的基础知识,对于那些不确定是否具有这一领域背景知识的人来说。如果您已经在任何这些领域具有专业知识,则可以跳过这些子部分。无论您的专业知识如何,我都在提示框中强调了 ML 面试的具体建议,帮助您应用每个 ML 领域的知识并在面试中表现出色。

定义标记数据

返回到我们的苹果数据集,从“总结独立和因变量”,您拥有过去苹果销售的数据点。在“总结线性回归”中,价格也是依赖变量。您确实拥有数据集的标签¹⁴,这意味着您之前进行的 ML 任务是使用标记数据。非标记数据的一个例子是当您有苹果的价格和重量但没有苹果品种时,您尝试推断不同苹果品种之间的共同点。因为您最初没有正确或预期的“标签”——在这种情况下是苹果品种——所以您将使用非标记数据进行无监督学*。

监督学*总结

在标记和非标记数据的概念基础上,让我们进入监督学*。监督学*是机器学*的第一种类型,其定义是利用标记数据,如图 3-6 所示。监督学*利用过去的正确或预期结果来预测新数据点的因变量。例如,利用苹果的重量、品种等来预测新苹果的销售价格就属于监督学*。监督学*可以分为两大类:回归和分类。

机器学*家族概述

图 3-6. 机器学*家族概述(简化理解)。

回归任务中,依赖/输出变量是连续值。例如,预测股票价格、房价或天气(温度)都产生连续值。分类是一种监督学*类型,其中依赖/输出变量是分类的,即它被放入一个类别,比如“这是狗”或“这是猫”。分类的例子包括检测某物是否是垃圾邮件,使用图像识别如在图片中标记动物类型等。

可以通过诸如独热编码之类的技术混合分类数据和连续数据。例如,如果我们尝试分类图像中是否有狗或猫,有狗的图像将使用“狗”类别的 1 编码,以及“猫”类别的 0 编码。可以将这些数字编码(0 或 1)与具有连续值的数据集混合。这样您可以混合这些分类数据(0 或 1)与具有连续值的数据集。

定义无监督学*

无监督学*是使用未标记数据来训练模型:当您没有“标签”可用时(标签是您正在寻找的正确或预期值)。您可能会使用无监督学*来查找数据集中的模式、共同点或异常,而无需先前知识的 ML 模型的正确或预期结果标签。

无监督学*的常见用途包括聚类和降维(见图 3-6)。许多生成模型是无监督的,例如用于图像生成的变分自编码器(VAE),例如与应用程序如稳定扩散。

聚类是一种将相似数据点组合到一起形成聚类的 ML 任务,如图 3-7 所示,这允许您看到任何新出现的模式。虽然您无法推断出您没有的任何标签,但仍然可以找到异常或感兴趣的聚类以进一步调查。无监督学*可用于客户细分,因为您可以假设同一聚类中的客户可能具有类似的偏好或行为。您可以使用无监督学*进行异常和异常检测,因为您可以在不了解“异常”外观的情况下发现数据中的异常模式。

无监督学*示例:聚类

图 3-7. 无监督学*示例:聚类。

降维是一种常见的技术,用于减少训练数据中冗余输入变量的数量。减少特征/输入变量的数量有助于减少过拟合,因为学*过多变量的模型可能还会从这些变量的“噪音”中学*。

总结半监督和自监督学*

随着行业对完全标记大量数据的限制,监督学*和无监督学*的扩展变体变得越来越受欢迎。在面试中,你可能不经常遇到这些概念,但你应该意识到它们的存在。如果你正在面试的团队使用这些技术,最好准备好讨论它们。

半监督学*使用少量标记数据(通常是手动标记的)来训练一个专门用于帮助机器标记先前未标记数据的 ML 模型。然后,初始标记数据集与具有最高置信度的机器生成标签结合,创建一个更大的标记数据集,如图 3-8 所示。

半监督学*概述

图 3-8. 半监督学*概述。

自监督学*¹⁵依赖于数据集本身来学*潜在的表示,而不需要标签。例如,在图像中,如果删除了某些部分,我们能否预测或生成这些缺失的部分?自监督学*的常见用途包括填补图像、音频、视频¹⁶、文本等的缺失部分。

提示

面试中可以提到半监督学*和自监督学*,以帮助解决标记数据不足或不必要为所有数据进行标记的情况。

强化学*总结

基于数据集或标签使用的第三种主要机器学*类型是强化学*(RL)。在其最简单的形式中,RL 并不一定需要先前的数据集,尽管通常在行业中,我仍然更喜欢有一些现有的数据集或现有的模型,这样我可以在部署 RL 代理到真实世界或客户手中之前脱机测试 RL 算法。

强化学*依赖于“代理”,这与我之前介绍的机器学*“模型”概念并不相同,尽管它们在改进和学*的迭代过程中有相似之处。强化学*通过试错学*。代理只需在每个新数据点到来时做出反应,通过经验最终学会预测执行下一步最佳动作的最优方式。

一个常见的强化学*示例是机器人学*导航迷宫,迷宫中有奖励、陷阱和出口(例如,参见本章后面的图 3-14)。机器人第一次穿越迷宫时,不知道金子、陷阱和出口的位置。但是随着它在环境中遇到这些事物,它也会获得知识或数据点,类似于通过试错构建自己的数据集。在机器人多次导航迷宫之后,它学会了最快和最安全的路径到达出口。但根据您设计的强化学*代理的方式,它还可以优化各种目标,例如收集最多的金子而不是尽快到达出口。

有各种类型的强化学*,其中一些类似于监督学*,但我将把这些深入讨论留在“强化学*算法”部分。强化学*通常用于游戏、机器人和自动驾驶汽车,但强化学*也可以用于越来越多之前使用监督学*的应用,比如 YouTube 上推荐视频的系统。

监督学*和无监督学*的样例面试问题

现在我已经在更高层次上覆盖了监督学*、无监督学*和强化学*,让我们看看一些与这些概念相关的常见面试问题。

注意

本节专门涵盖了监督学*和无监督学*的面试问题;由于强化学*有自己的部分,可以在“强化学*算法”中找到关于强化学*的问题。

面试问题 3-4:监督学*中常见的算法有哪些?

示例答案

回归算法族包括线性回归和逻辑回归,以及其他算法如广义线性模型(GLMs)和各种时间序列回归模型如自回归移动平均(ARIMA)。

决策树算法族可以在监督学*中用于分类和回归任务;这些包括 XGBoost、LightGBM、CatBoost 等。决策树可以在随机森林算法中组合(集成)多个决策树。像决策树一样,随机森林可以用于监督学*中的分类和回归任务。

神经网络不仅可以用于监督学*任务,还可以用于无监督学*。在监督学*方面,这些任务包括本节中的许多任务,如图像分类、目标检测、语音识别和自然语言处理(NLP)。

其他算法包括朴素贝叶斯,¹⁷ 这是一种使用贝叶斯定理的监督分类算法。¹⁸ 贝叶斯定理在机器学*中的应用包括贝叶斯神经网络,¹⁹ 这些网络预测结果的分布(例如,标准模型可能预测价格为$100,但贝叶斯模型将预测价格为$100,标准差为 5)。

面试问题 3-5: 无监督学*中常用的一些算法是什么?它们是如何工作的?

例子答案

无监督学*通常用于聚类、异常检测和降维。我将根据这些类别对算法进行分组。聚类 通常使用 k 均值聚类和基于密度的聚类(DBSCAN 算法)等算法。K 均值聚类 将数据分组到k个簇中,并迭代地使用聚类的质心标记每个数据点。然后更新簇的质心,并继续迭代,直到簇分配达到稳定状态,不再移动或改变。DBSCAN 是一个流行的算法,它将彼此靠*的数据点(高密度)分组在一起,并根据它们之间的距离将这些簇分离开来。因为无监督学*算法可以处理大的类别不平衡,所以有常见的无监督学*算法可以处理异常检测。

有许多算法可以用于降维。主成分分析(PCA)可以将数据集“压缩”到一个更低维的空间中。这对于数据预处理非常有用,因为它可以减少使用的冗余特征数,同时保持数据中的方差,以便在数据中保留足够的信号和模式。

自编码器 是一种无监督学*的类型,具有广泛的应用,特别是在自然语言处理领域,但不限于此。它们可以用于对输入文本进行压缩表示,这也是一种降维的形式,然后解码压缩表示以生成下一块文本数据。这对于文本完成和文本摘要任务非常有用。作为无监督学*的一个子集,自监督学*也是自编码器可以使用的情况之一。例如,自监督学*用于填补图像中缺失的部分或修复音频和视频。²⁰

面试问题 3-6: 监督学*和无监督学*之间有什么区别?

例子答案

这两种类型的机器学*之间的主要区别与使用的训练数据有关。监督学*使用带标签的数据,而无监督学*使用未标记的数据。带标签的数据 指的是训练数据集中已经包含 ML 模型的正确输出或结果。

监督学*和无监督学*在 ML 模型输出方面也有所不同。在监督学*中,ML 模型旨在预测标签将是什么。无监督学*不预测特定的标签,而是试图在数据集中找到潜在的模式和分组,这可以用来聚类新数据点。

在评估方面,这两种 ML 方法有不同的评估方法。监督学*通过将其输出与正确输出(使用测试/保留/验证数据集)进行比较来进行评估。在无监督学*中,模型根据其在数据中聚类或捕捉模式的效果进行评估,通过诸如聚类的 Jaccard 分数或轮廓指数以及异常检测的 ROC 曲线/曲线下面积(AUC)等指标来进行正比率比较。²¹

最后,监督学*和无监督学*通常用于不同类型的任务。监督学*通常用于分类(预测正确的类别)或回归(预测正确的值)任务,而无监督学*通常用于聚类、异常检测和降维任务。

面试问题 3-7:您在哪些情况下会使用监督学*而不使用无监督学*,反之亦然?请用一些现实世界的例子加以说明。

示例答案

无监督学*和监督学*在结果或标签的使用上存在差异。因此,无监督学*最适用于标记数据不可用或任务不是预测“正确”输出,而是在数据中找到模式或异常的情况。

作为一个现实世界的例子,监督学*可以用于分类和物体检测,例如图像识别任务。在训练数据集中,我将有正确标记的对象,并且算法将知道它们是否学会了根据与地面实况比较它们的预测来正确地检测对象。换句话说,如果算法没有正确地在图像中用框圈出脸部,我会知道,因为我将每个图像(脸部正确框出)与之比较。监督学*的其他场景可能包括基于其特征(如其年龄、系列名称和卡片的条件)预测罕见交易卡的价格。鉴于我已经有了正确标记的欺诈数据集,欺诈检测也可能是监督学*的应用。如果我没有关于欺诈行为的标记数据,我可能会选择使用无监督学*,通过检测异常行为来进行。

注意

在真实的面试中,你可能不需要提供这么多例子,但作为参考答案,我会列举一些。如果你能提供一个在你面试的公司所属行业中普遍关注的例子,那就更好了。例如,时间序列的例子通常与金融和金融科技行业相关,而欺诈检测则与在线销售平台、银行和金融相关。

有时无监督学*比监督学*更合适。对于异常行为的一般警告标志,可以使用异常检测来查找用户在线银行账户的异常登录位置。聚类是一种无监督学*任务,实际应用可以是根据客户的特征(例如行为、偏好)将客户分组,企业可以利用这些信息来确定如何为特定集群的用户量身定制产品或针对市场营销活动。如果我调查一个集群,并且通过聚类算法显示年轻专业人士有类似的行为,那么我们可能会知道在公司下一次数字广告活动中可以向他们提供类似的促销材料。

面试问题 3-8:在实施监督学*时可能遇到的常见问题是什么,你会如何解决?

示例答案

可能会影响监督学*的一个常见问题是缺乏标记数据。例如,当我想要用机器学*分类图像中的特定卡通和动漫角色时,我找不到可用于下载和使用的互联网标记数据。有一些开源数据集,比如 CIFAR,²²用于一般对象和物品的标记,但是对于更具体的用例,我需要自己获取并标记图像(供个人使用)。

我曾经处理过标记数据不足的问题;在这种情况下,手动标记一些例子作为起点是有效的。然而,仍然没有足够的标记例子,这导致了一个不平衡的数据集。为了人为增加标记数据的数量,我使用了数据增强技术,创建了合成数据和现有数据的变体,以使机器学*模型更加健壮。在图像识别中的数据增强的一个例子是随机翻转或旋转图像。为了说明为什么这可以增加样本,如果我翻转一个向右看的直立动漫角色,那么它就变成了两个模型学*的数据点:一个向右看和一个向左看。旋转也有助于:机器学*算法能够正确地识别侧身倾斜或者倒立做倒立头的动漫角色吗?

自然语言处理算法

*年来,自然语言处理领域取得了很大进展,OpenAI 的 ChatGPT 就是一个显著的例子。有很多面试问题是基于变压器模型的基础技术,并且随后是 BERT 和 GPT 系列模型,所以我会在本节中涵盖这些概念。

NLP 通常应用于聊天机器人和情感分析(例如,基于 Reddit 或 Twitter 帖子查看产品或公司的一般态度是积极还是消极),以及生成书面内容。如果您正在为一个从事 NLP 工作的公司或团队面试,那么您肯定会被要求深入展示您对这些概念的理解。即使您不是专门面试 NLP 团队,我仍然建议您对 NLP 应用有一般了解,这将使您成为一个更全面的候选人和 ML 专业人员。更不用说,NLP 技术不再仅用于生成书面内容;它们还与计算机视觉、文本到图像模型结合,用于生成图像、视频、音频等等。甚至时间序列预测和推荐系统也开始采用 NLP 技术。学* NLP 的基础知识将会给您带来很多好处,因为这些技术的通用性有多大。

本节介绍了 NLP 技术的基础知识,适合那些对该领域的背景知识不确定的人。如果您已经精通其中任何领域,请随意跳过子部分。无论您的专业水平如何,我都在提示框中强调了 ML 面试的具体建议,以帮助您应用您对每个 ML 领域的知识,并在面试中表现出色。

总结 NLP 的基本概念

让我们分解支持 NLP 的组件。首先,你有一个数据集,通常称为文本语料库。²³ 文本语料库可以包含许多类型的文本,如新闻、在线论坛或任何具有大量真实和有意义文本的内容,而不是胡言乱语。接下来,使用这个数据集,你需要像处理其他机器学*任务一样对数据进行预处理。一些常见的在面试中会问到的技术包括分词、词袋模型或 TF-IDF(词频-逆文档频率)。

分词是将文本分解为单词、短语或有用的语义单元的过程。²⁴ 例如,根据情况,“preprocess” 这个词可以作为一个单独的标记保留,也可以分解为“pre”和“process”。而“aren’t”可以作为一个单独的标记保留,但也可以分解为“are”和“n’t”。

一旦数据集经过预处理,语言建模就可以被制定出来,以预测下一个序列的项,这可能是下一个单词(如图 3-9](#next_word_or_phrase_predictioncomma_as_s)所示),下一个句子,下一个段落,缺失的单词等等。

如手机或电子邮件上的自动完成中看到的下一个单词或短语预测 25

图 3-9. 如手机或电子邮件上的自动完成中看到的下一个单词或短语预测。²⁵

词袋模型BoW)是一种将句子或短语映射到向量的方法。向量可以由单词和其他信息组成,例如单词出现的次数(如果出现一次为 1,出现两次为 2,依此类推)。对于句子“Syd likes to drink bubble tea and chamomile tea”的示例.json表示如下:

{
    "Syd": 1, "likes": 1, "to": 1, "drink": 1, "bubble": 1, "tea": 2, 
    "and": 1, "chamomile": 1

}

注意,“tea”这个词出现了两次,因此计数为 2。

TF-IDF利用单词在段落或文档中出现的频率来确定这些单词的相关性。

尽管 NLP 与其他类型的机器学*共享许多基础概念,但它也带来了独特的挑战。在使用监督学*(如下游微调)时,数据很难标记。例如,如果您正在使用监督微调进行情感分析,快速预测用户评论是积极的还是消极的,有时可能会存在歧义。另一个挑战是存在大量的变异性,例如俚语和地方语法差异,这也可能导致数据稀疏性,即文本语料库中确切的单词组合可能很少出现,但仍然是有效的。

NLP 的常见用例包括情感分析、聊天机器人、文本分类(例如,垃圾邮件与非垃圾邮件)、文本生成、文本摘要、文本到图像生成等等。

小贴士

BoW 和 TF-IDF 是我最*在面试中听说的有用的基础技术。

摘要长短期记忆网络

长短期记忆(LSTM)网络是一种递归神经网络,专门设计用于处理长数据序列,在自然语言处理(NLP)应用中非常有用。与转换器中的注意力单元类似,长期依赖性和先前文本的上下文对于 NLP 的有效性至关重要。然而,LSTMs 也有一些局限性,比如处理非常长的文本序列时,即理解页面或段落中较早出现的文本背景。为此,转换器(在下一节中介绍)能够更好地处理长期依赖性。

小贴士

LSTMs 不仅可以用于特征工程和时间序列。由于篇幅限制,我在这里不再详细解释,但我鼓励你阅读更多。Christopher Olah 的博客理解 LSTM 网络提供了一系列良好的插图,帮助理解 LSTMs 的应用。

摘要变压器模型

Transformer 模型由 Google 于 2017 年引入,²⁶ 这使得*年来语言模型的范围得以扩大。相比于卷积神经网络(CNNs)和循环神经网络(RNNs)等现有架构,Transformers 在处理长文本串的上下文和意义时表现出更好的改进。²⁷ Transformers 也更适合在数据集中找到模式,而不像 CNNs 和 RNNs 那样需要大规模标记的数据集。因此,现有数据集的准入门槛更低。有了 transformers,大型的、自由形式的互联网文本语料库可以直接用于分析,无需事先昂贵的标注工作。

transformer 网络内的注意力单元是其有效性的一部分,可以找到单词之间的短距离和长距离关系,这有助于模型正确标记上下文。例如,“Max went to the record store. Later, he bought a Jay Chou album.” 自注意力单元可以正确识别“he”指的是“Max”。结合 BERT 的编码器架构和多头注意力机制,这显著提高了自然语言处理任务的性能和能力。

BERT 模型总结

由 Google 开发,BERT(Bidirectional Encoder Representations from Transformers)模型自 2019 年起用于处理 Google 搜索引擎的查询。²⁸ 正如其全名所示,BERT 利用了前述的 transformer 神经网络。BERT 是预训练的,这意味着 Google 进行的初始训练步骤生成了用户可以访问的模型²⁹,通过在大规模文本语料库(如维基百科和其他文本数据集)上进行“自监督”学*。在预训练期间,BERT 接受了两个任务的训练:遮蔽语言建模(MLM)和下一个句子预测(NSP)。

遮蔽语言建模 指的是随机“遮蔽”或阻止/删除句子中的几个标记,并让模型学*正确预测这些标记。例如,“Lisa is singing a [MASK]”,其中 [MASK] 表示 BERT 预测的标记。这在 Figure 3-10 中有所说明。如果 BERT 能够预测“歌曲”或“旋律”等词有更高的正确概率,那么模型训练就很顺利。如果它预测的词或标记像“狗”,那么在模型训练的这一点上就不准确。

Illustration of masked language modeling

图 3-10. 遮蔽语言建模示例。

下一个句子预测 是 BERT 训练的第二个任务。其目标是准确预测文本序列中的下一个句子。由于这一训练过程可以在没有外部标签的情况下向模型提供反馈,因此它并不是“监督”学*本身,但因为反馈来自文本语料库本身,所以被描述为“自监督”学*。

模型预训练之后,用户可以下载模型或使用 API³⁰来“精细调整”模型以适应其自己的用例。这会改进用户的 BERT 模型副本,并需要监督学*。例如,用户可能希望使用 BERT 进行情感分析;在这种情况下,用户需要提供具有积极情感、消极情感或模糊情感的文本示例和标签(如果用户愿意)。如果你想使用 BERT 生成具有特定语气的文本,例如电影反派,你需要提供特定于 BERT 的示例作为精细调整的一部分。BERT 在这些任务上为用户节省了大量时间,因为它已经对目标语言(包括各种开发者创建的其他语言的预训练模型)有了一般性的理解³¹。

提示

精调可以用于许多其他的 ML 模型,而不仅仅是 BERT。例如,你可以精调像GPT-3.5(在写作时)。然而,我将精调作为 BERT 的一部分,因为我看到许多面试都在问关于 BERT 精调的问题。

总结 GPT 模型

GPT(生成式预训练变换器)系列的 NLP 模型以推动 OpenAI 工具 ChatGPT 而闻名。截至写作时,GPT 模型家族包括 GPT-1、GPT-2、GPT-3 和 GPT-4³²。它们在大型文本语料库上进行训练³³,例如 BookCorpus、WebText(Reddit)、英文维基百科等等。

GPT 家族利用变换器进行预训练,并且预测下一个单词。像其他主要的 NLP 模型一样,它可以通过精细调整³⁴来更新预训练模型的参数,使其更适合特定任务,例如文本生成。值得注意的是,GPT-3(与在写作时推动 ChatGPT 的 GPT-3.5 和 GPT-4)还利用用户反馈通过强化学*来改进其模型预测。强化学*在“强化学*算法”中有更详细的介绍。

除了 GPT,还有几个其他大型语言模型(LLMs),例如 PaLM2(驱动 Google Bard)、Llama/Llama 2(Meta AI)等等³⁵,都是基于类似技术进行训练的。

更进一步

NLP *年来发展迅速,许多知名的 LLM 已经发布(如图 3-11 所示)。我鼓励对该领域感兴趣的候选人更多地了解这些模型和技术。我记得在工作中探索了 Word2vec³⁶ 和 GloVe³⁷,现在还有许多其他开发 NLP 应用的方法。许多基础方法像这两个以及像 BERT 这样的模型仍然被广泛使用,我认识的招聘经理们仍然会询问它们,所以不要忽视基础!

大型语言模型的进化树示意图;来源:“大型语言模型实用指南”

图 3-11. 大型语言模型的进化树示意图;使用许可来自“大型语言模型实用指南”

NLP 面试样本问题

现在我已经介绍了一些在 NLP 中使用的基础技术,是时候看一些面试问题了。NLP 领域和生成 AI 中的应用发展非常迅速,因此我们将看到事情如何变化!然而,从我与网络中的招聘经理交流来看,我知道所有的招聘经理仍然期望候选人具备关于基础主题和用于 NLP 应用案例的数据预处理技术的知识。

面试问题 3-9:你将如何利用像 BERT 这样的预训练模型来执行特定的下游任务,比如情感分析、聊天机器人或命名实体识别?

示例回答

BERT 和其他预训练的 NLP 模型可以进行微调。一个大型的预训练 NLP 模型库是 Hugging Face 模型库。预训练模型可能包括用户上传的原始模型的微调模型,例如由 Google、OpenAI 等公司提供的原始模型,但用户也可以下载针对情感分析等任务进行微调的模型。

如果我想自己对其中一个原始模型进行微调,我需要为 NLP 模型提供一个带标签的数据集。例如,对于情感分析,这将包括正面和负面情感文本的示例;对于聊天机器人,我可能提供带有正确答案的帮助台问题的标记数据;对于命名实体识别,我将提供命名实体的示例,希望 NLP 模型能正确输出。

面试问题 3-10:你如何清洗/处理原始文本语料库以训练 NLP 模型?你能列举一两种技术及其背后的原因吗?

示例回答

从原始语料库开始,一个快速的第一步是使用正则表达式技术清除不需要的字符。某些下游任务并不依赖标点符号,但像情感分析这样的任务可能受益于保留标点符号;我们可以看到“!”在情感分析中可能是有用的。接下来,我们可以使用分词将文本分解为有意义的单元,通常是单词;例如,“Susan is writing a sentence”可以分解为五个标记:“Susan, is, writing, a, sentence.”

词干提取(Stemming)和词形归并(Lemmatization)都旨在将词语还原为其基本形式,以便时态变化和衍生仍指向同一根词。词干提取 是一个粗略的启发式技术,去除单词的末尾(例如 cars → car;history → histori 和 historical → histori)。[³⁸] 词干提取比词形归并更加粗糙,后者利用词典形式的基本词;例如,在词形归并中,“studying”,“studies”和“study”都会被还原为“study”。这对于 NLP 模型识别这些词在其根本意义上相同是有用的。

面试问题 3-11:自然语言处理模型常见的挑战有哪些,你如何解决这些挑战?

示例回答

即使使用了强大的预训练模型,自然语言处理(NLP)可能面临的挑战包括同义词/同形异义词、讽刺以及特定领域(如金融或法律文件等)的语言。这些问题可以通过更多针对特定情况的数据进行更好的下游微调来改善。例如,可以提供更多同义词用法的示例,这样 NLP 模型就能更好地判断何时使用哪个词。

在许多情况下,存在固有的偏见;用于大规模语言模型(LLM)训练的预训练语料库,如维基百科,有大量男性志愿编辑者,这是不成比例的。Reddit 作为一个具有大量文本数据集的论坛,也常用作训练数据集的基础,其用户性别偏差也很明显。

面试问题 3-12:BERT-cased 和 BERT-uncased 有什么区别?使用其中之一的优缺点是什么?

示例回答

BERT-uncased 有一个分词器,会将输入文本转换为小写,因此不管是传入大小写(包括大写)还是全小写(uncased)文本,对于 BERT-uncased 来说都是相同的。BERT-cased 则会为相同的单词不同大小写情况下分别处理;例如,“The”在 BERT-cased 中与“the”是不同的。因此,BERT-cased 能够基于大小写区分不同的语义。在不太重视大小写信息的应用中,BERT-uncased 可能更合适。然而,在需要考虑大小写信息的情境,例如专有名词对于 NLP 任务很重要的情况下,会更倾向选择 BERT-cased。

提示

您可以看到这些问题的趋势:无论是哪种 NLP 应用(即使是生成式 AI!),了解如何适应情况至关重要。如果专有名词有用(不要全部小写),预处理将会不同,有时您可能会保留标点符号(如情感分析),有时则不会。深入理解 NLP 技术可以帮助您在面试中作出比仅仅记忆和复述更好的回答。

推荐系统算法

推荐系统(RecSys)无处不在于我们的数字生活中,并负责个性化您访问的网页和应用,例如 Netflix、YouTube、Spotify、任何社交媒体网站等。通过比较两个不同用户登录时显示在其首页或搜索结果中的项目或产品的顺序,可以判断网站是否具有个性化。例如,您的 YouTube 首页显示的内容可能与兄弟或朋友的不同。

推荐系统根据您以前的行为(例如观看过的节目和电影)提供新节目和电影的建议,认为您可能会喜欢、与之互动或购买。例如,Netflix 使用您以前观看的节目和电影的信息作为其推荐系统中的信号,以向您建议新的节目和电影。

提示

由于许多技术产品使用推荐系统,这是大型科技公司面试官常问的“默认”类别。

本节介绍了推荐系统技术的基础知识,供那些不确定是否具备该领域背景知识的人参考。如果您已经在任何这些领域有专业知识,可以跳过子节。无论您的专业知识如何,我都在提示框中强调了 ML 面试的具体建议,以帮助您应用您在每个 ML 领域的知识,并在面试中表现出色。

总结协同过滤

协同过滤 是推荐系统中常见的技术。该术语来源于使用许多用户和/或物品偏好的数据(协同)来为单个用户进行推荐(过滤)。这基于一个假设,即具有相似过去偏好的个体可能会对新的未见产品产生偏好,因此算法将推荐相似用户喜欢的新物品。

协同过滤技术有两种主要类型:基于用户和基于物品。 基于用户 的协同过滤技术识别具有相似兴趣和偏好的用户,然后向这些相似用户推荐他们以前未见过的产品或物品。通过 ML 算法(如矩阵分解),计算“相似”用户,这将在本章后面介绍。 基于物品 的协同过滤技术根据其用户评分或用户互动识别相似的物品。如果用户以前喜欢过类似的物品,则协同过滤算法将推荐这些物品。

总结显式和隐式评分

在基于用户和基于物品的协同过滤中,通常需要了解用户的评分和偏好。如果用户留下了一个好评和评论,那么你可以明确地知道他们喜欢这个产品。但是用户没有足够的时间对每件事情都提供明确的详细反馈——想想你自己留下评论的次数;你很可能并没有为过去使用的每件物品都留下评论。然而,你仍然可以计算隐式反馈,比如在 YouTube 视频上花费的时间:如果有人看到最后,这可能意味着观看者比在两秒后关闭视频时更喜欢它。在推荐系统中使用隐式反馈还可以帮助减轻一些常见的偏见;如果人们喜欢或讨厌产品,他们更有可能留下明确的评价(而且你知道如果出了什么问题,人们更有可能大声表达)。

小贴士

在 第四章 中,我将讨论模型训练和数据预处理。对于推荐系统的应用,在探索性数据分析、模型训练、数据预处理、特征工程、评估和监控过程中,理解可用的显式和隐式评分是面试中重要讨论的内容。

总结基于内容的推荐系统

另一种常见的推荐系统类型是基于内容的系统。在基于内容的推荐系统中,你需要关于产品本身的详细信息。这些信息可能包括文本描述的特征(书籍简介、电影类型和描述)、图像(产品截图)、音频/视频(预告片、产品视频)等,以便了解哪些物品彼此相似。相比之下,之前描述的基于用户和基于物品的协同过滤依赖于用户对物品或产品的偏好,而不依赖于物品本身的特征。

例如,基于内容的电影推荐系统可以根据用户先前观看并喜欢的电影的类型、导演或演员推荐电影,通过明确和隐式反馈进行衡量。因此,基于内容的推荐系统可以被制定为一个排序或分类问题,像基于树的模型算法非常适合。

基于用户/基于物品与基于内容的推荐系统比较

使用基于用户/基于物品或基于内容的推荐系统都有其优缺点。基于用户的系统在处理新用户时表现不佳;这通常被称为“冷启动”问题,因为用户的偏好数据不足,可能因为他们尚未购买或评价任何产品。基于内容的推荐系统可能需要较少的用户行为数据,因为它们不依赖其他用户的偏好或评分,这使得它们适合新用户或整体反馈较少的小众项目。但基于内容的系统可能仅限于推荐与用户之前互动过的物品类似的物品;因此,新物品不会被引入给用户,从而限制了用户可能享受到的产品或物品的多样性。

提示

知道基于用户、基于物品和基于内容的推荐系统之间的权衡可以帮助你在面试和工作中脱颖而出。在现实中,显式反馈可能难以获得,而隐式反馈可能并不完美。知道如何混合和匹配你掌握的所有数据和推荐系统算法将极大地帮助你脱颖而出。

总结矩阵分解

矩阵分解是协同过滤中使用的一种技术。首先,构建一个矩阵,其中用户作为行,物品作为列,用户对物品的评分或偏好作为单元格的值。这被称为用户-物品矩阵,如图 3-12 所示。由于并非所有用户都与所有物品互动,原始矩阵将非常稀疏。例如,一个用户可能只与少数几个物品互动过,但在线平台上有数千或数百万种产品。矩阵分解的目标是预测矩阵中那些空值——也就是用户在之前未与之互动的物品上可能会给出的评分,并推荐那些你估计用户会喜欢的物品。

矩阵分解示例;来源:Google

图 3-12. 矩阵分解示例;来源:Google

一个经典的算法是奇异值分解(SVD);然而,除了实践数据集之外,我从未见过它被用于行业应用,因为其昂贵的计算需求。⁴⁰ 对于行业应用,如果作为机器学*从业者选择使用矩阵分解,选择的算法需要能够处理非常稀疏和大型的矩阵,因为许多在线平台拥有大量的产品和用户。例如,ALS 等算法通过最小二乘法的*似来计算它们对矩阵中缺失值的最佳猜测(用户可能会喜欢的物品),而不是传统 SVD 使用的复杂矩阵操作。

推荐系统面试常见问题样例

现在我已经介绍了推荐系统的基础知识,让我们来看一些实际面试问题的例子。

面试问题 3-13:内容推荐系统和协同过滤推荐系统有什么区别?在什么情况下会选择其中之一?

示例答案

内容推荐系统需要了解被推荐产品的分类或特征,以确定产品的相似性。协同过滤依赖用户行为和用户偏好来推荐用户喜欢的类似口味的产品,因此可能对产品本身知之甚少。

因此,在协同过滤推荐系统无法为用户-物品矩阵构建足够多用户或物品时,内容推荐系统可以很好地工作。换句话说,只要有关于物品/产品特征以及用户特征或偏好的信息,内容推荐系统就可以解决“冷启动”问题,而无需像协同过滤那样需要更多的用户行为和交互数据。

另一方面,协同过滤适用于用户行为数据丰富的情况。有时,很难收集足够的、有意义的描述产品的特征,这使得内容推荐系统失效。在这些情况下,协同过滤可能更合适。

提示

据我所知,我曾经参与过一个项目,其中协同过滤算法(ALS)对长期使用网络平台的用户效果更好,但对新用户效果较差。使用基于内容的过滤和 XGBoost 对新用户效果更好,我们根据用户类型部署了不同的模型。当然,这只是一个例子,对您的情况可能会有所不同。

面试问题 3-14:推荐系统中遇到的一些常见问题及其解决方法是什么?

示例答案

冷启动问题:这是指机器学*模型没有足够的过去数据点可供训练。因此,模型无法从过去学到足够的模式,以准确预测新数据点的正确结果。在推荐系统中,可以使用内容推荐系统,它需要较少的用户行为数据,但确实需要足够的产品特征数据。这可以帮助解决冷启动问题,并为新的网站用户提供推荐。

推荐系统在数据质量方面也可能遇到挑战,这个问题并不仅限于推荐系统。这可能包括源数据中的错误,例如在数据摄入过程中出现的错误。这个问题可以通过分析源数据存在问题的地方,并与负责数据质量的团队(有时是数据工程师或平台工程师,或者是 MLE 和数据科学家们)合作进行修复来解决。然而,首先要识别数据质量问题的存在是非常重要的,一些预防措施包括使用数据质量监控工具如 Great Expectations,在数据分布发生变化或者有大量缺失值时提醒团队。

当 ML 数据集中有许多缺失值时,这被称为稀疏性。例如,注册网站平台的用户可能在问卷中要求用户偏好时没有正确填写或者完全跳过。例如,当有人注册新的 Reddit 账户时,会显示常见的子论坛,但用户可以跳过这一步。这是为了尽可能减少网站注册过程中的阻力,但是这样的情况可能导致在构建 RecSys 特征集时出现数据稀疏性。可能的解决方案包括插补(例如,用平均值填补缺失值或使用基于树的方法填补数据)、使用协同过滤或矩阵分解技术、特征工程等等。

面试问题 3-15:推荐系统中显式反馈和隐式反馈的区别是什么?分别使用每种类型的权衡是什么?

示例答案

显式反馈包括用户评分或评价,而隐式反馈必须从可用的用户行为中派生,例如在网页上花费的时间或点击流行为。显式反馈的好处包括在机器学*中使用明确量化的评级以及与隐式反馈相比的明确性。然而,显式反馈可能更难收集,因为并不是所有用户每次互动后都会留下评价(大多数用户不会)。

因此,通过隐式反馈(例如视频观看时间或在网站上阅读的时间)来衡量用户的参与度或享受程度可能会被使用。当然,这可能导致不完美的度量:用户在网页上花费很长时间是因为他们喜欢内容,还是因为他们对上面的文字感到困惑?总的来说,考虑到这些权衡是很重要的,但实际操作中,你可以经常在你的机器学*模型中结合这两种反馈信号。

面试问题 3-16:在推荐系统中如何解决数据不平衡问题?

示例答案

这是 ML 场景中常见的一个问题:有一些类别或类别具有比其他类别更多的观测或数据点,而有许多类别/类别则观测较少,形成了长尾[⁴¹]。

处理这个问题时,过采样技术可能在简单情况下有所帮助,比如创建更多的数据点来增加那些观测次数较少的类别。然而,当观测有许多类别时,简单的过采样技术就不能缓解这个问题了。可以使用其他技术,比如特征工程和集成方法,来替代或与过采样同时使用。集成方法的一个示例可以是为热门项目和低参与度项目分别创建推荐系统。

在像亚马逊和 Spotify 这样的公司中,将 RecSys 与强化学*等家族结合起来,有助于确保长尾产品、艺术家或商品至少在某些时间向用户展示。[⁴²]

提示

回到本节开头,推荐系统是一个常见的默认 ML 话题,因为许多科技公司的 ML 用例可以被制定为排名或推荐问题。在大科技公司中,我看到 NLP 技术或 RL 与 RecSys 的结合增加了,因此请务必查看“了解推荐系统算法的资源”中的论文,例如社交媒体(如 Facebook、Instagram)、娱乐(如 Netflix、Spotify、YouTube)、在线购物(如 Amazon)等已知的 RecSys 专注产品的现有示例。

强化学*算法

在“监督学*、无监督学*和强化学*”中,我简要介绍了强化学*(RL)算法。简而言之,RL 依赖于“试错”学*,在最简单的情况下,它不需要预先存在的数据集或已知标签。RL 将通过实时环境(例如机器人多次导航迷宫)收集知识,学*金子、陷阱和出口的位置。

强化学*在工业中有许多应用,比如自动驾驶车辆、游戏[⁴³]、作为大规模推荐系统的一部分、LLMs(RLHF[⁴⁴]对改进ChatGPT有很大帮助),等等。因此,了解强化学*对于希望加入使用 RL 的团队的面试者来说是必要的。

提示

如前所述,RL 在生产中是一种较为先进的技术家族。因此,对于新毕业生角色,你应该首先专注于获得更广泛的 ML 知识。一旦掌握了这些,了解 RL 可以帮助你在求职过程中脱颖而出(根据我的经验来看)。

本节介绍了强化学*技术的基础知识,供那些不确定自己在这一领域是否具备背景知识的人参考。如果您已经在任何这些领域中具有专业知识,请随意跳过子节。无论您的专业知识如何,我在提示框中强调了关于 ML 面试的具体建议,帮助您应用每个 ML 领域的知识,并在面试中表现出色。

总结强化学*代理

在强化学*中,代理是一个与环境交互的自主实体,具有特定的目标或目标,并通过试错学*做出最优决策。例如,一辆自动驾驶汽车在测试环境中学*,随着时间的推移,学会了哪些行为是好的(遵守速度限制和道路标志)和哪些是坏的(如撞到树木和闯红灯)。

虽然在前面提到的大多数 ML 算法中,模型是焦点,但在 RL 中,代理随着其与环境的交互而更新。这并不意味着 RL 中没有“模型”,但模型通常被用作支持组件,可以在整个 RL 工作流程中混合和匹配。

为了说明强化学*,我将继续以自动驾驶汽车的示例简化理解。创建这个基本的强化学*代理需要以下构建块:状态、动作、奖励和策略。

提示

有许多种类的强化学*,因此在每种算法类型中,策略、状态、动作或奖励之间的交互方式可能有所不同,并且它们可能与其他概念混合和匹配。请注意在面试中询问的概念。

强化学*代理正试图学*如何根据环境反应以安全驾驶的最佳策略。当代理被初始化时,它不知道在特定情景下选择最佳动作的策略,因此你只需让它在环境中四处行驶。这个特定场景的构建块包括:

状态

代理遇到的状态是环境的表示,或环境的状态。这可能包括更新汽车周围环境的信息;跟踪汽车左侧、右侧、前方或后方是否有物体;以及可行驶道路和交通灯及其状态的特殊标记。

动作

在这个例子中,代理可以选择的动作有:左转、右转、前进和刹车。注意:这种情况被简化为离散动作,但复杂的情景可能包括转动方向盘的角度。代理可以执行的所有动作统称为动作集,代理旨在在每个决策点执行最佳动作。

奖励

每次代理在环境的某个状态下采取行动后,代理将获得有关获得或损失的利益量的反馈,这在强化学*中称为奖励。例如,在自动驾驶汽车 RL 代理面前有红灯的状态下,RL 代理采取制动行动,这可能会被奖励为正奖励。如果 RL 代理选择继续前进并闯红灯,则会受到惩罚:即获得一个负值的奖励,也称为负奖励。代理将记住这一点以便下次使用。奖励通常是外部定义的,代理事先不知道它们,只能在试验和错误中学*到。请注意,“在给定状态下进行的行动”这样的措辞是有意的;在不同状态下进行相同的行动可能会产生不同的奖励。例如,在右侧有灯柱时右转并发生碰撞,以及在右转道上右转将分别产生负和正奖励。因此,状态对于 RL 代理的决策和学*至关重要,不仅仅是行动奖励

策略

策略是代理如何选择行动的方式。在大多数情况下,它将选择已知能产生最高奖励的行动,但这种简单的策略会导致代理停止探索新的场景,并且经常产生奇怪的行为。例如,代理可能早就学会了在红灯时右转不会受到负奖励(在北美的许多地方根据交通法律是允许的)。代理可能会利用这个事实,总是在红灯时右转,而不是尝试新的事物,例如在红灯处停车。

因此,策略可以定义为在已知产生最高奖励的状态下选择行动,同时平衡诸如利用已知奖励和探索环境以学*新的状态-动作-奖励组合等附加因素。常用的策略包括epsilon-贪婪策略⁴⁵,其中代理在训练过程的开始阶段更多地进行探索,然后在经历了更多状态、行动和奖励之后更多地进行利用。在某些类型的强化学*中,其策略是一个参数化模型,然后进行更新;我将在关于基于策略的强化学*的后续部分中详细介绍这一点。

总结一下,代理使用策略在给定状态下选择最优行动,然后查看行动带来的奖励,然后更新策略以改进未来的状态和行动,如图 3-13 所示。

强化学*策略更新

图 3-13. 强化学*策略更新。
提示

在面试中,我经历了更多关于为什么奖励设定如此的后续问题和深入追问,例如,“为什么你选择将点击率作为正面奖励,而不是视频观看时间?”

总结 Q 学*

我将继续在状态、动作、奖励和策略的概念上进行建设,作为接下来章节的基础。强化学*代理通常希望在给定状态下选择动作后获得最高的奖励。然而,在奖励中缺乏进一步的细化时,这可能导致短视行为,正如您在代理仅利用而不探索时看到的那样。解决强化学*中的短视行为的一种方法是通过在奖励设计中增加更多复杂性来处理。因此,长期的预期奖励非常重要,它不仅包括即时动作的奖励,还包括将来可能对代理可用的奖励。

预期的总奖励是作为强化学*过程的一部分计算的,它是当前步骤下可用的未来奖励的期望值的加权和。我将以需要寻找迷宫出口的机器人为例进行说明,如图 3-14 所示:

  • 在这个迷宫中,炸弹是坏的,而金钱/财富是好的。

  • 出口位于迷宫的右上角,迷宫中间有一条死胡同,机器人在先前的探索中已经了解到。

  • 如果机器人选择朝中间走,那么它去到死胡同的概率较高,去到出口的概率较低,这在未来奖励的期望值之和中得到了体现。

  • 因此,在其他条件保持不变的情况下,朝右上方向的总预期奖励(又称为预期累积奖励)将高于朝中间方向的总预期奖励。当然,机器人需要已经探索过那些地方;在探索之前,它仍会计算预期奖励,但可能不太准确。

    强化学*示例:机器人在迷宫中导航

    图 3-14. 强化学*示例:机器人在迷宫中导航。

现在让我们将预期的累积奖励概念与Q 值联系起来,这是在特定状态下采取行动的预期累积奖励。Q 函数是一个相关概念;它接受状态-动作对的输入并输出 Q 值。策略确定 RL 智能体应在给定状态下采取的行动。为了将所有内容联系起来,Q-learning 中的最优策略来自于在每个状态中选择具有最高 Q 值的动作。在每一步之后,评估策略并使用称为 Bellman 方程的优化方法更新 Q 值。⁴⁶ 重复此过程,直到策略收敛并在给定状态下选择相同的行动。

也可以使用 Q-learning 而不是策略迭代,而是使用更简单的ε-贪心策略,这在前面的部分中提到过。在策略不太可能收敛或学*代价高昂,或者状态和/或动作空间非常大的情况下,这种更简单的格式通常更为实际。

总结基于模型与无模型的强化学*

因为 Q-learning 不使用模型来尝试模拟世界——或者换句话说,状态动作之间的关系,因此它是一种无模型强化学*技术。像 Q-learning 这样的无模型强化学*需要表示状态和动作,但之后只需观察奖励即可持续改进其 Q 值和策略(如果使用策略迭代)。

提示

常见的无模型强化学*算法包括 Q-learning、SARSA(状态-动作-奖励-状态-动作)⁴⁷ 和 *端策略优化(PPO)⁴⁸。

在基于模型的强化学*中,智能体学*环境的模型,包括各种可能状态之间的关系,称为状态转移。智能体利用此模型在特定状态下做出最佳行动决策。因此,基于模型的强化学*需要对环境有明确的了解。例如动态规划和 蒙特卡洛树搜索(MCTS)⁴⁹。

总结基于价值与基于策略的强化学*

基于价值的强化学*建立在估计处于某个状态并选择采取某个动作时的预期累积奖励(即“价值”)的基础上,例如在 Q-learning⁵⁰、SARSA⁵¹和深度 Q 网络(DQNs)中。这些算法的重点在于能够预测预期的累积奖励。

另一方面,基于策略 的强化学*学*策略,即代理程序在给定状态下选择行动的方法或模式。基于策略的强化学*具有可以使用梯度上升方法优化的参数化策略函数,因为它学*状态和行动之间的映射。使用梯度上升是因为基于策略的强化学*旨在最大化预期累积奖励,而梯度下降用于最小化错误。常见的基于策略的算法包括基于策略梯度的算法,如 REINFORCE 和演员-评论者方法(“演员”学*策略,“评论者”学*值)。您可以在图 3-15 中看到各种类型的强化学*的示意图。

强化学*方法概述;来源:“Introduction to Reinforcement Learning” by J. Zico Kolter

图 3-15. 强化学*方法概述;来源:“Introduction to Reinforcement Learning” by J. Zico Kolter

总结基于策略与离策略强化学*

基于策略 的强化学*根据在遵循当前策略迭代时收集的数据点更新其策略。请注意,并非所有基于策略的强化学*必须是基于策略的。⁵² 假设一个 RL 算法使用当前策略(p1)执行一个动作(a1),并使用该动作的观察结果使用梯度上升更新该策略,记为(p2):最新学*的策略。如果代理程序使用新策略(p2)继续下一个动作(a2),那么它被认为是基于策略的。策略迭代方法如 SARSA⁵³是基于策略的 RL。换句话说,如果代理的行为策略是其目标策略⁵⁴(正在更新的策略),那么这就是基于策略的 RL。

离策略 的 RL 算法根据从不同策略或混合策略收集的数据点或经验更新其策略。这包括 Q-learning 和 DQNs。巧合的是,这些都是基于值的 RL 算法。为了避免混淆,将基于策略与离策略视为代理程序是否使用正在更新的最新策略,而基于策略与基于值则指的是用于推导最佳行为的算法类型。

还有许多其他算法可以探索,如时间差分(TD)、A3C(异步优势演员-评论者)和 PPO;如果您有兴趣了解更多,请查阅 Richard Sutton 和 Andrew Barto 的强化学*教科书,在线免费提供,也包括本节开头的资源。

强化学*面试问题示例

现在您已经熟悉了强化学*的基础概念,让我们看一些例子面试问题。

面试问题 3-17:解释强化学*中的 DQN(深度 Q 网络)算法。

示例回答

DQN 是 Q-learning 的一个扩展;DQN 使用神经网络来逼* Q 值,这些值表示在给定状态下采取行动后预期的未来奖励(与 Q-learning 的定义相同)。在 DQN 中,您有两个网络:目标网络和 Q 网络。目标网络负责预测从给定状态下所有可能采取的行动中的最佳 Q 值(目标 Q 值)。Q 网络采用当前状态和动作,并预测特定动作的 Q 值(预测的 Q 值)。为了改进 Q 网络,使用预测的 Q 值、目标 Q 值和观察到的奖励之间的差异作为 Q 网络的损失函数。

神经网络的权重是根据预测的 Q-learning 与通过经验获得的实际 Q 值之间的差异进行更新的。使用目标网络的原因是确保训练结果更稳定,因为在强化学*中,每一步都会更新 Q 网络,每个动作的方差可能非常大。经过足够的步骤后,目标网络使用 Q 网络的新权重进行更新,然后继续训练。

面试问题 3-18:作为跟进问题,您能解释一下 DQN 在常规 Q-learning 基础上添加的主要修改吗?

示例回答

DQN 主要的新进展之一是使用经验回放。经验回放是在 Q 网络和目标网络之前的一个组件,使用简单的 epsilon-greedy 方法在当前状态下在真实环境中采取行动并获得奖励。它将这些行动、状态和奖励保存为网络用作训练数据的经验。使用经验回放的原因是强化学*的顺序性质;网络的训练数据集应包含每个动作在前一个状态下导致的奖励和新状态的顺序。

面试问题 3-19:通过一个例子解释强化学*中的探索与利用。这两个概念的权衡是什么?您会如何平衡探索和利用?

示例回答

我将以一个简单的自动驾驶汽车的 RL 代理为例进行说明。在探索过程中,它首先发现在红灯处右转不会受到惩罚(按照北美的规则)。代理程序可能会继续利用这一知识,而不是尝试新的行为并学会在红灯前停下来,从而导致不良行为:永远不在红灯前停车。因此,鼓励探索同样重要,这样代理程序就可以尝试新的行为。随着代理程序对环境进行了更多次的探索,增加利用参数变得更安全,因为此时对代理程序表现良好并积累的经验来说更为重要。通过早期允许更多的探索,然后通过 epsilon-greedy 策略等技术减少探索并增加利用,我可以平衡探索和利用。

总之,为了平衡探索和利用,我将使用 epsilon-greedy 策略⁵⁵,以便 RL 代理可以更多地探索环境。随着代理程序与环境的互动和学*,epsilon 值会减少,使得代理程序开始增加利用。最终,一旦代理程序进行了足够的探索,它就可以利用过去见过的良好决策并减少探索。

面试问题 3-20:在以下情况下,您发现强化学*算法一直推荐将作为其销售价格的 10%错误标记的项目。这可能是什么原因,并假设数据都是正确的,您将调查什么?

例子回答

在我们的 RL 代理中有奖励函数的情况下,我将调查奖励/奖励函数,并查看是否在奖励 RL 代理的异常行为。例如,代理程序可能会利用方式来人为增加用户的点击率,例如推荐高度折扣的商品。在这种情况下,点击率的人为增加会给 RL 代理带来正面奖励。如果奖励函数考虑到了折扣在奖励中的成本,那么代理程序就不太可能只优化点击率而损失产品的利润。

面试问题 3-21:解释基于模型或无模型强化学*。各自的例子是什么?在何时选择其中一种?

例子回答

当环境模型难以估计或环境不断变化时,通常更倾向于无模型 RL。这是因为基于模型的算法试图构建准确的完整环境模型。这里“模型”包括从一个状态到另一个状态的转移概率。注意:这里使用“模型”一词并不意味着 RL 的其他组件不是 ML 模型。具体来说,“基于模型的”RL 指的是环境的模型,而不是在工作流中具有其他 ML 模型的独占性。

当您有一个合理的地面真实表示整个环境时,比如在 Atari 或象棋等游戏环境中,模型基 RL 更为可行。这些环境可以模拟多次,通常具有确定性结果,因此可以学*或构建描述环境及其状态转移概率的模型。在大多数实际情况下,完全描述环境是不可行的,尽管通过深度学*和描述环境的非常非常多的特征,比如自动驾驶汽车上的先进传感器,这可能是可能的。总的来说,在环境未知的情况下,无模型 RL 可以使用。

计算机视觉算法

计算机视觉是一个常见的 ML 应用程序,包括图像分类、图像识别等。例如,将计算机视觉应用于医学图像,如 X 光片,以分类患者是否患有某种疾病,或检查波形图像以分类特定声音。自动驾驶汽车代表了各种计算机视觉技术的复杂应用。

一些计算机视觉应用可以跨多个行业使用。例如,光学字符识别(OCR)可用于银行的在线支票存款系统中读取支票,检测社交媒体帖子中的标志,或者识别广告图像中的产品。⁵⁶ 无论行业如何,利用计算机视觉 ML 的 ML 从业者受益于领域知识,特别是在健康护理或自动驾驶等高影响应用中。

提示

计算机视觉面试问题可能严重依赖领域知识,因此除了本书和技术知识的资源外,我鼓励您阅读与您目标领域特定的计算机视觉应用相关的内容。

本节涵盖了计算机视觉技术的基础,适合那些对这个领域的背景知识不确定的人。如果您已经在任何这些领域有专业知识,可以跳过子节。无论您的专业知识如何,我在提示框中强调了关于 ML 面试的具体建议,帮助您应用每个 ML 领域的知识并在面试中表现出色。

汇总常见图像数据集

由于它们的视觉性和相对易于理解的特性,图像数据集通常被用作深度学*的初学者教程。例如,我记得在 Coursera 上一个关于 CNN 的课程中使用了狗和猫的数据集,以及其他数十万名学*者。在图像上使用机器学*引起了机器学*爱好者的想象,并且在自学和项目组合方面非常流行。在研究中,许多相同的数据集推动了机器学*的重大进展。您可能还记得在 第一章 中我提到 ImageNet 数据集和挑战导致了深度学*模型准确率的发展和爆炸式增长,这是前所未有的。

这里是一些在计算机视觉中常用的公共数据集:

我鼓励您试试。如果这是您第一次尝试,您可以尝试以下 Colab 笔记本:

一旦您熟悉了基础知识,我鼓励您自己动手做一个项目。您可以在这里找到更多的图像数据集,甚至可以收集您自己的数据:

提示

许多在线教程都从简单的图像数据集开始,例如分类猫和狗,鸢尾花数据集,MNIST 等等。因此,它们应该用于学*目的,而不是用于组合作品。候选人只使用这些最常见的数据集(这不是夸张),我们面试官已经看过成千上万的申请人,这些项目很难突出。如果您正在构建一个组合项目,请尝试找到更独特的数据集。

总结卷积神经网络(CNN)

如前所述,计算机视觉任务的示例包括目标检测、人脸识别和医学分类。计算机视觉算法常用的数据是图像,并且通常使用 CNN 架构实现,如图 3-16 所示。CNN 在图像识别等任务中特别有效,因为它们可以接收图像编码的信息,图像以矩阵形式表示(输入特征图)。然后,输入通过网络中的各种卷积层“卷积”——这个过程从图像的矩阵表示中提取信息,并创建捕捉图像更细微信息的新特征。卷积还允许将图像中的信息压平和压缩,这对计算是有效的。

CNN 接收一张猫的图像,并以矩阵形式表示图像,然后两个卷积模块提取有用的特征,这些特征被馈送到最后的两个全连接层,预测图像是否是猫;来源:“ML 实*:图像分类”,Google

图 3-16. CNN 接收一张狗的图像,并以矩阵形式表示图像,然后两个卷积模块提取有用的特征,这些特征被馈送到最后的两个全连接层,预测图像是否是狗;基于来自“ML 实*:图像分类”,Google 的一张图像。

总结转移学*

对于计算机视觉任务,你可以在网上找到许多预训练模型。这些预训练模型已经在通用任务(如图像分类任务)上进行了调整和优化。从头开始训练这些模型耗时且资源密集,因此在实践中,转移学*是一种常见的技术。

转移学*利用预训练模型,并修改最后的层次任务以专注于手头的较小任务。例如,预训练模型可能已经训练好了对一千种物品进行分类。在工作中,你只需对台式电脑和笔记本电脑进行库存跟踪任务的分类。你可以下载预训练模型,使用其架构和权重,除了最后的层次,然后只训练最后的层次,使其专门用于这两种物体。

结果是一个模型,它已经对图像分类有了一般的理解,以及你微调模型以执行的专门任务。这个过程被称为转移学*

这里有一些教程:

提示

在面试中,了解迁移学*是有帮助的。在许多情况下,识别预训练模型并在其基础上进行构建对于特定任务非常有用。在工业界,由于成本问题,很少会选择从头开始训练一个全新的神经网络。如果您只提到从头开始训练计算机视觉模型,这可能显示您还没有考虑或接触到足够的实际情况。

总结生成对抗网络

“Deepfakes”(通过深度学*生成的伪造图像)因创建政治家和名人的伪造图像而频登新闻头条。Deepfakes 是生成式 AI 结果已经变得非常逼真的一个例子。它们通常由称为生成对抗网络(GANs)的网络生成。

GANs 的架构⁵⁸侧重于两个模型:生成器和鉴别器。生成器学*和改进以生成良好的输出。鉴别器学*和改进以评估生成器创建的输出是真实还是伪造。

例如,训练生成拉布拉多犬图像的过程如下(参见图 3-17):

  • 训练开始。生成器在生成类似拉布拉多犬的对象方面表现不佳,而鉴别器在区分生成器创建的图像与真实拉布拉多犬图片方面表现不佳。

  • 随着生成器的训练加深,它学会了创建看起来更像拉布拉多犬的图像。随着鉴别器的训练加深,它更能够区分生成器生成的伪造拉布拉多犬图像与真实图像的不同。生成器的目标是创建足够逼真的拉布拉多犬图像,以至于鉴别器会误以为它们来自真实世界中的真实拉布拉多犬图片。

  • 最后,生成器在生成拉布拉多犬(或简称拉布拉多犬)的图像方面变得非常擅长,鉴别器无法再将它们与真实图像区分开来。

GAN 训练示例

图 3-17. GAN 训练示例。请注意,GAN 可以生成足以欺骗鉴别器的训练数据集中没有的图像(在本示例中,我们只是简单地翻转了图像,但是真实的网络可以生成更与真实训练数据不同的图像)。
注意

扩散模型现在常用于图像生成任务。我不会在本书中详细介绍,但如果您感兴趣,可以阅读原始论文⁵⁹。

总结额外的计算机视觉用例

除了分类和图像生成,计算机视觉还有许多其他用例,例如超分辨率、语义分割和物体检测。我将在这里介绍一些常见的行业用例,但正如之前提到的,我强烈建议您阅读与您正在面试的公司或行业相关的示例,以进一步提升面试回答。

超分辨率摘要

超分辨率 是将低分辨率图像转换成高分辨率版本的任务。这项任务也被称为提升。常见的用例包括提升历史图像、照片、电影等。在健康行业中,这项任务可以用于提高老旧医疗设备的分辨率,以便在难以升级设备的情况下做出更好的诊断。

GANs 和扩散模型通常用于这项任务。更多示例,请参考以下资源:

目标检测摘要

目标检测 是用于识别和定位图像中物体的任务。它比图像分类更为先进,后者是对整个图像进行分类;定位 告诉我们感兴趣物体在图像中的位置。通过将目标检测应用于视频中的单个帧,可以进行物体跟踪,并跟随视频中的主体或物体位置,甚至跨多个摄像头角度。使用机器学*进行目标检测和物体跟踪可用于体育比赛中追踪球的运动轨迹,例如。

与目标检测相关的算法包括:

语义图像分割摘要

语义图像分割 是将语义标签(如“计算机”、“手机”、“人物”或“狗”)分配给图像中每个像素的任务。示例包括在图像中隔离类别,例如将前景中的人类与背景中的建筑物分离。智能手机相机的人像模式是一个常见的示例。了解更多关于语义分割应用的信息,例如 Google Pixel 手机相机的人像模式⁶⁰。

您可以通过这些资源了解更多信息:

这里还有一些行业示例(请注意它们通常结合多种技术):

  • Amazon 一直在实验和研究计算机视觉,以帮助顾客在线购物,例如通过描述现有产品的变化来帮助他们找到相关产品。⁶¹ 例如,顾客可能在搜索连衣裙时看到一款喜欢的款式。然而,该款式的颜色不是他们偏爱的。他们可以通过输入“我想找一个类似的,但把黑色改成粉色”来找到类似当前产品的连衣裙。

  • Meta AI经常利用计算机视觉来提高其社交媒体平台上的自动化。例如,它已经改进了为视力障碍人士自动生成的图像描述,⁶² 提供了更好的 Facebook Marketplace 商品的自动分类、内容审核等功能。

  • Netflix 利用计算机视觉来实验和改进内容的缩略图,以及其他使用案例,利用其丰富的视频、音频和图像数据。⁶³

图像识别的样例面试问题

现在我已经概述了计算机视觉、常见数据集、算法和使用案例,这里有一些例子面试问题。

面试问题 3-22:图像识别任务中的一些常见预处理技术是什么?

样例回答

图像识别任务中常见的预处理技术包括数据归一化、数据增强和图像标准化。数据归一化将图像中像素的数值表示转换为预定义的范围,例如(0, 1)或(-1, 1)。这样,应用于不同层的算法可以遵循相同的数值范围。数据增强有助于减少在训练数据集上的过拟合。例如,如果训练数据偶然只包含向右转的猫,那么卷积神经网络可能不会学*到向左转的猫也是猫。通过使用翻转、旋转、裁剪等多种数据增强技术,我们可以向数据集中添加更多相同对象的表示,并帮助卷积神经网络学*泛化物体检测。图像标准化使数据集更易于处理,通过确保图像具有接*的高度和宽度来实现。在此预处理步骤中,图像被调整大小,使它们在某一范围内具有相似的宽度和高度。

面试问题 3-23:在图像识别任务中,你如何处理类别不平衡?

样例回答

处理图像识别任务中的类别不平衡有几种方法。在这里,“类别”指的是一个类别或标签;例如,一幅图像可能包含“猫”或“狗”。处理类别不平衡的一种方法是合并非常相似的类别,比如“橙子”和“柑橘”。当然,我们必须确定合并标签的权衡。如果图像识别模型负责标记柑橘水果,那么我们应该尝试另一种方法或合并其他类型的标签。

第二个选项是重新采样,它生成合成数据或复制少数类别的数据点。在 TensorFlow 和 PyTorch 中有内置工具可以为图像识别任务执行此操作。处理类别不平衡的另一种方法是调整 CNN 的损失函数,使得对少数或稀有类别的错误赋予更高的权重,而不是常见类别和标签的错误。这有助于避免由于类别不平衡导致在稀有类别上的欠拟合。

面试问题 3-24:如何处理图像识别任务中的过拟合?

示例答案

在 CNN 中添加一个 dropout 层(一种正则化类型)将随机将神经元的激活设置为 0;这可以防止层次过度利用某些特征。另一种方法是早停止,即在 CNN 无法显著减少损失时停止训练(CNN 旨在最小化损失)。减少层次复杂性也可以减少过拟合,因为当 CNN 层次太复杂时,它可能在图像中找到更多无意义的模式。例如,许多歌手的图像都涉及站在舞台上并拿着麦克风,模型可能会学到图像中麦克风的存在意味着歌手的存在。处理图像识别中过拟合的另一种技术是数据增强,这可以帮助在训练数据集中增加更多多样性,减少过拟合。

面试问题 3-25:如何改进和优化用于图像识别的 CNN 架构?

示例答案

如果现有网络表现不佳,例如,出现欠拟合且无法良好分类对象的情况,我可能考虑增加更多特定类型的层次,例如添加卷积层或重新排列各种层次的顺序。这也是研究人员优化各种算法架构的方式,例如在 ResNet 上创建层次变化。

总结

恭喜你已经通过了一些复杂的话题!首先,你浏览了一个总结常见的统计技术,包括机器学*中的常见技术,如正则化,以及过拟合和欠拟合等主题。我们详细介绍了监督学*,无监督学*和强化学*。然后,你深入研究了各种核心机器学*领域:自然语言处理,推荐系统,强化学*和计算机视觉。

本章中,您将得到一些示例面试问题以及每个主题的资源,当您准备时可以参考。

现在您已经了解了技术面试中机器学*算法部分的概述,让我们来看看 ML 模型的训练过程和模型评估。

¹ 根据工作在机器学*生命周期中的责任类型,可能会跳过这部分内容,例如“应用机器学*工程师”或“软件工程师,机器学*”等职位,特别是在 Google。如有疑问,请与您的招聘者或招聘经理确认!

² Jason Brownlee,《机器学*掌握》博客,“算法与模型在机器学*中的区别”,2020 年 8 月 19 日,https://oreil.ly/TrduX

³ 详细信息请参阅“监督学*、无监督学*和强化学*”。

⁴ “交叉验证:评估估算器的性能”,在Scikit-learn:Python 中的机器学*用户指南中,2023 年 10 月 24 日访问,https://oreil.ly/Spja4

⁵ “什么是欠拟合?”IBM,2023 年 10 月 21 日访问,https://oreil.ly/SSihF

⁶ Sekai Ichi 苹果每个可以售价$20 至$25(来源:Silver Creek Nursery)。

⁷ “什么是过拟合?”IBM,2023 年 10 月 21 日访问,https://oreil.ly/p9V_u

⁸ “Lasso 和 Elastic Net”,MathWorks,2023 年 10 月 21 日访问,https://oreil.ly/yOCEe

⁹ “不平衡数据”,Machine Learning,Google for Developers,2023 年 10 月 21 日访问,https://oreil.ly/sKP4h

¹⁰ Nitesh V. Chawla, Kevin W. Bowyer, Lawrence O. Hall, and W. Philip Kegelmeyer,《人工智能研究杂志》第 16 卷(2002 年):321–57,doi:10.1613/jair.953

¹¹ Chip Huyen,《设计机器学*系统》第四章“训练数据”(O’Reilly),https://oreil.ly/bsqEg

¹² Chip Huyen,《设计机器学*系统》第六章“模型开发与离线评估”。

¹³ “什么是过拟合?”IBM,2023 年 10 月 21 日访问,https://oreil.ly/p9V_u

¹⁴ 作为提醒,此苹果数据集的标签是过去苹果价格,换句话说,过去的“正确”或预期结果,以便我们检查训练模型的准确性。

¹⁵ 参见 Randall Balestriero 等人, 自监督学*菜谱, June 28, 2023, https://oreil.ly/M20OU, 以及附带的博客文章 “自监督学*菜谱,” Meta AI (blog), April 25, 2023, https://oreil.ly/XT6wX.

¹⁶ 欲了解更多,请参阅 Andrew Zisserman, “自监督学*” (presentation, Google DeepMind), https://oreil.ly/wGQ98.

¹⁷ Jake VanderPlas, Python 数据科学手册 (O’Reilly, 2016).

¹⁸ “贝叶斯定理直观(及简短)解释,” Better Explained, accessed October 23, 2023, https://oreil.ly/I7ika.

¹⁹ “贝叶斯神经网络,” 机器学*词汇表, accessed October 23, 2023, https://oreil.ly/BotI7.

²⁰ Andrew Zisserman, “自监督学*” (presentation, Google DeepMind), https://oreil.ly/o32MY.

²¹ ML 模型评估在第四章中有更详细的涵盖。

²² Alex Krizhevsky, “CIFAR-10 数据集,” Canadian Institute for Advanced Research, accessed October 23, 2023, https://oreil.ly/x1g7o.

²³ “文本语料库,” Wikipedia, updated September 17, 2023, https://oreil.ly/v2IbE.

²⁴ Christopher D. Manning, Prabhakar Raghavan, and Hinrich Schütze, “Tokenization,” in 信息检索导论 (Cambridge University Press, 2022), https://oreil.ly/0opkO.

²⁵ Yonghui Wu, “智能撰写: 使用神经网络帮助撰写电子邮件,” Google Research (blog), May 16, 2018, https://oreil.ly/gqnBt.

²⁶ Ashish Vaswani 等人, “注意力机制就是你所需的一切” (paper presented at the meeting of the Advances in Neural Information Processing Systems, 2017), https://arxiv.org/abs/1706.03762.

²⁷ Rick Merritt, “转换器模型是什么?” Nvidia (blog), March 25, 2022, https://oreil.ly/As2W6.

²⁸ Pandu Nayak, “比以往更好地理解搜索,” The Keyword (blog), Google, October 25, 2019, https://oreil.ly/xONdR.

²⁹ 参见 “预训练模型,” BERT, on GitHub, https://oreil.ly/XkaY2.

³⁰ “使用内置 BERT 算法入门”,AI Platform 培训:文档,Google Cloud,更新于 2023 年 10 月 20 日,https://oreil.ly/HeJax

³¹ 参见 Hugging Face 上的“BERT 多语言基础模型(带大小写区分)”,https://oreil.ly/tyO6D

³² 我在撰写本章草稿后,GPT-4 问世了,所以我不得不添加它!当这本书到达你手中时,我想知道还会发布什么新内容。

³³ “生成式预训练变压器”,维基百科,更新于 2023 年 10 月 23 日,https://oreil.ly/Emp_M

³⁴ “微调”,OpenAI 文档,访问日期为 2023 年 10 月 23 日,https://oreil.ly/B19eG

³⁵ 这个领域发展迅速;当这本书出版时,我不知道这些模型是否已经被淘汰。

³⁶ “Word2vec”,维基百科,更新于 2023 年 9 月 5 日,https://oreil.ly/JyqBW

³⁷ Jeffrey Pennington,Richard Socher 和 Christopher D. Manning,“GloVe:全局词向量表示”,斯坦福大学,2014 年 8 月,https://oreil.ly/LdCcH

³⁸ Christopher D. Manning,Prabhakar Raghavan 和 Hinrich Schütze,《信息检索导论》(剑桥大学出版社,2008 年),https://oreil.ly/JsXCj

³⁹ Weidinger 等人,《语言模型的道德和社会风险》(Google DeepMind,2021 年 12 月 8 日),https://oreil.ly/-ZFL7

⁴⁰ 对于那些好奇的人,奇异值分解(SVD)的时间复杂度,对于一个m x n的矩阵,其中m > nO(m² × n + n³)。实际上,这可能取决于实现,正如这个MathWorks 讨论所提到的。

⁴¹ 有时,这个问题在 RecSys 中被称为“长尾”问题

⁴² Rishabh Mehrotra,“个性化可解释推荐与多目标上下文赌博”(MLconf 的视频演示,YouTube,2019 年 3 月 29 日),https://oreil.ly/v587X;Brent Rabowsky 和 Liam Morrison,“推荐系统的新动向”,AWS for M&E(博客),Amazon Web Services,https://oreil.ly/Z0Qq2

⁴³ 我曾与育碧的一位团队成员交谈过,他们训练了 RL 代理以帮助优化和测试他们的游戏。这里有更多来自育碧的例子

⁴⁴ Chip Huyen,“RLHF: 人类反馈的强化学*”(博客),2023 年 5 月 2 日,https://oreil.ly/xE7tR

⁴⁵ “ε贪婪策略”,机器学*词汇表:强化学*,访问于 2023 年 10 月 23 日,https://oreil.ly/ZYbkN

⁴⁶ “贝尔曼方程”,机器学*词汇表:强化学*,访问于 2023 年 10 月 23 日,https://oreil.ly/KP8kh

⁴⁷ “SARSA 代理”,MathWorks,访问于 2023 年 10 月 23 日,https://oreil.ly/KP8kh

⁴⁸ 孙月文、袁欣、刘文章和辛长银,“基于模型的强化学*:*端策略优化”,2019 年中国自动化大会 (CAC),2019 年,pp. 4736–40,doi:10.1109/CAC48633.2019.8996875

⁴⁹ Michael Janner,“基于模型的强化学*:理论与实践”,伯克利人工智能研究,2019 年 12 月 12 日,https://oreil.ly/ZuF22

⁵⁰ J. Zico Kolter,“强化学*简介”(演示,第 28 届国际自动规划与调度会议,荷兰代尔夫特,2018 年 6 月 24–29 日),https://oreil.ly/b_5nO

⁵¹ “SARSA 代理”,MathWorks,访问于 2023 年 10 月 2 日,https://oreil.ly/iZOG3

⁵² 王廷武,“通过学* REINFORCE 学*强化学*”(演示,多伦多大学机器学*组),https://oreil.ly/Fgmck

⁵³ David L. Poole 和 Alan K. Mackworth,“关于策略学*”,《人工智能》第 2 版(剑桥大学出版社,2017 年),https://oreil.ly/KmgMu

⁵⁴ 王廷武,“通过学* REINFORCE 学*强化学*”(演示,多伦多大学机器学*组),https://oreil.ly/Fgmck

⁵⁵ “ε贪婪策略”,机器学*词汇表:强化学*,访问于 2023 年 10 月 23 日,https://oreil.ly/jHrup

⁵⁶ “什么是 OCR(光学字符识别)?”亚马逊网络服务,访问于 2023 年 10 月 24 日,https://oreil.ly/0ms_Z

⁵⁷ 除非你有一些真正有创意的转折,但即便如此,使用一个不那么陈词滥调的数据集可能会有更好的投资回报。

⁵⁸ “GAN 结构概述”,机器学*,Google 开发者,2022 年 7 月 18 日,https://oreil.ly/EfpSR

⁵⁹ Jascha Sohl-Dickstein 等,“利用非平衡热力学进行深度无监督学*”(2015),https://oreil.ly/0Zp8Q

⁶⁰ Marc Levoy 和 Yael Pritch,“Pixel 2 和 Pixel 2 XL 智能手机上的肖像模式”,Google Research(博客),2017 年 10 月 17 日,https://oreil.ly/VdtgX

⁶¹ Larry Hardesty,“计算机视觉如何帮助亚马逊顾客在线购物”,Amazon Science(博客),2020 年 6 月 5 日,https://oreil.ly/xGyam

⁶² “Facebook 如何利用 AI 改善盲人或视觉障碍人士的照片描述”,AI at Meta(博客),2021 年 1 月 19 日,https://oreil.ly/_3YYj

⁶³ “Ava: 在 Netflix 上的图像发现的艺术与科学”,Netflix Technology Blog,Medium,2018 年 2 月 7 日,https://oreil.ly/3S9NZ

OceanofPDF.com

第四章:技术面试:模型训练和评估

在本章中,我们将涵盖机器学*模型训练过程及相关面试问题。对许多实践者来说,模型训练是最令人兴奋的部分,我也同意——在整个过程中看到模型变得越来越准确确实令人满足。然而,要开始机器学*模型训练、超参数调整并运行各种算法实验,您需要拥有数据。机器学*的核心是让算法在数据中找到模式,然后根据这些模式进行预测和决策。拥有有用的数据是机器学*的基础,正如行业格言所说:“垃圾进,垃圾出”。也就是说,如果机器学*模型训练在无用数据上,那么产生的模型和推断也将无用。

我将从数据处理和清洗的概述开始,这将把原始数据转换为对机器学*算法有用和兼容的格式。接下来,我将介绍算法选择,例如在不同场景下各种机器学*算法之间的权衡,以及如何一般性地选择最适合给定问题的算法。

之后,我将涵盖模型训练和优化模型性能的过程。这可能是一个模糊而具有挑战性的过程,您将学*到一些最佳实践,如超参数调整和实验跟踪,这可以避免丢失最佳结果,并确保这些结果可以复现。在这一点上,我还将讨论如何判断一个机器学*算法在实际中是否优秀。这涉及模型评估以及与一些基准模型或基准启发式方法进行比较。模型评估还可以帮助您确定模型在新的、未见过的数据上的效果,并发现模型可能在现实世界中过拟合、欠拟合或表现不佳。

注意

我尽量提及尽可能多的常见机器学*面试技巧,但阳光下还有更多。务必查看链接的资源,以扩展您的学*和面试准备!

在本章中,我将提供实用的技巧和示例,帮助您在机器学*面试中取得成功。到本章结束时,您应该对数据清洗、预处理、模型训练和评估过程有扎实的理解,并能够在自己的面试中进行深入讨论。

定义机器学*问题

在本节中,我将概述定义机器学*问题的高层次概述,包括为什么以及如何在面试问题中展示这一点。

考虑以下场景:你,作为应聘者,正在走你建立的一个机器学*项目。目标是预测用户是否会点击特定歌手音乐会的促销邮件。[¹] 在你概述完后,面试官思考了几秒钟,然后说道:“听起来你可以利用用户听歌手 A 的时间来决定谁会收到该歌手音乐会的促销邮件。例如,如果他们每周听歌手 A 超过五个小时,那么如果该歌手在听众所在地区有音乐会,就发送邮件。考虑到有一些简单的方法,它们不使用机器学*也能达到与你的模型相同的效果,为什么选择了机器学*?”

你陷入了冻结状态,因为你没有考虑到这个问题。当时,这似乎是一个有趣的自主项目,你只是想学*一下。你不能完全理解面试官用这个问题探讨什么。你该怎么办?

在此之前了解如何回答这些问题很重要。以下是一些可能的角度:

  • 你有考虑过首先使用基于启发式(即基于规则的)基线吗?在适用的情况下,你还可以使用尽可能简单的模型,比如逻辑回归模型,作为一个基线。然后,你的机器学*模型的目标将是比基线表现更好。

  • 在现实世界中,新的机器学*项目往往不会启动或批准,除非有明确的商业价值来证明工程时间和精力的投入是值得的。例如,如果实施一个从头开始推荐音乐会的机器学*系统的成本不足以抵消预期的收益,那么使用启发式方法会更容易。预计的节约复杂性、手动工作或时间也是选择机器学*而不是启发式方法的原因之一。

但不要担心——面试官并不是在贬低你的项目,而是在问:“为什么选择了机器学*?”这在专业的机器学*领域非常常见。问“为什么选择了机器学*?”并不意味着“你真的不应该使用机器学*。”这只是开始讨论的一部分,专业的机器学*人员在日常生活中经常遇到这种情况。你如何回应这个问题,特别是对于新毕业生来说,可以很好地表明你是否能顺利过渡到在工业界从事机器学*工作。

在这种情况下,你可以这样回答:

  • 坦诚地回答:“老实说,我只是想通过一个副业项目学*一些新的建模技术,因为我是 Spotify 的重度用户,我想看看如何用机器学*模拟它的邮件功能。”

  • 如果你在谈论一个工作项目:“事实上,我发现启发式方法确实有效,但仅适用于最普通的用户。例如,重度用户需要更长的听歌时间来确定他们喜欢的艺术家。此外,一旦我们在启发式方法中包含了其他数据,比如喜欢添加到播放列表,我们注意到对促销电子邮件的反应更高。因此,启发式方法变得过于复杂和难以扩展。这就是为什么我们开始使用 ML,因此它可以在更多特征中找到模式。”

Tip

诚实是好的。作为一名新毕业生,我曾经在一次副业项目展示中开头说:“这是一个用于 Ariana Grande 图像的分类器。我只是想做这个项目来娱乐,没有真正的原因必须选择 Ariana Grande。这里是我是如何做的…” 但我仍然成功地被面试官认真对待,因为我解释这个项目是使用卷积神经网络的机会。

如果你正在做自己的副业项目,并期望用它来回答面试问题,考虑哪些启发式方法可以达到你想要的目标。稍后,你可以将它们用作简单的基准线,看看 ML 方法是否更好。这将帮助你脱颖而出。我稍后会讨论模型选择和模型评估。

数据预处理和特征工程

在本节中,我将总结常见的数据预处理和特征工程技术和场景,以及涵盖 ML 生命周期中这一步的常见 ML 面试问题。为简单起见,我假设 ML 面试问题的数据是可用的,即使这在现实场景中是一个常见的挑战。我将从数据采集的介绍开始,² 探索性数据分析(EDA)和特征工程。

Tip

所有数据和 ML 角色都将使用数据预处理和 EDA。本章的一些技术特别适用于 ML,但对数据分析师或数据工程师也同样有用。

数据采集入门

获得数据,在 ML 的背景下通常称为数据采集,可以涉及以下选项:

  • 工作访问,通常是专有数据

  • 公共数据集,例如来自 Kaggle,人口普查局

  • 网络爬虫(注意某些网站的条款和条件)

  • 学术访问,比如参与你大学的研究实验室

  • 从供应商购买数据:

    • 有些供应商还可以帮助注释和标记数据,例如Figure EightScale AI

    • 你的工作场所或学术机构通常会帮助支付成本,因为这些价格通常对个人副业项目来说太高了。

  • 通过模拟创建合成数据

  • 创建你自己的原始数据,比如拍摄自己的照片,众包数据或使用你自己创建的艺术/设计

探索性数据分析入门

现在你已经获取了数据,是时候开始分析了。你在进行探索性数据分析(EDA)时的主要目标是查看数据是否足够作为起点,或者你是否需要更多数据。因此,你需要对数据的分布进行高级概述,并找出任何缺陷和怪异之处。缺陷和怪异可能包括过多的缺失值、数据分布倾斜或重复值。EDA 还涵盖每个特征的一般特征,查看均值、分布等。如果发现缺陷,你可以在数据清洗和特征工程过程中稍后解决这些问题;而在进行 EDA 时,重要的是意识到潜在问题。

小贴士

对于机器学*和数据从业者来说,拥有一些领域知识非常重要。在我关于视频游戏定价的个人项目中,作为一名狂热的游戏玩家,我对行业动态和客户行为非常了解。在工作中,我需要学*每个领域,以构建有用的机器学*模型;例如,电信客户的行为与金融科技客户不同。

我的常规做法是运行 ydata-profiling,之前称为 pandas-profiling,并从生成的报告开始深入分析(示例报告见图 4-1)。请注意,这只是一个起点,使用领域知识来发现模式或异常将非常重要。对一些行业和模型来说可能是问题的东西,在其他行业中可能是预期的。例如,在 RecSys 问题中,数据稀疏性比在时间序列数据集中更常见。仅仅查看生成的统计数据是不够的。此外,一些领域可能有算法来处理该领域的常见问题,因此这些问题可能不会引起太大关注。

ydata-profiling 屏幕截图;来源:ydata-profiling 文档

图 4-1. ydata-profiling 屏幕截图;来源:ydata-profiling 文档

关于 EDA 的更多细节超出了本书的范围,但我建议阅读 Making Sense of Data,作者是 Glenn J. Myatt 和 Wayne P. Johnson(Wiley),以获取更多信息。

经过一些迭代,假设你已完成了探索性数据分析(EDA),来到一个决策点:数据现在似乎足够可靠(暂时可以继续),或者你可能需要先获取更多数据或另一个数据集;反复进行。

小贴士

当面试官询问你在解决机器学*问题时从何处开始时,他们希望听到你在获取某些数据源后的早期阶段提到探索性数据分析(EDA)。展示你能够批判性地查看数据甚至发现缺陷是非常重要的,而不仅仅是使用预先清理过的数据集。

特征工程介绍

在探索数据后,迭代直到找到模型训练的良好起点,现在是进行特征工程的时候了。在机器学*中,特征指的是 ML 模型的输入。目标是修改数据集,以确保与 ML 模型兼容,同时处理数据中观察到的任何缺陷或不完整性,如缺失值。我在这里讨论的主题包括处理缺失数据、处理重复数据、标准化数据和数据预处理。

注意

一些技术与通常称为“数据清洗”的内容重叠,这可能比特征工程更频繁发生,但在此介绍是很有用的。

使用插补处理缺失数据

处理缺失数据的常见插补技术应该能够在面试中提到,并分析其优缺点。这些包括用均值或中位数填充以及使用基于树的模型。

表格 4-1 列出了在填补缺失值时需注意的一些事项。

表格 4-1. 常见插补技术的优缺点

技术 优点 缺点
均值/中位数/众数 实现简单 与基于树的方法相比可能无法考虑异常值,对分类变量不太适合
基于树的模型 可捕获更多潜在模式 适用于数值和分类变量 添加了数据预处理的复杂度 如果数据的基础分布发生变化,需要重新训练模型

处理重复数据

几乎有无数种观察结果会被意外复制的方式,所以这是在进行探索性数据分析时需要发现的问题之一:

  • 数据摄取作业可能因错误而运行两次。

  • 在进行一些复杂的连接操作时,有些行可能会无意中重复,然后没有发现。

  • 一些边缘情况可能导致数据源提供重复数据。

… 等等。

如果遇到重复数据,可以使用 SQL 或 Python 对数据进行去重,并确保记录以更便于您后续访问和使用的格式表示。

标准化数据

处理缺失和重复数据后,数据应该进行标准化。这包括处理异常值、缩放特征,确保数据类型和格式一致:

处理异常值

处理异常值的技术包括从数据集中删除极端异常值,用较不极端的值替换它们(称为Winsorizing),以及对数尺度转换。我建议不要轻易删除异常值,因为这取决于领域知识;在某些领域,后果可能更严重。例如,从自动驾驶汽车训练数据集中删除马车图像数据,仅因为它们不是常见类型的车辆,可能导致模型在现实世界中无法识别马车。因此,在决定具体技术之前,务必仔细评估其影响。

缩放特征

对于具有多个数值特征的数据集,较大的值可能会被 ML 算法误解为具有更大的影响。例如,一个列是价格,范围从$50 到$5,000,而另一个特征是广告显示时间,范围从 0 到 10 次。这两个特征使用不同的单位,但都是数值的,因此价格列可能被表示为具有更高数量级的影响。一些模型,如基于梯度下降的模型,对特征的规模更为敏感。因此,最好将特征缩放到[-1, 1]或[0, 1]的范围内。

警告

缩放特征时要小心。结合不同的技术或使用探索性数据分析(EDA)中发现的信息是有用的。例如,一个特征可能有极端的异常值,如大多数值在[0, 100]范围内,但有一个观测值为 1000。如果不检查,您可能会基于最小值 0 和最大值 1000 来缩放特征值。这可能会导致特征中包含的信息被压缩。

数据类型一致性

我曾经在处理一个 ML 模型时得到了意外的结果,花了一些时间调试。最后,我找到了问题所在:一个数值列被格式化为字符串!在继续流程之前,检查最终数据类型以确保它们在输入 ML 模型时是有意义的,这将对质量保证(QA)很有帮助。

提示

面试官可能会询问您如何处理异常值、特征规模或数据类型一致性的后续问题,因此请确保了解每种方法的原理和权衡。

数据预处理

在使用的算法类型的背景下,预处理数据将使特征对 ML 模型有意义。结构化数据的预处理可以包括独热编码、标签编码、分箱、特征选择等。

提示

非结构化数据是“未按预设数据模型或架构排列的信息,因此无法存储在传统的关系数据库或关系数据库管理系统(RDBMS)中。文本和多媒体是两种常见的非结构化内容类型。”³ 当遇到非结构化数据时,预处理可能会有所不同(甚至可能将数据转换为结构化)。出于说明目的,本章节专注于预处理结构化数据的示例。

分类数据的独热编码

您可能希望将分类数据表示为数值数据。每个类别成为一个特征,每个观测中的状态由 0 或 1 表示。例如,想象一个简单的天气数据集,只可能有晴天或多云的天气。您将得到以下结果:

3 月 1 日

  • 天气:晴天

  • 温度(摄氏度):27

3 月 2 日

  • 天气:晴天

  • 温度(摄氏度):25

3 月 3 日

  • 天气:多云

  • 温度(摄氏度):20

但是,“天气”特征可以进行独热编码,使其拥有所有可能的天气状态的特征:

3 月 1 日

  • 晴天:1

  • 多云:0

3 月 2 日

  • 晴天:1

  • 多云:0

3 月 3 日

  • 晴天:0

  • 多云:1

独热编码通常被使用,因为数字对机器学*算法更容易理解;某些算法不接受分类值,但这在多年来有所改进,一些实现可以在幕后考虑分类值并进行转换。

一位缺点是独热编码对于原本具有高基数的特征(该特征中有许多唯一值)可能导致特征数量急剧增加,这可能在计算上更昂贵。

提示

有时候,缺乏领域知识或对业务逻辑的理解可能会在数据预处理中引起问题。例如,将退订用户定义为在过去七天内取消产品的用户,但实际上产品或业务逻辑将退订用户定义为在过去 60 天内离开的用户。(如果由于某种原因,业务逻辑不适合机器学*,我们可以讨论一个折中方案。)

标签编码

标签编码将类别映射到数字,但保持在同一个特征中。例如,天气类型可以映射到唯一数字,如图 4-2 所示。

标签编码示例

图 4-2. 标签编码示例。

标签编码的一个缺点是一些机器学*算法可能会混淆比例和值,将它们视为影响的更高级别。举个例子,天气可以进行标签编码:晴天变为 0,多云变为 1。但对于机器学*来说,这可能会导致将多云误认为比较重要,因为 1 比 0 大。

幸运的是,在许多机器学*算法中,您可以使用内置类(例如 scikit-learn 的LabelEncoder类),使算法在幕后知道这只是一种分类,而不一定是大小的指示。

小贴士

当然,如果您忘记让算法知道标签编码的特征实际上是标签编码,那么机器学*算法可能会像处理普通数值特征一样处理该特征。如果在面试问题中没有解决这个问题,您可以看到这可能会导致问题。

数值分箱

分箱可以减少基数的数量,并帮助模型更好地概括。例如,如果数据集中的价格为$100,即使在特定应用中,$95 与$100 相似,也可能不会一开始就概括$95。作为例证,您可以定义分箱边界为[15, 25, 35, 45, 55, 65, 75, 85, 99],这将创建类似的价格范围,如“$15-$25”,“$25-$35”,“$35-$45”等。

箱式分组法的一个缺点是它将分箱的含义引入硬边界,因此,一个观察结果为$46 可能会被视为与“$35-$45”分箱完全不同,即使它可能仍然相似。

特征选择

有时,您的数据集将具有高度相关的特征——即特征之间存在共线性。举一个极端的例子,您可能有以厘米为单位的身高和以米为单位的身高,这本质上捕捉了相同的信息。可能还有其他捕捉相同信息高比例的特征,删除它们可能会减少意外过度拟合或改善模型速度,因为模型不需要处理那么多特征。降维是特征选择的常见技术;它在保留最重要信息的同时减少数据的维度。

您还可以使用特征重要性表,例如 XGBoost 或 CatBoost 中提供的表格,并剪枝具有最低重要性的特征——即对模型贡献最低的特征。

数据预处理和特征工程示例面试问题

现在我已经介绍了一些数据预处理和特征工程的基础知识,让我们通过一些示例面试问题来进一步讨论。

面试问题 4-1:特征工程和特征选择有什么区别?

示例答案

特征工程是关于从原始数据中创建或转换特征的过程。这样做是为了更好地表示数据,并使数据与其原始格式相比更适合机器学*。常见的技术包括处理缺失数据,标准化数据格式等。

特征选择是关于缩小相关的机器学*特征,以简化模型并防止过拟合的过程。常见的技术包括 PCA(主成分分析)或使用基于树的模型的特征重要性来查看哪些特征提供更有用的信号。

面试问题 4-2: 在进行数据预处理时,如何防止数据泄露问题?

示例答案

谨慎处理训练、验证和测试数据分割是防止数据泄露的最常见方式之一。然而,事情并不总是那么简单。例如,在数据插补时使用所有观测的平均值,这意味着平均值包含了所有观测的信息,而不仅仅是训练集的。在这种情况下,请务必只使用关于训练集的信息来进行数据插补。数据泄露的其他例子可能包括时间序列分割;我们应该小心,不要错误地对时间序列进行洗牌和分割(例如,使用明天来预测今天,而不是反之)。

面试问题 4-3: 在特征工程中如何处理偏斜的数据分布,假设机器学*问题需要少数数据类?

示例答案

采样技术,⁴,例如过采样少数数据类,在预处理和特征工程中可能有所帮助(例如,使用 SMOTE 等技术)。重要的是要注意,对于过采样,任何重复或合成的实例应仅从训练数据生成,以避免与验证或测试集的数据泄露。

模型训练过程

现在您已经准备好进行机器学*的数据,是时候进入下一步了:模型训练。这个过程包括定义机器学*任务、选择最适合任务的机器学*算法以及实际训练模型的步骤。在本节中,我还将提供一些常见的面试问题和技巧,这将帮助您取得成功。

模型训练中的迭代过程

在机器学*项目的开始阶段,您可能已经考虑过您希望的一般结果,例如“在 Kaggle 竞赛中获得尽可能高的准确率”或“使用这些数据预测视频游戏销售价格”。您可能还开始研究一些在任务中表现良好的算法,例如时间序列预测。确定最终的机器学*任务通常是一个迭代的过程,在这个过程中,您可能会在各个步骤之间来回反复,直到最终确定某些内容,就像在图 4-3 中所示。

机器学*训练中的示例迭代过程

图 4-3. 机器学*训练中的示例迭代过程。

例如,让我们看一下预测视频游戏销售项目中的所有步骤:

  1. 定义机器学*任务,选择模型。您可能从一个想法开始:使用时间序列数据和 ARIMA(自回归综合移动平均),因为问题看起来很简单——价格预测通常使用时间序列数据。

  2. 数据采集。您可能会获取一个具有时间序列数据的数据集,即只有时间,如日期或时间戳,以及价格。未来价格是模型预测的输出,而历史价格是输入。

    然而,您可能会遇到这样一种情况:使用 ARIMA 似乎行不通,于是您通过更仔细地分析源数据来排除故障。结果发现,您正在将大公司(也称为“AAA”游戏)的数据与独立工作室(也称为“独立”游戏)的较小游戏数据混合在一起。AAA 游戏通常拥有较大的市场营销和推广预算,因此平均销量高于独立游戏。

  3. 定义 ML 任务(再次)。下一步是重新评估 ML 任务。经过一番思考,您决定仍然预测时间序列,因此保持 ML 任务不变。

  4. 数据采集(再次)。不过,这一次,您已经知道可能需要采取不同的措施以获得更好的结果。因此,您获取了更多数据:游戏是 AAA 还是独立。您甚至可能最终手动标记它。

  5. 模型选择(再次)。现在您意识到模型需要更改,因为 ARIMA 不能处理类别变量,比如“独立”和“AAA”标签。因此,您上网查找其他可以混合类别变量和数值变量的算法,并尝试其中之一。

  6. 继续迭代之前的步骤,直到达到足够好的效果。如果仍然不起作用,您可以重复进行,获取更多类型的特征,尝试不同的模型,或者进行如独热编码之类的特征工程。ML 任务可能也会随之改变:而不是预测精确的销售数字,您可以选择预测类别,例如(高、中、低)销量,其中高销量定义为超过 50,000 单位或通过探索性数据分析定义的某些值。

如果您从头到尾完成了一个项目,您会了解本节描述的步骤的迭代性质。您可能会注意到,在这个例子中,您可以清楚地看到是什么导致您回到数据采集,然后是什么导致您回到定义 ML 任务。即使理由只是为了看看新方法是否比当前方法更好,也总是有一个理由。这为您在面试官提问时提供了很多有趣的信息。

面试官们希望确认以下几点:

  • 您了解其领域中常见的 ML 任务。

  • 您了解与所述任务相关的常见算法。

  • 您知道如何评估这些模型。

定义 ML 任务

在前一节中,您看到从数据采集到模型训练的步骤通常是迭代的,解释每次迭代的基本原理将有助于您的面试答案。

要选择机器学*模型,你需要定义机器学*任务。为了弄清楚这一点,你可以问自己要使用什么算法以及与该算法相关的任务是什么。例如,它是分类还是回归?

目前没有固定的方法能告诉你正确的算法,但通常你需要知道:

  • 你是否有足够的数据?

  • 你是在预测数量/数值还是类别/分类值?

  • 你是否有标记数据(即你知道地面真实标签)?这可能决定监督学*还是无监督学*对于任务更好。

任务可能包括回归、分类、异常检测、推荐系统、强化学*、自然语言处理、生成式人工智能等,所有这些内容你都可以在第三章中阅读到。选择机器学*任务的简化概述如图图 4-4 所示。了解目标和可用数据(或计划获取的数据)可以帮助你最初选择任务。例如,根据可用的标记数据或目标变量是连续的还是分类的,不同类型的机器学*任务更适合。

机器学*任务选择简化流程图

图 4-4. 机器学*任务选择简化流程图。

模型选择概述

现在你对机器学*任务有了一个概念,让我们继续进行模型选择。请记住,这是一个迭代过程,所以你可能不会一次性做出决定。然而,你确实需要选择一个模型(或几个模型)作为起点。在面试中,你会被问及为什么选择这样或那样的算法或模型,仅凭直觉不足以得到成功的答案。正如你在图 4-4 中看到的那样,你已经有了一个基于你定义的机器学*任务的起点。因此,让我们深入了解一些常见的算法和库(主要是 Python),你可以用来实现这些任务。

我想快速澄清一下术语:当你最初选择算法时,那并不在技术上是模型选择,直到你测试并比较出结果模型的性能。虽然这两个术语常常被交替使用,因为你最终希望根据实际的模型性能做出最终决定。正如杰森·布朗利在《机器学*精要》中所说:“模型选择是一个可以应用于不同类型的模型(例如逻辑回归、SVM、KNN 等)以及在同一类型的模型配置不同模型超参数(例如在 SVM 中不同的核函数)的过程。”⁵

这里有一些可以作为每个任务简单起点的算法和库。请注意,许多库都是多功能的,可以用于多个目的(例如,决策树既可以用于分类也可以用于回归),但我列出了一些简化的示例以便理解:

分类

算法包括决策树随机森林等。开始使用的示例 Python 库包括scikit-learnCatBoostLightGBM

回归

算法包括逻辑回归,决策树等。开始使用的示例 Python 库包括 scikit-learn 和statsmodels

聚类(无监督学*)

算法包括k-means 聚类DBSCAN等。一个开始使用的示例 Python 库是 scikit-learn。

时间序列预测

算法包括ARIMALSTM等。开始使用的示例 Python 库包括 statsmodels、Prophet、Keras/TensorFlow等。

推荐系统

算法包括矩阵分解技术,如协同过滤。开始使用的示例库和工具包括 Spark 的MLlib或 AWS 上的Amazon Personalize

强化学*

算法包括多臂赌博机、Q 学*和策略梯度。开始使用的示例库包括Vowpal WabbitTorchRL(PyTorch)和 TensorFlow-RL。

计算机视觉

深度学*技术是计算机视觉任务的常见起点。OpenCV是一个重要的计算机视觉库,也支持一些机器学*模型。流行的深度学*框架包括 TensorFlow、Keras、PyTorch 和 Caffe。

自然语言处理

所有前述的深度学*框架也可以用于自然语言处理。此外,尝试基于 transformer 的方法或在 Hugging Face 找到相关内容是很常见的。如今,使用 OpenAI API 和 GPT 模型也很普遍。LangChain是一个快速增长的用于 NLP 工作流的库。还有谷歌最*推出的Bard

提示

如果任务来自于著名的机器学*家族之一,那么也有专门针对该任务的著名算法。我提供的启发法只是一个常见的起点,你可能会尝试其他多功能技术,如基于树的模型或集成方法。

模型训练概述

现在您已经完成了定义机器学*任务和选择算法的步骤,接下来将开始模型训练的过程,其中包括超参数调优以及优化器或损失函数的调优(如果适用)。这一步骤的目标是通过改变模型本身的参数使模型变得越来越好。有时候这并不奏效,您需要回到较早的阶段通过输入数据来改进模型。本节重点在于调优模型本身而不是数据。

在面试中,雇主更感兴趣的是听到您如何提高模型性能,而不仅仅是您获得了一个高性能的模型。在某些情况下,即使最终的模型表现不佳,只要您在机器学*训练过程中非常深思熟虑,即使其他因素不在您的控制范围内(如数据获取),也可以展示您适合这个角色。在其他情况下,即使您拥有高准确度的模型,如果您没有部署它,面试官可能不会太在意;通常情况下,我们会看到模型在训练阶段和离线评估中表现良好,但在生产或实时场景中表现不佳。

超参数调优

超参数调优是通过手动调整、网格搜索或甚至自动机器学*来选择模型的最佳超参数。超参数包括模型本身的特性或架构,例如学*率、批量大小、神经网络中隐藏层的数量等。每个具体的模型可能会有其自己的参数,例如 Prophet 中的changepoint 和季节性先验尺度。超参数调优的目标是例如看看如果学*率更高或模型会更快地收敛并表现更好。

有一个良好的系统来跟踪超参数调优实验非常重要,这样可以保证实验的可重复性。想象一下,如果您看到一个运行良好的模型,但由于对脚本直接进行了修改,您丢失了确切的更改,无法再现好的结果会有多么痛苦!跟踪将在“实验跟踪”中进一步讨论。

机器学*损失函数

机器学*中的损失函数测量模型预测输出与真实值之间的差异。模型的目标是最小化损失函数,因为这样可以根据您对模型精度的定义进行最准确的预测。机器学*损失函数的例子包括均方误差(MSE)和平均绝对误差(MAE)。

机器学*优化器

优化器 是调整机器学*模型参数以最小化损失函数的方式。有时候,可以选择不同的优化器;例如,PyTorch 提供了13 种常见的优化器供选择。Adam 和 Adagrad 是流行的优化器,很可能模型的超参数也被调整以提升性能。根据模型结构和当前优化器不理想的原因,这可能是额外的优化点。

实验跟踪

在进行超参数调整时,你需要记录每个模型迭代的性能。如果没有过去参数记录来进行比较,你将无法找出哪组参数表现更好。

你面试的公司可能有机器学*实验跟踪工具。通常情况下,你是否有使用过公司具体工具的经验并不重要,只要你知道实验跟踪的重要性。我以前用 Microsoft Excel 进行过实验跟踪,很多其他从业者也有类似经历。然而,现在更普遍的是使用集中式的实验跟踪平台。例如,MLflowTensorBoardWeights & Biases,以及Keras Tuner。还有很多其他工具,比如KubeflowDVCComet ML,等等。在面试中,你具体使用过哪些工具并不重要,关键是你知道应该在集中位置跟踪实验结果。

模型训练的额外资源

Google 拥有一个Google 机器学*教育网站(在撰写时免费提供),适合对机器学*有更详细了解的人士;可以从机器学*入门课程开始(专注于机器学*和 TensorFlow,并且可以在 Google Colab 上运行)。

模型选择和训练的样例面试问题

现在我们已经复*了模型训练过程中的常见考虑因素,让我们来看一些示例面试问题。

面试问题 4-4:在什么场景下你会选择强化学*算法而不是基于树的方法?

示例答案

强化学*算法在重视通过试错学*和行动顺序的场景下非常有用。当结果可能延迟出现但我们希望强化学*代理不断改进时,强化学*也很有用。例如游戏玩法、机器人技术、推荐系统等。

相比之下,基于树的方法(如决策树或随机森林)在问题是静态且非顺序的情况下很有用。换句话说,考虑延迟奖励或顺序决策不如对训练时的静态数据集足够重要。

面试问题 4-5:在模型训练过程中常见的一些错误是什么,以及你如何避免它们?

示例答案

过拟合是一个常见问题,当生成的模型捕捉了训练数据中过于复杂的信息,并且不能很好地推广到新的观察数据时。正则化技术⁶可以用于防止过拟合。

如果不调整常见的超参数,模型可能表现不佳,因为默认的超参数通常不会直接出箱成为最佳解决方案。

过度设计问题可能导致模型训练过程中出现问题;有时候,在尝试非常复杂的模型或模型组合之前,尝试简单的基准模型可能更好。

面试问题 4-6:在什么情况下集成模型可能会有用?

示例答案

当处理不平衡数据集时,其中一个类别显著多于其他类别时,集成方法可以帮助提高少数类别数据的结果准确性。通过使用集成模型和结合多个模型,我们可以避免并减少模型对多数数据类别的偏向。

模型评估

现在你正在训练你的模型,是时候评估它并确定是否应该继续迭代或者认为它已经足够好了。顺便说一句,通常应该在开始机器学*建模之前决定业务度量标准。业务度量标准包括提高点击率、提高客户转化率或通过客户调查来衡量更高的满意度。这些指标与本节中提到的机器学*模型指标不同,而是用于查看模型在训练数据集上训练并在评估数据集上评估后是否表现良好。

面试官们希望了解在领域中评估模型的常见方法。例如,时间序列面试问题可能期望你了解平均绝对误差(MAE)、均方根误差(RMSE)以及类似的评估指标,这些是我在金融科技角色面试中遇到的一部分。你还可能讨论假阳性和假阴性之间的权衡,这是我在安全机器学*工作面试中遇到的重要部分。其他常见的期望包括了解方差偏差权衡及其测量方法,或者准确率与精确度和召回率的区别。

常见机器学*评估指标总结

这里是用于评估机器学*模型的一些常见指标。你选择的指标将取决于机器学*任务。

注意,我不会在这本书中定义所有术语,以免它变成一本统计学教科书,但我会定义和说明最常见的术语。如果你想深入了解其余的指标,还包括了额外的资源。

分类指标

分类指标用于衡量分类模型的性能。简而言之,注意到 TP = 真正例,TN = 真负例,FP = 假正例,FN = 假负例,如图 4-5 所示。以下是其他需要了解的术语和数值:

  • 精度 = TP / (TP + FP)(如图 4-6 所示)

  • 召回率 = TP / (TP + FN)(如图 4-6 所示)

  • 准确率 = (TP + TN) / (TP + TN + FP + FN)

真正例、假正例、假负例和真负例的示意图

图 4-5. 真正例、假正例、假负例和真负例的示例;来源:Walber,CC BY-SA 4.0,维基媒体共享资源

精度与召回率的示意图

图 4-6. 精度与召回率的示意图。

有了这些术语,我们可以构建各种评估:

混淆矩阵

TP/TN/FP/FN 值的矩阵形式摘要(如图 4-7 所示)

F1 分数

精度召回率的调和平均数。

AUC(ROC 曲线下的面积)和 ROC(接收者操作特征曲线)

曲线在不同阈值下绘制真正例率与假正例率。

混淆矩阵示例

图 4-7. 混淆矩阵示例。

回归指标

回归指标用于衡量回归模型的性能。以下是一些需要了解的术语和数值:

  • MAE:平均绝对误差(MAE(y,ŷ)=1ni=1n|yiŷi|

  • MSE:均方误差

  • RMSE:均方根误差

  • R²:R 平方

聚类指标

聚类指标用于衡量聚类模型的性能。使用聚类指标可能取决于是否有地面实况标签。这里假设你没有,但如果有,分类指标也可以使用。以下是需要了解的术语列表:

轮廓系数

衡量物品与其所在集群中其他物品的凝聚力以及与其他集群中物品的分离度;范围从-1 到 1

Calinski-Harabasz 指数

评分用于确定集群的质量;得分越高,意味着集群更密集且分离良好

排名指标

排名指标用于推荐或排名系统。以下是需要了解的一些术语:

平均倒数排名(MRR)

衡量排名系统的准确性,即第一个相关文档出现的高低

精度在 K 处

计算推荐项目中顶部相关的比例

标准化折现累计增益(NDCG)

比较 ML 模型预测的重要性/排名与实际相关性

现在你已经决定了指标(有时你会想使用几个),你需要用代码来实现它们。在 Python 的常见 ML 库中,大多数提到的指标都已经有了实现,因此你不必自己从头开始实现它们。以下指标实现是一个很好的起点:

此列表并非详尽无遗,请查看您使用的库的文档。如果内置实现由于某些原因不符合您的特定需求,则可以编写自定义代码。如果这在面试中提到,最好解释原因。例如,如果您想要混合匹配几种不同库的不同指标,您可能需要编写一些代码来连接它们并进行聚合。

评估指标中的权衡

对于面试官来说,你展示出能够对 ML 评估指标和各种权衡进行批判性思考非常重要。例如,仅使用准确度可能会隐藏模型在少数类(相比于多数类数据点非常少的类别)上预测的缺陷。在这种情况下,最好补充使用更多指标,如 F1 分数。但有时你需要明确地做出权衡。

例如,在医疗模型中,从 X 光扫描图像预测肺癌时,假阴性将会产生非常高的影响。因此,减少假阴性是可取的。当减少假阴性时,召回率指标会增加(请参阅前一节的定义)。但在某些情况下,在减少假阴性的过程中,模型可能会意外地学会将更多的患者分类为阳性,即使他们并没有肺癌。换句话说,假阳性作为间接结果增加了,降低了模型的精确度。

因此,在做出假阳性和假阴性之间的权衡时非常重要;在某些情况下,得失比可能是值得的,而有时则可能不值得。当你回答面试问题时,如果能够讨论这类权衡将会很有帮助。

提示

面试官可以从你思考周到的答案中看出,你能够对模型中的偏差进行批判性思考,并能够选择适当的模型和指标,这使你成为更有效的 ML 从业者。

离线评估的附加方法

使用我之前概述的模型指标,您可以衡量模型在预测之前未见标签方面的有效性,与模型隐藏的地面真实标签相比。希望您已经进行了一些调整实验;即使您的第一个模型以度量标准衡量的效果最佳,也值得查看哪些方面不起作用。您的面试官可能也会询问这方面的内容!

然而,在模型部署之前,确认模型在实际生产中表现良好是很困难的。在这种情况下,“实时”意味着它已经在世界上运行,类似于“现场直播”。生产是指具有实际输入和输出的软件系统。尽管在模型指标上表现良好,但在生产环境中可能表现不佳的原因有很多:真实世界中的数据分布有时无法由训练数据捕捉,存在边界情况和异常值等。

如今,许多雇主寻求具备了解模型在生产环境中可能表现的经验。这与学校或学术角度不同,因为在实际输入中,表现不佳的模型将给企业带来真正的损失。例如,一种糟糕的欺诈检测模型可能会给银行造成数百万的损失。一个推荐系统如果一直推荐无关或不适当的内容,可能会导致客户对公司失去信任。在某些情况下,公司可能会被起诉。面试官将会很关注你是否意识到这一点,并且是否考虑过如何预防这些情况的发生。

另一方面,在机器学*中工作是非常令人满足的,因为如果模型成功,它可以成为防止数百万欺诈损失的一部分,或者可以在你最喜爱的音乐流媒体应用程序的背后运行!

在模型投入生产之前,您可以进一步评估模型,并评估模型是否确实强大且能够推广到新数据。可以使用以下方法来实现这一点:

扰动测试⁷

引入一些噪声或转换测试数据。例如,对于图像,看看随机添加一些像素是否会导致模型无法预测正确的结果。

不变性测试

测试机器学*模型是否在不同条件下表现一致。例如,删除或更改某些输入不应导致输出发生 drastica 更改。如果完全删除一个特征后,模型做出不同的预测,那么您应考虑调查该特征。如果该特征是或与敏感信息(如种族或人口统计信息)相关,则尤为重要。

基于切片的评估

在测试切分的各种片段或子组上测试您的模型性能。例如,您的模型在总体精度和 F1 等指标上表现良好,但当您进行调查时,发现在 35 岁以上和 15 岁以下的人群中表现不佳。这将是重要的调查和迭代对象,特别是在训练过程中可能忽略了某些群体时。

想了解更多有关这些评估技术的信息,请参阅 Chip Huyen 的《设计机器学*系统》(https://oreil.ly/JVYBI)(O'Reilly)。

模型版本管理

模型评估的目标是查看模型是否表现足够好,或者是否比基线或其他 ML 模型表现更好。每次模型训练后,您将拥有各种模型工件,例如模型定义、模型参数、数据快照等。当您希望挑选出表现良好的模型时,如果输出的模型工件可以轻松检索,将更为便利。与重新运行整个模型训练管道以重新生成模型工件相比,具有模型版本管理功能更为便利,即使您知道导致该模型的特定超参数。

本章前面已列出的实验跟踪工具(见“实验跟踪”)通常也支持模型版本管理。

模型评估中的样本面试问题

现在我们已经介绍了模型评估的常见技术和注意事项,让我们来看一些示例面试问题的内容。

面试问题 4-7:什么是 ROC 指标,何时使用它?

示例回答

ROC(接收者操作特征)曲线可用于评估二元分类模型。该曲线在不同阈值下绘制真正率与假正率之间的关系——阈值是介于 0 和 1 之间的概率,超过该概率的模型预测将被标记为该类。例如,如果将阈值设定为 0.6,则模型的概率预测大于 0.6 的类 1 概率将被标记为类 1。

使用 ROC 可以帮助我们确定在各种阈值下真正率和假正率的权衡,并且我们可以决定使用什么是最佳阈值。

面试问题 4-8:精确度和召回率有什么区别;在分类任务中何时使用其中之一?

示例回答

精确度Precision)衡量模型在进行正确预测时的准确性(质量),召回率Recall)衡量模型在正确预测相关项的数量方面的准确性。在数学上,精确度为 TP / (TP + FP),而召回率为 TP / (TP + FN)。

当关键是减少 FP 并将其保持低时,精度比召回更重要。一个例子是恶意软件检测或电子邮件垃圾邮件检测,在那里太多的假阳性可能会导致用户不信任。电子邮件垃圾邮件检测中的假阳性可以将合法的业务邮件移至垃圾邮件文件夹,导致延误和业务损失。

另一方面,在高风险预测(如医疗诊断)中,召回率比精确率更重要。增加召回率意味着较少的假阴性,即使这可能导致一些意外的假阳性。在这种情况下,最重要的是尽量减少错过真实案例的机会。

面试问题 4-9:高层次解释 NDCG(归一化折扣累积增益)是什么?它适用于哪种类型的机器学*任务?

示例答案

NDCG 用于衡量排名任务的质量,如推荐系统、信息检索和搜索引擎/应用程序。它比较了机器学*模型预测的重要性/排名与实际相关性之间的关系。如果模型的预测与实际(或理想)相关性差异很大,例如在购物网站的顶部显示客户不感兴趣的产品,则得分会较低。NDCG 通过预测相关性得分(DCG,折扣累积增益)之和除以 IDCG(理想折扣累积增益)来计算。然后对结果进行归一化,使其在 0 到 1 之间。

总结

在本章中,我概述了机器学*建模和训练过程的概述,以及每个步骤如何与机器学*面试相关联。首先,您定义了机器学*任务并获取了合适的数据。接下来,您根据任务的适用算法选择了模型作为起点。您还选择了一个基准模型,从简单的东西开始,以便比较任何进一步的机器学*模型,比如基于启发式方法或尽可能简单的模型,比如逻辑回归。

在所有这些步骤中,在面试中注意如何通过迭代过程来改进模型非常重要,这甚至可能涉及返回到以前的步骤,比如数据获取。在回答有关您在自己的项目上进行机器学*模型训练经验的面试问题时,无论是学校、个人还是工作项目,都需要谈论您面临的权衡以及为什么认为某种技术会有所帮助。

仅仅拥有高度准确的模型(如测试集上的测量)是不够的,因为对于雇主来说,重要的是了解应聘者如何在生产中使用模型。如果您申请的是构建生产管道和基础设施的机器学*角色,那么这一点就更加重要。最后,您审查了如何评估机器学*模型并选择最佳模型。

在下一章中,我将讨论机器学*技术面试的下一个主要组成部分:编码。

¹ 假设在这个项目中,存在适合这个问题的一些公共数据集。

² 请记住任何许可、版权和隐私问题。

³ “非结构化数据”,MongoDB,访问时间 2023 年 10 月 24 日,https://oreil.ly/3DqzA

⁴ 在第三章中讨论了抽样技术。

⁵ Jason Brownlee,《机器学*模型选择的简介》,Machine Learning Mastery(博客),2019 年 9 月 26 日,https://oreil.ly/2ylZa

⁶ 在第三章提到。

⁷ 这个术语在 Chip Huyen 的书籍《设计机器学*系统》(O'Reilly)中使用,出于方便起见,在本节中我使用相同的术语,因为似乎没有统一的术语,而更多是高级别的分组。

OceanofPDF.com

第五章:技术面试:编程

在前几章中,我详细介绍了机器学*面试流程以及技术面试中涉及的机器学*算法和模型训练部分。然而,技术面试可能要求候选人掌握更多的内容,不仅限于机器学*算法、统计知识和模型训练。本章将涵盖其中之一,即编程面试。

在机器学*岗位上,不同公司甚至同一公司内不同团队对编程题目的要求也不尽相同。例如,当我面试数据科学家和机器学*工程师岗位时,我遇到了以下类型的编程问题和任务:

  • 公司 1:关于在 pandas 中进行数据处理的 Python 问题

  • 公司 2:仅有 Python 脑筋急转弯问题(“LeetCode 风格”)

  • 公司 3:涉及 SQL 和 Python Pandas 的数据相关编程问题

  • 公司 4:带有真实场景的编程作业

…等等。

在编程面试中,不同公司可能会提出完全不同的问题。从我个人的经验和软件工程师同事及招聘经理的反馈来看,相较于软件工程师角色的技术面试,机器学*编程面试的标准化程度要低一些。但是值得一提的是,一些机器学*角色的面试官并不总是会问候选人最难的“LeetCode 风格”问题,也就是“LeetCode 难题”¹,因为候选人可以通过其它技能(如机器学*算法知识)进行评估。然而,这在很大程度上取决于具体的岗位要求,例如,面试 MLOps 等工程师职称的候选人可能会被问及标准的软件工程问题,其中可能包括 LeetCode 难题。像往常一样,与您的招聘顾问确认一下。

正如我在《机器学*角色的三大支柱》中所提到的,从事机器学*工作的人们需要同时具备编程和机器学*/统计方面的能力。你并不需要成为最熟练的编程高手,甚至不需要比软件工程岗位的平均候选人经验更丰富,但你需要足够优秀,可以轻松地与团队合作。

你可能会遇到一些团队,只需具备机器学*/统计知识即可,在小规模数据上工作,并且在面试过程中不需要测试你的编程技能。但对于这本书来说,我更倾向于 ML 角色,这些角色既涉及软件工程又涉及 ML,因为没有一种方法将 ML 模型分发和提供给用户,它们就无法成为我们日常使用的产品的一部分。ML 本身并不能创造 Netflix 推荐系统,而是将该模型投入生产并成为用户前端体验的一部分,从而带来用户的喜爱以及 ML 所带来的收入。 (更多关于测试模型部署知识的面试内容,请参见第六章。)

在本章中,我将解析机器学*工作面试中常见的编程问题类型,并讲解如何准备:

  • 如果你不懂 Python 的学*路线图

  • 与数据相关的 Python 问题

  • Python 脑筋急转弯问题

  • 与数据相关的 SQL 问题

从零开始:如果你不懂 Python 的学*路线图

如果你已经了解 Python,请随意跳过本节!我专注于了解 Python 的原因是:

  • 我经历的大多数,如果不是全部 ML 面试都假定你在某种程度上了解 Python。工作中大多数你将使用的 ML 库都有 Python 实现。

  • 即使是软件工程师也建议在面试时使用 Python 而不是其他语言,因为 Python 的编码速度和抽象性。与其在面试中花费宝贵的时间从头开始用 C 或 C++编码,不如只用 Python 编写一两行代码,这有助于你专注于面试中的重要内容。

  • 在 ML 工作中,你通常需要与其他个人和团队合作。即使 ML 可能是你的主要技能,面试官也会看你是否能编写可读性高的代码,供同事使用。

鉴于这些原因,如果你不懂 Python 或者有些生疏,以下是一个自学的建议路线图。

选择一本易于理解的书籍或课程

找一本侧重于实用代码的书籍或课程,在这些资源中你可以立即看到结果。²完成书中的练*。这里是我推荐的一些资源:

从 LeetCode、HackerRank 或你选择的平台上开始做简单的问题

有许多类似的在线编码平台,最常见的(在北美)是LeetCodeHackerRank。为简单起见,我将主要使用这两个平台作为示例,但你的地区或场所可能有其他类似的平台。

两个经典的初学者问题是Fizz BuzzTwo Sum。在你选择的平台上试试它们;在学*初期查看答案是可以接受的。目标是理解这段代码——如果现在能理解这些,以后就能理解更难的了。³

设定一个可衡量的目标并练*、练*、练*

即使是每天做一道题或者每两天做一道题对初学者来说也是有帮助的。在你的日记或手机上保持一个追踪器。尝试一个小时,如果卡住了,看答案,读答案或找视频解释,直到理解。几天后可以再做一道题,看看理解是否牢固。避免死记硬背,因为面试可能不会出完全相同的问题,除非你非常幸运。

尝试使用与机器学*相关的 Python 包

在你熟悉了 Python 的一些基础知识后,从以下教程开始使用机器学*:

CatBoost 教程可以是你第一个机器学*模型的起点!完成这一步后,你可以尝试使用自己的数据集或进行修改,尝试其他类型的模型,并建立自己的项目。

现在,我将介绍一些可能在机器学*工作面试中被问到的编程问题的提示。

编程面试成功的建议

在我们进入本章的代码部分之前,这里有一些需要记住的提示。你在面试当天的表现非常重要,无论你准备得多么充分,如果结果对面试官来说不明显都是无用的。我见过很多候选人忽视这一点,从而让他们的辛勤工作付诸东流。另一方面,遵循这些提示表现良好的候选人可以使他们的表现成倍成功。

大声思考

即使你是编码的人,面试仍然是你和面试官之间的讨论。对于面试官来说,你写下某一行代码的意图并不总是清晰的。如果你在打字时大声思考,可以帮助面试官理解你的思路,甚至帮助你自己。大声思考的一个例子是:“接下来我要写一些测试,但我在考虑要测试什么…”

即使你编写了一个最佳解决方案,如果整个面试大部分时间都是沉默的,通常也不是一个好迹象。你不必(也不应该)在每个时刻填充思维和对话,只要你向面试官提供足够的信息,而不是在沉默中编码即可。

这里有几个例子:我曾经面试过一个候选人,在整个面试过程中非常沉默。我提了一些问题来促使他们解释他们的代码,但他们可能很紧张,没有提供任何解释。最终,我无法提供帮助来引导他们走向最佳解决方案。在另一次面试中,候选人分享了他们的思维过程,因此我能够在候选人陷入困境之前提出澄清问题。候选人成功走上了正确的道路。请注意,这并不意味着如果你大声思考就会得到一个解决方案,而是通过与面试官的对话增加,面试官可以在你编码时提供更好的澄清。

控制对话流程

作为候选人,你可以积极塑造面试的对话流程,帮助你专注于解决问题。如果你需要一些时间集中精力,只需告诉面试官!在思考解决方案时,我曾经用过这句话:“我会专注大约两分钟,试着想出一个解决方案,所以我会安静一会儿。”这对于行为面试问题也很有效,比如“告诉我一次你在团队项目上克服挑战的经历。”如果你脑海中真的没有答案,而且你很紧张,你可以说:“在回答之前我正在整理我的思绪”,而不是在紧张时即兴编造。在编码面试期间同样适用;你可以控制节奏来帮助自己表现最好,因为面试官无法读懂你的思想。

你还应该注意时间,不仅仅依赖面试官来控制。作为面试官,当我们时间用尽时,我曾经不得不中断候选人以进行下一个问题。作为候选人,你可以在面试开始时澄清会问多少个问题以及每个问题大概需要多少时间。有时面试官会直接向你提供这些信息,但并非总是如此。例如:

候选人:“有多少个问题?每个问题需要花多少时间?”

面试官:“面试持续一个小时,我们有三个问题要让你回答,所以大约每个问题需要 20 分钟。但第一个问题最简单,最后一个问题最复杂,所以我建议你在第一个问题花 10 到 15 分钟,这是比较典型的。”

通过一个简单的问题,您可以获得更多信息来帮助您掌控面试的节奏和流程!现在,如果还有 10 分钟而且还有几个问题要解答,您就不会被措手不及了。

您的面试官可以帮助您

类似于“大声思考”的建议是:如果您遇到困难,请告诉面试官。他们通常不会拒绝给您一些提示。作为候选人,我曾直接要求过提示!例如:“您是否有具体的方向建议我如何处理这个问题?”(我在这种情况下通过了面试。)但我会小心:每次询问时,我都清楚地知道,如果请求过多的帮助,会对我的面试评估不利,相比于那些问题较少的人。尽管如此,我宁愿得到一个小提示,能够完成问题的 30%而不是被卡住时间一直流逝。权衡您的情况和时间。询问面试官是否在正确的方向上比完全进入一个不同的歧途要好得多。

"大多数情况下,面试官希望候选人通过面试取得辉煌成绩!因此,他们会提出问题来引导正确的回答,这样他们就有证据证明候选人准备好担任该角色,同时在技术面试中提供反馈和提示。因此,面试官应被视为一个盟友,而不是一个守门人," 亚马逊的高级应用科学家尤金·延说道。

优化您的环境

这应该是不言而喻的,但如果您在电话面试时,尽量选择一个安静的环境,没有干扰性的背景噪音。如果您开启了视频摄像头,请确保背景不会太分散注意力,或者使用虚拟背景。有一个面试官告诉我,当他们面试某人时,候选人的伴侣没有穿全衣服,正在候选人背后的床上移动。这不是一个被人记住的好方式!多亏了 Zoom、Microsoft Teams 和 Google Meet 上的虚拟背景,您可以避免这种情况发生。

总的来说,如果我是候选人,并且没有选择而必须在喧闹的环境中进行面试,比如繁忙的咖啡馆,我会提到因为背景噪音需要将自己(在通话中)静音的可能性。在这些情况下,面试官们总是理解的。主要目标是让您的话清楚地传达给他们听到;如果您不得不一遍又一遍地重复自己,这可能会很尴尬。

如果你现场面试,请确保基本需求得到满足:不要让自己在面试前感到饥饿。如果你面试的公司在面试后为你提供免费午餐,但是你没有时间在现场获取零食或早餐,那么请确保提前吃点东西。在我个人的情况下,我每天都喜欢喝咖啡,所以我确保能在面试前喝到或购买到。不要留事情到最后,即使公司有小厨房和免费零食,也不能保证你需要时能随时取用。我觉得带上自己的食物更方便。

我也会在现场面试时带上水瓶,并尽量在前一天晚上睡好觉。当然,这并不总是可能的,但尽力而为,你不会后悔的。

面试需要精力!

我提到所有这些建议是因为面试需要大量的注意力和心理、体力。这不仅仅是关于你在技术主题上的准备;整个面试过程就像标准化考试一样,综合评估你的表现。有些人准备充分但由于压力、紧张或睡眠不足表现不佳。也有些人准备稍微少一点,但因为在面试时心理和身体状态良好表现更好。表现更好的人得到工作。这听起来不公平,但请记住并尽你所能做到最好。

Python 编程面试:与数据和机器学*相关的问题

现在,让我们深入探讨编程/编码面试问题的第一种类型:与数据和机器学*相关的问题。这些问题侧重于使用 Python,例如使用 NumPy 和 pandas 库或像 XGBoost 这样的 ML 库,编写解决面试问题的代码。这类问题与下一小节涵盖的脑筋急转弯/LeetCode 问题的主要区别在于,这类问题更关注你在机器学*工作中日常角色中的实际操作。

根据你面试的公司类型不同,这些问题可能围绕公司的产品展开主题。例如,一个社交媒体公司可能会询问你如何获取新用户注册信息的一系列问题,以及如何提取用户活跃度的答案,以及上周有多少用户流失(离开)。

示例:与数据和机器学*相关的面试和问题

在本节中,我将为你介绍一个面试场景,并提供两个与数据和机器学*相关的 Python 示例问题,这些问题可能会在面试中被问到。请注意,这些示例中给出的数据集意在简单小巧,便于理解。

情景

面试当天,面试官会给你发送一个HackerRank接口的链接。当你打开它时,你会看到一个界面,你可以在那里编写你的代码。你再次确认,这场为期一个小时的面试总共有两道题,你计划在第一个问题上花费 15 分钟,第二个问题上花费 30 分钟。其余时间用于缓冲和与面试官的问答。

面试官将第一个问题复制并粘贴到页面顶部,以注释代码的形式概述问题。编程面试界面可能已经预填了问题,但在我参加过的多种类型公司的数据面试中,从大型科技公司到初创公司,问题可能不会显示在侧边栏,而是直接粘贴到编码区域。作为面试官,我推测这更适合那些不需要完全运行脚本的问题,以及更加侧重于来回讨论的面试。

你再次确认,你不需要完全运行代码,因为 HackerRank 环境实际上不会连接到真实的数据库。面试官确认了这一点。

问题 5-1(a)

[你正在面试的社交媒体公司],我们正在研究用户行为。我们拥有的数据格式是[sample data in .json format]。数据以以下两个.json对象的形式提供(简便起见称为“表格”)。

表格 1

user_signups = {
  "user_signups": [
      { "user_id": 31876, "timestamp": "2023-05-14 09:18:15" },
      { "user_id": 59284, "timestamp": "2023-05-13 15:12:45" },
      { "user_id": 86729, "timestamp": "2023-06-18 09:03:30" },
  ]
}

表格 2

user_logins = {
  "user_logins": [
      { "user_identifier": 31876, "login_time": "2023-05-15 10:28:15", 
"logoff_time": "2023-07-15 13:47:30" },
      { "user_identifier": 31876, "login_time": "2023-06-17 15:12:45", 
"logoff_time": "2023-07-17 18:31:20" },
      { "user_identifier": 31876, "login_time": "2023-06-20 09:03:30", 
"logoff_time": "2023-07-20 12:17:10" },
      { "user_identifier": 59284, "login_time": "2023-05-16 14:49:10", 
"logoff_time": "2023-07-16 18:02:45" },
      { "user_identifier": 59284, "login_time": "2023-05-18 09:33:25", 
"logoff_time": "2023-07-18 12:48:15" },
      { "user_identifier": 59284, "login_time": "2023-06-19 14:06:40", 
"logoff_time": "2023-07-19 16:34:50" },
      { "user_identifier": 59284, "login_time": "2023-06-21 08:20:05", 
"logoff_time": "2023-07-21 11:36:25" },
      { "user_identifier": 59284, "login_time": "2023-07-23 15:28:50", 
"logoff_time": "2023-07-23 18:44:40" },
      { "user_identifier": 86729, "login_time": "2023-06-18 10:48:30", 
"logoff_time": "2023-07-18 10:58:20" },
      { "user_identifier": 86729, "login_time": "2023-06-19 13:31:05", 
"logoff_time": "2023-07-19 15:50:40" },
      { "user_identifier": 86729, "login_time": "2023-06-21 10:10:25", 
"logoff_time": "2023-06-21 12:21:15" }
  ]
}

表格 1 中有新用户注册时间:

  • user_id

  • timestamp

表格 2 中有当前账户:

  • user_identifier

  • login_time

  • logoff_time

问题:给定这两个表格,哪些用户的最新活动超过了注册后 60 天?

在回答第一个问题时,你应该做以下几件事情:

  • 如果不清楚每种数据类型的含义,请确认:表格 1 中的user_id是否与表格 2 中的user_identifier相同?(例如答案示例中,我们假设它们相同。)

  • .json格式加载到你选择的格式中,例如加载到 pandas DataFrame 中。

  • 大声思考——在编码时解释你的方法和想法。如果你不确定,请确认问题;在这种情况下,即使有几列,最终你也不需要其中的一些列,或者你可以简化结果。

以下代码是问题 5-1(a)的示例答案:

# python

import json
import pandas as pd

user_signins_df = pd.DataFrame(user_signins["user_signins"]) ![1](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/1.png)

user_logins_df = pd.DataFrame(user_logins["user_logins"])
latest_login_times = user_logins_df.groupby(
    'user_identifier')['login_time'].max() ![2](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/2.png)

merged_df = user_signups_df.merge( ![3](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/3.png)
    latest_login_times,
    left_on="user_id",
    right_on="user_identifier",
    how="inner"
    )

merged_df['timestamp'] = pd.to_datetime(merged_df['timestamp'])
merged_df['last_login_time'] = pd.to_datetime(merged_df['login_time'])

# merged_df

|user_id   |timestamp               |login_time
|31876     |2023-05-14 09:18:15     |2023-06-20 09:03:30
|59284     |2023-05-13 15:12:45     |2023-07-23 15:28:50
|86729     |2023-06-18 09:03:30     |2023-06-21 10:10:25

merged_df['time_between_signup_and_latest_login'] = \
merged_df['last_login_time'] - merged_df['timestamp'] ![4](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/4.png)

# merged_df

|user_id |timestamp           |login_time          |time_between
                                                    _signup_and
                                                    _latest_login
|31876   |2023-05-14 09:18:15 |2023-06-20 09:03:30 |36 days 23:45:15
|59284   |2023-05-13 15:12:45 |2023-07-23 15:28:50 |71 days 00:16:05
|86729   |2023-06-18 09:03:30 |2023-06-21 10:10:25 |3 days 01:06:55

filtered_users = merged_df[merged_df['time_between_signup_and_latest_login'] \
> pd.Timedelta(days=60)] ![5](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/5.png)

filtered_user['user_id']
# Result: 59284

1

将.json 对象读取为 pandas DataFrame。

2

对于每个用户,获取他们的最新登录时间,并存储在名为latest_login_times的 DataFrame 中。

3

合并这两个 DataFrame。现在,对于每个用户,它显示他们的注册时间(timestamp)和最新登录时间(login_time)。 (提示:如果面试时间允许,可以将这些列重命名为更清晰的名称。)

4

计算注册时间戳和最新login_time之间的时间差,并将结果放入一个新列中。

5

筛选用户,仅保留那些在注册后超过 60 天登录过的用户。

对于本书中的代码示例,由于打印书籍的格式化,有时换行不像代码格式化程序输出的那样清晰。

问题 5-1(b)

现在,面试官将第二个问题粘贴到了 HackerRank 界面上。

假设你有一个新的数据集,表 3。

表 3

{
  "user_information": [
    {
      "user_id": "31876",
      "feature_id": "profile_completion",
      "feature_value": "55%"
    },
    {
      "user_id": "31876",
      "feature_id": "friend_connections",
      "feature_value": "127"
    },
    {
      "user_id": "31876",
      "feature_id": "posts",
      "feature_value": "42"
    },
    {
      "user_id": "31876",
      "feature_id": "saved_posts",
      "feature_value": "3"
    },
    {
      "user_id": "59284",
      "feature_id": "profile_completion",
      "feature_value": "92%"
    },
    {
      "user_id": "59284",
      "feature_id": "friend_connections",
      "feature_value": "95"
    },
    {
      "user_id": "59284",
      "feature_id": "posts",
      "feature_value": "63"
    },
    {
      "user_id": "59284",
      "feature_id": "saved_posts",
      "feature_value": "8"
    },
    {
      "user_id": "86729",
      "feature_id": "profile_completion",
      "feature_value": "75%"
    },
    {
      "user_id": "86729",
      "feature_id": "friend_connections",
      "feature_value": "58"
    },
    {
      "user_id": "86729",
      "feature_id": "posts",
      "feature_value": "31"
    },
    {
      "user_id": "86729",
      "feature_id": "saved_posts",
      "feature_value": "1"
    },
    {
      "user_id": "13985",
      "feature_id": "profile_completion",
      "feature_value": "45%"
    },
    {
      "user_id": "13985",
      "feature_id": "friend_connections",
      "feature_value": "43"
    },
    {
      "user_id": "13985",
      "feature_id": "posts",
      "feature_value": "19"
    },
    {
      "user_id": "13985",
      "feature_id": "saved_posts",
      "feature_value": "0"
    },
    {
      "user_id": "47021",
      "feature_id": "profile_completion",
      "feature_value": "65%"
    },
    {
      "user_id": "47021",
      "feature_id": "friend_connections",
      "feature_value": "73"
    },
    {
      "user_id": "47021",
      "feature_id": "posts",
      "feature_value": "37"
    },
    {
      "user_id": "47021",
      "feature_id": "saved_posts",
      "feature_value": "32"
    }
  ]
}

问题: 基于上一问题中的表格以及这个新表(表 3),假设可以在比这更多的数据上运行模型,你将如何建立一个预测流失模型?假设分析日期为 2023 年 7 月 25 日。创建流失指标和特征表,并口头描述你将如何进行建模。

这里有一些回答问题 5-1(b)的提示:

  • 你应该分析这些数据,即使它是一个玩具数据集,也要详细说明如果数据集更大你会怎么做。

  • 定义用户留下或离开的含义。公司是否有关于流失用户的定义?(例如,是指 30 天内未登录的用户吗?)弄清楚任何不清楚的事情。

  • 建议一些可能找到的相关性的方法——例如,如果用户的个人资料完成率较低,他们更有可能流失吗?另外,概述和编码出如何在数据集中测试和确认这些假设。

  • 对于建模来说,你可以尝试一些低成本的基线模型吗?也许是回归或简单的基于树的模型?

  • 对于更复杂的模型,你会怎么做?

  • 如果你注意到时间快用完了,告诉面试官你会快速概述复杂模型可能的工作方式,并结束讨论。

举例说明,这里是加载表格后一些行可能看起来像的示例:

user_id feature_id feature_value
|31876 |profile_completion |55%
|31876 |friend_connections |127
|31876 |posts |42
|31876 |saved_posts |3
|… | |

以下代码是问题 5-1(b)的示例答案的第一部分,加载表 3:

# python

import pandas as pd

user_info_df = pd.DataFrame(user_info["user_information"])

user_info_df.head() # print top 5 rows

    |user_id    |feature_id            |feature_value
    |31876      |profile_completion    |55%
    |31876      |friend_connections    |127
    |31876      |posts                 |42
    |31876      |saved_posts           |3
    |59284      |profile_completion    |92%

面试官确认,如果用户 30 天内没有登录,则可以视为流失。请注意,我们假设当前日期为 2023 年 7 月 25 日。您创建了一个表示流失的二进制列。以下代码是问题 5-1(b)的答案的第二部分,创建流失指标:

# python

import numpy as np

# add churn indicators

merged_df['churn_status'] = np.where(
  pd.to_datetime('2023-07-25') - merged_df['login_time'] >= pd.Timedelta(days=30), 
  1, 
  0
  )

# merged_df

|user_id |timestamp           |login_time           |time_between       |**churn
                                                      _signup_and        _status**
                                                      _latest_login 
|31876   |2023-05-14 09:18:15 |2023-06-20 09:03:30  |36 days 23:45:15   |1
|59284   |2023-05-13 15:12:45 |2023-07-23 15:28:50  |71 days 00:16:05   |0
|86729   |2023-06-18 09:03:30 |2023-06-21 10:10:25  |3 days 01:06:55    |1

从这里你可以将其连接到特征表:

# python

user_info_df["user_id"] = pd.to_numeric(user_info_df["user_id"])

features_df = user_info_df.merge(merged_df_2[["user_id", "churn_status"]], 
                                 left_on="user_id", right_on="user_id")  ![1](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/1.png)

# features_df

|user_id    |feature_id            |feature_value    |churn_status
|31876      |profile_completion    |55%              |1
|31876      |friend_connections    |127              |1
|31876      |posts                 |42               |1
|31876      |saved_posts           |3                |1
|59284      |profile_completion    |92%              |0
|59284      |friend_connections    |95               |0
|59284      |posts                 |63               |0
|59284      |saved_posts           |8                |0
|86729      |profile_completion    |75%              |1
|86729      |friend_connections    |58               |1
|86729      |posts                 |31               |1
|86729      |saved_posts           |1                |1

1

数据框merged_df具有您的流失指标,现在您将其与具有特征的表features_df连接起来。

接下来,您决定使用简单的 ML 模型 CatBoost,并继续将此数据框转换为所需的格式(在这种情况下,如果列是特征,则更容易)。

一个简单基于规则的方法可以是,如果用户 20 天内没有登录,他们可能已经很可能会流失(30 天未登录)。这种简单的“等待和观察”基于规则的方法是一种选择。另一个选择是,如果他们在 14 天内既没有登录又没有添加任何朋友,那么他们很可能会流失。我们的猜测是,如果此时他们没有朋友,那么可能他们没有回来的动机,因此可能会流失。

提示

如第四章中提到的,在这里可以讨论缩放数据,以使具有较大“数字”的特征不会使量级失衡。讨论一下如果存在缺失值的情况(在这个示例中,没有,但在现实世界中可能会有)。

数据和机器学*面试常见问题解答

在上一个场景中,我详细介绍了数据和机器学*面试可能的进行方式。我参与过许多此类面试,有时是作为面试者,有时是作为面试官。以下是我希望能帮助你的一些额外观察和建议。

FAQ:看起来面试方式差异很大。我应该尝试在像 HackerRank 和 CoderPad 这样的平台上练*吗?

A: 面试格式可能有所不同,但不要为此担心。一旦你做了几次,你会越来越*惯这种多样性。例如,我曾经参加过需要正确运行代码的面试,也参加过允许伪代码的面试。就像谷歌面试的例子,当然你不能在 Google Docs 中直接执行代码。但如果你不熟悉语法或经常犯一些明显的错误,面试官仍然能看出来,即使你不需要运行代码。

FAQ:大声思考似乎会分散注意力。如果我真的做不到怎么办?

A: 如果你知道大声思考会让你分心,那么你就不需要频繁发言。然而,我仍然建议在你自然停顿的时候,比如刚刚定义完一个函数,利用这段时间快速总结一下你做了什么以及为什么这样做。作为面试官,即使我在密切关注候选人输入的每一个字符,我可能会有错误的假设——我不可能读心!总结一下,至少在自然停顿时尝试解释一下你的想法。

FAQ:我没有以往处理数据的工作经验。我怎么样才能回答这些问题?

A: 我发现,那些与数据工作的人经常考虑的一件大事是各种算法的优缺点。他们还要考虑更加注意数据的细微差别。例如,回到社交媒体公司的面试场景,面试官可能会提到基于树的模型对于使用时间较长的用户效果更好,但对新用户的效果可能不那么好。当面试者能够提出解决劣势的解决方案时,这是很好的——例如,一种解决方案可以是仅对具有超过 30 天活动的用户使用此模型。

作为数据中细微差别的一个例子:如果一个表格既有用户 ID 又有朋友连接,但没有关于用户使用社交媒体平台时间的信息,那么数字可能不会有相同的意义。使用平台时间更长的用户可能自然会有更多的朋友连接。尽管朋友数量相同,对于仅注册一个月的用户和使用时间为一年的用户来说,拥有 10 个朋友的意义是不同的。

好消息是,即使在没有数据工作经验的情况下,现在你知道了这些要点,你也可以通过侧项目获得相同类型的思考方式。听起来要求很多,但作为一个新毕业生,我能够根据我在计量经济学作业中学到的东西回答这样的问题。只要你有一些实际经验(在面试准备和建立项目组合时应该有),你就能做到。

数据和 ML 面试问题的资源

这里有一些进一步练*数据和 ML 相关面试问题的资源:

注意

当搜索关于数据和编码的面试问题时,我发现搜索结果倾向于偏向脑筋急转弯类型的问题,如果你搜索“机器学*编程问题”。我解决这个问题的方式是指定 Python 库然后加上“练*”——例如,“numpy 编程练*”或“pandas 编程练*”。

Python 编程面试:脑筋急转弯问题

现在,让我们继续讨论下一类编程问题,本书中将其称为“脑筋急转弯问题”。它们也被称为“LeetCode 问题”(人们通常简称为 LC)、编程挑战等等。

在搜索机器学*面试中提出的编程问题时,脑筋急转弯类型的问题在搜索引擎结果中经常出现,但你现在知道这不是唯一可能被问到的问题类型。尽管如此,这些问题之所以重要的原因是:

  • 它们更加标准化。

  • 它们与历史悠久的软件开发者/软件工程师面试流程共享。

  • 对于非常重视软件工程技能的机器学*岗位,这类问题和面试流程与一般的软件工程面试有很大的重叠。

  • 即使在你的实际工作中,你所处理的项目可能比编程脑筋急转弯更加广泛,但脑筋急转弯问题仍然主要用于评估候选人的编程技能。

注意

对于那些已经熟悉这类面试问题的人,可以跳过本节。这是针对那些对脑筋急转弯/LeetCode 类型问题新手的指导,解释如何高效准备它——也就是说,工作要聪明,不仅仅是努力。如果你听说过这些模式,那么现在是时候去练*和“刷 LeetCode”了!

在我开始提供建议和资源之前,这里有一些要注意的模式,帮助你准备脑筋急转弯问题。

脑筋急转弯编程问题的模式

当你注册 LeetCode 或 HackerRank 时,你将面临平台上数百个问题。这可能导致分析瘫痪:有这么多问题,我应该从哪里开始?接着会感到不知所措:有成千上万的问题;我真的能学会所有这些吗?

别担心 —— 你不必担心。许多问题测试类似的概念或模式。当你开始专注于识别共同模式并从第一原则理解它们时,即使以前没有见过,你也能更灵活地应对新问题。

如果有一百个问题,但实际上只测试了 10 种主要模式,最初做每种类型的两三个问题(20 到 30 个问题)会节省时间,而不是粗暴地准备面试,做所有一百个问题。

可以略过这一节;你不必完全深入理解一切。在开始面试准备之后,你可以回来复*。

下面是一些需要注意的模式:

  • 数组和字符串操作

  • 滑动窗口

  • 双指针

  • 快慢指针

  • 合并区间

  • 图遍历,如深度优先搜索(DFS)和广度优先搜索(BFS)

我将详细介绍前三种模式:数组和字符串操作,滑动窗口和双指针。我看到这些主题的问题在所有数据相关角色中被问得最多,而仅仅关注软件工程的工作面试可能会问到额外的概念,比如图遍历。我将在本节的后面提供资源链接,帮助你为这些额外的概念做好准备。

数组和字符串操作

对于许多编程问题,你需要能够操作数组、字符串、字典或其他数据类型。我将这个声明分成两部分来解释一些定义。首先,在这种情况下,“数组”并不是字面上限制于 Python 数组或 NumPy 数组;相反,这是一个口头上的总称。在面试的背景下,“数组”可能包括 Python 列表和其他可迭代对象,可以在for循环中进行迭代。在这种情况下,“操作”指的是像更新、重新排列和提取数组中的元素以实现目标结果的任务。这不是孤立存在的模式;相反,你将使用数组和字符串操作技能与其他模式如滑动窗口和双指针结合使用。

这些问题中,你应该能够轻松使用以下简单函数:

此外,如果你不熟悉语法或者可以通过更简单的内置函数轻松实现结果,你可能会导入模块如collections或者itertools或者内置函数sorted(),但这可能比它们的价值更麻烦:

  • abs()

  • aiter()

  • all()

  • any()

  • anext()

  • ascii()

  • bin()

  • bool()

  • breakpoint()

  • bytearray()

  • bytes()

  • callable()

  • chr()

  • classmethod()

  • compile()

  • complex()

  • delattr()

  • dict()

  • dir()

  • divmod()

  • enumerate()

  • eval()

  • exec()

  • filter()

  • float()

  • format()

  • frozenset()

  • getattr()

  • globals()

  • hasattr()

  • hash()

  • help()

  • hex()

  • id()

  • input()

  • int()

  • isinstance()

  • issubclass()

  • iter()

  • len()

  • list()

  • locals()

  • map()

  • max()

  • memoryview()

  • min()

  • next()

  • object()

  • oct()

  • open()

  • ord()

  • pow()

  • print()

  • property()

  • range()

  • repr()

  • reversed()

  • round()

  • set()

  • setattr()

  • slice()

  • sorted()

  • staticmethod()

  • str()

  • sum()

  • super()

  • tuple()

  • type()

  • vars()

  • zip()

  • __import__()

你还应该熟悉常见的数据类型,包括以下内容(记住本书侧重于 Python):

列表

你应该能够熟练地通过索引循环和切片操作它们。获取从 A 到 B 的元素,获取最后三个元素,等等。

字符串

你应该能够像操作列表一样操作这些字符串。你能轻松获取第三个字母吗?获取前一到三个字母?最后一个字母?等等。

各种数值类型

面试问题是否要求保存为int还是float?有没有一个更好的选择?

字典

这些数据结构可以帮助你通过键值对存储和快速访问数据。它们也非常高效。对于*惯其他语言的人来说,这与 Java 的 HashMap 类似。

集合

如果面试问题侧重于唯一值,它们非常适合使用。

元组

当你希望一次从程序中返回多个结果时非常有用。

生成器

在实际生活中非常有用,这些数据结构可以显著节省所需的内存,减少在处理大量数据时可能发生的错误。

数组

我在面试中并不常使用 Python 的这种“array”(不同于 NumPy 的 array),因为之前使用的数据类型对我来说已经足够了。然而,了解这种实现可能会有所帮助,特别是对于大量数据和数值操作更为高效的情况。

注意:我对每种数据类型的评论并不详尽,但在面试中我发现它们非常有用。

注意

根据你面试的角色,问题的难度可能远高于本书中的简介。如果你申请大型科技公司的工程师角色(如 MLE 或 ML 软件工程师),强烈建议(甚至必须)在像 LeetCode 这样的在线平台上多加练*。对于初学者,继续在这里介绍的基础上构建也是很有必要的。

滑动窗口

现在让我们继续讲解下一个模式:滑动窗口。这种模式适用于需要操作或聚合一系列值的问题(见 图 5-1)。在学*这种模式之前,我通常会采用蛮力方法:在每次循环中,例如对整个范围求和。然而,采用这种方法很快就会遇到问题。它在处理较小的数据时效果不错,但在处理大范围数据时,我的解决方案可能会超时,导致无法通过测试用例(如在 LeetCode 上)。在提供测试用例的面试中,这意味着我无法完全解答问题。

滑动窗口的示意图

图 5-1. 滑动窗口的示意图。

这种模式帮助你重复使用窗口或范围,这些窗口在每次迭代中重叠。在第一次迭代中,你会对所需范围内的所有内容求和。在循环的第二次迭代中,而不是从头开始对第二次迭代的范围求和,你可以使用第一次迭代的总和,加上新的数字,并减去第一个数字。这样,求和范围问题变得更简单,只需要处理三个数字。当我采用这种方法时,我发现在许多以前失败的问题中,现在在大范围数字上运行时,测试用例能够通过。

现在让我们来看一些简化理解的示例问题。请注意,许多在线平台如 LeetCode 将提供一些样板代码,例如预定义的类,供您插入代码;为简洁起见,示例问题和答案中不包括样板代码。

问题 5-2

给定正数数组 [2, 1, 5, 1, 1, 3, 2] 和正整数 k = 3,找出大小为 k 的任意连续子数组的最大和。

在这个例子中,大小为 3 的子数组是:

[2, 1, 5] → Sum: 8
[1, 5, 1] → Sum: 7
[5, 1, 1] → Sum: 7
[1, 1, 3] → Sum: 5
[1, 3, 2] → Sum: 6

下面的代码是问题 5-2 的示例答案:

# python
def max_subarray_sum(arr: List[int], k: int):
    """
    :returns: int
    """
    results = []
    window_sum, window_start = 0, 0

    for window_end in range(len(arr)):
        window_sum += arr[end]                                   ![1](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/1.png)

        if window_end >= k-1:                                    ![2](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/2.png)
          results.append(window_sum)                             ![3](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/3.png)
          window_sum -= arr[window_start]                        ![4](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/4.png)
          window_start +=1

    return max(results)

test_arr = [2, 1, 5, 1, 1, 3, 2]
test_k=3
result = max_subarray_sum(test_arr, test_k)

# result: 8

1

在滑动窗口后添加新项(参见图 5-1)。

2

对于前 k 个元素,将它们全部加在第一个完整的window_sum中。我们使用 k-1 是因为列表/数组是从 0 开始索引的,这意味着位置从 0 开始,而不是从 1 开始。

3

一旦我们开始滑动窗口,将结果存储在名为results的数组中。

4

在滑动后删除窗口中不再存在的项(参见图 5-1)。

提示

根据输入数组是否排序,您可能会有不同的实现。始终双重检查您的问题,看看它们是否指定了排序的输入/输出。

双指针

双指针 是我接下来要讲解的模式。按照这种模式的问题可以通过两个指针在数组、列表、字符串等中遍历解决(请参见示例答案中的图 5-2)。想象一只乌龟和一只兔子,它们分别位于数组表示的直路的两端。乌龟和兔子向对方移动以找到问题的解决方案,最终在中间相遇。还有其他模式;例如,一个指针可以固定,而另一个可以移动。

为了说明,让我们看一个双指针面试问题的示例,并查看一些在线资源以练*其他相关问题。

问题 5-3

从一个排序的唯一数字数组中,找到数组中可以相加得到给定目标值的一对数字。返回数组中每个数字的索引(位置)。每个数字只能使用一次,也就是说,不能将相同的数字与自身相加。

这是示例输入:

numbers = [2, 5, 7, 11, 16]
target = 16

示例目标输出是:[1, 3]

索引为 1 和 3 的数字分别是 5 和 11,它们相加得到目标和 16。

这是一个简单的解释以便理解。首先,我将说明双指针方法如何在图 5-2 中起作用。在这个例子中,指针从数组的开头和结尾开始,向中间移动,使得指针元素的和接*目标和。

用于编程面试问题的双指针模式示意图

图 5-2. 双指针模式在编程面试问题中的示例。

这里是示例代码实现:

# python
import math

def get_pair_with_target_sum(numbers: List[int], target: int):
    """
    :returns: List[int]
    """
    start_ind, end_ind = 0, len(numbers) - 1    ![1](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/1.png)

    test_num = math.inf

    while test_num != target_sum:               ![2](https://github.com/OpenDocCN/ibooker-ml-zh/raw/master/docs/ml-itvw/img/2.png)

      start_num = numbers[start_ind]
      end_num = numbers[end_ind]
      test_num = start_num + end_num

      if test_num > target_sum:
        end_ind -= 1
      elif test_num < target_sum:
        start_ind += 1
      elif test_num == target_sum:
        return [start_ind, end_ind]

    if test_num == math.inf:
      return None

numbers = [2, 5, 7, 11, 16]
target = 16
result = get_pair_with_target_sum(numbers, target)

# result: [1,3]

1

start_ind 对应于图 5-2 中的指针#1(最左指针),而end_ind对应于指针#2(最右指针)。

2

如图 5-2 中所示,保持迭代总和,如果目标总和较小,则将最右指针向左移动,如果目标总和较大,则将最左指针向右移动。

提示

如果您正在应聘编程问题较难的角色,面试官可能会继续询问您是否能够提出如何优化或加快初始解决方案。如果您能够从一开始就提出优化的解决方案,那就更好了!进一步优化的示例在以下代码示例中有所体现。

以下代码示例更为简洁,简化了初始答案:

# python
def get_pair_with_target_sum(numbers: List[int], target: int):
    """
    :returns: List[int]
    """
    pointer_1, pointer_2 = 0, len(numbers) - 1
    while(pointer_1 < pointer_2):
        current_sum = numbers[pointer_1] + numbers[pointer_2]
        if current_sum == target:
            return [pointer_1, pointer_2]
        if target > current_sum:
            pointer_1 += 1
        else:
            pointer_2 -= 1

numbers = [2, 5, 7, 11, 16]
target = 16
result = get_pair_with_target_sum(numbers, target)

# result: [1,3]
注意

根据测试用例,无论是由面试官提供还是您自己设计的,可能会假设是否对输入进行了清理。在问题 5-3 中,我将假设传入的输入是正整数,但有时会有诡计问题,例如当您的代码假设它们始终是正输入时,却传入负数。请与面试官核实并相应地做出反应。

脑筋急转弯编程问题资源

本节提供了进一步的资源,用于编程面试的练*。

编程面试练*平台

以下是练* LeetCode 风格或脑筋急转弯编程问题的常见平台:

LeetCode

一个提供软件工程师和开发人员编程挑战和面试准备资源的在线平台

HackerRank

提供在线编程测试和技术面试的在线平台

Pramp

免费的在线同行互助平台,用于练*技术面试

Interviewing.io

匿名模拟面试,与科技公司的工程师进行

精选的编程面试学*资源

以下是这类问题的流行且有用的指南;基本上,它们是您在普通软件工程师面试循环中使用的相同资源:

  • 破解编程面试 由 Gayle Laakmann McDowell 撰写:这本书被认为是大型科技公司风格编程面试的最受欢迎的入门读物之一。它专注于软件工程面试循环,但如果您正在面试与软件工程循环有很大重叠的 ML 角色(例如某些 MLE 角色,ML 软件工程师等),那么您也需要为这些面试循环做好准备。

  • “如何在 Python 编程面试中脱颖而出” by James Timmins.

精选编程面试练*题

要了解更多模式,你可以查看资源,比如LeetCode 75 学*计划获取完整的类别列表,并在博客文章如“编程面试中 7 个最重要的 LeetCode 模式” by Hunter Johnson 中阅读它们。

SQL 编程面试:与数据相关的问题

在数据工作的人们可能在职业生涯中的某个时刻遇到 SQL。在我曾经工作过的每家公司中,我都必须同时使用 Python 和 SQL。因此,许多公司专门用 SQL 测试一些数据问题,尽管你可能能够选择 Python 或 SQL 来回答某些问题。

像在数据和 ML 上的 Python 问题一样,SQL 问题可能与你正在面试的公司或团队的行业相关联。例如,一个在大型社交媒体公司搜索团队面试数据科学家职位的人可能会遇到以下问题:

  • 在过去 14 天内进行了超过 10 次搜索的用户有多少?

  • 有多少百分比的用户得到了多种搜索结果类型?

  • 要求你创建一个搜索的自动完成功能。你会如何使用 SQL 实现一个简单版本?

这里我包含了一个 SQL 面试问题样例。

问题 5-4

对于这个问题,你会得到两个表。

表 1 包含每个产品的产品级信息以及产品的价格和数量:

Product  Category  Price     Quantity
Product1 Category1 10.99     5
Product2 Category2 25.99     12
Product3 Category1 15.49     20
Product4 Category3 8.99      3
Product5 Category2 17.99     8

表 2 包含即将到来的折扣信息:

Category Discount
Category1 0.10
Category2 0.00
Category3 0.05
Category4 0.15
Category5 0.05

编写一个查询,获取每个类别的总数量和总折扣值(如果所有商品在促销期间出售),例如以下列:

  • category

  • total_category_quantity

  • total_discounted_values

以下代码是问题 5-4 的示例答案:

-- SQL
SELECT
P.category AS category,
SUM(P.quantity) AS total_category_quantity,
SUM(P.quantity * P.price * (1-COALESCE(D.discount, 0))) 
AS total_discounted_values
FROM TABLE_1 AS P
LEFT JOIN TABLE_2 AS D
ON A.CATEGORY = B.CATEGORY
GROUP BY P.CATEGORY
;

SQL 编程面试问题的资源

这里给出的示例是为了让你了解 SQL 中基本的连接测试问题。然而,更高级的表可能包括更多的表,更复杂的表,窗口函数,子查询等。利用这些资源进一步准备:

为准备编程面试的路线图

有些人可能已经有面试经验,并且已经意识到可能会被问到各种不同类型的问题。当我刚开始面试时,我被各种不同类型的问题搞得措手不及。例如,我专注于准备与数据和机器学*相关的 Python 问题,但没有意识到会有一些与常见的机器学*或统计 Python 库完全不相关的脑筋急转弯问题。从那时起,我确保扩展了我的面试准备覆盖范围。

虽然说起来容易,做起来却难。无论你已经了解 Python 还是 SQL,这些问题的格式可能仍然令人困惑。没有足够的练*,在时间限制下表现良好也是一件困难的事情。面试是孤立的事件,正如我之前提到的,表现优异的面试是一种独立的技能。一个非常充分准备和经验丰富但面试时非常紧张的候选人可能不会被选中。但是,一个准备充分并且在面试压力下表现良好的候选人更有可能得到这份工作。

这本书是关于机器学*职业的,所以我不会对像这样的面试是否是衡量行业中(特别是有经验的)人员表现的最佳系统发表太多评论,他们可能已经有一段时间没有练* LeetCode 脑筋急转弯了。但我知道的是,当我面试时,我会花时间复*其中的一些问题,并制定一个时间表来做到这一点。你可能已经根据本章内容覆盖的内容知道该准备什么,但如果不动手键盘,你不会在获得工作机会的道路上取得实际进展。

每次我找工作,我都会列出我应该准备的内容,并制定一个练*的时间表。在这里,我包括了一些示例日历,你可以作为大学生或者正在进行职业过渡的人使用,还有一些变体。我鼓励你根据自己的情况调整时间表并开始行动。本章重点介绍编程面试准备路线图,但你可以使用同样的格式来准备本书中提到的所有面试类型(详见第八章了解更一般的机器学*面试准备路线图)。

编程面试路线图示例:四周,大学生

概述:你是本科或硕士最后一年的学生。你对 Python 有些了解,但对 SQL 一无所知,因为你没有参加使用 SQL 的课程。你从一位在数据领域工作的校友的信息面试中学到,还有从阅读这本书中了解到,除了练*一些 Python 脑筋急转弯问题外,你应该了解一些 SQL 知识。

可选但鼓励:您还可以联系您项目的学术顾问或相应人员,请他们联系该项目的校友,他们进入数据科学和/或机器学*领域。他们给了您两位校友的联系方式,⁴您在 LinkedIn 上找到并联系了他们。其中一位没有回复,但您与另一位通话了,他谈到了他们的准备情况。您记录了一些笔记并开始制定计划。

目标是在四周内开始申请工作和面试(表 5-1)。

表 5-1. 一个大学生的示例路线图,设定课程和作业之间的准备时间,每天总计大约两到三小时,每周约 18 小时

示例路线图
第 1 周:计划
Mon

| 阅读 ML 面试 | 阅读 ML 面试 | 阅读 ML 面试 | [今天因任务繁忙

明天]^(a) | [今天因任务繁忙] | 进行面试准备

准备

日程表^(b) | 进行面试准备

日程表 |

第 2 周:数据和 ML 问题
Mon Tue Wed Thur Fri

| 刷新 NumPy 的知识

和 pandas | 在 NumPy 上练*问题 | 在 NumPy 上练*问题 | [俱乐部活动] | 在 pandas 上练*问题 | 练*问题

在 pandas 上 | [与朋友 BBQ] |

第 3 周:脑筋急转弯编程问题
Mon Tue Wed Thur Fri

| 滑动窗口模式上的 3 个问题^(c) | 两个指针模式上的 3 个问题 | [模式]上的 3 个问题 | [今天因任务繁忙

明天] | [今天因任务繁忙] | 数组和字符串操作的问题(与前两个类别重叠) | 尝试 3 个问题并计时 |

第 4 周:从头学* SQL
Mon Tue Wed Thur Fri

| 观看 SQL 介绍视频,跳过部分

他们 | 观看 SQL 介绍视频 | 尝试 3 个问题,查看

解决方案 | 尝试 3 个额外的问题,查看

解决方案 | 尝试 2 个新问题,不查看

解决方案 | [放松] | [放松] |

第 5 周:SQL 练*问题 + 脑筋急转弯,计时
Mon Tue Wed Thur

| 不看解决方案练* 5 个 NumPy/pandas 问题

解决方案 | 在所有主要模式中练* 4 个 LeetCode 问题,不查看

解决方案 | 查看您之前卡住的问题的解决方案 | 练*尝试

3 个 LeetCode 问题中

1 小时不看

解决方案 | 尝试 3 个 SQL 问题,不查看

解决方案 | 查看前一天 SQL 问题的解决方案

看看是否有

更好

解决它们的方法 | 追赶未完成的任务 |

^(a) 你会看到我将这些任务放在这个准备日历中,但这并不意味着你在这个日历之外没有做任务、准备考试或者社交活动。这个计划是每天只有两到三个小时,如果你列出学校或个人事务在这里,那意味着你仍然可以从面试准备时间中抽出时间处理紧急事务、任务或社交活动。^(b) 在这个例子中,第 2 至第 4 周是在规划周期间的专门时间填充的。^(c) 你可以选择两个简单难度的问题开始,以及一个中等难度的问题。每个问题可以花 30 分钟到 1 小时来解决;如果一个小时后仍然卡住了,那就看看解决方案。

这个路线图之所以可以相对较短,主要是因为我喜欢尽快摆脱仅消耗学*材料的阶段。有些人因为不开始动手在键盘上练*和解答问题,所以花费了两倍的时间却进展较少。这就像试图通过阅读学*数学而不自己解决任何问题一样。

我也让我的路线图压力不大。如果你不能做三个问题,那就做一个。就那天只做一个。在至少一半的准备日里,你甚至可以看看解决方案。你可以做到的!

警告

第一次尝试练*问题并发现自己陷入困境时,会感到痛苦。试图回到观看视频和阅读书籍,希望找到那些至关重要、立竿见影的有效技巧,这种诱惑是很强的。不要陷入这种陷阱。 越快开始尝试练*问题并犯错,你就会学得越快。根据我的经验,你也会更好地保持信息。

根据我自己的经验,在准备阶段类似这个路线图后,我继续进行迭代和改进,开始面试并在一些面试中失败。也许我需要多练*一些中等难度的问题,或者在面试过程中更快速地识别编码模式。但至少我开始了,每次面试失败并在随后的每次面试中变得更好,都让我离实现机器学*工作的目标更*了一步,远胜于被动地观看视频。

编程面试路线图示例:六个月,职业转型

好了。假设你不是学生,但你正在从事机器学*之外的领域工作。此外,你还有一个孩子要照顾,和你的配偶共同承担责任。

概述:您对机器学*/数据领域很感兴趣,并且一直在阅读在线材料,然后无意中发现了这本书。您希望开始迈出这一步,但工作后精力有限。您将周末时间用于家庭,但计划每周六投入两到三小时,周日投入一小时进行面试准备。您希望在六个月内做好准备,这是一个现实可行且可持续的目标(请参考表 5-2)。

表 5-2. 专业全职职业人士和有孩子的家长的路线图,每周安排约四小时

第 1 周 第 2 周 第 3 周 第 4 周
Month 1 阅读机器学*面试 制定学*计划 制定学*计划
Month 2 学* NumPy 学* pandas 练* NumPy 问题(看解析后再不看) 练* pandas 问题(看解析后再不看)
Month 3 阅读关于 Python 的 LeetCode 阅读模式,每种模式做 1 道题 每种模式做 2 道简单难度的题 每种模式做 2 道中等难度的题
Month 4 通过视频学* SQL 尝试 3 道带解析的 SQL 问题 尝试 5 道不带解析的 SQL 问题
Month 5 每周做 3 道题 每周做 3 道题 每周做 3 道题 每周做 3 道题
Month 6 每周做 5 道题,计时 每周做 5 道题,计时 每周做 5 道题,计时 每周做 5 道题,计时

请注意,您还需要为本书中的其他部分安排准备时间。例如,如果您也在学*机器学*算法,那可能也需要六个月的路线图。如果您在工作,并且每周末只有两到三个小时的空闲时间,或者每个工作日每天只有一小时,那么您可以调整并延长时间框架。这完全取决于您自己!

编程面试路线图:创建您自己的!

现在是制定您自己的路线图的时候了。在您的日程中,可以包括其他类型面试的准备。我想强调准备编程面试,因为需要大量的肌肉记忆来快速完成问题。请参考第八章中的空白模板,您可以用于编程准备以及整体面试准备。

伴侣网站的评论区与我分享您的路线图!

摘要

在这一章中,你阅读了各种类型的编程面试题目:与数据和机器学*相关的问题,脑筋急转弯以及 SQL 问题。你还了解了面试官在编程面试中寻找的内容以及一些成功的技巧:大声思考,经常与面试官澄清,以及面试过程中的交流。最后,我提供了一些准备编程面试的示例路线图,并鼓励你根据自己的目标时间制定自己的路线图。

¹ 在 LeetCode,一个在线编程实践平台上,有一个被标记为难度高的编程问题。在撰写本文时,其他难度包括简单和中等。

² 我通过在Ren’Py游戏引擎中编码学到了这一点。因为它基于 Python,并且我可以立即在屏幕上看到结果,我能够直观地理解我的代码在做什么。对于一个自学者来说,这非常有帮助。

³ 从学*乐器的类比来看:如果你可以慢慢地弹奏,你也可以快速地弹奏。

⁴ 我有过一些影响我职业生涯的学术顾问,他们以不可思议、改变生活的积极方式影响了我。如果你仅仅是问一下,你可能会对他们能够提供的惊人资源感到惊讶。另一方面,我曾经对学术顾问有过两年的恐惧,因为当我失败了几门课程并且在午餐休息时听到一些抱怨学生的话语时,有一位学术顾问说,“你永远无法从这个失败中恢复过来”。没有恶意,但是我学到了一课——找到那些真正值得他们的重量黄金的好顾问需要努力。我提到这一点是为了鼓励你,如果有可能的话,多与他们交流。这种努力是值得的!

OceanofPDF.com

第六章:技术面试:模型部署和端到端 ML

在第三章和第四章中,你已经对与 ML 算法、模型训练和评估相关的重要面试概念有了概览。为了让 ML 模型对用户产生影响,无论是公司的客户还是内部用户和同事,模型都需要部署

部署有许多层次,但最重要的是实现模型的最终目标。如果你的模型是手动运行的,并且每次市场团队请求新结果时都是临时的,而且运行良好,那可能就是你的部署级别。或者,你可以拥有一个完全自动化的系统,在这种情况下,模型会作为 A/B 测试的一部分发送给客户,训练模型的人除了进行模型训练外不需要做任何事情。这可能是需要的部署级别。

顺便提一句,ML 专业人士并不需要了解模型部署的所有细节。然而,如果你申请以下职位之一,熟悉本节提到的话题会很有用。通常需要更深入了解模型部署的角色包括:

  • 不仅仅进行模型训练的机器学*工程师

  • MLOps 工程师

  • 在初创公司担任数据科学家或 MLE,并且没有其他专门从事 ML 部署的人员

巧合的是,如果你的工作正好属于这种类型的角色,那么面试中可能还会包括与软件工程面试环节重叠的编码问题,如第五章所述。

另一方面,如果你感兴趣的公司或团队有非常明确的角色划分,而你申请的职位不需要进行实际的部署工作,或者你感兴趣的工作包括以下工作:

  • 产品数据科学家

  • 数据科学家、应用科学家、MLE 等,专注于模型开发或其他分析工作

本章将介绍模型部署、部署后的模型监控,以及其他端到端的机器学*流程和工具。此外,我还将简要总结更高级的机器学*面试话题:系统设计、过往项目的技术深度探索和产品感。这样你就知道这些话题,以及如果遇到它们该如何准备。好消息是,更难的变种通常只在高级或资深以上的职位中才会遇到,而不是在入门级别。

模型部署

我用来描述模型部署的类比是它“实时且在空中”。在机器学*角色中,这是机器学*生命周期的重要部分,如第一章所述。关于机器学*部署的面试可能涉及的主题包括机器学*或软件基础设施(用于支持模型服务)、机器学*假设检验、监控、模型更新等等,一旦模型部署完成。

这种类型的机器学*经验可能通过自学更难获得,因为当我们作为副业构建机器学*模型时,首先可能没有用户进行测试。因此,在我看来,这通常不是副业项目的重点。

接下来,我将概述模型部署在工业界的重要性的一些原因,并向你展示如何在心理上从模型训练和开发工作转向部署工作。

新加入机器学*行业的主要经验差距

在我开始进入机器学*领域时,生产部署的概念对我来说是陌生的。因此,我包括了这一部分,描述了我如何首次接触这些概念,并如何从理论的机器学*知识过渡到独立项目再到成熟项目。希望这个故事能让你感同身受,并对你有所帮助。

在我在多伦多大学的硕士项目期间,我在 Jupyter 笔记本上使用 Python 进行了一些研究项目。对于这些项目,我以编程方式进行数据抓取和获取,编写脚本进行数据清理,并分析数据。在这段时间里,我用我的笔记本电脑进行计算:我直接在笔记本电脑的本地环境安装 Python 包。在开发过程中,由于我是唯一的工作人员,我能够快速地编辑我的代码。除了在我的笔记本电脑上本地制作副本之外,我没有对代码进行备份。在完成机器学*模型的训练和分析后,我创建了一些可视化内容,并将它们放入 LaTeX 格式的论文中,这就是项目的结束。我从未再次运行过那些脚本。

所有这些对学*环境来说都是合适的,但与工业环境中的工作环境非常不同。许多机器学*从业者也分享了他们调整心态的经历:现在模型需要部署,能够运行,并且可以轻松地被其他同事修改,代码也需要被备份并重新运行 —— 通常是自动化地!

生产是一个光谱,取决于你申请的公司。对于某些团队来说,你的主要机器学*成果可能仅仅是在训练模型后生成一些图表,这可能类似于你在学校或个人项目中的经验。对于其他团队(据说这些岗位更具竞争力),生产可能会伴随对可用性和百万用户运行的期望。在这些情况下,一个简单的开发环境中有效的方法可能与生产环境中的不同。

在我的第一份工作中,我开发的机器学*模型每天都必须为数百万用户运行。与我在研究生项目中只有几千条记录的项目相比,所需的计算方式完全不同,我无法再在我的笔记本电脑上运行它。在那份第一份工作中,我不得不学*远程进入我们本地云计算并在虚拟机上工作的方法。我还不得不学*使用版本控制,以便代码可以备份并轻松与同事共享。我不得不编写测试代码,以便自动测试每次更改;这是我在学校项目中没有做过的,因为我手动测试了每个更改。最后,我的第一份工作中的机器学*模型必须通过调度程序运行,以便每天至少生成一次预测结果——这与我在学校的机器学*模型只运行一次训练过程后生成完整结果完全不同。

我分享这些是为了表明,如果你能在学校通过使用版本控制(Git、GitHub 等)进行协作项目中获得这些经验,那么你将能更加流利地谈论这些技能。如果你没有机会学*协作开发,那么无论你申请什么角色,浏览一些本章内容都会对你有所帮助,以便你能熟悉可能需要在工作中学*的内容。

提示

现在,我建议候选人尝试使用诸如 Streamlit 这样的工具部署一个简单的 Web 应用程序。过去,我已经使用 Flask 在本地部署过我的项目,或者在 Heroku 这样的托管网站上部署过。

数据科学家和 MLE 是否应该了解这些?

求职者经常会提出这种类型的问题,例如“A 是否应该了解 Docker?”“B 是否应该了解 Tableau?”例如:

  • 数据科学家是否应该了解 Kubernetes?

  • MLE 是否应该了解机器学*算法背后的数学?

  • 数据科学家是否应该了解 Docker?

我的回答是:必须根据你自己的情况决定在你的机器学*职业生涯中是否应该学*技术 X,以下是如何进行决策的。

让我们以 Kubernetes 为例——你可能正在尝试弄清楚你是否应该了解它。我认为事情是有先后顺序的:首先,了解你申请的角色需要什么是必要的。使用第一章和第二章中概述的方法,看看你对机器学*生命周期的哪个部分感兴趣,然后通过工作职位描述确定你申请的工作是否需要你了解 Kubernetes。如果角色不要求这一点,专注于准备其他核心主题,如模型训练和评估。

如果你瞄准的角色确实需要 Kubernetes 经验或其他类型的部署知识,比如设置 Jenkins、GitHub 操作和通用 CI/CD,那么务必进行一些研究,并在一个玩具项目中获得一些实际经验。

更进一步,阅读有关该主题的各种可靠和相关来源,并收集广泛的观点是非常重要的。

例如,Chip Huyen,《设计机器学*系统》(O’Reilly)的作者,在一篇博文中写道:“为什么数据科学家不需要了解 Kubernetes”:

拥有一个端到端的数据科学项目可以实现更快的执行和更低的沟通开销。然而,只有当我们有好的工具来抽象出较低级别的基础设施,帮助数据科学家专注于实际的数据科学而不是配置文件时,才有意义。¹

我还推荐 Eugene Yan 的博文“不受欢迎的观点:数据科学家应该更具端到端”,² 在这篇文章中他写道:“我试图说服[读者],端到端的可见性、内聚性(即反向康威定律)和所有权会带来更好的结果。”³ 但他并不一定“主张数据科学家/ML 工程师应该全栈,并且深入了解如何设置 K8s,进行博士级研究,设计前端等等。”他补充道。

在此时点,在查看工作职位和各种可靠意见后,你可能会做出决定:“我现在不需要学* Kubernetes,但将来可能会有帮助。”

无论你的结论是肯定还是否定,我认为最好的答案类型是假设当情况改变时,你可以重新评估这个答案。就像所有职业一样,无论你是否应该了解 X、Y 或 Z 技术都是会变化的!随着你的职业发展,你可能会发现自己处于以下某种情况中:

  • 进入初创企业并承担更广泛职责

  • 想要晋升,需要更多 X 经验

  • 想要横向转入另一个需要更多 X 经验的 ML 角色

在这些情景中,最终你可能需要了解 X!但这并不意味着你现在就需要了解它。由于你可能在面试准备上时间不足,把它看作是受限制的优化问题。你可能有限的精力、准备时间和研究时间可以用来找到理想的工作。你应该优先考虑那些能给你最优化面试结果的活动。如果学* Kubernetes 能达到这个效果,那就专注于学*它。如果是模型训练,那就首先专注于模型训练,然后把剩余时间用在其他任务上。

端到端机器学*

端到端 是一个用来指代整个工作流的术语,“端”是项目或工作流的开始和结束。关于 ML 从业者是否应该更全面已经有了讨论,你可能会想知道你是否应该这样做。要联系机器学*生命周期,答案是你应该了解多个生命周期的方面(参见 图 1-5),而不仅仅是其中的一部分。

在软件工程中,类似的术语是 全栈工程师全栈开发者,有时候全栈数据科学家、全栈 MLE 等也指那些负责更多端到端 ML 过程的角色。

我的答案会与“我需要知道这个吗?”的问题类似:审视你的工作角色,看看需要什么。然后确定什么是优先的,什么是最有益的。

提示

如 Eugene Yan 在他的博客文章中所写,“不受欢迎的观点:数据科学家应该更全面”,了解端到端的 ML 过程是有帮助的,但你不必成为每一个方面的专家。

这是我自己的故事,随着时间的推移变得更加全面,但不是作为一名初级候选人。当我得到我的第一份数据科学/机器学*工作时,我对规模化模型部署或像 Docker 或 Kubernetes 这样的工具了解不多,⁴ 我对数据工程和 SQL 也不太熟悉。在那份工作期间,我学到了更多关于数据工程和 SQL 到高级水平,Docker 到中级水平,但我仍然不了解 Kubernetes。

在我的第二份工作中,我在一家初创公司,我负责更多的机器学*生命周期,因此我需要学*更多关于规模化部署模型的技术。在那种情况下,学*这些技术并使得端到端连接 ML 工作流到我们应用堆栈的非 ML 部分变得更加合理。我在 O'Reilly AI Superstream: MLOps 上的主题演讲中谈到,了解部署过程如何帮助 ML 从业者更有效地完成 ML 项目。

总体而言,我认为成为更全面的人对我的职业生涯有益。然而,这是在多年的时间内发生的:我在我的 ML 生涯开始时并不了解很多,而是逐项目、逐角色地积累知识。所以不要太担心需要了解 X、Y 或 Z 的说法:通过审视你最感兴趣的角色,并优先考虑成功面试的顶级技能来评估你的情况。在深入之前,你也可以通过像这本书这样的书籍快速获取其他技能的高级概述。你可以在工作中或通过持续的自学中后续学*新技能,就像我一样。

接下来的部分将涵盖云环境和本地环境、模型部署技术、云提供商和额外的工具。如果你已经熟悉这些概念或者觉得某些部分现在对你来说不相关,可以跳过它们。当这些话题变得更相关时,你也可以回到本章节。

云环境和本地环境

在第四章中,我谈到了模型训练和评估。但我没有在那一章节详细描述开发环境。模型在某处训练并在另一处评估。该环境可以是本地机器(比如你的 MacBook Pro)、云虚拟机(VM)等等。

另外,模型训练的环境通常与生产环境不同。例如,模型可以在 VM 上训练并打包成 pickle 文件,然后通过脚本复制到生产环境,这个生产环境可能在完全不同的 Google Cloud Platform(GCP)命名空间中,训练模型的人可能没有个人访问权限。

无论是在云端还是本地工作,你都必须注意模型训练与部署之间的交接。模型训练的工件是如何运送到生产环境的?生产过程是什么样的,每个步骤在哪里进行?甚至是否有生产流程?了解 ML 工作流建立在哪些类型的位置基础上的基础知识,可以帮助你简化、自动化或优化 ML 部署的任务。这通常不会直接在面试中询问,但对于面试中其他与模型部署相关的话题是一个重要的基础。

本地环境总结

当我刚开始涉足数据领域时,已经更普遍地在远程或云环境中训练模型或配置云虚拟机。然而,有一些事情并非在高性能计算上运行,仍然可以在本地机器上常见地完成(取决于你的工作场所)。这些包括:

  • 连接到远程数据存储并在本地运行 Jupyter Notebook 进行临时的探索性数据分析

  • 在小样本数据上快速原型化模型训练,但是完整的训练是远程进行的

  • 如果公司的技术堆栈设置成可以在本地运行 ML 服务进行测试

本地机器通常只是开发环境,除非你是一家初创公司在单台机器上运行服务器(这种情况非常少见,因为会存在停机或计算问题)。在本书中,我不会讨论仅运行单个本地服务器的情况。

了解你的开发环境在本地机器(如笔记本电脑)上的运行方式非常重要,这样你就知道如何在生产环境及其反之上复制它。设置Docker(稍后在本章中介绍)和依赖管理如PipenvPoetry等在 Python 中是必不可少的,这样在某人的笔记本电脑上运行的内容将在生产环境甚至另一个同事的笔记本电脑上运行!

云环境总结

尽管“云”已成为由第三方管理的远程服务器使用的总称,但在 ML 中有一些重要的细微差别以及云环境部署的不同方式。接下来,我将详细介绍几种开发环境类型。

公共云提供商

公共云指的是来自诸如 GCP、Amazon Web Services(AWS)、Microsoft Azure 等供应商的云服务,我将在“云供应商概述”中更详细地介绍。然而,与同一供应商的私有云相比,硬件方面,同一台服务器可以运行来自多家公司的工作负载——也就是说,它们是多租户的。公共云提供商的优势在于其极大的便利性,这使得公共云成为软件公司非常流行的选择。

在使用公共云时需要考虑的一些额外问题包括:由于大型供应商的大量资源,使用公共云通常是安全的,但由于法规原因,这可能不是最理想的选择。向公共云迁移的过程可能会导致停机并破坏日常运营,这可能极其不便。如果你准备在 ML 中的中小型公司工作,你可能会使用公共或私有云。如果你在高度监管的大公司工作,你可能会使用本地部署或本地云和/或本地工作。

随着 AWS 等平台的兴起,公共云变得流行起来,促使许多公司将工作负载从本地(on-premises)服务器迁移到云服务上。然而,由于法规原因,许多工作流程或数据存储仍无法迁移到公共云。

本地部署和私有云

在一些大型公司中,拥有服务器并在其上托管本地平台并不罕见。当我在一家大型电信公司工作时,它拥有许多自己的服务器。事实上,许多大型公共云提供商使用的服务器是从电信公司租赁或拥有的。该公司保留了一些服务器供私人使用,并拥有自己的GitLab 实例和其他服务。许多企业软件解决方案也提供自托管解决方案,具有企业支持的好处。这被称为本地部署

自托管许多服务的原因包括:

  • 公司拥有服务器,比将同一批服务器暴露于公共云更安全。

  • 在某些情况下,出于监管目的,如欧盟的通用数据保护条例(General Data Protection Regulation,GDPR),信息隐私的法规更容易实施。

  • 金融服务和法律机构等高度受监管的行业对数据存储位置有额外要求,并且是否可以使用公共云来存储个人可识别信息(PII)。

私有云位于公共云和本地/私有云之间。如 AWS 等供应商托管服务器并保证这些服务器仅用于一家企业客户(单租户),⁵与公共云使用的共享硬件相对立。公司可能会根据可行性和成本、便利性及法规平衡各种权衡因素,使用这些解决方案的混合方式,包括公共云。

注意

如果您的角色不负责评估、设置或自动化部署环境,那么您开发机器学*的环境在面试时不会有太大差别。当我使用本地云时,与私有云或公共云相比(依我之见),便利性略逊一筹,但总体上需要的知识相似。如果您已经使用了一个远程环境,那么您也可以使用另一个。然而,如果您是 MLOps 平台团队的一员,可能需要更多地了解您所使用平台的基本工作原理。

另一方面,还出现了所谓的云回归⁶现象,即曾经转向公共云服务的公司现在正在重新评估并回到本地云,因为本地云的各种优势。据我观察,大公司有更多资源自行托管本地云实例,因为他们拥有更多员工,因此能够负担得起专职人员来维护这些本地服务器,并与供应商顾问沟通,解决出现问题时的故障排除方法。在我曾供职的一家大公司,其中一个平台供应商是 IBM;当 IBM 平台的本地实例出现问题时,数据科学团队的高级成员之一会联系 IBM,并安排会议,以便 IBM 提供故障排除支持。全天候提供 IBM 支持服务确实很好,但你可以想象,支持和咨询的成本也相当高。

较小至中型公司可能会发现维护本地云既繁琐又昂贵,而且开销太大。对于这类公司,公共或私有云可能仍然是最常见的选择。

模型部署概述

在模型训练完成并准备就绪后,是时候部署它们(到生产环境)了!在不同类型的公司中,这个过程可能大不相同。正如我在本章前面提到的,生产环境有不同的层次,但目标是让模型变得有用

这里是一些部署示例的非详尽列表,从最简单的级别到最复杂的级别:⁷

  • 机器学*模型被某处存储并按需运行;结果在本地保存。

  • 机器学*模型被某处存储并按需运行,但结果写入到一个中心位置。

  • 机器学*模型被某处存储并自动运行为批处理过程,并将结果写出。

  • 机器学*模型被包装在一个简单的 Web 应用程序中,例如Flask,并通过 Docker 容器启动。

  • 机器学*模型被包装在一个简单的应用程序中,并通过Google Cloud FunctionsAWS Lambda调用。

  • 机器学*模型被某处提供并由 Kubernetes 编排和管理;几乎所有事情都是自动化的。

等等。

根据您面试的公司及其典型的部署模式,您会有不同的期望。如果您正在面试一个技术或机器学*团队成熟的公司,您可能需要了解与上述列表中 5 和 6 级相关的工具。公司规模不如技术栈的成熟度重要;当我在一个有 200 人的初创公司时,我们的技术栈正处于第 6 级。

这意味着,一般来说,如果您在一个负责平台的部分、部署和生产生命周期的机器学*角色中,如果您恰好没有这些技术和工具的工作经验,您将需要更多时间进行学*。对于成熟度较低的机器学*团队(如 1 至 4 级),您可能会在训练机器学*模型的同时,负责处理这些角色。

随着一个机器学*团队的成熟度增加,同一个人既训练模型又构建自动化平台的价值将会减少。一个人或一个团队一次做多件事情,将无法专注于使机器学*模型达到最佳状态,特别是随着公司需要越来越多的模型。

例如,一个电子商务公司最初可能制作了一个简单的库存预测模型,后来可能希望开发推荐商品的模型,用于其新闻通讯。然后,公司可能希望仅在销售期间添加一个强大的销售模型。或者,也许有人在公司发现欺诈账户正在使用公司的商品来掩盖偷来的资金流;那么该公司的某人可能会发布指令创建一个欺诈检测模型。

当一个机器学*团队承担了越来越多的责任时,团队会厌倦用胶带(快速、临时的)修复方法,并希望开始引入一些开发者的额外工作量,比如容器化和版本控制。今天,公司通常从一开始就开始使用这些工具,但仅仅几年前,一些软件不够成熟或者机器学*团队可能并未使用 Docker,而有些公司和团队直到几年前(截至 2023 年)才正式开始使用 Git。如今,对 Docker 和版本控制(如 Git)的知识的需求可能比以往更高。

Docker 简介

Docker 允许将软件应用程序及其依赖项打包在一起,并且是可移植的——也就是说,使用 Docker 容器,相同的软件应该能在任何兼容的机器上以相同的方式运行。另一方面,同事的系统上可能可以运行相同脚本,但在你的笔记本电脑上运行同样的脚本可能需要环境可移植。因此,Docker 还可以使环境与运行它的基础设施无关。

容器化并不是什么新鲜事物:过去,虚拟机(VMs)经常用来解决类似的问题——例如,一个在 Linux 机器上工作的人想要在 Windows 上测试某些东西,可以安装一个 Windows 虚拟机,反之亦然。缺点是,安装的是整个操作系统,这在其他环境上测试时会导致大量冗余。使用 Docker 容器,你不需要安装整个操作系统(除非特意如此)。例如,你可以有一个 Docker 镜像指定 Python 环境;⁸ 容器使用主机的操作系统,但仍然提供了虚拟机隔离其他部分的功能。

Docker 镜像 是一个只读模板,包含创建 Docker 容器 的指令。⁹ 因此,镜像就像一个模具。定义这个模具的指令在 Dockerfile 中。Docker 容器是镜像的可运行实例,你可以创建、启动、停止等等。你可以从一个单一镜像创建多个相同的容器实例。有关示例,请参见 图 6-1。

Dockerfile、Docker 镜像和 Docker 容器。

图 6-1. Dockerfile、Docker 镜像和 Docker 容器。

与 Kubernetes 协调

现代 Web 服务通常要求具备高可用性。像 Docker 化这样的良好实践有助于将软件以易于移植的方式打包,这有助于应用程序在无需停机的情况下发布。然而,这只是一个谜题的一部分;像 Kubernetes 这样的技术可以自动化地编排容器化应用程序,使其在正确的位置和时间运行。当然,负责 ML 应用程序编排的人(也可能是你?)需要设置自动化并调整配置和策略。¹⁰

请注意,涉及编排的职位角色的责任在不同公司可能有所不同。一些公司可能会让 DevOps 工程师维护编排基础设施。然而,我见过许多更大更成熟的 ML 组织中有基础设施工程师、MLOps 工程师和 ML 工程师(MLE),他们可能都至少负责 ML 应用程序的一部分正常运行时间要求。

在这本书中,我概述了 Docker 和 Kubernetes,但由于篇幅有限,无法像 DevOps/MLOps 书籍那样详细涵盖,因此这里提供了一些我在 O'Reilly 发现的有用资源:

如果这些对你完全陌生,不用担心。根据我的工作经验,在工作中我已经学会了大部分容器化和编排工具。事实上,我可以说,在工作时间内通过实践项目的学*贡献了我在这一领域的大部分知识。

额外的工具

这里我讨论了一些其他有用的工具:

ML 管道和平台

现今有许多处理 ML 工作流自动化部分的 ML 平台,了解它们是非常有用的。如果你事先得知你面试的公司使用的平台是哪个(些),务必查阅该平台的文档页面,了解平台提供的常见术语和工具。这些 ML 平台可以包括 Airflow、MLflow、Kubeflow、Mage 等。

CI/CD

在一个软件团队更加自动化和成熟的组织中,你可能需要了解更多关于持续集成、持续交付(CI/CD)工具和技术的内容。配置这些工具可以在新的提交合并到主分支时自动部署软件(这是一个简化的例子以便理解)。这样做可以减少手动更新代码的工作量。参见 图 6-2,了解自动化更新源代码、创建软件构建¹¹、测试和部署的示例。一些 CI/CD 工具,结合版本控制,可能包括 Jenkins、GitHub actions 和 GitLab CI/CD。

CI/CD 在代码更改后自动化流程的示例流程图;来源:“CI/CD Pipeline: A Gentle Introduction,” Marko Anastasov, Semaphore

图 6-2. CI/CD 在代码更改后自动化流程的示例流程图;来源:“CI/CD Pipeline: A Gentle Introduction,” Marko Anastasov, Semaphore

设备端机器学*

在机器学*中,还有一些特定领域与设备端部署或边缘部署相关。诸如量化¹² 这类技术使得机器学*模型更小更高效,可以在移动设备、物联网设备以及其他类型的边缘设备上运行。在部署时,这需要考虑许多额外的因素。这是一个更高级的话题,所以如果你为面试需要这方面的知识,我建议你进一步补充。

您可以通过以下资源了解更多关于设备端机器学*的内容:

面向模型训练角色的面试

即使你主要申请的是机器学*模型训练相关的角色,也不要低估一些高级知识对你面试的帮助。由于在机器学*训练领域有很多有经验的候选人,如果在这方面与其他候选人处于同一水平,拥有更多的模型部署实践和跨团队协作经验可能会起到决定性作用。不过,如果你的角色不太侧重于机器学*运维,你应该优先考虑第三章和第四章中的核心机器学*训练能力。

作为个人趣闻,我成功获得过的一些工作中,面试官反馈称他们对我如何将机器学*训练与部署过程联系起来印象深刻。例如,在面试中我提到如何优化机器学*输入,以确保模型在生产环境中仍能以足够快的速度运行以满足要求。那些对端到端过程留心的候选人可以缩短从机器学*模型原型到集成到公司产品(例如购物网站上的推荐系统)所需的时间。

因此,在工业界,候选人不能将机器学*模型仅视为好奇的项目——在运行时使用尽可能多的数据并且需要过长时间来迭代或无法调试。这在仅在较少的时间间隔内运行整个模型的研究或临时基础上效果不错。但是在生产环境中,如果出现故障或错误可能导致收入或用户信任的损失,修剪一些内容并确保相关脚本可以进行调试是很重要的。

在这个问题上表达我的观点和经验有助于我区别于那些似乎对其机器学*模型的可用性后续处理不负责任的候选人。

模型监控

在模型经过(如第四章中概述的过程)训练后,您仍然需要将其部署到生产环境中。在此之前,决定并设置监控非常重要,以便尽早检测到生产中模型存在的问题。例如,如果模型不断拒绝贷款申请人,您希望机器学*团队中的某人查明原因,并有可能与业务或产品团队讨论。可以设置的其他监控类型包括在数据管道失败时发出警报等。

在本节中,我将介绍常见的监控设置,如仪表板和数据质量检查。我还将涵盖特定的与机器学*相关的监控,例如与准确性相关的指标。

小贴士

那些没有经验将机器学*模型部署到生产环境中的求职者可以通过部署一些简单的 Web 应用程序来模仿这些经验,正如本章前面提到的。

监控设置

这里是一些在生产环境中监控机器学*模型后常见的方法。

仪表板

仪表板通常是监控的第一步。您可能尚未自动化数据质量检查,但我看过的许多公司至少有某种形式的仪表板来监控机器学*预测。

在创建用于机器学*监控的仪表板时,有几个重要的考虑因素:

保持可视化尽可能简单。

如果太复杂,人们会停止查看,这违背了创建仪表板的初衷。

尽可能使标签清晰明了。

过去我与合作并指导过的团队成员都知道,如果任何可视化中缺少或者标签不清晰,我会在代码审查中提到它们的重要性。特别是,请不要忘记轴标签。

良好地显示模式。

有时默认的比例尺不能很好地显示差异或大小;例如,有时图表非常拥挤。您可以使用对数变换使图表更易读。

警告

这些点有些并不是在面试期间确定的,而是在更早的阶段。例如,如果您在简历中链接了 GitHub 作品集,面试官可能已经看过了。如果作品集中的仪表板或图表非常不清晰,并且缺少轴标签,那么甚至在面试之前就已经给出了负面印象。

在实施方面,这里是一些常见的可视化和监控工具:

数据质量检查

由于仪表板需要手动检查,您可能希望添加自动化检查以节省时间并确保准确性。这些检查可以包括检查传入数据中的缺失值,甚至检查数据的分布是否发生变化。

数据检查或数据单元测试工具包括:

Great Expectations 期望的屏幕截图,可测试数据是否满足某些要求

图 6-3. Great Expectations 期望的屏幕截图,可测试数据是否满足某些要求。

警报

现在您已经自动化了检测数据质量下降或变化的过程,您可以设置警报。警报策略包括警报的逻辑,例如:如果某列开始出现过多的空值,请通知这个 Slack 频道。图 6-4 展示了通过Great Expectations在 Slack 上显示测试的示例。

Great Expectations 网站的屏幕截图:Slack 通知示例;来源:Great Expectations 文档

图 6-4. Great Expectations 网站的屏幕截图:Slack 通知示例;来源:Great Expectations 文档

与机器学*相关的监控指标

之前,我讨论了整体监控设置和数据监控,现在我将深入介绍衡量模型性能本身或模型的输出和预测的度量标准。这通常是面试中被问及的问题,用以确定您将如何处理模型性能变化。以下是一些可用的度量指标类别:

准确度相关的度量指标

您可以监控和跟踪准确性相关的度量指标,尽管这可能需要完整的反馈循环才能完成。例如,在一个流失预测模型中,您可能预测本月的周期内某个用户将会流失。一个月后,您再检查该预测是否正确,并对整月的所有预测执行相同的操作。如果您的模型准确性低于预期,则将其作为需要调查的内容记录下来。

与预测相关的度量指标

在模型需要比反馈循环更快做出反应的情况下,您还可以监视预测度量指标。例如,如果模型开始预测异常高的欺诈警报(您可以事先确定阈值),请调查是否有任何变化。由于您已经从前一步骤设置了数据质量检查,这可能是一个很好的起点。换句话说,使用模型的输出作为警报,并通过调查输入或其他因素(如最*的世界事件或销售)进行故障排除。

云供应商概述

在本节中,我将概述三大主要云供应商。在机器学*面试中,我认为您拥有哪种云供应商的经验并不重要,只要您了解它们的工作原理即可。例如,我的第一份工作使用本地云,但我的第二份工作主要使用 GCP,并且对此经验非常满意,因为它证明了我能够使用远程机器。我的第三份工作同时使用 AWS 和 GCP,并且完全不介意我到目前为止只使用了 GCP,并且对 Azure 的接触很少。

一旦你熟悉了主要组件,每个主要的三大云供应商的功能通常都有对应的功能。我经常发现自己搜索诸如“GCP [术语] AWS 对应物”,其中[术语]可能是像服务帐户这样的东西,因为它们在 AWS 中被称为其他名称。后来我发现它们简单地称为IAM 角色

当然,雇主可能期望候选人在没有太多时间进行培训和适应新技术的情况下就开始工作。在这种情况下,有经验使用公司平台的候选人可能会得到优先考虑。我认为这些情况是候选人无法控制和了解的,如果你怀疑出现了这种情况,也不要感到太难过。

GCP

GCP(Google Cloud Platform)是 Google 的云服务。在我在多个使用 GCP 的工作场所的经验中,我认为它非常易于使用。我在数据科学/ML 工作流中看到的主要工具有(这是一个非详尽列表):

Google Colab

这是创建、托管和共享 Jupyter Notebooks 的流行解决方案。可用于研发、探索性数据分析和模型训练。

Google Cloud Storage(GCS)和 buckets

用于存储部分模型训练输入和输出。

Google Cloud 数据库

包括 Cloud SQL、BigQuery、Bigtable、Firestore 等。这些是分析型数据库,有时用作批处理 ML 的特征存储。

Google Kubernetes Engine(GKE)

对于较大规模的操作,此工具使用 Kubernetes 来 orchestrate ML 部署,例如在需要更多计算资源时进行自动扩展。

Google Cloud 上的 Kubeflow

您可以在 GCP 上运行模型管理工具,如 Kubeflow、MLflow 等。

Vertex AI

撰写时,此功能正在进行一些更新和更改,但其目的是成为端到端的 ML 解决方案。

当然,根据您加入的 ML 公司,可能会混合使用不同的工具,因为归根结底,所有这些组件只是达到目标的手段。正如我之前说的,您不需要了解所有这些工具;我提到一些工具是为了帮助您获得一般的名字识别和了解每个工具的功能。

要在 Google 技术堆栈上免费开始使用 ML,您可以使用 Google Colab 的免费套餐,在我的经验中非常好用。然后,您可以使用GCP 的免费套餐,在特定的月度配额之内。此外,还有一个高达 300 美元的云计费信用的免费试用(撰写时可用)。

Google 提供了一系列免费和付费的 ML 课程;撰写时,这是他们的基础课程页面和他们的机器学*工程师学*路径。还有Google Cloud 技能提升:提供视频讲座和 Qwiklabs 的实践实验室培训服务。

AWS

Amazon Web Services(AWS)是另一个非常流行的云平台,由亚马逊拥有。它具有多种与 ML 相关的功能和服务;以下是一个非详尽列表:

Amazon Simple Storage Service(S3)

可用于存储部分模型训练输入和输出的存储解决方案。

Amazon Elastic Kubernetes Service(EKS)

完全托管的 Kubernetes,用于 orchestrate ML 部署,例如在需要更多计算资源时进行自动扩展。

Amazon EC2

在 AWS 上用于创建 VM 的计算层。

Amazon SageMaker

管理的 ML 平台,模型存储和特征存储。其中包括 模型版本控制模型监控仪表板 等。

要免费入门,请使用 AWS 免费层(截至撰写本文时)。AWS 有官方免费课程指导您使用平台。¹⁵ AWS 机器学*学*计划 也是免费的(截至撰写本文时)。我建议先通过官方的免费课程快速浏览一下,因为它们通常较短,并专注于供应商认为最重要的学*部分。

Microsoft Azure

下面是 Azure 上的机器学*工具的非详尽列表,这是微软的云平台:

Azure Blob 存储

可用于存储部分模型训练输入和输出的存储解决方案

Azure 虚拟机

Microsoft Azure 上的计算层

Azure 机器学*

机器学*生命周期的端到端平台

要开始使用 Azure 上提供的 免费服务。Azure 在 数据科学家的机器学*培训 页面上有官方的免费课程。

面试中的开发者最佳实践

在面试过程中,了解候选人是否具有在正式软件环境中工作的经验非常有用。对于入门级候选人,我期望能够在他们之前未使用过的工具上进行指导和辅导。但我见过很多刚从学校毕业的人,他们已经在学校作业或实*中使用过像 Git 这样的工具,并学会了进行代码审查的流程,所以说实话,竞争相当激烈。甚至在实*阶段,我曾面试并指导过许多候选人(例如来自我的母校滑铁卢大学),他们在本节描述的通用开发者工具上已经获得了全职等效的经验。

提示

对于任何从事机器学*工作的人来说,这一节都非常有用,不仅仅是那些专注于模型部署的人。

版本控制

任何申请机器学*职位的候选人都应该有一些使用版本控制的经验。最常见的版本控制是使用 Git。公司通常使用像 GitHubGitLab 这样支持 Git 版本控制的在线平台。版本控制的目标是能够跟踪代码的变化,回滚(重置)到以前的代码版本,并轻松与团队其他成员合作。当你是唯一在代码库上工作的人(例如在你的个人项目上),你可能看不到它的意义,而是使用复制粘贴来备份你的代码。然而,当涉及到任何两个或更多人共同工作的更大代码库时,请节省自己的头疼时间,使用版本控制。

在我个人看来,花一点时间来设置版本控制前期投入的回报将是指数级的;没有版本控制,你可能会浪费数百小时尝试在多人之间传递代码,或者在代码出现问题且无法恢复之前有效版本时产生恐慌。一想到这些,我就不寒而栗。

依赖管理

对于需要候选人具备强大软件开发技能的机器学*角色,依赖管理可能是面试讨论的一个话题。在开发中,使用某种工具来实现可移植性是最佳实践,但在更细粒度的项目级别上,也是必要的。这可以简单地通过设置 Python 依赖管理来实现,比如PoetryPipenv

列表并不全面,但它显示了你可以牢记代码的可移植性,并与团队一起合作交付软件/机器学*解决方案。了解依赖管理的最佳实践与本章早期讨论的“Docker”部分相关,显示了候选人可以轻松融入与团队合作的协作软件开发工作流程。

代码审查

当你在工作中对生产代码进行更改时,通常会有一个审查过程,在这个过程中,其他团队成员可以给你反馈。你需要证明代码按预期工作,并且没有出现任何问题;测试是一个常见的方法来做到这一点。

那些刚入行或刚从学校毕业的人可能没有经历过代码审查流程。在面试中,这并不太重要,但行为面试可以测试候选人是否能够接受反馈。这是为了防止候选人加入团队后与代码审查产生摩擦;能够良好接受建设性反馈并不将其个人化的人更容易合作。本书不涵盖更多关于如何在代码审查中给予和接受反馈的方式,但我希望你能理解为什么一些面试问题旨在了解你在代码审查中可能的反应,这是 ML/软件工作流程中非常普遍的一部分。要了解更多信息,可以从 Chromium 文档的“尊重更改”页面和 Google 的“如何撰写代码审查评论”部分开始。

作为一个警示的例子,我见过有候选人在面试中对错误或误解作出非协作性和攻击性的反应。最*,我听说过一个候选人在无法很好地回答问题时,甚至发邮件进一步批评面试官并侮辱公司。如果一个候选人对一个标准化、良好进行的、专业的一小时面试都反应如此,那么他们如何对待代码审查呢?如果他们连一小时的互动都不能处理,那么与他们一起工作日复一日的同事会有什么感觉呢?这是一个不被雇佣的简单方式,毫无疑问。

测试

在许多编码团队中,为代码编写测试是一种最佳实践。在 Python 中,你可以使用像pytest和 unittest(PyUnit)这样的包。你了解哪一个并不是很重要;你可以在 Eric 的 Pytest 博客中看到详细的比较¹⁷。

在许多编码面试中,一个隐藏的要求是你必须为你的代码编写测试。即使在描述中没有包含这一点,也可能是这样。例如,我曾经在 HackerRank 或 CoderPad 上进行过现场编码面试,期望有测试,但这并没有在描述中提到,我还有一次回家编码练*,期望候选人主动添加测试。

提示

为了保险起见,在编码面试期间提到一些测试用例是很重要的。面试官通常期望你至少提到它;如果在面试过程中无法完全编码出来,他们会告诉你。如果是一项回家作业,我强烈建议你为此编写一些测试。

从面试官的角度来看,我也希望面试者要么询问是否应该添加测试,要么主动添加它们。一些遵循软件工程师面试路线的面试官甚至可能期望面试者使用测试驱动开发(TDD)¹⁸,尽管我发现这种情况较少。如果面试官期望特定的东西,比如 TDD,那么他们会在面试简报中提到。

以下是一些关于为 ML 工作流编写测试的资源:

其他技术面试组成部分

正如你在图 1-1 中看到的,还有其他类型的面试。通常,它们是更高级的组件,评估候选人在 ML、编码、训练和部署的各种组合上的能力(迄今为止在第 3、4 和 5 章中已涵盖的内容)。

你可能经常听到的其他类型包括:

  • 机器学*系统设计面试

  • 技术深度挖掘面试

  • 回家作业

  • 产品感觉

我将简要介绍每种面试类型,以便你了解如何为它们做准备。当我寻找我的入门级职位时,我个人并不需要为这些类型的面试做准备,因为机器学*理论和编码就足够了。然而,随着我晋升到高级和高级以上职位,我遇到了越来越多的高级面试。每家公司可能只会要求其中的一些,或者完全不要求,所以你在面试中遇到的情况可能会有所不同。例如,Meta 要求 MLE 候选人进行系统设计问题的答辩,而不仅仅是“高级”级别的候选人。

机器学*系统设计面试

ML 系统设计面试和问题要求你在通常是假设的情景中设计某事物。这可能包括要求你从头设计一个全新的系统,或者你如何假设地设计一个已知的系统。例如:

  • “假设你是电子商务公司 ML 团队的一员。它旨在利用 ML 提高客户保留率。请详细说明你的初始方法和如何实现这一目标。”

  • “你如何在 Google Maps 上引入基于 ML 的餐厅推荐?”

  • “我们公司正在开发的在线游戏使用强化学*来提升玩家体验。你如何设计这样一个系统?”

ML 系统设计问题通常是开放式的,面试官会就他们感兴趣的问题进行反复交流。ML 系统设计问题可能会因为以下几个原因而变得相当具有挑战性:

他们可能没有一个 100%正确的答案。

由于问题通常涉及假设的情景,问题本身也可能会在过程中发生变化。例如,我(作为候选人)可能会问面试官,“我们对这个 ML 系统预计会有多少日活跃用户?”在相同的问题下,面试官可能并没有定义场景的所有参数,并会即兴提出一个合理的数字。在机器学*系统设计中,你所做的很多事情仅仅是估算和粗略计算,并没有正确的工具可供选择(例如,对于某些情景,你可以使用 XGBoost 或 CatBoost)。

不同公司、团队和面试官之间的 ML 系统设计问题有很大的变化。

你的表现很大程度上不仅取决于你最初的设计,还取决于你如何应对可能朝任何方向发展的开放式问题。面试官可能会对你如何处理 ML 推断速度感到好奇,你可能会在这个话题上再花五分钟。或者,碰巧的话,他们可能会问到在训练模型之前如何确保数据质量高。像即兴表演一样处理,并且能够根据你与面试官之间的对话流动进行调整。

务必查看职位发布内容,了解应重点关注的方面。即使在系统设计问题要求你设计端到端 ML 项目的情况下,你也可以花更多时间专注于职位核心能力。如果你正在应聘数据科学家职位,负责训练和评估 ML 模型,那就详细阐述这一点,而不要过多涉及部署。不过,如果问题涉及端到端系统,也不要忽视 ML 系统的其他方面。如果你正在应聘注重部署的 MLE 职位,花更多时间在此方面,而不要陷入关于数据工程的兔子洞。如有疑问,询问面试官是否专注在正确的方向,并询问是否希望在任何主题上深入讨论。

根据面试官的不同,他们可能对所需答案有不同的想法。一些面试官希望你从数据和具体特征开始谈起,例如它们是否连续或分类等。其他一些面试官可能不会过多关注这些细节。作为面试者,与面试官确认他们期望的详细程度至关重要。

Serena McDonnell,前 Shopify 首席数据科学家

我在这里不会提供更多例子,因为它们将建立在并结合我们已经讨论过的 ML 算法、ML 评估、ML 部署和编码面试信息的基础上。对于入门级角色,如果存在系统设计问题,它们将专注于在前几章中已涵盖的技能。最高级别的系统设计问题主要保留给更高级别和高级职位。

欲深入了解此主题,我推荐以下资源:

在 Meta 的面试准备指南中,你会看到反复提到期望候选人对他们提出的 ML 设计的潜在风险和缓解方法。这是所有 ML 面试中思考的有用模式,也是一个更有效和深思熟虑的 ML 从业者的标志。改善你对可能风险的讨论的一个有用和重要的方法是阅读关于 AI 偏见的文章,因为它们是风险的重要组成部分。来自 Timnit Gebru 和 Joy Buolamwini 的研究是良好的资源;例如,他们调查了ML 算法在性别和种族(通过皮肤类型)上的准确性差异。Meta 自己在 AI 公平和透明度方面的博客中也提到了各种风险和缓解措施。Meta 的努力包括创建更多数据集,以“帮助研究人员评估他们的计算机视觉和音频模型在不同年龄、性别、肤色和环境光照条件下的准确性”。

技术深度挖掘面试

技术深度挖掘问题允许你逐步讲解你过去从零开始设计和构建的东西,讨论你遇到的折衷和挑战,以及你是如何解决它们的。我经常看到这种类型的问题被归类为与过去项目相关的行为问题;例如,Shopify 在其技术面试环节中非常强调技术深度挖掘

注意

有许多公司进行这种类型的面试,我听过它被称为许多名字:案例研究面试(与咨询类型的案例研究不同),反向系统设计,回顾性系统设计等等。我借用 Shopify 的术语技术深度挖掘来指代这种类型的面试和本书中的面试问题。

根据面试阶段和面试官的不同,回答这类问题可能需要比通常的行为面试更深入的技术解释和深度挖掘,具有系统设计的深度和交互。然而,它与通常的系统设计问题有所不同,因为在线上有大量的准备材料,那些问题聚焦于假设情境,而不是你过去的工作或项目中实际构建的东西。个人经历来说,我越来越多地收到类似技术深度挖掘变种的问题。

在家练*的技巧

有时,公司会为候选人提供一项在家完成的练*或评估。这些可能会自动评分,候选人将被通过或失败。也有开放式的在家练*,其目标不是仅通过练*来判断候选人的通过与否,而是将其与面试讨论结合起来,候选人通过解释其解决方案来进行讨论。

前几章关于 ML 算法和编码的技巧仍然适用:

  • 确保你不仅能解释算法,还能解释权衡以及为什么和如何决定你的方法。

  • 在面试中通过代码中的文档字符串和口头表达清楚你的思维过程。

  • 编写测试!

产品感知

在数据科学和机器学*面试中,特别是在大型科技公司,一个隐藏的要求是候选人具备一定的“产品感知”。这是一些公司用来描述一个求职者是否具备关于如何使机器学*对公司产品有益的实际知识的统称。

当谈论机器学*产品以及研究公司的产品时,可以展示这一点。理解机器学*的常见产品目标非常重要,比如:

  • 提高用户便利性

  • 减少用户流失率

  • 改善入职体验

现在这种情况越来越为人所知;如果你在搜索引擎上查找“数据科学产品感知”,会显示一些指南。然而,很多候选人除非招聘人员或招聘过程中明确提到,否则不会考虑为此做准备。作为一个机器学*候选人,你可以将产品感知融入到你的行为面试、系统设计面试、技术深入分析等中。你的准备方式是借鉴产品经理面试的方式。

提示

从面试官的角度来看,我这样想。候选人是否只关心模型准确度指标,还是也关心产品的月均活跃用户?他们是否将他们正在构建的机器学*与产品联系起来?

不要低估这一点——当我刚开始进入机器学*领域时,更有经验的人和成功的同行建议我更多地了解和理解业务方面。这是导师对我的职业生涯有益的一种方式:有许多信息在问题库类型的面试指南中没有被分享。反过来,我在这本书中尽可能包含了尽可能多的潜在信息。

这里有一些入门资源:

MLOps 的样例面试问题

这里列举了一些我用来面试从事基础设施工作的 MLOps 工程师和 MLE 的面试问题。这些面试问题包括示例答案,旨在为你的潜在回答提供灵感。我想指出,这些问题主要是询问你的经验;很可能,MLOps 工程师和 MLE 会与其他角色分享核心的编码面试循环(第五章),然后简历详细讨论和技术深度挖掘问题中将包括类似我提供的这些问题。如我在第五章中提到的,那些更专注于运营的角色可能也会有更专业的编码问题,类似于对 DevOps 工程师提出的问题。为了不重复太多,最好你在可能的情况下,仔细检查职位发布和与招聘人员及招聘经理沟通,了解面试的重点和期望。

对于本章,特别需要注意的是,你的答案会因个人经验而异;这些答案只是高层次、相对通用的示例,展示了一个答案可能的样子。请勿在面试中将其作为真正的答案,除非你已经完成了示例答案中提到的任务/项目。

面试问题 6-1:你能详细描述一个你如何提升机器学*基础设施可扩展性的例子吗?

示例回答

使用 Kubernetes 的扩展帮助了;例如,水平扩展有助于将相同的工作负载分布到更多实例中。在请求量大时,我使用负载平衡与 Google Kubernetes Engine。在过去,我在与 GCP 合作时使用过云平台的自动扩展功能。

面试问题 6-2:你如何处理生产环境中机器学*模型的监控和性能跟踪?

示例回答

对于机器学*,我了解到,在生产环境中监控机器学*应用程序与监控非机器学*应用程序之间的不同之处在于数据和与模型相关的监控。这包括数据漂移、模型准确性和漂移等的监控。为此,我使用诸如 Great Expectations 或 Alibi Detect 的工具。特别是,在我之前的公司,我们使用 Great Expectations 来检查突然出现的大量缺失值或分布变化。

此外,使用这些监控工具,我可以创建警报并在这些平台上定期进行异常检测任务,以报告错误或漂移。在服务可用性方面(更一般,不太与 ML 相关),常用的工具如 Grafana、ELK Stack(Elasticsearch、Logstash 和 Kibana,也称为 Elastic Stack)和 Prometheus。

面试问题 6-3:你曾经构建过什么样的机器学*模型的持续集成/持续交付(CI/CD)流水线,具体是怎么实现的?

示例回答

我首先自动化了 ML 管道中涉及的步骤,如整理数据预处理、模型训练和评估的脚本。然后,我将这些步骤集成到一个 CI/CD 管道中,使用Jenkins触发代码库 GitHub 上的代码更改时运行管道。该管道包括环境搭建、代码检查和测试,随后自动将模型部署到一个用于进一步测试的演示环境。在验证成功后,模型将复制到生产环境。这些步骤自动化了部署过程,节省了手动部署时间,同时也允许质量控制。

摘要

在本章中,我演示了 ML 角色在其运营和基础设施经验方面可能会接受的面试。接下来,我讨论了端到端机器学*的几个级别和示例,这些因数据团队的规模和成熟度而异。

你还阅读了不同类型的云环境、私有云和公有云之间的权衡以及 ML 模型部署和编排的常见工具。接着,我讨论了模型部署后的一些监控设置。我简要概述了流行的云服务提供商,指出大多数云提供商都有类似的工具集,如果你使用本书未提及的供应商,可能仍然会找到相应的服务(只是名称可能不同)。

我提出了一些开发者的最佳实践,这些实践对运维和软件开发密集型角色至关重要。很多这些内容会随着工作经验自然而然地学会,但对于有学校或者 bootcamp 经验的人来说,你仍然可以通过团队项目或开源贡献来展示这些技能。

最后,我介绍了 ML 角色的其他类型面试,例如系统设计、技术深度挖掘和产品意识。在下一章中,我们将继续讨论行为面试以及如何在面试中取得成功。

¹ Chip Huyen,《为什么数据科学家不需要了解 Kubernetes》,博客,2021 年 9 月 13 日,https://oreil.ly/6c35m

² Eugene Yan,《不受欢迎的观点:数据科学家应该更加端到端》,博客,2020 年 8 月,https://oreil.ly/iUnlj

³ 想了解更多康威定律的内容,请参考“康威定律”,维基百科,更新时间为 2023 年 10 月 2 日,https://oreil.ly/wJIN7

⁴ 对于这个例子,你也不需要知道它们是如何工作的。本章稍后我将概述 Docker 和 Kubernetes,所以不用担心。

⁵ “选择适合工作负载的正确云——公有云、私有云和混合云的区别”,Amazon Web Services,访问时间为 2023 年 10 月 24 日,https://oreil.ly/KX5FE

⁶ Tytus Kurek, “什么是云重返?” Ubuntu (博客), 2023 年 3 月 17 日, https://oreil.ly/2qcrO.

⁷ 从技术堆栈和用例的确切情况来看,从最简单到最复杂的顺序可能有所不同,但让我们只按照这个列表的顺序来进行说明。

⁸ “将 Python 环境容器化,” Docker 文档, 访问于 2023 年 10 月 24 日, https://oreil.ly/fwWoP.

⁹ “Docker 概述,” Docker 文档, 访问于 2023 年 10 月 24 日, https://oreil.ly/JsMan.

¹⁰ “政策,” Kubernetes 文档, 更新于 2023 年 5 月 29 日, https://oreil.ly/P37UZ.

¹¹ 将源代码文件转换为独立软件工件(通常称为软件构建或简称构建)。

¹² “量化,” Hugging Face, 访问于 2023 年 10 月 24 日, https://oreil.ly/L-RAZ.

¹³ “宣布 Cloud Run,我们无服务器堆栈的最新成员,” Google Cloud (博客), 2019 年 4 月 9 日, https://oreil.ly/f5hTc.

¹⁴ Craig Wiley, “Google Cloud 推出 Vertex AI,一站式 ML 工具平台,” Google Cloud (博客), 2021 年 5 月 18 日, https://oreil.ly/hfL1h.

¹⁵ 关于免费和付费课程的概述,请参阅“云角色—技能构建者,” AWS 培训与认证, 访问于 2023 年 10 月 24 日, https://oreil.ly/f9jH-.

¹⁶ “gittutorial—Git 的入门教程,” Git, 访问于 2023 年 10 月 24 日, https://oreil.ly/C7KCS.

¹⁷ Eric Sales De Andrade, “Pytest vs Unittest(对两个最流行的 Python 测试框架的诚实评价),” Pytest with Eric (博客), 更新于 2023 年 10 月 24 日, https://oreil.ly/rYCOR.

¹⁸ “测试驱动开发,” Wikipedia, 更新于 2023 年 8 月 27 日, https://oreil.ly/i5tPU.

¹⁹ Joy Buolamwini 和 Timnit Gebru, “性别色调:商业性别分类中的交叉准确性差异,” 公平性、问责性和透明度第一次会议论文集 81 (2018), 77–91, https://oreil.ly/spsb7.

²⁰ “Meta 在 AI 公平性和透明度方面的进展与学*,” Meta (博客), 2023 年 1 月 11 日, https://oreil.ly/AOwku.

²¹ Ashley Sawatsky,“Shopify 的技术面试流程:期望及如何准备”,Shopify Engineering(博客),2022 年 7 月 7 日,https://oreil.ly/QaUfA

OceanofPDF.com

第七章:行为面试

面试的目标是评估候选人是否适合特定角色,这包括他们是否能够与团队良好合作。无论候选人在技术技能上有多么出色,如果他们不能与同事良好合作来完成项目,他们就无法交付项目。面试通过多种方式来识别优秀候选人,其中他们的机器学*/编码能力很重要,但并非面试官寻找的全部内容。本章重点介绍设计用于评估您在团队中适应性的面试问题。

换句话说:技术技能有最低要求,候选人至少需要足够的技能来通过技术面试。在这里设定标准,以确保聘用公司对候选人在技术层面能够胜任工作有信心。即使是通过了这一标准的候选人之间仍然存在差异;例如,一些候选人可能需要花费稍多一点时间来适应,但如果雇主期望他们至少能留下一年或更长时间,他们的编程技能的轻微差异在长期内不会造成很大影响。

那么,是什么让所有在技术面试中表现良好的候选人有所区别呢?面试官依赖于额外的措施,例如候选人的沟通能力如何,他们与同事合作的能力如何,他们是否能够良好接受反馈,他们是否具有成长思维等等。例如,一个具有过硬技术技能并达到要求的候选人,如果再加上强大的沟通能力,最终表现可能会比技术技能非常强但难以合作的候选人更好。

行为面试通常是整体面试的最重要组成部分。根据我的经验,大多数决定性因素是因为候选人的价值观和过去行为与公司或团队的原则不符合——相对于技术或软技能,这通常有更高的要求。

亚马逊高级应用科学家 Eugene Yan

一般来说,只要你有自我意识并在沟通方式上使用常识,你的面试评估不会受到影响。我的观点是:候选人在面试中失败的一个简单方式是表现出他们很难共事。招聘团队知道那些自大、缺乏自我意识等特质的人很可能对团队造成负面影响,因此不会是一个好的招聘选择。

行为面试问题与回答

为了衡量面试技术部分未涵盖的所有因素,面试官使用行为问题。行为问题可以在专门的行为面试会话中提出,尽管它们也可以在技术面试中穿插进行。术语“行为问题”和“行为面试”在不同地区或不同行业可能有所不同。通常,这种类型的面试会关注所谓的软技能

提示

理解这些软技能对于你在机器学*项目中的技术贡献至关重要,除非你像经营一人创业公司一样。

这里有一些关于行为面试和问题测量的例子:

  • 沟通技巧

  • 协作和团队合作

  • 领导技能

  • 解决冲突的能力

  • 候选人如何对待反馈

  • 候选人如何应对不确定性和学*新技术/工具

  • 候选人是否意识到他们的技术工作如何为团队构建的业务/产品做出贡献——有时被称为产品感

这些问题可能会以以下格式出现:

  • “告诉我一个你处理过的冲突情况的例子。”例如,“告诉我一个你在某个机器学*项目中如何应对冲突的例子。”

  • “描述你曾面对过紧迫截止日期并如何应对的情况。”

  • “举一个你曾经为一个机器学*项目做的成功演示的例子,并描述你的准备过程。”

目标是根据你描述过去类似情况下的反应来衡量你作为同事的表现。请注意,行为问题通常是关于你真实的过去经历;不要将其与假设情境混淆,比如,“如果你在团队中遇到冲突的情景,你会怎么做?”

因此,重视行为面试准备作为你机器学*面试准备的关键部分是很重要的。你应该从列举你过去的项目、工作经验和其他相关经历开始。

使用 STAR 方法回答行为问题

在机器学*面试中,以及技术面试中,一种广为人知的结构化回答技巧是 STAR 方法。¹ 有了这种结构,确保你为面试官提供足够的背景信息,包括描述你过去经历的情境及你的行动带来的影响。STAR 方法在表 7-1 中有详细介绍。

表 7-1. STAR 方法

情境 提供你的例子发生的情境背景。
任务 解释你在例子中负责的任务是什么。
行动 解释你在例子中成功应对情况所采取的步骤和行动。
结果 解释你的行动导致的结果和成果。

这里是一个例子问题和答案,答案遵循了 STAR 方法:

问题

“告诉我一个你在项目中遇到严重障碍的时间。你是如何克服它们的?”(业务术语表示导致进展受阻的情况)

回答

[情境] 我正在参与 Y 项目,即为公司的购物网站创建推荐系统。

[任务] 我负责训练机器学*模型,为公司的购物网站用户生成推荐。

[行动] 我与数据工程师合作,获取所需数据,并开始使用 XGBoost 训练基准模型。在这个过程中,我发现了对模型有益的新数据来源,最终迭代出了两种模型:一种在新用户上表现更好,另一种适用于现有用户。

[结果] 模型在线运行,并与在线实验中的对照组进行比较。最终,ML 驱动的方法比基准对照组提高了 2 倍的参与度指标。

这个答案做得很好的地方如下:

  • 避免使用过多行话。

  • 它提到了相比对照组 ML 模型的提升(改进)。

作为面试官,我觉得关于购物网站的更多细节可能会更好,但在实际情况中,可能上下文信息已经在早期问题中涵盖,面试者已经描述了他们在这个项目中的责任。此外,作为面试官,我会就我想了解更多的问题进行后续提问,比如“你训练的两种模型是什么?”

用英雄之旅法增强你的答案

有时候,仅仅使用 STAR 方法是不够的,特别是当候选人机械地按模板回答面试问题时,答案会显得枯燥和不容易记住。我建议使用英雄之旅法来增强用 STAR 方法构建的答案。目标是进一步描述你克服的挑战和为成功付出的巨大努力,从而使你的答案更具影响力。²

英雄之旅,或称为单一神话模式,是一种常见的故事模板,涉及一个英雄踏上冒险之旅,经历各种试炼和磨难。最终,他们凯旋而归,经历了变化或转变。一些主流媒体中的例子包括《狮子王》、《饥饿游戏》和《星球大战》。当你想起这些电影时,你最记得角色经历的是故事和他们克服的挑战,而不是初期设定世界和背景的场景,或者英雄返回后的几个场景庆祝的部分。

电影的结构通常是这样安排的:可能会用 15–20%的场景来设定背景,60–70%的时间用于描绘旅程和挑战,最后 10–15%的时间则用于振奋人心的结局。

当然,这种结构因故事而异。我想强调的主要观点是大部分时间都花在了旅程和挑战上。这就是为什么我建议在 STAR 方法之上采用这种结构。一个展示这种格式的引人入胜的故事,正如图 7-1 所示,将强调在冒险过程中遇到的挑战的描述,以及最初的催化剂和结果。

行为面试问题的英雄之旅

图 7-1. 行为面试问题的英雄之旅。

现在,我将演示一个答案的例子,尽管遵循了 STAR 框架,但并不令人难忘或有影响力。回想一下前一节中的示例面试问题:“告诉我你在项目中遇到了困难的时候,你是如何克服的?”

我使用了仅基于 STAR 方法的示例答案;这里是如何通过英雄之旅使这个答案更加出色的示例:

[情境]

我正在进行 Y 项目的工作,这是为我们公司的购物网站创建一个推荐系统。

[任务]

我负责训练机器学*模型,为购物网站的用户生成推荐。

[行动]

我与数据工程部门合作,获取所需的数据,并开始使用 XGBoost 训练基线模型。

[英雄之旅,重点在挑战上]

在训练 XGBoost 模型时,出现了一个问题:整体表现并不理想。我分析了结果,找出了进一步调查的步骤;数据源的质量是正确的,因此我排除了数据质量问题。数据集包含匿名化的客户特征,例如他们最后一次访问购物网站的时间和最后一次购买的价值。然而,由于这些数据中并没有进一步的客户行为细节,模型无法捕捉到更多的细微差别。我向我的经理和团队的高级开发人员建议,我需要更多关于客户行为的遥测数据。在整合新数据之后,还有很长的路要走。新模型在新客户身上表现良好,但在现有客户身上表现不佳。因此,我将数据分开,并根据他们的账户年龄为每种用户类型分别使用两个模型,以达到最佳的整体表现。

[结果]

当我将模型训练的详细结果呈现给团队的各位高级成员以及产品团队后,这些模型被批准在线运行。它们在在线实验中与控制组进行了比较。最终,基于机器学*的方法相比基线控制组获得了 2 倍的参与度提升。

面试官的最佳实践和反馈

以下是作为面试官对示例答案的一些评论,这也是一般的最佳实践:

描述你克服的挑战有助于建立面试官对你作为面试者的信心。

作为面试官,这个答案将英雄的旅程方法添加到 STAR 框架上,比第一个示例答案更详细地描述了面试者在开发机器学*模型时面临的挑战。为什么这对面试官很重要?这种类型的答案能更好地展示你是一个能够自我解救(甚至你的团队)的雇员,如果你描述了过去遇到的困难的深度(具有挑战性的情况),面试官可以更有信心,如果你加入他们的公司,你可以做同样的事情。

挑战留下了更深刻的印象。

此外,作为面试官,当我听到并理解候选人遇到的困难的程度时,我能更好地记住它们。这也是向同事轻松解释为什么我支持这位候选人,而不是那些一切都顺利的候选人的一种简单方式。那些没有详细描述他们所面临挑战的面试者,可能实际上解决了比那些详细描述的面试者更困难的问题,但是(1)我不会知道,因此(2)留下的印象更少,我很难在候选人审查调查期间向同事描述它。

解释互动和合作,适时给予功绩。

这个答案不仅更清晰地描绘了情况和挑战,还提到了受访者的队友。面试官可能会对受访者是否具有跨团队沟通的能力感到好奇,或者至少是否与他们的经理或直属同事进行了沟通。由于面试的时间限制,面试官可能没有时间明确询问团队的范围。在最坏的情况下,面试官可能会对受访者没有提及任何合作者感到怀疑,因为面试者声称不是他们自己的工作的模式。

解释面试官可能不了解的上下文和任何具体术语。

一个常见的错误我见过求职者犯的是太快进入问题而不解释背景。当与同一家公司工作的人交谈时,期望你的同事具有一定的熟悉度是合理的,你通常可以跳过解释一个词的含义。但通常情况下在面试中,你可能正在与另一家公司的人交谈。不要说,“我在为 MyShopping 的 ML 模型工作”,而是说,“我在为 MyShopping 的 ML 模型工作,这是顾客可以用来浏览店面页面并支付购买的移动应用程序。”对于没有工作经验但描述学校项目的面试者,要注意不要使用学校术语而不解释它们。例如,在多伦多大学,计算机科学课程标记为 CSC,如 CSC 110Y1,但在滑铁卢大学,它们标记为 CS,如 CS 115。即使你认为面试官应该很容易理解你指的是什么,也要向他们解释任何缩写。

提供对面试官熟悉的可比较技术以解释术语。

不要假设每个人都记得技术的名称及其功能。例如,当提到 Trino 时,您也可以提到它在被重新品牌之前称为 Presto。或者,如果您正在解释过去项目中如何使用 Airflow,可以提到 Airflow 是一个用于创建和管理数据工作流的平台。此外,您还可以提到它与 MLflow 或 Dagster 有些相似之处等等。如果您知道正在面试的公司使用某种工具或技术,并且您使用该技术来解释您如何使用您的工具,那就更好了,例如,“我正在使用 Airflow,类似于您们提到使用 MLflow 的方式,这是…”根据我的经验,这与面试官的联系非常好,他们知道我在听取我们的讨论并且我在通话中与招聘人员问了信息丰富的问题。

根据听众调整详细程度。

能够以不同详细程度解释技术和非技术概念是很重要的。在一些面试中,尤其是现场最后一轮,你可能会与利益相关者如你将要合作的产品经理或者 ML 团队紧密合作的组织的负责人进行一到两个面试。在我的 ML 工作面试经验中,我遇到过这样的场景,通常每个面试会话持续一个小时。对于与产品导向人士的面试会话,我更加关注我的技术工作如何与产品相关或者如何影响业务,而不是深入探讨我为何选择某个 ML 评估指标的细节。延伸到这条规则的另一个方面,在与直接从事 ML 的面试官交谈时,仍需提供一些背景信息。例如,在我日常工作中对计算机视觉的经验不多,可能需要在计算机视觉领域的某些缩略语上得到提醒。如果你主要有强化学*的经验,但所面试的公司或团队并非专注于此,可能你的面试官需要更多关于强化学*的解释。

提示

在由 ML 专家进行的行为面试中,你仍然应提供背景信息。一个合理的方式是记住他们为另一家公司/团队工作,可能在另一个领域是 ML 专家。

如图 7-2 所示,重要的不仅是你掌握的知识量和技能如何,如果在面试中的沟通无法让面试官理解,那么他们就无法了解你所有的优势和你能为他们团队带来的全部价值。花时间梳理如何在行为面试中使用你的沟通作为一个桥梁,帮助面试官更好地理解你,这将带来非常高的回报。

面试中的沟通至关重要;如果你无法有效沟通,那么无论你的技能多么出色,也无法传达给面试官

图 7-2. 面试中的沟通至关重要;如果你无法有效沟通,那么无论你的技能多么出色,也无法传达给面试官。

常见的行为问题和建议

现在我已经介绍了如何构建你对行为面试问题的回答结构,让我们直接深入一些常见的问题。

有关沟通技能的问题

  1. 告诉我一个你不在同一团队的队友或同事理解一段代码或设计的时候,你是如何处理这种情况的?

    面试官的视角:一个需要考虑的问题是,候选人是否试图从除了他们自己团队同事的角度来解释问题,例如,通过提供更多的背景信息。

  2. 告诉我一个你需要向非技术干系人员呈现的时候,你是如何准备的,结果如何?

    面试官的视角:询问候选人如何准备给我作为面试官提供更好的了解,了解他们的价值观以及他们是否对可能存在的沟通障碍有所观察。此外,通过询问他们如何准备,可以让我了解他们如何填补感知的空白,以使演示成功。

  3. 描述一个你如何处理一个沮丧的队友或经理的时间。你是如何处理这种情况的?

    面试官的视角:候选人提到他们如何尝试解决冲突以及他们如何处理需要在中间见面的情况,这对我评估他们在紧张或高压环境中易于合作的程度也很有帮助。

关于协作和团队合作的问题

  1. 告诉我一个你犯了错误并且你是如何处理的时间。

    面试官的视角:对我来说了解候选人如何处理犯错的情况是很有用的。他们会不惜一切代价掩盖吗?他们是否通过让错误的后果积聚来使情况变得更糟?还是他们会承认情况并提出解决方案?当你回答这类问题时,试着向面试官传达你重视协作和沟通的态度。

  2. 当你在项目中进行一次艰难的对话时,有过什么经历?可以是与队友或你在指导的人之间。

    面试官的视角:当然,这个问题也涉及到沟通方面。从团队合作的角度来看,我认为了解候选人是否是那种愿意承担责任并找到让团队在这种困难对话和情况中更好地工作的方法是很有用的。

  3. 告诉我一个你领导过项目的时间。

    面试官的视角:这是一个自由形式的问题,答案可以涉及到高级职位的一些重要方面。对于初级人员来说,这是一个评估你作为领导者如何对待团队成员的好问题。

如何回应反馈的问题

  1. 告诉我一个你收到过重要反馈的时间。

  2. 对于给予和接受反馈,你最看重什么?请举例说明。

  3. 如果你能改变过去的任何决定,那会是什么,为什么?

处理挑战和学*新技能的问题

  1. 告诉我一个你如何应对高压情况,比如紧迫的截止日期,以及你是如何度过的时间。

  2. 告诉我一个你对工作或项目感到不满意的时间。你是如何改善情况的?回顾起来,有什么你会做得不同的地方吗?

  3. 在过去,你是否需要为一个项目学*一门新的编程语言(或其他新技能)?你是如何确保它有效的?通过一个例子详细说明。

面试官的角度:重要的是澄清时间框架以及你学到的如何对项目有所贡献。分享你用来解决困境的方法并且在需要帮助时寻求帮助可以加分。这些对技术工作者非常重要,不仅限于机器学*,因为学会如何解除阻塞(包括尝试现有解决方案后向他人寻求帮助)可以展示出积极主动的态度,避免项目延迟。

这不是一个明确的标准,但根据我的经验,最重要的不是成为“全知全能”的人,而是成为一个愿意接受“初学者心态”并且快速学*的人。这对于在机器学*及科技行业中长期发展至关重要,因为技术每年变化非常快。

关于公司的问题

  1. 您如何考虑自己的职业生涯,职位是否符合您的目标?

    面试官的角度:公司希望确保你的兴趣与职位相符。如果工作不吸引你,你可能更容易提前离职,这就是说,你有风险可能会流失。

  2. 你了解公司、产品或团队的一些知识吗?

    面试官的角度:在面试之前花 10 分钟浏览公司网站、产品列表和职位发布,作为面试准备的一部分,以便刷新记忆。

关于工作项目的问题

  1. 告诉我你曾经从零开始建立过什么。

  2. 您能否详细介绍一下您最自豪的项目?

    注意:这些问题可以是技术面试的一部分,但回答这些问题需要良好的行为面试结构。

  3. 您是否曾经使用数据来改进过流程或技术?

自由形式的问题

  1. 你在工作中最激动的是什么?

  2. 你在工作之外有什么爱好?

行为面试最佳实践

现在您已经看到一些示例问题,这里是回答行为面试问题时的最佳实践总结:

提示

我建议在准备面试答案时,查看示例问题和最佳实践,以确保您涵盖了您的基础。

确保在较长回答或解释过程中偶尔暂停。

不要无休止地啰嗦而不给面试官插话的机会。现在越来越多的面试是通过虚拟进行的,因此偶尔暂停以便面试官回应尤为重要。如果看不到面试官的身体语言,这有助于创造更自然的对话。

快速总结您对面试官问题的理解。

这可以帮助你确认自己是否正确理解了问题,并给面试官纠正任何误解的机会,以免在错误的方向上花费大量时间回答问题。总结你的理解只需几秒钟,但可以节省几分钟!此外,我发现这为我的大脑提供了几个思考的瞬间,而不是试图在问题被问出后立刻回答。当然,如果你发现自己确实时间不足,你可以跳过这一步。

当有疑问时,请与面试官澄清。

与前一点一样,这是为了确保当你对某事不确定时不会陷入兔子洞。我宁愿安全而不抱歉地问。有些人因为担心提问会让他们显得不确定或缺乏信心而避免提问,但我认为情况恰恰相反:不确认你是否仍在正确的轨道上,可能会给人一种你过于紧张以至于不敢提问的印象。一个简单的“我应该继续讨论我的模型训练方法,还是您希望我转向模型评估?”就足够了。

面试是沟通的过程。

在面试中,通用的沟通规则同样适用。不要无故粗鲁,不要贬低或忽视面试官,并保持专业。查看一个忽视面试官的例子,应该避免在图 7-3 中看到。

根据 Gergely Orosz 的推文引用(完整线索)

图 7-3. 根据 Gergely Orosz 的推文引用(完整线索)。

找到一种方法来利用你的过去经验,不管它是什么。

你可以找到一种方法将你过去的经验与你为何参加这次机器学*面试联系起来。有些人可能会认为提到他们非机器学*或非技术技能是在说谎,但我觉得在许多不同领域,可转移技能非常重要。

如果你没有相关工作经验,如何回答行为问题

如果你是学生

拥有一个自主的项目,而不仅仅是一切都交给你的东西,表明你是自主的。这需要额外的工作,但你可以通过定义自己的项目来获得自己的经验,比如一个提供机器学*预测的 Web 应用程序。你可以分解构建它所需的任务并执行它们。这些通常被称为副项目,不需要你支付数千美元或参加另一个在线课程或训练营。你可以利用这种经验来回答大量的技术和行为问题。

如果你在其他领域工作过

你肯定能够带来可转移的沟通和领导技能。如果你曾经管理过一个厨房,从事过服务行业工作或者做过收银员,那么你可能有一些令人难忘的故事,可以作为回答类似“告诉我你在工作中遇到困难情况的经历”的行为问题的答案。不要忽视你拥有的东西。

发挥创造力——创造自己的经验

曾经我和一位自学了大量 Python 技能的英语博士候选人进行了指导电话。他想知道如何正式展示自己的技能。我推荐了与我自己做过的相同的事情:找到一种方法将数据科学或 ML 融入到自主学*的学术任务中。作为英语项目的一部分,他们可以轻松地找到应用 NLP 技术的方式,将其应用于正式的学校项目。这相当于一举两得:既展示在 ML 简历上的一个伟大项目,又获得学术学分。

在我的例子中,在攻读硕士学位期间,我利用任何机会都在计量经济学作业中使用 Python,这是允许的(可以在 Stata、R 或其他工具中选择)。我不得不自行解决这个问题,因为大多数教材都是关于 Stata 或 R 的,我搜索了如何将这些程序的指令翻译成 Python。正如你所看到的,这不仅对回答技术问题有帮助,对于回答关于学*新技能和我遇到的挑战的行为问题也很有帮助。

高级+行为面试技巧

高级职位和更高级别(如员工或主管)的 ML 面试也将包括行为面试。在此处我将使用“高级+”来指代这些角色。回答这些问题的基本原则通常遵循本章的所有原则,但我想指出某些差异。

高级+面试将强调你是否能够与入门级聘用者区别开来,并且你必须在面试中证明这一点。高级 ML 贡献者将负责的示例包括:

  • 你能够独立完成项目,并带领团队一同完成吗?

  • 你能够在更困难的情况下找到答案并解决自己的问题吗?

  • 你能够通过开发者的杠杆效应使你的团队更加高效吗?⁴

  • 你能够指导初级队友吗?

  • 你理解你的组织与你公司正在建设的产品之间的关系,并能够利用这一点取得成功吗?

  • 你能够与其他团队良好合作,并且额外建立与利益相关者的信任吗?

要成功通过高级+角色的面试,你对面试问题的回答将与你为入门级角色准备的回答有所不同。例如,在入门级别,可能有人分配任务给你,如果你不理解构建 API 如何帮助产品的整体理念,那是可以的。但是在高级水平上,你的问题将要求更高的独立性标准,以及理解底层原因的能力(理解背后的原因),并且能够通过帮助每个人更加高效来成为团队的增值者。

对于员工和主要角色,你需要展示以上所有内容,但在更高的程度上。高级职位可能会与其直接团队及少数相邻团队合作,而员工以上职位需要与更大的组织和其他组织建立信任和关系。例如,员工以上的角色可能会与市场营销、财务、产品等部门共同合作,共同开发公司的主要产品。

大科技公司的具体准备示例

如果你在大科技公司面试,已知有一些准备方法。你需要额外努力确保你的答案合适,但这将是值得投入的努力。

知道每家公司都重视其价值观是非常必要的,因此需要量身定制你的行为面试问题。例如,我曾经费力确保我常用的一些领导行为面试问题也能涵盖亚马逊的“行动偏见”原则。

以下是一些示例。

亚马逊

亚马逊会告诉每一个机器学*/数据科学面试者要学*他们的亚马逊领导原则,并在面试中展示足够的这些价值观。

在撰写本文时,其中一些原则包括:

  • 客户痴迷

  • 拥有权利

  • 发明和简化

  • 学*并保持好奇心

  • 坚持最高标准

  • 构想宏伟的未来

  • 行动偏见

  • 获得信任

  • 有骨气;持异见并承诺

  • 交付结果

我建议查看亚马逊的官方页面获取最新的原则信息,因为有时会新增新原则。

这里有一些示例问题和相关原则:

坚持最高标准

告诉我,你曾经提升过团队/项目标准的时候。

学*并保持好奇心

告诉我,你因为好奇心而做出更好决策的经历。

拥有权利

告诉我,你在超越正常职责范围内做出更好决策的经历。

注意这些问题与其他地方提问的问题类似,但如果你在亚马逊面试,要映射到最接*的亚马逊领导原则,并确保在你的答案中涉及该原则。

我在亚马逊面试中的独特之处在于行为问题所占比例之大。这使得行为面试故事的准备工作变得更加紧张和有价值。领导原则非常重要,一旦你进入亚马逊,它们就更为重要。

Ammar,亚马逊的工程师

Meta/Facebook

Meta 有六大核心价值观。在撰写本文时,它们包括:

  • 迅速行动

  • 注重长期影响

  • 创造令人印象深刻的东西

  • 居住在未来

  • 直接并尊重你的同事

  • Meta、Metamates、我

要重申我之前提到的建议,你需要把这些原则融入到你的行为问题回答中:你不仅仅是列出它们。

Meta 在行为面试中有五个评估信号。它们是:

  • 解决冲突

  • 持续成长

  • 拥抱不确定性

  • 推动结果

  • 有效沟通

这些(五个信号)重点领域被选择,因为它们对在 Meta 的工作环境中茁壮成长至关重要。因此,在与 Meta 面试时,特别强调在这些领域表现出色。

Meta 的 MLE,Igor

通常情况下,我建议您查看 Meta 的官方页面,以获取关于其核心价值观和文化的最新信息。Meta 的一位招聘专员建议查看 Meta 职业资料(在邀请面试时可以创建资料)。Meta 职业资料推荐的公开资源包括:

Alphabet/Google

Google 以试图衡量其面试者的“Googleyness”而闻名⁵,并且有一个题为“我们所知道的十件真理”的关于页面帖子,列出了 Google 看重的几个重要价值观。

Googleyness 据说没有一个简单的定义,但这里有一个例子。Laszlo Block(Google 前人力资源主管,也是《工作规则》的作者Work Rules!)将“Googleyness”定义为:

喜欢享乐等特质(谁不喜欢),一定的智力谦逊(如果不能承认可能是错误的话很难学*),高度的责任感(我们想要拥有者,而不是员工),能够处理不明确情况的能力(我们不知道业务如何发展,而在 Google 内部航行需要处理许多不明确情况),以及你在生活中采取了一些勇敢或有趣的路径的证据。

其他资源包括《商业内幕》的一篇文章概述了 Google 在其员工中寻找的 13 种品质。此外,像逻辑思维能力、角色相关知识和经验以及领导力这样的特质在您的行为面试⁶中将非常重要。

他们关心“Googleyness”的原因是因为 Google 希望即使在开发者更年轻时也能保持很大的独立性。

Google 的工程师(审阅本章)

Netflix

Netflix 有其“文化宣言”。在“职位和文化”网站上列出了 Netflix 作为公司所重视的一些重要价值观。在撰写本文时,它们包括:

  • 受重视的行为(如勇气、沟通、包容等)

  • 诚实而富有成效的反馈

  • 梦幻团队

  • 自由和责任

  • 信息负责人

  • 意见不合而后决定

  • 代表性很重要

  • 艺术表达

要深入了解这些观点的每一点,我鼓励您查看Netflix 的官方网页,其中包括这些价值观的详细信息。

Netflix 的面试过程(技术和非技术)更依赖于团队,并且该过程也更加注重公司的价值观和文化适配。这就是为什么 Netflix 的文化宣言如此重要。理解 Netflix 运营方式的绝佳来源是书籍No Rules Rules

路易斯,Netflix 的 ML 工程师。

这只是一些例子的非尽头列表,但希望您可以看到如何为每个不同的公司做准备。无论公司大小,我建议您快速查看其招聘页面,看看是否列出了像这样的价值观;这些可能是面试官评估您的标准!

花时间研究这些信息也是“猜测”有保障问题的一种简单方法。例如,在 Elastic(Elasticsearch)中,这些值被称为源代码。在面试中,我们会询问候选人是否知道这一点,以及源代码中他们最喜欢的部分是什么。

提示

被另一家公司收购的公司可能会使用其新母公司的标准。例如,几年前我在 Twitch(被亚马逊收购)面试时,Twitch 建议我也看看亚马逊的领导原则,这也得到了我与的一名亚马逊员工的确认。请注意,这可能会因团队而异。如果有疑问,请向您的招聘专员咨询。

概要

在本章中,我讨论了各种结构化回答行为面试问题的方法,即 STAR 方法和英雄之旅。接下来,我们看了看各种行为面试问题的常见类别,并提供了每种问题的示例。然后,我们探讨了行为面试问题的各种最佳实践。最后,我们从亚马逊、Meta/Facebook、Alphabet/Google 和 Netflix 提供了一些大型科技公司的最佳实践示例。我还提出了一些关于如何调整您的行为面试答案以适应其他公司的建议。

¹ 您可以在“使用 STAR 方法进行下一次行为面试”中了解更多关于 STAR 方法的信息,麻省理工学院职业咨询和职业发展部门,于 2023 年 10 月 24 日访问,https://oreil.ly/wiO9h

² 我首次看到类似方法提及是在 Steve Huynh 的“A Life Engineered”发布的视频中。

³ “单一神话:英雄之旅”,伯克利 ORIAS,于 2023 年 10 月 24 日访问,https://oreil.ly/zjWAc

⁴ 要了解更多信息,请参阅我的博文,“从初级到高级开发者——用开发者影响力加倍效果”,2021 年 6 月 20 日,https://oreil.ly/TOgB4

⁵ 玛丽·迈森扎尔(Mary Meisenzahl),“谷歌在 2017 年对‘Googleyness’(新员工重视的关键价值观)进行了一项小而重要的改变”,Business Insider,2019 年 10 月 31 日,https://oreil.ly/HKQ3X.

⁶ “如何通过谷歌行为面试成功:一份指南”,Google Exponent(博客),于 2023 年 10 月 24 日访问,https://oreil.ly/kcsHf

OceanofPDF.com

第八章:把一切联系在一起:您的面试路线图

现在您已经完成了整个机器学*面试流程,是时候制定一个计划了。在第一章和第二章中,您了解了许多类型的机器学*工作,并对哪些可能更适合您进行了自我评估。基于此,您还了解了您预期擅长的技能。在随后的章节中,您了解了面试中常见的问题类型。有没有需要更多准备的类型?本书的目标是帮助您开始弥合差距,而不仅仅是读懂差距。

注意

要在面试中取得成功并获得工作,采取行动将有助于您,而不仅仅是考虑采取行动。

面试准备清单

按照此清单创建您的面试过程计划。回顾本书中的相关内容或过去的练*,帮助您完成清单:

  • 写下您有兴趣在工作中进行的 ML 生命周期的部分。请参考第一章中的图 1-5 来回顾 ML 生命周期的概述。

  • 写下所需角色的技能,并在第二章中进行自我评估。

  • 确定哪些类型的面试对该角色可能是相关的。查看第一章中面试流程的概述。

  • 确保简历整理得干净利落,列出与所选角色相关的要点。请参考第二章获取更多简历建议。

  • 写下您打算为面试做准备并开始申请的时间范围。例如:我打算为面试准备三个月,然后开始申请。

现在您已经准备好了这些组成部分,是时候制定您的路线图了。

面试路线图模板

表 8-1 包含一个示例路线图,您可以在创建自己的路线图时参考。尝试写下整体计划,但要知道这并非铁板一块。我建议每周调整您的计划。从您的目标时间框架内设定可实现的目标开始。例如,如果您想在一周内阅读一本九章的机器学*书籍,您需要每天完成 1.3 章节。将任务细分到章节或练*问题的级别可以帮助您一目了然地看到什么是可行的,什么是不可行的。在第一周结束时,如果每天 1.3 章节被证明不合理,您可以延长时间框架或每天花更多时间准备。如果您每天可以轻松地完成两章,您可以调整一些关于第二周阅读量的预测。

注意

在第五章中,您填写了一个编程准备路线图,我觉得很重要单独包含,因为编程面试的准备需要肌肉记忆和重复。本章的路线图侧重于整体面试流程,因此现在是时候添加任何其他与机器学*相关的学*和准备计划了。

表 8-1. 示例路线图;时间:课间/作业之间及晚上,每天两到三个小时

示例路线图
第 1 周:计划

| 阅读 ML 面试 | 阅读 ML 面试 | 阅读 ML 面试 | [因为任务到期

明天]^(a) | [因为任务到期今天] | 进行面试

准备

时间表^(b) | 进行面试准备

时间表 |

第 2 周:数据和 ML 问题

| 刷新 NumPy 和 pandas 知识 | 在 NumPy 上练*问题 | 在 NumPy 上练*问题 | [俱乐部活动] | 在 pandas 上练*问题 | 练*问题

在 pandas 上 | [与朋友烧烤] |

第 3 周:脑筋急转弯编程问题

| 3 个问题

滑动

窗口模式^(c) | 两个指针模式的 3 个问题 | [模式]的 3 个问题 | [因为任务到期

明天] | [因为任务到期

今天] | 数组和字符串操作问题(与前两类重叠) | 尝试 3 个问题并计时需要多长时间 |

第 4 周:从头学* SQL

| 观看 SQL 入门视频,跳过一些

他们 | 观看 SQL 入门视频 | 尝试 3 个问题,查看解决方案 | 尝试 3 个问题,查看

解决方案 | 尝试 2 个新问题,不看

解决方案 | [放松] | [放松] |

第 5 周:SQL 练*问题 + 脑筋急转弯,计时

| 练* 5 个 NumPy/pandas 问题,不看

解决方案 | 不看的情况下练* 4 个 LeetCode 问题的所有主要模式

解决方案 | 查看您先前卡住的问题的解决方案 | 练*尝试做

3 个 LeetCode 问题

1 小时不看

解决方案 | 不看的情况下练* 3 个 SQL 问题

解决方案 | 查看前一天 SQL 问题的解决方案

看看是否有

更好

解决它们的方法 | 赶上未完成的任务 |

^(a) 尽管我在这个准备日历中放置了这些任务,但这并不意味着你在这个日历之外没有作业、考试准备和社交活动。这个安排仅需每天两到三小时,如果你在这里列出学校或个人事务,那就意味着你仍然可以为紧急事务、作业或社交活动抽出时间,而不影响面试准备时间。^(b) 在本示例中,第 2 至第 4 周是在计划周的专门时间内填写的。^(c) 你可以选择两个简单难度的问题开始,再加一个中等难度的问题。你可以每个问题花 30 分钟到一小时;如果一个小时后仍卡住,就看答案吧。

使用表 8-2 中的模板来填写你自己的路线图。考虑到你其他的生活承诺和能量。每天你准备花费多少小时?(如果你需要比模板提供的时间更多的时间,只需添加更多行并创建你自己的版本。)

表 8-2. 面试准备路线图模板——填写你自己的!

路线图模板
第一周
星期一

|

第二周
星期一 星期二 星期三 星期四 星期五 星期六

|

第三周
星期一 星期二 星期三 星期四 星期五 星期六

|

第四周
星期一 星期二 星期三 星期四 星期五 星期六

|

高效的面试准备

自 2017 年以来,除了写关于机器学*和技术职业的文章外,我还写了关于高效时间管理和提高生产力的文章。这些都是生活中非常好的技能,它们让我能在更少的时间内取得更多成就。有了正确的时间管理技能,你可以花更多时间和爱人在一起、做家务、玩视频游戏,享受生活,同时实现你的职业目标。

面试准备也是如此。每个人都希望在相同或更少的时间内做更多事情。对于同一个机器学*岗位的竞争者来说,他们在面试准备中的自律、高效和有效将可能比那些没有这些特质的人更容易获得职位。

成为更好的学*者

以下是我用来在学*上取得卓越表现的主要技巧,我将在接下来的章节中详细讨论。这些技巧不仅有助于准备面试,还有助于快速适应新工作和快速晋升:

  • 尽快动手学*,快速学*。

  • 理解这个系统。

  • 不是时间框架的问题,而是单位时间内的进展。

  • 递归地寻找知识空白。

尽快动手

通过渗透学*是行不通的。仅仅是看无休止的 YouTube 视频或者阅读更多的 Reddit 帖子和书籍是不行的。我这么说是因为我以前做过。在做表面浏览和阅读的同时放松是可以的,但是如果你想要推动进展,就要尽快动手学*。编写一个小的神经网络代码。在不看解答的情况下做一道 LeetCode 题目。找出你不了解的东西并填补这个空白。反复实践。

当我准备 CFA 一级考试的时候,我在完成所有材料阅读之前做模拟考试。我只能答对 35%,但这帮助我迅速确定哪些材料需要更多阅读,哪些可以完全跳过。

理解这个系统

标准化考试不仅测试你对材料的了解程度,还测试你对考试本身系统和结构的了解程度。即使是母语为英语的人,如果完全没有准备,也会在雅思考试(国际英语语言测试系统)上手忙脚乱,因为他们被问题格式所搞得措手不及。如果你试图在不看课程大纲的情况下准备大学考试,你将处于严重劣势。事实上,在学校准备考试时,你可能也不会没有先查看大纲。面试也是如此。许多候选人没有详细记录面试官下一轮要问什么,也没有后续跟进。我尽量通过提出澄清问题来构建尽可能详细的图片:“当你说编程面试时,是一般的 Python,如 LeetCode 风格,还是专注于数据处理,比如 pandas?”

单位时间内的进展等于效率。

我提到过要在少量时间内做更多事情。这并不意味着我只花一周准备面试,而其他人需要两周。让我用一个比率来解释效率:目标达成进度 / 花费时间。

如果我花了五个小时,那五个小时最好能派上用场。 我不喜欢花十个小时做本可以在五个小时内完成的事情(尽管有时会发生)。 对于每天自己有非常有限时间的人,比如一个小时,提高效率更为重要。 不要将自己与有更多时间可用并且可以在一周内完成准备工作的人进行比较。 相反,用你每天的一个小时,专注于正确的事情,你可能能够在一个月内实现你的目标,而不是让时间膨胀到三个月。 将自己与自己比较,并专注于自己的时间可用性和自己的目标。 不要浪费时间,但尽可能提高效率。

逐步填补知识空白

当您阅读这本书时,您可能遇到了您并不完全理解的术语。 当您为新工作角色进行研究时,情况也是如此。 不要忽视这些术语,记下它们并学*它们的定义。 下次遇到这个术语时,您就不会再有同样的问题了!

这是一个逐步填补知识空白的例子,当遇到新术语或技术时,ChatGPT:

ChatGPT

GPT 模型:在阅读这些内容时,遇到了新术语变压器

Transformers:在此过程中阅读,了解了新术语编码器/解码器自注意力

  • 编码器/解码器:阅读了这些内容,大部分时候我都理解了

  • 自注意力:阅读注意力,似乎很有道理

目标是尽可能深入挖掘,直到它与您已有的知识联系起来或直到您获得这些知识。 这就是为什么基础知识很重要:您可以使用这些基础知识模块将知识与新概念连接起来,以获得更好的理解和知识保持。

时间管理和责任感

为面试做准备通常是一种在有限资源(时间、精力等)下优化结果的练*。 良好的时间管理可以帮助您在同样的时间内最大化产出。 责任感可以帮助您完成计划中的事情。 这里有一些关于时间管理的建议,我将在以下章节中详细讨论:

  • 阻挡时间专注。

  • 使用番茄工作法。

  • 避免燃尽。

  • 问问自己:你需要一个责任伙伴吗?

专注时间

我建议在日历上专门为面试准备安排时间,并保护该时间。 假设您在工作后的星期四晚上已经安排好准备时间——如果有朋友邀请您出去喝一杯啤酒,您应该可能要拒绝,但是您可以下次再碰面。 好吧,除非这是一年只能见一次的外地朋友——那么将星期四改到星期五;不要就这样忘了它!

我个人喜欢一小时或更长时间的时间块,理想情况下是两到三个小时,因为我的大脑需要 30 分钟来热身。关键是尽可能提前预定时间块。如果你试图在当天安排时间块,拖延的诱惑就会更容易让你放弃。

使用番茄工作法

以下是番茄工作法的工作原理:

  • 设置一个计时器(默认为 25 分钟)。

  • 在这段时间里,除了手头的任务外,不要做任何其他事情。不允许查看社交媒体,阅读无关的电子邮件等等。(可以查找与任务直接相关的术语或网站。)

  • 计时器结束后,休息一下(默认为五分钟)。

  • 重复上述步骤。

我喜欢设置计时器的原因是因为它增加了效率(单位时间的进展)。如果我花一个小时准备,我可能能完成两个练*题。如果我在玩手机或分心,我可能在一个小时内只能完成一个练*题!这会影响准备面试所需的时间量。显然,这可能会影响准备面试所需的时间量。

如果你还没有尝试过使用专注计时器(番茄钟),我强烈建议你试试,这将极大地提高你的效率。如果你更喜欢顺其自然,而且你已经尝试过使用计时器但没效果,那么就按照适合你的方式来吧。

你需要一个责任伙伴吗?

在许多情况下,即使他们不是和你一起准备面试,与他人分享你的进展也是值得的。我发现,在我上学时,当我的同龄人在努力准备面试时,我也很容易变得更努力,即使我们并不是为同一家公司面试。如果你是独自准备,孤立无援可能会更难保持动力。在这种情况下,这里有三个选择:

  • 尽可能跟踪路线图上的所有内容,并成为自己的责任伙伴。

  • 告诉一个朋友或家人你的进展情况。除非你希望他们了解得更详细,否则他们并不需要知道太多。

  • 在你的社区(例如校友群体)在线参加学*小组。

  • 如果你雇了职业教练,他们可以帮助你保持责任感。

我个人通过成为自己的责任伙伴取得了很好的效果。看到我的路线图和日历的可视化,并填充它感觉很棒。我也喜欢玩视频游戏,也许是因为能看到进度的某些方面对我来说非常满足。不利之处是,因为只有我知道我的进展情况,我可能会开始拖延并不断调整我的时间表:一个星期变成两个星期,变成三个星期……因为没有人知道。

如果要告诉别人你的进展情况,最好找身边的人更新一下。这里有一个例子可以发给朋友:“我一直在为面试做准备。我每周发一条关于此的简短信息给你可以吗?你不必详细回复。我只是想有点责任感。” 我的朋友们都觉得可以。一周结束时,我可能会给他们发消息:“这周我做得不错。我完成了计划做的两章和 10 个问题。不过,我目标还差三个问题,下周会补上。”

你可以尝试不同的方法,看看哪种对你有效。就像在家里或健身房锻炼一样,这对每个人来说是不同的,你会有自己的策略来安排你的准备训练。

避免疲劳:代价高昂

番茄工作法之所以安排了休息时间是个天才之举。这不仅仅是时间管理,也是能量/注意力管理。你有没有那种情况,花了几个小时解一个数学题,但是卡住了?然后你去洗手间或出去走了走,回来时神奇地找到解法?我在练* LeetCode 问题时经常遇到这种情况。我会出去散散步,清醒一下头脑,然后回来重新攻克问题。更好的方法是,干脆收工去睡觉。我在读研究生时,我称之为“睡眠技术”。

通过休息进行持续练*是避免疲劳的最佳方法。极端的例子是,如果让自己疲劳过度,可能会失去数周甚至数月的动力。我以前有过这种经历,几次如此,情况并不好;因为我当时年轻时把自己工作到疲劳的边缘,导致我的目标受到了一段时间的影响。恢复起来花了几个月的时间。我们的身体不是机器,大脑长时间使用后会感到疲倦。照顾好自己,如果可以的话,避免过度工作。虽然像我这样的人,可能直到达到极限才意识到,但这也没关系。只要记住这一点!

冒名顶替综合症

你可能听说过这句格言:“职位发布是愿望清单,而不是要求清单。”¹ 如果你通常对只符合 60%资格的工作申请有犹豫,我鼓励你试试申请其中一些。你可能会得到比预期更好的结果!如果你对符合大部分资格的工作感到犹豫,只申请你超格的工作,那就退一步,考虑一下这是否与冒名顶替综合症有关。记住,在资源充足的公司(即中型及以上公司),职位越初级,团队对于花时间培训和指导你的期望也就越高。

我也曾经历过严重的冒名顶替综合症,² 觉得自己实际上不够资格去做工作(即使是我当前在做的工作)。我学到的一件事是放大视角,看看整体局势。我在将自己与使我感到不够格的更广泛人群比较时,真的是在比较自己应该比较的更广泛的人群吗?如果我被所有看起来比我聪明的同行包围,也许这是一件好事而不是坏事(这是我在一所高度竞争的硕士课程中经历过的现象)。

我建议阅读 Eugene Yan 在同一主题上的博客文章,以获取识别和管理冒名顶替综合症的技巧。³ 这不是一件会自动消失的事情;也许它永远不会完全消失,因为随着您在职业生涯中的晋升,总有新的东西需要学*(以及感觉自己像个冒名顶替者的!)。

简而言之:

  • 您可能正在将自己与经验更丰富的更广泛人群进行比较,从而觉得自己不够好。停止这样与他人比较,或者将其视为一件好事。

  • 写下自己的成就列表,并经常反思。您还可以在日记或炫耀文档中更新和跟踪这个列表。⁴

摘要

在本章中,您看到了自己面试准备的摘要清单和路线图。您还了解到了如何高效学*、更好地管理时间以及避免疲劳。最后,我描述了在机器学*职业中可能出现的冒名顶替综合症及其识别和管理方法。

¹ Alison Green,“招聘岗位的要求更像是愿望清单还是严格要求?” Ask a Manager(博客),2016 年 2 月 18 日,https://oreil.ly/i5osl

² 请参阅我的博客文章“我的冒名顶替综合症故事和我所学到的经验”,2021 年 4 月 18 日,https://oreil.ly/Ifblb

³ Eugene Yan,“如何与长期冒名顶替综合症共存”,Susan Shu Chang(博客),2021 年 4 月 11 日,https://oreil.ly/3xJVp

⁴ Julia Evans,“让您的工作得到认可:写一份炫耀文档”(博客),访问于 2023 年 10 月 24 日,https://oreil.ly/AMCS1

OceanofPDF.com

第九章:面试后和后续步骤

既然你已经读到了本书的这一部分,我希望你能将所学应用于你的求职过程中!这可能是一个坚持的游戏:在申请我过去的角色之一时,我申请了大约 70 个职位,并得到了 10 次招聘者面试和两次最终轮面试,最终得到了一个 offer。面试历时数月,期间我不断遇到新的情况和问题。

在你的面试旅程中,你可能会遇到相同的问题。假设你已经参加了一些面试,现在急切地等待他们的回应。在这个阶段你该怎么做? 当然,理想的结果是你可以顺利进入下一个阶段,但从统计数据来看,有时你会听到不幸的消息,即招聘团队已经选择了其他候选人。在这种情况下你该怎么做?

在本章中,我将从面试后到 offer 阶段走一遍最后的步骤,涵盖我从求职者那里得到的常见问题。我将介绍一些我个人和许多求职者都遇到过的情景,并分享如何达到最佳结果的建议。我还会介绍一些关于你在新的 ML 工作的头 30/60/90 天的建议,以确保你和你的 ML 职业成功!

面试后的步骤

面试后,我通常只想放松一下,忘记它。但这里有一些行动我试图(大多数情况下)在每次面试后做的,以优化我的求职过程。老实说,有时候我并不完全完成每一个步骤,但我知道如果我大多数时候这样做,那将增加我在面试中提高的机会,从而获得那份工作!

记录你从面试中记得的内容

我喜欢记录我记得的问题和我大致如何回答。这帮助我看到被问到的问题类型以及是否存在常见模式。你可以通过 Google 资源如 Reddit 或 Glassdoor 来双重检查这些问题,看看它们是否与其他候选人被问到的相符,有时其他求职者会分享他们的答案。

我发现一些公司有非常固定的面试流程,常常会重复使用问题。但对于那些进行更多对话式面试或提供带回家作业的公司来说,这将更难以判断。无论哪种情况,如果你在面试后能看到如何改善你的答案,那么当你下次遇到相同或类似的问题时,你将表现得更好。忽略这一步很容易,但如果下一个面试官问了一个类似的问题,你又答得不好(再次),导致你面试失败,你会非常后悔吧?

确保你没有错过重要信息

向招聘人员或招聘团队询问下一步是什么,以及应该何时期望听到回复。有时,答案是他们不知道需要多长时间,但这也是有效的。只要确保您在面试过程中、后续电子邮件或与招聘人员或招聘团队的通话中询问即可。

是否应该给面试官发送感谢邮件?

我经常被问到这个问题,当我开始我的第一份工作时,我也问过一个朋友/导师是否应该这样做。作为现在已经进行了许多机器学*面试的面试官,我可以说这实际上并没有太大差别。当然,一个简单而随意的笔记很好读,但我认为面试结果真正取决于面试本身是否顺利;一个好的感谢笔记不会改变您的表现。

作为候选人,我有时会发送一封简短的感谢邮件。现在我作为面试官的一方,我知道这些邮件并不能让候选人脱颖而出。我还没有遇到过面试团队中有人认为简单而礼貌的感谢笔记是讨厌的,但如果我接到一个粗鲁的后续备注,那么我宁愿候选人干脆什么都不发。

感谢信模板

如果您确实想发送一封感谢信,我建议以下方式:

  • 保持简洁明了。

  • 您可以重申对该角色的兴奋之情。

  • 不要试图解释面试中的某个错误或为某事辩解。面试官可能已经忘记了,这样做只会弊大于利。

一位招聘经理对求职者的建议是不要走向另一个极端,显得过于渴望,比如发送过长并过度感谢的感谢邮件。例如夸大其词地说“这是一生中的机会”或“能为您工作将是最大的荣幸”。在理想世界中,面试官会单纯接受邮件的表面价值,并不会判断其“绝望”方面,但实际上,这些因素确实会起作用。

注意

在您的地区,可能会有其他社会规范影响专业通信的详细程度或您表达感激的程度。我曾为加拿大和美国的公司工作过,因此我的沟通规范以北美为中心。请据此调整!

这是我的个人面试感谢信模板—您应该用您自己的情况替换括号[ ]中的文字:

Hi [Xue-La],今天在面试中与您[和团队]见面很棒。感谢您抽出时间[回答我有关工作文化的问题];这让我对[公司名]和您在[推荐系统]上的工作更加兴奋!

祝好,

Susan

面试后等待回应的时间应该是多久?

理想情况下,您应该已经被告知预期在何时收到招聘人员和/或面试官的回复。如果您没有收到回复,并且他们没有告诉您何时可以预期回复,我认为在一周工作日后跟进是合适的。有些公司确实需要几个月才能完成招聘,特别是大型和官僚主义的公司。因此,即使您在一周后发送电子邮件,他们可能无法立即给出适当的回复,但至少您已经开始了面试后的对话。有些公司也可能只需要一周或更短的时间——通常是创业公司。

面试之间应该做什么

如果你有几个面试安排,可能会在它们之间有些时间,无论是多阶段面试之间还是不同公司或不同职位的面试之间。或者这可能是你收到一些回应后,但还没有接受报价的时间。这段时间可能会有所变化,因此不必专注于区分“面试后”和“面试之间”的差异,因为它们可能有些重叠。

如何回应拒绝

当我自己成为求职者时,我知道被拒是这个过程中不可避免的一部分——接收那些“很遗憾,我们决定选择其他候选人…”的电子邮件。当我对一个工作非常感兴趣并期待积极回应时,我会给自己一些时间感到失落,并(合理地)向信任的人士如朋友或家人倾诉。通常情况下,情况不会逆转,除非保持礼貌和职业素养。候选人可能成为第二选择,如果第一选择拒绝了报价,可能会再次联系你。但是对于那些发送愤怒跟进邮件的候选人,这种情况可能不会发生。

如果你不想回复拒绝邮件,你不必这样做,但是特别是对于我在面试过程中与团队互动更多的团队,我会发送一封邮件作为礼貌,因为我已经了解了这些人。

拒绝回应的模板

在收到自动拒绝电子邮件后,我通常会回复电子邮件。但是,如果这封邮件是我与招聘人员交谈后或者在通过更多面试轮次并与团队有更多互动后收到的,我会回复拒绝邮件。如果我回复了,这是我的模板:

你好[招聘人员或招聘经理],

感谢您的更新和花费的时间。在整个过程中,与您和团队见面并了解更多关于[公司名称]的信息是一件好事。[此处可选择性添加句子。]

最好,

Susan

注意:通常,我只会在我进入后续轮次并与团队有良好的互动时添加更多内容(可选的额外句子)。如果我感觉我们有良好的互动,我也可能会说“让我们保持联系!”但我认为这取决于你的个性。

注意

通常情况下,请用你自己的情况替换方括号中的文本,并牢记,如果你所在地区重视其他类型的沟通方式,因为我是从北美的角度来写作的。

一位同行的机器学*专业人士提到,这也是他们寻求反馈(如果适用)的时机,有时他们确实会从招聘团队那里得到反馈。我自己很少在请求后得到过反馈,这可能是因为避免法律问题,¹ 特别是在一个有着需要遵循程序的大公司时。

小贴士

在回应拒绝时,最好保持专业、礼貌和积极的态度。

求职申请是一个漏斗。

据我的经验,我并不是所有申请的工作都会被邀请面试,所以多申请一些与我机器学*技能和个人资料匹配的工作并不会有害。至于是否个性化申请,请记住每份申请的效果,正如第二章中提到的那样。

即使你觉得自己有些不太符合资格,也要申请!通常,成功的候选人甚至可能并不具备清单上的所有经验。例如,我看过许多机器学*职位描述提到 Kubernetes,但正如你在之前的章节中读到的那样,并不是所有的机器学*角色都需要深入的 Kubernetes 经验。当然,你仍然需要具备预期经验的相当数量,或者成功地说服招聘团队你能够在合理的时间内学*和贡献。

你可能已经看过或听说过这个统计数据:男性只有在符合 60%的资格要求时才会申请工作,但女性只有在符合 100%的情况下才会申请。² 这可能是信心表现在符合条件的候选人较少申请工作的一种方式之一。如果这对你有共鸣,一定要看看你是否在低估自己。

如果你收到了那些令人头疼的拒信,继续建立应用程序的流程吧。继续申请,继续浏览,继续更新你的简历!利用每一次的拒绝来帮助你增加下次成功的机会;否则,你可能会花费比必要更多的时间在这个过程上。

更新和定制你的简历,测试各种变化。

有时,你的简历确实会在减少初次拒绝方面发挥重要作用。我曾经给过人们简历反馈,他们报告说回调率增加了。我自己在申请不同类型的机器学*职位时也使用过这种策略。改进我的简历增加了我为更加侧重于 ML 模型开发的工作收到的面试次数,也帮助我避免了那些不匹配我的技能的工作的面试邀请。

如 第二章 中所述,将你的简历针对你想要的特定 ML 角色进行调整;例如,对于 MLE,查看是否应该强调你的 ML 模型开发技能还是你的 Kubernetes 技能。如果你的简历有空间,你可以强调两者。

offer 阶段的步骤

现在你已经经历了几次面试,希望你已经拿到了一个 offer!即使你的第一个报价可能不是你理想的,我认为这是一个重要的里程碑。第一个可能是最难的!

让其他正在进行中的面试知道你已经收到了一个 offer

有时候,其他面试的时间线更加延迟,但如果你让其他公司知道你已经收到了一个 offer,有些地方愿意加快你的面试过程。当然,这并不保证成功,但让其他地方知道你有一个 offer 并没有坏处。最好的情况是他们会加快你的过程,最坏的情况是没有任何变化。这些公司现在也知道另一家公司想要你;这可能会增加你作为候选人的价值,因为你有当前的外部验证。

我在这本书中没有详细讲解谈判,以下是一些许多人觉得有用的文章:

如果要约响应时间线非常短,应该怎么办

我会非常诚实地告诉你:新工作是一个重要的职业和生活转变,不是一件微不足道的事情。我经常需要一周——或者至少是一个周末——不受干扰的时间来考虑这个 offer。有时候,你没有时间的奢侈,需要立即找工作,这也没关系。在这里,我将概述我在回应 offer 时的思考过程,假设你不是处于紧急财务状况、急需签证或其他个人情况。在这些情况下,你可能有自己接受工作 offer 的考虑因素,我在这里给出的考虑因素可能不适用于你的情况!

我个人会尽可能要求更多时间来决定——最好是至少周末。假设你在周二收到了一个 offer,并且他们希望在周四前得到答复,但这对你来说不足以研究所有细节并比较这个报价。以下是一些你可以说的例子:

  • “我需要在周末和我的家人讨论这个 offer。我可以在下周二回复你吗?”

  • 如果您还在与其他公司面试:“由于我还在进行另一轮面试的最后阶段,我需要一些时间。我对这个提议感到非常高兴,我对这个机会感到非常兴奋,但是如果我不与其他公司再次确认最终细节,那就不太对了。我想我可以在下周一知道他们的决定。我能在下周三之前通知您吗?”

  • 如果您正在搬迁:“在我决定接受这个提议之前,我想多花点时间研究这个地区和生活成本。我可以在下周二再给您回复吗?”

根据您的情况,有很多真实而重要的理由需要您尽职调查,并在您签署可能会极大改变您日常生活的合同之前花一些时间。

了解您的提议

在做出任何决定之前,我强烈建议您全面了解您的职位提议。以下是一些可能不会立即想到但是工作提议中非常重要的部分,超出了显而易见的基本工资。

工作场所文化

工作场所文化被 Indeed 定义为“在工作环境中形成常规氛围的态度、信念和行为的集合”³。工作在我们的生活中占据了很多时间:每天八小时(不包括交通时间,如果适用),一周五天,大约我们周的 24%时间在工作中度过。如果我们假设每天八小时的睡眠,并且一天有 16 小时清醒时间,那么我们花费 36%的清醒时间在工作中。所以,如果工作场所文化与您和您的价值观不合适,结果可能是需要花费大量时间和金钱来解决的心理和身体健康问题。回报是否值得?这是否值得您的生命?

有时候,在面试阶段很难弄清楚真正的工作场所文化,但请记住。健康的工作场所文化可能包括公平、协作和透明等行为,但不健康的工作场所文化可能促进欺凌、歧视或违法行为。在北美,有受保护的群体⁴,旨在保护一系列群体免受歧视的法律,如种族、年龄、性取向和性别认同、退伍军人地位、宗教等⁵。作为一个在北美相对少数群体的个人例子,我知道有些和我类似的人遇到了敌对的工作环境,所以找到反对性别和基于性别的骚扰的公司文化对我个人来说非常重要。

工作与生活的平衡

在评估提议时要问自己的一个重要问题是:你能花时间与重要的人在一起吗?有一句谚语说“20 年后,唯一会记得你工作到很晚的人只有你的孩子。”也有些情况是人们因为工作上的不灵活而感叹错过了孩子重要的里程碑(比如他们的第一步或其他文化上重要的里程碑)。如果你没有孩子,那么可以用其他所爱的人⁶ 代替,比如父母,另一半,你的宠物……你懂的。同样的逻辑也可以延伸到爱好,比如创作艺术,社交活动,参加音乐节等等。

避免燃尽也很重要。 燃尽 被世界卫生组织定义为“由于长期未能成功管理的职场压力而导致的综合症候群”,其影响包括“感到精力耗尽或筋疲力尽。”⁷ 从长远来看,燃尽的代价可能比超负荷工作的暂时好处更高。人们经常因为工作而后悔破坏了他们的健康,无论是心理还是身体上的。

另一方面,我认识过一些人将自己投入到工作中,作为逃避其他事物的一种方式。也有些人强烈信仰公司的使命,并拥有更多的公司股权,因此更努力工作将为他们带来更多的精神和财务满足感。根据你的情况,相应地评估你的工作提议的这些要点。

基本工资

这是提议中最明显的部分:每次发薪水时你可以在银行账户中看到的金额。基本工资通常被视为提议中最重要的部分之一,理所当然地——钱可以支付账单,并在灾难性生活事件中帮助你;用较少的流动资金很难做到这一点。

例如,如果你在一家公开公司拥有限制性股票单位(RSU),则有 停止交易期⁸,因此在紧急情况下不能变现。当然,如果你有更多储蓄,那么较少的流动基本工资是可以接受的。 (接下来讨论了更多的非基本工资选项的例子。)

提示

对于一些地区,你可以查看 Glassdoor 或levels.fyi获取平均薪酬信息。请记住,对于你具体情况可能没有足够的数据,因此要谨慎对待这些数字。例如,由于我是加拿大人,这些网站通常没有足够的数据,我大部分薪酬信息是通过我的导师和网络口耳相传得到的。是的,如果人们信任你,他们会分享确切的金额。是的,你需要花时间来建立这种信任(参见第二章)。

奖金、股票和其他种类的补偿

有些公司可能会在基本工资之外给你其他形式的补偿。你可能常见的补偿包括 RSU(限制性股票单位)、股票期权、年终奖金、利润分享、佣金等等。务必核实这些的价值。例如,股票期权与 RSU 并不相同。在之前的一家工作场所,尽管我拥有很多股票期权,但它们最终却变得一文不值。

你可能想要了解的一些工作条件包括股票或期权的解禁期、如何行使期权等等。我不是财务专家,所以你可以在《哈佛商业评论》的“关于股票期权和 RSU 的一切你需要知道”中进一步了解这些内容。请查阅在线指南或在你所在地区咨询专家,了解与你的地区和就业情况相关的具体规则、法律和税收。

福利

你的福利可能不包括在基本工资中,但它们可能有很大的经济价值。例如,我甚至没有意识到我的公司在一年内通过雇主匹配为退休基金捐款超过$10,000。我知道有雇主匹配,但在考虑这份工作时并没有实际计算过其货币价值。事后看来,我绝对应该这样做。在美国,良好的健康福利可能意味着为你节省数千美元。产假和父母假期对你和你的家庭来说可能意味着极大的安心感。

根据你的生活阶段,相关福利的列表可能会随着时间变化而变化。一个个人例子是,当我年轻时,我并不太关心健康和牙齿福利,但在我开始需要定期维护特定牙齿程序后,支付治疗费用的 20%比起之前零费用变得更加昂贵(分别是我之前的两份工作)。我的建议是不要低估这些福利的重要性。

把所有这些联系在一起

现在你全面考虑了这份工作的条件,想一想接受这份工作意味着对你的生活和职业生涯有什么影响。我建议你如果有任何疑问,始终与招聘人员或招聘经理确认。他们已经向你提供了一个工作机会,在这个阶段,他们宁愿回答你的问题并调整工作条件(如果合理),而不是为了其他候选人再花费数十小时进行面试。因此,不要担心花些时间审查合同、提问和尽职调查。

新机器学*职位的前 30/60/90 天

经过艰苦的面试过程后,你终于拿到了一个甚至几个工作机会的 offer,恭喜!现在你已经接受了你选择的工作 offer,并准备开始新的工作了!

在入职后,除了了解情况外,你还有很多事情可以做,这些事情在你的机器学*工作的前几个月内会对你有所帮助。我的正规教育并没有教给我这些事情,有时甚至过去的工作经验也不会让你意识到这些有用的小贴士。以下行动在我以往的工作中对我有很大帮助,我认为在你新的机器学*工作的头几个月中,记住这些是很重要的:

  • 获取领域知识。

  • 熟悉代码。

  • 结识相关人士。

  • 帮助改进入职文档。

  • 跟踪你的成就。

现在我将详细介绍每个行动的细节。

获取领域知识。

如果你是银行业的数据科学家,你需要熟悉并了解你所处理的银行产品以及它们的运作原理。如果你是电子商务和推荐系统领域的 MLE,你需要确保理解客户和业务价值。如果你对这些点理解不深,可能会导致开发出不符合公司优化目标的模型或基础设施,使得你的工作表现看起来比实际情况要差。

另一方面,深刻理解目标将帮助你更有效地构建机器学*模型。谁知道呢,这可能会影响你获得晋升的时间(如果你有这样的目标)!

获取代码知识。

我认为这是最不容忽视的行动,因为在机器学*角色中,几乎可以保证你将接触到代码和数据或接受相关培训。但为了完整起见,这里是我确保要做的事情:

  • 能够建立开发环境。

  • 检查所需的权限并申请它们(或请求经理帮助申请)。

  • 浏览主要项目和代码库。

如果有你不熟悉的库,请问一下同事是否在使用。如果在使用,你可以问问经理是否有培训计划涵盖这些内容的一部分。我之所以提到先检查是因为很多公司和团队有一些可能不需要改变的遗留代码,因此你无需过分担心。例如,在我曾经的一个工作场所,有几个文件夹和任务是用 Scala 编写的,我向经理询问了它们是否在使用,因为我很好奇。结果发现那些任务正在逐步淘汰,所以那时我不需要过多关注它们;而集中精力熟悉 Python 和 shell 脚本更为重要。

结识相关人士。

公司由人组成,即使在我们与代码和机器打交道的技术领域也是如此。在技术方面,与你的主管、高级同事和其他负责类似技术方面的同事联系。当你遇到问题时,知道该联系谁可以帮助你解决问题是很有帮助的。例如,作为新员工,通过早期与人们联系,我在工作中变得更加有效率。当我不知道如何追踪数据来源时,我有一本人们发来的电话簿或一份要读的文件清单。

如果你正在处理某一类产品,比如社交媒体上的推荐系统,那就了解一下是谁在决定产品。联系产品经理或相关人员。不要低估与非技术人员的联系;有时候你卡住不是因为代码或数据问题,也不是 bug,而是因为你不知道的某些产品逻辑。

作为新员工,与你团队和组织中的人安排 30 分钟的咖啡聊天(虚拟或面对面)。这有助于你更快地了解他们,并快速入职,因为他们可以与你分享重要的背景信息。

提示

与某人进行咖啡聊天后,问问他们建议你下次与谁会面。然后你可以安排与那个人的咖啡聊天!

帮助改进入职文档

在我工作的所有公司的入职期间,总会有一些文档要遵循,有时还会与同事或经理进行代码、数据和项目的讨论。在文档网页上,有时会有失效的链接或过时的描述,你的入职伙伴会口头告诉你这些。对这些文档做出改变;这是一个很好的开始贡献的方式,如果你的文档存储在代码库中(例如,在 GitHub 上的 Markdown 文件,在内部 Wiki 页面上呈现),那么这是一个你可以在第一周甚至第一天就可以进行的简单拉取请求(PR)。

记录你的成就

当你安顿下来时,要考虑你的长期成长。这意味着记下你为绩效评估和晋升过程做的准备工作。一个很好的资源是 Julia Evans 的自夸文档,这是一个记录你在工作中取得成就的文档。定期更新它,它将成为你未来在机器学*领域前进时的重要资源!

概要

在本章中,我讨论了一些面试后的常见问题,比如后续跟进、回应拒绝等。我还介绍了工作提议的常见考虑和组成部分,希望这些可以为你提供一些视角。接下来,我提供了一些在你开始第一份机器学*工作时的建议,帮助你在最初几个月取得成功。

  • 祝贺你走到这一步!现在希望你能把所学应用到实践中。如果有一件事我希望你能记住,那就是学会调整并找到自己的立足之地。这就像攀岩(其实我并不怎么攀岩):当你抓住另一个把手时,保持平衡和抓地力的方式会因为腿部力量和握力不同而不同,因为每个人的情况都不同(图 9-1)。而这个机器学*职业就是我们所有人攀登的巨石,我们都在用自己的方式应对。祝你好运;我支持你!

寻找自己的机器学*职业道路有点像攀岩;由 yns plt 拍摄,Unsplash 提供的照片

Figure 9-1. 寻找自己的机器学*职业道路有点像攀岩;由yns plt拍摄,Unsplash提供的照片。

¹ “大公司不给不成功的申请者反馈的真正原因”,《福布斯》,2018 年 2 月 8 日,https://oreil.ly/0V09R

² Tara Sophia Mohr,“为什么女性除非百分之百符合条件才申请工作”,《哈佛商业评论》,2021 年 11 月 2 日,https://oreil.ly/z4VGh

³ Indeed 编辑团队,“工作文化是什么?定义、要素和示例”,《Indeed》,更新于 2023 年 8 月 21 日,https://oreil.ly/Dij-Y

⁴ 参见美国平等就业机会委员会,“谁受到就业歧视的保护?”https://oreil.ly/AKD4a,或查阅您所在地区的政府网站了解类似信息。

⁵ 自文写作至今,这些列表可能已更新,因此请进行必要的尽职调查。

⁶ Tim Urban 的文章“尾端”给了我一个改变人生的视角,我强烈推荐;详见 Tim Urban,“尾端”,《Wait but Why》(博客),2015 年 12 月 11 日,https://oreil.ly/sxXWk

⁷ “烧尽:‘职业现象’”,世界卫生组织,2019 年 5 月 28 日,https://oreil.ly/S8Xf1

⁸ Christina Majaski,“停止期间:定义、目的、示例”,《Investopedia》,更新于 2021 年 4 月 15 日,https://oreil.ly/65360

OceanofPDF.com

第十章:结语

机器学*面试并不容易,除了本书中详细介绍的一切,还需要毅力和坚持。这些品质将在你的机器学*职业生涯中帮助你走得更远。我很想听听你的成功故事;确保查看伴随网站,那里还有更多讨论和未能包含在本书中的额外资料!

进入未来,有许多探索的机会,你会对能够通过机器学*和数据实现的事物感到兴奋。除此之外,你可能会考虑在职业生涯中继续成长,并成为技术领导或经理。我正在继续写关于我从事该领域以来的成长历程,以及如何从入门级发展到首席级别的内容,可以在我的SubstackLinkedIn上找到,这些资源可能也会对你的成长之路有所帮助。

OceanofPDF.com

posted @ 2025-11-21 09:08  绝不原创的飞龙  阅读(20)  评论(0)    收藏  举报