面试官如何判断面试者的机器学习水平?

或者,你遇到过的水平最高的机器学习面试是什么?
关注者
4,529
被浏览
284,636

17 个回答

收录于编辑推荐 ·

不邀自来:)

首先这个问题问的很广。做机器学习方向很多,有些公司更偏重于数据挖掘,而有些更倾向于深度学习。同理,相对应的岗位有些偏重理论也有些偏重实践。这些因素叠加造成了机器学习相关的岗位分布广,如数据分析师,算法工程师,机器学习科学家等,很难一概而论

大概从实习生的时候就开始根着老板招聘面试机器学习方向的候选人,到现在前前后后大概也参与了20个左右机器学习求职者的技术面试。其中有在读的研究生(实习生岗位),也有已经工作了多年或者学术背景深厚的名校博士(相对高级的“科学家”岗位)。

不谈具体岗位的前提下,我想回答以下几个问题: 1.为什么要避免学科性的偏见 2. 如何测试面试者的知识广度 3. 怎样测试面试者的知识深度 4. 为何需要确认基本的编程和数据分析能力 5. 怎么提高机器学习面试成功率

-------------------------------------------------------------------------------------

1. 避免学科间的偏见与歧视

机器学习作为一个交叉广度大,各学科融合深的学科,各种背景的面试者都有。我建议一定不要预设立场,无论是数学、统计、物理、计算机,或是其他学科的面试者都有独特的知识储备。比如机器学习其实和统计学习有很大部分是重叠的,甚至和优化(如运筹学)、数学(线代等)也有很多相关的地方。而不同领域的人对于同一件事情的描述可能是相似但不相同的,甚至连叫法都不同。举个简单的例子,统计学将变量叫做predictors而机器学习倾向于将其叫做feature(特征)。我听说过很多面试官就因为对方不能完全的使用他能听懂的术语就拒掉了候选人,我觉得这个是愚蠢的

以我们团队为例,我的老板是统计学博士和教授(偏计量),而我是纯粹的计算机科学出身。他喜欢用R来建模而我只擅长Python和C++。但正是这种差异性让我们可以更好的合作,他在无监督学习中很喜欢用各种密度分析(density estimation)或者对分布直接进行拟合,而我可以给他介绍很多机器学习方向比较流行的算法,比如Isolation Forests。同理,Python和R都有各自擅长的领域,比如Python做时序分析的难度就远远大于R,因为R有非常成熟的package。

因此,我们不要因为领域不同,叫法不同,编程语言不同,或者模型的解释思路不同就轻易的否定一个面试者。长此以往,我们的思路会越来越窄,而一定程度的包容能拓展思路。

2. 通过广度测试划定面试者的知识面

机器学习的项目一般都牵扯数据处理,建模,评估,可视化,和部署上线等一系列流程我们希望面试者对于每个步骤都有最基本的了解。因为其范围很广,我们希望首先在短时间内了解一个面试者的知识范围。有很多基本但经典的问题可以用于了解面试者的素质,给出一些例子:

  • 数据处理:如何处理缺失数据(missing value)? 各种处理方法有什么利弊?
  • 数据处理:如何将描述变量(categorical variables)转为连续变量(continuous variables)?
    • 如何处理有序变量?
    • 如何处理无序变量?
  • 数据处理:如何进行选择特征选择?如何进行数据压缩?
    • 特征选择:包裹式,过滤式,嵌入式
    • 数据压缩:主成分分析,自编码等
  • 模型解释: 试解释什么是欠拟合与过拟合?如何应对这两种情况?
  • 模型解释: 什么是偏差与方差分解(Bias Variance Decomposition)?与欠拟合和过拟合有什么联系?
  • 评估模型一般有什么手段?
    • 分类模型评估方法?
    • 回归问题评估方法?
    • 数据不均衡的评估方法?
  • 深度学习是否比其他学习模型都好?为什么?

以如何处理缺失数据为例,可能的回答有:1. 分析缺失比例决定是否移除 2. 用均值,众数,回归代替 3. 用0代替等。比如深度学习是否比别的模型好,我们就期待面试者能说“分情况讨论”,若是能提到“没有免费的午餐定理”更是加分。在这个阶段,我们不会深入追问,仅想对面试人的知识范围有一个了解。

这类问题的共性就是无论你是在校学生还是资深科学家都应该有一个基本的水准在,不过没有必要百分之百的回答正确,因为本身很多答案都没有标准答案。大部分时候,这个环节我们对于是否录用这个人就已经有了答案。如果面试者答错或者不知道其中百分之八十的概念,录取的概率就很低了。

3. 根据岗位和求职者背景进行深入挖掘

在经过上一阶段以后,我们已经对求职者的素养有了大概的判断,下一步就需要进行深入了解,一般根据两点进行追问:

  • 面试者的背景: 如果有与岗位特别相关的工作经历,会深入询问。如果有高引用了的文章,也会让他讲一下他的研究。
  • 所面试的岗位: 如果没有与岗位特别相关的经历,会根据岗位需求进行询问。

进入这个环节其实就已经没有模板了。假设我们现在要为保险公司招聘一个机器学习工程师来自动化"骗保检测",我们的求职者是一位计算机系刚毕业的硕士生。那我们可能深入询问的话题包括:

  • 在只有少量的有标签数据的情况下,如何构建一个反保险欺诈系统?
  • 如果面试者回答先用监督学习来做,那么我们可能问:
    • 这种情况下数据是不均衡的,你是采用过采样还是欠采样?如何调整代价函数和阈值?
    • 如果面试者提到了集成学习,那么也会追问一下问什么集成学习适合数据不平衡。
  • 如果面试者回答用无监督学习,那我们可能会问:
    • 比如使用One-class SVM?那么我们可能会追问一下SVM相关的问题,比如什么是最大间隔分类器啊什么是Kernel,如何选择Kernel等。
    • 为什么K-Means不适合异常值检测?K-Means和GMM是什么关系?是否可以用FMM来直接拟合异常值。
    • 如何可以得到无监督学习中的分类规则?

这一类问题的特点是随机应变,一般都是在一个方向上深入。比如其他答案提到的L1和L2正则化,我们可能希望面试者在白板上画图介绍为什么L1可以得到稀疏解,以及和嵌入式特征选择有什么联系。这一类问题我们不期待求职者完全答对或者讲得清楚无误,我们同时也想观察其在压力和追问下的心理素质因为整个过程中肯定会有一些知识盲点,我们会尽量避免尴尬的气氛,所以作为求职者不必过分紧张。同时,通过和面试者一起了解他/她曾做过的项目,可以看出其对于这个专业的兴趣 -- 兴趣是很难演出来的。

在这个环节,如果一个面试者可以有能力进入深入交谈,甚至提到一些我们从来没想过的思路,都是加分的表现。

4. 基本的编程能力和数据挖掘能力

机器学习岗位,不管你是统计出身还是计算机出身,都避不开建模的过程,因此基本的编程能力是必须的。一般对于数学或者统计学出身的面试者,我们会额外给出一个简单的小程序测试。这种小程序可能简单如将读取数据后并保存为矩阵。这倒不是因为我们喜欢没事找事,而是因为机器学习太容易成为纸上谈兵,而从业者缺乏最基本的编程能力。

相似的,我们也希望面试者谈谈从模型中可以得到什么结论。我们曾把Kaggle上泰坦尼克的那个数据集处理过以后,让面试者谈谈幸存率到底和什么有关,如何分析。同样的,我们不追求完美答案,只是希望看到求职者可以解释一些简单的模型结果,从中攫取商业价值。

5. 让面试者有所收获 & 如何准备机器学习面试

面试不该是一场单纯的考试,在参加面试的过程中,也是一个学习过程。抛砖引玉,对于机器学习的岗位面试我有几点小建议:

5.1. 根据岗位,准备一份项目策划书。这个乍听下来有点虚,但我曾无数次使用这个小技巧得到良好的面试反馈和机会。假设你今天面试的岗位是我提到的保险公司的反诈骗组,那么如果你可以写一个如何使用机器学习进行反诈骗的项目策划书。这个过程对于面试者也是一个练习: a. 阅读论文和新闻收集材料的能力 b. 总结分析的能力 c. 总结的能力。

以我曾经面试过的一个人力资源相关的岗位为例,我准备了一份如何用机器学习来进行员工离职预测的策划书(中间省略掉了几页并马赛克处理了敏感的地方):

在策划书中,你可以分析项目需求,提出相关解法,并建议后续计划和列出相关文献。这样的行为不仅可以让雇主看到你的诚意,并看到你的的领域知识和独立分析问题能力

在适当的时机(比如开始面试的时候或者谈到岗位职责的时候),你拿出准备好的策划书,开始谈你的思路。这种做法我曾做过几次,效果都很惊艳,因为反被动为主动,从被考察变成了讲解你所了解的知识。作为一个面试官,如果被面试者能做到这个程度,我会在内心对录取他比较有信心。

5.2. 真诚并且实事求是

大家都是理工科出身,行家一出手便知有没有。在这种技术性比较强的学科,完全没有必要假装自己了解一个知识点。同理心告诉我们,大部分人都有知识盲区,我们不期待完美的回答。当你真的不知道一个问题的答案时候,真诚的希望对方能讲得更明白或者承认自己不太了解。

如果你假装自己很了解一个不明白的领域,我们一般会问的更深入。你成功的引起了我的注意,那个时候就真的收不了场了。相似的,简历上请真的不要夸大其词的描述自己的经历。我见过很多人只用过Naive Bayes就在简历上号称自己是机器学习专家,我现在还记得他被面试到面红耳赤的样子。在这个浮躁的年代,对于高薪的机器学习岗位,希望大家都能守住最起码的诚信底线

5.3. 确保自己对基本的概念有所了解

再一次,保证对基本知识的了解(有基本的广度)是对面试者自己和面试官的尊重。什么程度就算基本了解呢?我的感受是:

  • 对基本的数据处理方法有所了解
  • 对基本的分类器模型有所了解并有所使用(调包),大概知道什么情况使用什么算法较好
  • 对基本的评估方法有所掌握,知道常见评估方法的优劣势
  • 有基本的编程能力,能够独立的完成简单的数据分析项目
  • 有基本的数据挖掘能力,可以对模型进行调参并归纳发现

其中每一条都说来简单,但都是血与泪的过程,请勿操之过急。如何就能保证自己有了足够的基础知识呢?我觉得能基本看懂周志华老师《机器学习》的前十章,并相对熟练的使用Sklearn中基础的API进行建模就可以了。也请勿矫枉过正,如果你面试的岗位不是理论性科学家岗位,不要和数学推导死磕。这也是为什么我说写一个项目策划书很有帮助,在查阅文献和总结的过程中,你对想要面试的领域有了更加深刻的了解,有助于提高信心和知识。

5.4. 享受面试

请不要把技术面试当做一场噩梦,或是一个难关。作为一个冉冉升起的新领域,我们大家都是这么一路摸爬滚打过来的,至少我自己是很理解这一路的不容易。

因为机器学习领域的人才稀缺,一般而言你的面试官的时间都是很宝贵的,即使你最终没有通过面试,请抓住机会从他们身上有所学习的机会。从我的角度来看,你不仅可以借此发现自己知识点上的缺失,也可以听到在特定领域的流行的算法和模型,这些都是从书上很难学到的。如果你为了准备面试还阅读了相关领域的论文和总结,那我想来面试这件事已经远远超过了你是否被录取的意义。

路漫漫其修远兮,吾将上下而求索。与君共勉:)

谈谈最近校招面试的感受(作为某厂面试官),最近一周多面了20多个(视频加现场)。

我们这个团队以AI应用为主,又是新项目,所以校招的目标不是ML Scientist,是需要有工程实践能力,能够在具体相关业务中应用机器学习算法,并能跟进较新科研成果,和专职的ML Scientist对接的类似RSDE(研发工程师,Research Software Development Engineer)这样的角色,实际点来说就是:

  • 能动手写代码(首先是个工程师,再者来说以现在DNN越来越复杂的情况,代码能力不过关,很难想象具有潜力去修改优化调整这么复杂的网络结构)
  • 真的理解机器学习原理,不是在背书;
  • 能跟进较新科研成果的表现就是最好在相关领域发过paper,不要求顶级会议或journal,发过就行,起码证明你是经过这么个流程,总结过某种想法的;

能达到这些标准的话就不错了,然后一般分四步这么考察:

  1. 背景了解

先讲讲最近项目,别瞎吹画饼,就说说上一周你都每天在干嘛。这样一般就把很多人简历上牛逼哄哄的做了什么国家部门的大数据挖掘项目啊,对啥算法做了什么什么巨大的优化啊,或者做了什么公司的某fancy project之类的简化到可能就是手工给数据分类,或者比较不同模型(别人给的)的performance,或者好一点把CNN相关的某个现有开源代码实现去掉某个层或者改了几个参数在尝试(当然不是说就不好,其实也可以),或者做A/B测试看效果。当然其实都行,不是说做哪个就比哪个差了,但是马上就会有这人到底做了些啥的具体形象。

这一步对硕士生很管用,对phd不能这么搞。个人对phd首先会看看他的paper,大部分时候对国内phd会发现大部分paper都是把一个东西翻来覆去到处发灌水,这没啥,理解,主要是搞清楚他读博期间主要在研究啥,然后会看一下summary,具体有个了解。比较有意思的是很多phd的简历上没写几篇paper,不知道是觉得工业界求职不需要呢还是咋回事,没写paper的话我觉得你这phd白读了啊。。。如果看到做的paper有意思,面试开始时个人主要去了解下对方对做应用开发为主的工作怎么看,如果不感兴趣就算了----一般来说,女生都会强调想做research,男的好一些。不过有几次遇到一些压根没发什么paper的phd学生说他们想做学术研究,尼玛,老子当时就想你这paper比老子还少,做个毛的research啊。。。


2. 基本原理

经过上面第一步,差不多确认了两个人可以有在一起的意愿,然后就对方提到的近期工作内容中具体的一些细节让他讲一下。机器学习覆盖面太广,和具体业务结合也比较紧,所以尽量往自己知道的地方去靠拢。比如对方如果说主要做的是数据前期准备,就问问数据哪来的,怎么处理的,遇到什么问题,要不要做normalization啥的具体怎么做的;遇到说做优化的,就问问在优化什么东西,比如遇到过一个说在对比不同梯度下降算法并进行优化,就叫他讲讲对比了哪些梯度下降算法,然后在里面挑一两个让他解释原理,最好能画出来推导过程。反正就是一边听对方讲做的项目,一边看有啥可以深挖的(自己能判断正误的)

遇到那种讲说在优化(调参)CNN相关网络结构的比较麻烦,因为没有对方的实际数据,并不能确定他说得对不对,他说他去掉YOLO啥的某个层就怎么怎么了也不好判断,只有大概问问dropout啊maxout啊这些用没用或者改没改,结果如何是什么原因,这种我个人只是用来判断他的表达和逻辑能力。


3. Show me the code

毕竟是RSDE面试,不是Research Scientist,所以对Scientist一般会有前沿技术或者更深入的理论讨论,再说也有专门做某个具体方向的同事在其他面试环节里去针对性了解。在我这里,前面花个15-20分钟口头交流下理论就可以了,后面重头戏是动手coding.

首先,既然到了这一步,说明对方是声称对神经网络和机器学习有实际经验和细节理解的,那就来动手实现个基本的神经网络吧。我会给一组训练数据,让对方不用什么tf/caffe/pytorch框架,就用基本的python+numpy写一个基本的,可运行的网络实现出来。这一步足可以刷掉目前约2/3的面试人员,其中硕士生大多写不出来,phd倒没啥问题,但是存在实现速度的差异,有几个虽然写出来了,但是面试时间也到了。

我觉得比较有趣的是很多面试者声称熟悉各种activation function并能合理选用,口头解释的时候倒背如流,到了具体实现的时候大多会卡住,说不记得sigmoid的导数结果或者relu或者什么的,不知道如果不用现成框架的话怎么去实现导数。反复给他们说这没关系,重点是先搞个可以跑的网络,activation后面我们再来讨论, 这帮子人就卡住了,不知道该怎么进行-----晕,不是自称能灵活选用么,选一个你知道怎么求导并实现的啊。

其他问题包括压根不知道怎么开头啊,有明显眼光在看书抄(大部分是视频面试共享桌面)写出来的根本不是我给的数据啊,或者写出来的思路正确但是是pseudo code啊(这种其实还可以忍受),各种问题吧。

当然好的也有,印象比较深的是一个phd写完后直接跑我给的数据(其实是我乱写的一堆数据,里面有些问题),发现gradient始终为0,现场debug分析并发现问题后,自己做了一些对数据的处理通过,我觉得还是蛮不错的,这么短时间内相当于把特征工程和网络实现及测试整个流程演示了一遍;另外一个acm亚洲奖牌得主10分钟实现并搞定,这尼玛让老子哑口无言,搞得只好直接进入常规刷题算法环节。

实现NN网络这步完成后看情况,有些直接实现SGD/mini batch的,就直接走后面环节了;不然的话会叫他改成mini batch形式;


4. 常规算法

这步没啥好说,最开始有耐心的时候,如果上面的简单网络没有实现,还会耐心地让对方做个lc easy难度的题目,后来也不客气了,上面做不出来就谢谢对方然后bye bye。如果做出来了,时间还有,会给一个lc medium难度的看看。

不要觉得lc medium简单,现场面试没有跑了代码再改的机会,从实现速度到代码清晰程度都能看出问题,不管是acm奖牌得主还是noip选手,目前还没看到bug free写出来的。


基本上是这么个流程,当然不是这么死板,里面会根据对方的回答和代码实现过程引很多问题出来,这个就不能一概而论了。

另外这个流程可能适合团队人手不足没有足够面试人员,或者像对于校招这种面试环节不够难以全面深入考察的情况,所以在一次面试中覆盖内容较广,找到对方比较适合的方向,然后根据结果让具体负责该方向的同事再深入考察,这样基本在两轮之后可以有一个比较清晰的判断。

************************************************

btw,我们也社招,欢迎有三年以上实际项目的ml专家作为lead加入,私信联系。