本文要点
你可以通过阅读书籍、学习课程、参加会议和参与项目来获得相关的机器学习技能。
确保你的简历里列出了已掌握的技术以及参与过的项目。
在面试过程中,你可能会被问到技术问题、洞察力问题,并且需要解决编程问题。
在解决技术面试题时,要集中精力展示自己的技能,就像是在工作一样。这个时候,代码质量和描述与所采用的方法同样重要。
在过去的两年里,我努力提升公司的机器学习能力。我查看了数百份简历,进行了 100 多次电话面试,评审了很多编码任务,并与数十名工程师进行了现场面试。人们经常问我,他们应该为这样的面试做些什么准备,所以我把我的建议和技巧写成了这篇文章。
第一步:掌握相关技术
在申请职位之前,最重要的一点是要具备足以被录用的技能。面试官要求机器学习工程师具备很多相关技能,因此,要尽可能多地掌握这些技术。总体而言,一名优秀的机器学习工程师应该具备计算机科学(原始编程技能)、数学和统计学(了解使机器学习算法知识)和特定学科知识的组合。在本文中,我将深入探讨计算机科学、数学和统计学部分。
候选人需要掌握的最后一项技能是沟通——向他人解释你正在从事的工作的能力,这一项能力也是至关重要的。你的实验可能在数周的时间里无法获得更好的结果,而在这个时候,最重要的是要具备解释问题和解决问题的技能。
应该要掌握哪些技术?
你可以学习多门编程语言、框架和其他技术。你所掌握的技术将决定你获得什么样的职位以及将要从事的工作。所以,你必须明智地做出选择。以下是我的一些建议以及原因:
Python——用于训练机器学习算法的编程语言。确保你知道这门语言提供了哪些功能。除了 Python,我还建议你学习另外一门语言。如果要使用嵌入式平台,请选择 C++。如果要在企业环境中使用机器学习模型,请选择 Java。如果你想进行数据分析,请学习 R 语言。最后,如果你喜欢经典的 AI 算法和自然语言处理,请学习 Lisp。
TensorFlow/Pytorch——深度学习正在蓬勃发展。市场上有两个深度学习框架,但哪些项目应该使用哪个框架,它们之前的区别是非常不一样的。首先,需要注意的是,TensorFlow 通常在部署环境中更易于使用,而 Pytorch 在实验环境中更易于使用。最近,TensorFlow 试图让实验变得更容易,而 Pytorch 则致力于实现更容易的部署(即使在嵌入式硬件上)。如果你想要担当更多研究角色,我会推荐 Pytorch。如果你想要在一家主要在生产环境中更新模型的公司工作,我会推荐学习 TensorFlow。总体上讲,全面学习一个框架要比半途学习两个框架要好,尤其要考虑它们演化的速度。
Scikit-learn——scikit-learn 包含了大多数经典的机器学习算法。掌握它可以让你快速解决很多小的数据问题。如果你知道这个库的算法原理,那么在技术面试过程中就有领先优势。
NumPy 和 Pandas——在使用 Python 处理数据时,有效且准确地选择数据是非常重要的。大多数机器学习工程师每天都使用 NumPy 进行基本的数据处理。如果你有更高级的选择标准,可以考虑 Pandas!只需要用几行代码(并且没有那些令人讨厌的 for 慢循环)选择特定的数据样本就可以给未来的同事留下深刻的印象。
Apache Spark——拥有大量数据的公司将从机器学习中受益。处理大数据非常重要,Spark 将大大加快你的开发工作。请注意,在处理大数据时,了解 Hadoop 可能也很有帮助。
OpenCV——如果你想要使用计算机视觉学习,掌握 OpenCV 就至关重要。它提供了很多图像处理功能,可用于快速组建原型,或以更好的方式预处理图像。它还提供了很多识别、检测或定位物体的功能。
该看哪些书?
有很多书教你如何学习机器学习。不同的人有不同的学习方式,因此需要阅读不同的书。确保你购买的是具有激励教学风格的书籍。
对于数学和统计学书籍,我建议如下:
《模式识别和机器学习》(Pattern Recognition and Machine Learning),作者 Bishop。这是一本包含大量数学内容的书,从机器学习的基础讲起。这是我大学课程中最艰啃的一本书。如果你是一个喜欢数学和自下而上学习方式的人,我推荐阅读这本书。
《深度学习》(Deep Learning),作者 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville。这仍然是一本数学书,不过针对的是神经网络。我已经做了一些神经网络实验,以便更好地了解背后的原理,因此我喜欢阅读这本书。阅读这本书将会让你从“使用神经网络进行随机性的实验”过渡到“知道哪些参数可以更好地控制神经网络”。
《Python机器学习》(Python Machine Learning),作者 Sebastian Raschka。本书属于实用书籍。Sebastian 对 scikit-learn 提供的可用工具进行了广泛的概述。在最新版本中,他还提供了 TensorFlow 代码。
《人工智能:现代方法》(Artificial Intelligence: A Modern Approach),作者 Stuart J. Russell 和 Peter Norvig。我主要从这本书学习博弈论和搜索算法。书中还有很多概率论方面的内容,甚至还有一些机器人技术!这本书非常好,有些章节可以让你在面试中占据一定的优势。
在软件工程技能方面,你要精通编程语言、算法和数据结构。大多数工作都需要具备 Python 知识,因此请确保你了解这门语言及其最新功能。在面试过程中,你可能需要解决白板编程任务,因此算法和数据结构知识非常重要。我会推荐这两本书:
《算法简介》(Introduction to Algorithms)作者 Cormen、Leiserson、Rivest 和 Stein。本书对不同的算法和数据结构进行了非常完整的概述。使用正在学习的编程语言来实现算法和数据结构是一件非常有趣的事情。
《程序员面试经金典》(Cracking the Coding Interview)作者 Gayle Laakmann McDowell。掌握所有算法将花费大量时间。本书将教你最常使用的算法和数据结构。
应该学习哪些课程?
在线课程有很多选择。我最近没有参加任何课程,不过听说以下这些课程很不错:
“深度学习”——来自 Udacity 的一门在线课程
“机器学习”——由 Coursera 的吴恩达主讲的在线课程
“成为汽车自动驾驶工程师”(Become a Self-Driving Car Engineer)——Udacity 的一门在线课程
应该参加哪些技术大会?
我喜欢参观技术会议或聚会,因为它们让你了解可以通过机器学习解决哪些问题、最新的技术发展水平以及行业正在使用哪些技术。学术会议可能更多地与最新技术有关,而商业会议则可能探索更多的技术应用。我关注的会议有:
QCon——了解软件技术的最新进展
NVIDIA GPU技术大会——了解基于 GPU 的机器学习(神经网络)技术
CVPR——一个计算机视觉技术大会
NeurlPS——一个神经网络技术大会
ICPA——一个机器人技术大会
IROS——一个机器人技术大会
为面试做准备
面试的一个秘诀是要为面试做好准备。为了评估候选人是否适合工作岗位,公司会对候选人提出一些小的挑战。你可以把自己训练成很善于解决这些挑战!你可以这么做:
很多公司在开始面试你之前都会要求你解决一些HackerRank问题。到 HackerRank 网站上做一些练习,以便应对面试官。
如果你想要在竞赛性编程方面做得更好,就应该看一些现有的编程竞赛。我比较喜欢Google Code Jam和Advent of Code。Google Code Jam 有各种难度级别的编程挑战,并提供了解决方案的概要,这样你就知道哪些算法最为重要!每年 12 月,“Advent of Code”都会举办 25 项编程任务,这些任务在月底会变得越来越难。Advent of Code 的一个特点是通常有多种方法可以解决同一个问题,而与他人交换解决方案将会给你带来很多启发!
尽量参与大型机器学习项目
我希望看到候选人具备一个大型机器学习项目的经验,最好是涉及数据收集、数据清理、机器学习到部署的所有步骤。确保你在当前工作中获得了所有这些经验,或者尝试在业余时间获得这些经验。拥有这些经验会让你在申请职位时从众多竞争者中脱颖而出。
获得这些经验的一种办法是参与开源项目。你会发现,参与现有项目会有一个严格但很有用的评审过程。一旦你合并了第一个 PR,就将成为一个更好的开发者,知道其他开发者在乎什么。
第二步:申请职位
在申请职位时,请确保你的求职信和简历可以证明你具备所申请职位所需的能力,并且简历清晰易读。简历上可以列出你使用过的框架以及过去所做的项目。确保你可以回答出与简历上列出的框架和技术有关的问题!我还建议让专业的招聘人员或外包商帮忙看一下你的简历,他们很乐意帮你拿到工作机会!
其中的一个秘诀是要把重点放在你想要获得的工作上,而不是纯粹罗列过去都做了什么。我会针对我申请的职位调整自己的简历,重点突出过去所做的相关项目。简历应该突出展示你喜欢的技能和项目。你还应该在自己感兴趣的领域物色职位:公司喜欢录用对工作充满热情的人!
由于机器学习是一个不断发展的领域,很多人正在参加课程并试图找到与机器学习相关的工作。作为一名面试官,需要知道候选人是只“学习”了一些在线课程,还是具备“实践经验”。如果你在上一份工作中做过过机器学习,请在简历中明确指出。如果你只是在业余时间参与了大型项目,请在简历上附带项目的链接!
第三步:面试
面试官可能会问很多与机器学习有关的问题。你要确保已经了解了很多算法的基础知识,还应该清楚了解这些知识的目的和优势。作为一名面试官,我总是向在面试中会让我了解到新知识的人提供积极的建议。如果你对某些主题有深入了解,那么你更有可能被录用,特别是如果公司刚好欠缺这些东西。
在面试中一定要问清楚问题是什么,因为很容易出现各讲各的情况,而且过了一会儿才知道讲的不是同一个东西。举一个实际的例子:在一次面试中,我专注于如何编写高效的列表排序算法,而面试官只想要找到列表里最大的元素。每当遇到编码问题时,请先编写测试用例。这么做可以显示出你很在乎代码逻辑和测试,而这恰恰是面试官喜欢的东西。在编写测试用例时,你还有时间想一想可能的解决方案和潜在的陷阱。
在向面试官解释答案时,请使用STAR结构来描述你的故事。你可以解释自己所处的状况、所执行的任务、所执行的操作以及结果。
最初几次去面试时,你可能会感到紧张。这很正常,因为你通常不知道面试中会发生什么。每次面试都是不一样的,因此,即使在这个行业工作了多年,仍然可能会有些紧张。人的思想容易对一个有信心的人造成束缚,因此做好准备是非常重要的!以下这些小技巧可以帮助你应对紧张的情绪:
通常,面试官会在面试开始时会先进行一些闲聊。在此期间,收集有关面试官的信息。这总会让我感到放松,并让我能够在接下来的面试中与他或她保持很好的互动。
控制好环境:确保手机已关机,宠物呆在其他房间里,Alexa/Siri 已关闭。如果发生任何事情(例如邮递员送包裹来),请保持镇定,迅速处理好,再回到面试里来。我个人不介意被打扰,这些事情可能会发生在我们任何一个人身上。
在面试之前先进行练习!让你的朋友问你问题——可以在《程序员面试金典》一书中找到一些问题,你也可以在线搜索到一些常见问题。你也可以浏览其中的一些问题,以便了解答案是什么。
准备“电梯游说(elevator pitch)”。在一分钟内总结出你是谁、你是做什么的以及你想要什么。每个面试官都会要求你做自我介绍,这将是最完美的答案。轻松的自我介绍为面试开了一个好头。
了解如何轻松地传达信息。我发现有时候很难用语言表达自己的想法,所以我喜欢站在白板前,一边讲一边表达自己的想法。你会发现,一张便签纸也可以帮助你传达想法。无论你选择怎么做,都要确保事先进行练习,看看自己是否感到舒适自然。
面试之所以难,是因为你永远不知道会发生什么。我主要经历过以下这些类型的问题或面试:
知识类问题。例如“LSTM 的工作原理”、“二维卷积层有多少权重”、“支持向量机的核心技巧是什么”。如果你对问题一无所知,那么就按照你所知道的最大程度来回答。诚实很重要,但有些候选人会编造东西。你也可以说明通常该怎么找到问题的答案,或者如何解决问题。为了能够解决这些问题,你需要阅读教科书、学习特定的技术,并记住特定的事实和名字。
如果你申请的是深度学习相关的岗位,要确保你知道深度学习中使用最多的成本函数(例如二元交叉熵、分类交叉熵、均方误差、余弦相似度、Huber 损失和 Kullback-Leibler 散度)。
确保你知道常见的激活函数及其派生函数(例如 relu、elu、sigmoid、tanh、softmax、swish 和 selu),并且知道在神经网络中可以找到的最常见的层(密集层、卷积层、可分离卷积、批处理规范化、全局和局部池化(最大池化和平均池化)、LSTM、GRU、dropout)。
如果你需要了解更多经典机器学习的知识,建议从 scikit-learn 中的算法开始。比如,最小二乘线性回归、支持向量机、最近邻、决策树和集成方法。
洞察力类问题。面试者可能会在面试中给你一个小案例,并问你该如何处理。如果你过去曾做过一些机器学习项目,通常可以轻松地回答这些问题。但是,重新学习一下解决常见任务的方法还是有必要的。问题示例如下:
你知道哪些预处理数据的方法?
你会使用什么方法来增强数据?
你知道有哪些正规化方法?
为了完成这个任务,你将如何获取/收集/注解数据?
你将如何评估这个任务,你的模型应具备怎样的性能?
代码类面试。有些公司会使用 HackerRank,所以你可以运行自己编写的代码。有些公司则使用白板,或者只是要求在纸上写。由于这种面试方式很普遍,因此务必加以练习。如果是机试,我建议你在选择最佳解决方案之前先尝试 20 行代码。如果是写在纸上,你只有一次写出正确解决方案的机会。关于如何应对这类面试,有很多很棒的教程!这个时候最重要的是表达出你的想法,通常并不是要找到正确的解决方案,而是表明你是别人在解决类似问题时可以与他人一起工作的人。
社交类问题。有一些常见的社交类问题,例如“别人对你的评价如何”、“你遇到的最大的挑战是什么”、“你觉得自己 X 年后会怎样”。为常见的问题做好准备,并确保能够给出简短而有说服力的答案。
第四步:完成任务
很多公司会给你分配一个技术任务。我喜欢这些任务,因为如果给你足够的时间,恰好是展示你能力的机会。回顾这些技术任务,我看到了很多很棒的解决方案,但也有一些人完成得不好,我不得不拒绝他们。这里有一些完成技术任务的实用技巧:
描述过程。每次上交一份简短的报告,在报告中包含你所采取的步骤、你所尝试的事情以及如果有更多的时间你将如何改进它。我喜欢用Jupyter Notebook来完成技术任务,因为你可以同时进行描述和编码!如果没有使用,可以附上一个结构良好的 PDF 文档。
保持简单。对于机器学习技术任务,你可以尝试很多解决方案。简单高质量地完成一项任务总比尝试一个困难的解决方案而以低质量告终要好。
说清楚哪些代码是你复制粘贴的,哪些代码是自己写的。对于机器学习任务,通常有一些现有的算法和你必须实现的功能。例如,如果你要开发一个 2D 边框检测器,可以使用现有的 YOLO 实现。但是,一定要确保自己添加了重要的功能。人们仍然需要评估你的编码方式,所以一定要指出哪些是你写的代码和哪些是你复制粘贴的代码。
重质轻量。确保遵守约定、编码指南,并向函数中添加注释。你可以使用所谓的 linter 工具,它可以分析代码中潜在的错误和样式违规。写代码的时候,要表现出就像是在向未来雇主提交代码的样子。一段高质量的简单代码比一个无法理解的高级解决方案要好得多。
单元测试!作为一名专业软件工程师,为你所写的代码编写测试是工作的一部分。对于函数来说,简单的 assert 语句就大有帮助。表明你对某些测试框架很熟悉,这将给评审人员留下深刻印象。
结论
希望这些能够帮助你找到梦想的工作!机器学习很有趣,并且有解决很多问题的潜力。我写这篇文章是基于我在技术会议和聚会上与人交谈的经历,但我意识到这并不足以让我对机器学习世界有一个全面的认识。如果你有什么建议或者知道你所在的工作领域有哪些重要的东西,请留下评论,以便帮助那些想要成为机器学习工程师的人。
作者简介:
Roland Meertens 是一名机器学习工程师,研究自动驾驶车辆感知。他是 InfoQ 的撰稿人,在 pinchofintelligence.com 上有自己的博客,他在那里列出了自己的副业项目。
原文链接:
How to Get Hired as a Machine Learning Engineer
评论