特稿 >

行业洞察 >

涨薪20%!听听这位资深机器学习面试官的内心独白

涨薪20%!听听这位资深机器学习面试官的内心独白

Xtecher原创 丨 行业洞察

21430
3093

2017-08-31

           微信图片_20170823095134.jpg

本文授权转自阿萨姆、许韩的知乎问答和文章,AI科技大本营整理。


编者按:在营长的众多死党微信群,营长发现,大家很爱谈论机器学习面试,也是,毕竟面试表现越好,银子也能谈得越高,能把自己卖个好价钱,当然关心了。

对于这个话题最为关注的,莫过于研究生毕业的孩纸,和有两、三年工作经验的孩纸。这群孩纸,有非常迫切的需求,想知道面试官都会问什么,毕竟这类岗位面试是很耗费精力体力的:面试会谈到各类技术知识,会有笔试、公式推导等。只有提前把相关的方面准备好,才可能在面试中给人留下深刻印象。据说,好的面试能给薪水带来20%的提升呢。一位有着两年工作经验的机器学习算法人告诉AI科技大本营。(营长注:工作年限更长,或者技术大牛,人妥妥的是被各家抢着挖的对象,去面试那是看得起你)

不过,对于毕业生来说,并没有什么经验,可能不知道该从哪些地方来准备面试;而有了一定面试经验的从业者,也希望能更清楚地了解面试官到底在想什么,哪些地方能加分,哪些地方是坑,这样就能更从容一些,并能在下次面试时大幅改进。

为此,营长找到了一篇非常接地气而又详尽的知乎帖子,专门谈机器学习的面试。这是一位经验非常丰富的机器学习技术面试官,他掏心窝子地吐露了作为考官,在面试中的感受、以及他会通过哪些地方、以哪种方式对求职者进行考察。

通过面试官的自我解剖,求职者能更清楚:哪些是加分项?哪些需提前准备?面试考题背后有哪些玄机?如何在面试中化被动为主动?如何清晰地将自己的水平讲出来?

此外,作者还提到了很多技巧,比如提前做好策划书,这是绝对的经验之谈和加分项,化被动为主动的利器,并鼓励求职者要抓住面试机会,多吸收这个特定领域的流行算法和模型,并借此发现自己在知识点上的缺失,因为这是很难在书本上学到的。

不过,总的来说,这篇文章偏向于算法人才的面试,里面提到的好些指导性原则,这其实还是需要结合长期的积累。别以为看完这篇,就完事大吉了。



进入正文



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


以下内容授权转自阿萨姆的知乎问答


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

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

不谈具体岗位的前提下,我想从以下几个问题来聊聊这个话题:


  1. 为什么要避免学科性的偏见 

  2. 如何测试面试者的知识广度 

  3. 怎样测试面试者的知识深度

  4. 为何需要确认基本的编程和数据分析能力

  5. 怎么提高机器学习面试成功率


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


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

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

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


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


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

1)数据处理:如何处理缺失数据(missing value)? 各种处理方法有什么利弊?


2)数据处理:如何将描述变量(categorical variables)转为连续变量(continuous variables)?

  • 如何处理有序变量?

  • 如何处理无序变量?


3)数据处理:如何进行选择特征选择?如何进行数据压缩?

  • 特征选择:包裹式,过滤式,嵌入式

  • 数据压缩:主成分分析,自编码等


4)模型解释: 试解释什么是欠拟合与过拟合?如何应对这两种情况?


5)模型解释: 什么是偏差与方差分解(Bias Variance Decomposition)?与欠拟合和过拟合有什么联系?


6)评估模型一般有什么手段?

  • 分类模型评估方法?

  • 回归问题评估方法?

  • 数据不均衡的评估方法?


7)深度学习是否比其他学习模型都好?为什么?


以如何处理缺失数据为例,可能的回答有:


  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. 根据岗位,准备一份项目策划书。这个乍听下来有点虚,但我曾无数次使用这个小技巧得到良好的面试反馈和机会。假设你今天面试的岗位是我提到的保险公司的反诈骗组,那么如果你可以写一个如何使用机器学习进行反诈骗的项目策划书。这个过程对于面试者也是一个练习: 


  1. 阅读论文和新闻收集材料的能力

  2. 总结分析的能力

  3. 总结的能力。


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


2.jpg


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

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


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

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


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


  • 对基本的数据处理方法有所了解

  • 对基本的分类器模型有所了解并有所使用(调包),大概知道什么情况使用什么算法较好

  • 对基本的评估方法有所掌握,知道常见评估方法的优劣势

  • 有基本的编程能力,能够独立的完成简单的数据分析项目

  • 有基本的数据挖掘能力,可以对模型进行调参并归纳发现


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


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

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

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


以上内容是知乎用户阿萨姆对“面试官如何判断面试者的机器学习水平?”的回答。

原文地址:

https://www.zhihu.com/question/62482926/answer/210531386





给你的面试加点料


学习了上边的内容,小编再给你的面试加点料。以下是一些比较干货的面试题,看看你能答对几道,挑战一下吧!


以下内容授权转自许韩VS许韩的知乎专栏


1. 什么样的资料集不适合用深度学习?(来自知乎用户抽象猴)


数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。

数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。


2. 用贝叶斯机率说明Dropout的原理(来自知乎用户抽象猴)


Dropout as a Bayesian Approximation: Insights and Applications

http://mlg.eng.cam.ac.uk/yarin/PDFs/Dropout_as_a_Bayesian_approximation.pdf


3. 何为共线性, 跟过拟合有啥关联?(来自知乎用户抽象猴)


Multicollinearity-Wikipedia

https://en.wikipedia.org/wiki/Multicollinearity


共线性:多变量线性回归中,变量之间由于存在高度相关关系而使回归估计不准确。

共线性会造成冗余,导致过拟合。

解决方法:排除变量的相关性/加入权重正则。


4. CNN最成功的应用是在CV,那为什么NLP和Speech的很多问题也可以用CNN解出来?为什么AlphaGo里也用了CNN?这几个不相关的问题的相似性在哪里?CNN通过什么手段抓住了这个共性?(来自知乎用户Naiyan Wang)


Deep Learning -Yann LeCun, Yoshua Bengio & Geoffrey Hinton

https://www.researchgate.net/publication/277411157_Deep_Learning


Learn TensorFlow and deep learning, without a Ph.D.

https://docs.google.com/presentation/d/1TVixw6ItiZ8igjp6U17tcgoFrLSaHWQmMOwjlgQY9co/pub?slide=id.p


The Unreasonable Effectiveness of Deep Learning -LeCun 16 NIPS Keynote

http://vdisk.weibo.com/s/AoN5oNl5t04h


以上几个不相关问题的相关性在于,都存在局部与整体的关系,由低层次的特征经过组合,组成高层次的特征,并且得到不同特征之间的空间相关性。如下图:低层次的直线/曲线等特征,组合成为不同的形状,最后得到汽车的表示。


3.jpg


CNN抓住此共性的手段主要有四个:局部连接/权值共享/池化操作/多层次结构。

局部连接使网络可以提取数据的局部特征;权值共享大大降低了网络的训练难度,一个Filter只提取一个特征,在整个图片(或者语音/文本) 中进行卷积;池化操作与多层次结构一起,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对整个图片进行表示。如下图:


4.jpg


上图中,如果每一个点的处理使用相同的Filter,则为全卷积,如果使用不同的Filter,则为Local-Conv。


5. 为什么很多做人脸的Paper会最后加入一个Local Connected Conv?(来自知乎用户Naiyan Wang)


DeepFace: Closing the Gap to Human-Level Performance in Face Verification

https://research.fb.com/wp-content/uploads/2016/11/deepface-closing-the-gap-to-human-level-performance-in-face-verification.pdf?


以FaceBook DeepFace 为例:


5.jpg


DeepFace 先进行了两次全卷积+一次池化,提取了低层次的边缘/纹理等特征。

后接了3个Local-Conv层,这里是用Local-Conv的原因是,人脸在不同的区域存在不同的特征(眼睛/鼻子/嘴的分布位置相对固定),当不存在全局的局部特征分布时,Local-Conv更适合特征的提取。


6. 广义线性模型是怎被应用在深度学习中?(来自知乎用户抽象猴)


A Statistical View of Deep Learning (I): Recursive GLMs

http://blog.shakirm.com/2015/01/a-statistical-view-of-deep-learning-i-recursive-glms/


深度学习从统计学角度,可以看做递归的广义线性模型。

广义线性模型相对于经典的线性模型(y=wx+b),核心在于引入了连接函数g(.),形式变为:y=g−1(wx+b)。

深度学习时递归的广义线性模型,神经元的激活函数,即为广义线性模型的链接函数。逻辑回归(广义线性模型的一种)的Logistic函数即为神经元激活函数中的Sigmoid函数,很多类似的方法在统计学和神经网络中的名称不一样,容易引起初学者(这里主要指我)的困惑。下图是一个对照表:


6.jpg


面试题目参考自:许韩VS许韩的知乎专栏

https://zhuanlan.zhihu.com/p/25005808


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

账号登录

重置密码

还没有账号?立即注册>

账号注册

已有账号?立即登录>注册企业会员

重置密码

返回

绑定手机