人们用很多东西来比喻准备面试的过程。有人说这像准备一场战争,也有人说像邀请某人出去约会,还有人说像在高尔夫大师赛上打进最后一个洞。准备面试是一个令人兴奋,又或者是令人恐惧的过程。准备一场机器学习工程师的面试更是如此。要如何准备才能得到自己想要的结果呢?
成功的关键在于思维方式和充分的准备。
公司和角色
你首先要思考为什么你所申请的公司会有这样一个职位开放着。这是准备过程中极为重要的一个问题。如果你知道自己会被问到什么,你就能更好地定位自己能给公司带来的价值在哪里。比如说,一家公司正在招聘一名机器学习工程师,那么很显然他们目前正在试图解决一个传统方案所无能为力的复杂问题。
发现核心问题
你要做的第一件事情就是设想自己已经得到这份工作后的情景。为此你需要尽可能地收集和整理关于这家公司和这个职位的信息。问自己一个问题:我能为这家公司解决一个怎样的核心问题? 而寻找这个问题的答案的过程,应该是令人兴奋的,能驱使你去了解更多关于这个问题的信息——像是现有的解决方案、近几年的新趋势等——并让你看清具体的难点在哪里。如果你明确地知道自己申请的职位是属于哪个团队的,那么就很容易挑选一个合适的问题;否则的话就挑选一个对公司来说非常基本的问题你。除此以外,你还可以思考这家公司目前面临着怎样的挑战,从而预计他们可能会问你的问题。
寻找可能的数据源
在找出问题以后,接下来你就要思考你需要怎样的数据来解决这个问题。有些数据可能是现有的,另外一些数据可能需要你写一些额外的代码来收集。尝试去了解这家公司的基础设施和运维情况——他们用了怎样的技术栈、提供哪些 API、已经收集了什么类型的数据、等等。现在很多公司都会维护一个博客来讨论他们遇到的困难、采取的解决方案以及成功和失败的案例。你可以通过博客来更深入地了解他们是怎么运营的,他们的流水线上已经有了怎样的产品和服务等。
讨论和交流解决方案
好了,现在你要做一个很大的思维跳跃:如何将机器学习应用到这个问题场景中去? 给定你想达成的目标和你认为可以获取数据,你能把它转化成一个机器学习问题吗?哪些模型会比较合适?你将如何训练和评估模型?举个例子,像 Netflix 和 Amazon 那样的推荐系统所面临的主要挑战并不是预测,而是聚类——也就是说,当你能够将用户划分成购买偏好和行为相近的群组后,再给他们推荐产品就很容易了。
事先走一遍这样的思考过程能够帮助你在面试中很好地谈论公司最关心的问题。不会有人指望你能够走进面试房间然后把一个他们研究了几个月甚至几年的问题给完全解决,但面试官一定会喜欢对他所真正关心的问题展现出兴趣、动力和好奇心的候选人。
根据面试官和环节的不同,你可能会被问到很理论性的问题,但你应该用这个机会来展示自己对公司的了解和对角色的定位。当被问到一些开放性问题,比如说“请描述一个你在做项目时遇到过的技术难题以及你是如何解决它的”时,最好选择一个跟公司有关的话题来谈。
技能和样例问题
我最近写过一篇文章,在文中我列出了机器学习工程师所必须掌握的 5 类技能:
计算机科学基础和编程能力
概率论和统计
数据建模和评估
应用机器学习算法和库
软件工程和系统设计
那篇文章中对每类技能都提供了很多细节。而在这里我主要给出一些你在面试中可能会被问到的问题。
计算机科学
样例问题:
如何判断一个而链表中是否有环?
给定一棵二叉查找树中的两个元素,求它们的最近公共祖先。
给一个栈排序
基于比较的排序算法的时间复杂度是什么?证明?
如何求一个带权图中两个结点直接按的最短路径?如果有些权值是负的怎么办?
求一个字符串中所有的回文子串。
对这些问题你都要能够推导你的解法的时间和空间复杂度(大 O 表示法),并且尽量用最低的复杂度解决。
只有通过大量的练习才能将这些不同类型的问题烂熟于胸,从而在面试中迅速地给出一个高效的解法。常用的算法面试准备平台有 InterviewBit、LeetCode、Interview Cake、Pramp、interviewing.io 等。
概率论和统计
样例问题:
给出一个群体中男性和女性各自的平均身高,求整个群体的平均身高。
一次调查表明意大利三分之一的汽车都是法拉利,并且在那之中一半的车都是红色的。如果你在意大利的街头看到一辆红色的汽车驶来,请问它是法拉利的可能性有多大?
你试图找出在自己的网站上放置版头的最佳方案。变量包括版头的尺寸(大、中、小)以及放置的位置(顶部、中间、底部)。假定需要 95% 的置信水平,请问你至少需要多少次访问和点击来确定某个方案比其他的组合都要好?
很多机器学习算法都以概率论和统计作为理论基础。对于这些基础知识有清晰的概念是极为重要的。当然同时你也要能够将这些抽象的概念与现实联系起来。
数据建模和评估
样例问题:
一位农民想搞明白是什么因素影响了他的牛奶产量。他记录了每天的气温(30 - 40 度)、湿度(60 - 90%)、饲料消耗(2000 - 2500 千克)以及牛奶产量(500 - 1000 升)。
假设问题是要预测每天的牛奶产量,你会如何处理数据并建立模型?
这是一个什么类型的机器学习问题?
你的公司在开发一个面部表情识别系统。这个系统接受 1920 x 1080 的图片作为输入,并告诉用户图片中的人脸处于以下哪种情绪状态:平常、高兴、悲伤、愤怒和恐惧。当图片中没有人脸时系统要能够分辨这种情况。
这是一个什么类型的机器学习问题?
如果每个像素点由 3 个值来表示(RGB),那么输入数据的原始维度有多大?有办法降维吗?
如何对系统的输出进行编码?为什么?
过去几个世纪的气象数据展现出一种循环的气温模式:一会升高一会下降。对于这样的数据(一个年平均气温的序列),你会如何建模并预测未来 5 年的平均气温?
你在一家在线新闻网站工作,需要从各处收集文本,并将不同来源的内容聚集成一篇报道。你会如何设计这样一个系统?会用到哪些机器学习技术?
应用机器学习算法和库
样例问题:
你用一个给定的数据集训练一个单隐层的神经网络,发现网络的权值在训练中强烈地震荡(有时在负值和正值之间变化)。为了解决这个问题你需要调整哪个参数?
支持向量机的训练在本质上是在最优化哪个值?
LASSO 回归用 L1-norm 作为惩罚项,而岭回归(Ridge Regression)则使用 L2-norm 作为惩罚项。这两者哪个更有可能得到一个稀疏(某些项的系数为 0)的模型?
在用反向传播法训练一个 10 层的神经网络时,你发现前 3 层的权值完全没有变化,而 4 ~ 6 层的权值则变化得非常慢。这是为什么?如何解决?
你手上有一个关于小麦产出的数据集,包括年降雨量 R、平均海拔 A 以及小麦产量 O。你经过初步分析认为产量跟年降雨量的平方以及平均海报的对数之间存在关系,即:O = β_0 + β_1 x R^2 + β_2 x log(A)。能用线性回归求出系数 β 吗?
你可以通过像 Kaggle 比赛那样的数据科学和机器学习挑战来了解各种各样的问题和它们之间的细微差别。多多参加这些比赛,并尝试应用不同的机器学习模型。
软件工程和系统设计
样例问题:
你有一个电商网站,当用户点击一个商品打开详情页面时,你想基于商品特征和用户的购买历史为用户推荐 5 个其他的商品显示在页面的底部。你需要哪些服务和数据表来实现这个功能?请写一个查询语句或一段过程式代码来返回所要推荐的 5 个商品。
对于 YouTube 那样的在线视频网站,你会收集哪些数据来衡量用户的参与度和视频的人气度?
一个简单的垃圾邮件检测系统是这样的:它每次处理一封邮件,统计不同单词的出现频率(Term frequency),并将这些频率与之前已经被标注为垃圾 / 正常邮件的那些频率进行比较。现在需要对这系统进行拓展来处理海量的邮件流量,请设计一个 Map-Reduce 方案在一个集群上部署这个系统。
你要生成一个实时的热力图,来展示用户正在浏览和点击一个网页的哪些部分。在客户端和服务端分别需要哪些组件 / 服务 / API 来实现这个功能?
结语
我在本文中想要展示的是机器学习工程师面试的两个方面:情景侧和技术侧。我想强调一点,你不应该牺牲前者去追求后者。很多热爱机器学习的人往往沉浸在准备技术层面的问题上,而很少去考虑为什么这家公司会开发这么一个职位,为什么他们会想要机器学习作为解决方案,为什么他们会想要你。理解这些问题能够在你回答技术问题时提供情景,从而让你在诸多的候选人中脱颖而出成为最适合公司的人。