Py学习  »  机器学习算法

如何准备算法工程师面试,斩获一线大厂机器学习岗位offer?

AI科技大本营 • 4 年前 • 358 次点击  


作者 | 王喆

转载自知乎王喆的机器学习笔记


【导读】最近互联网公司的秋招如火如荼的进行,不少同学都会咨询关于面试和选择offer的事情,本文将分三个部分做一个全面的总结:1. 机器学习算法工程师的能力结构;2. 算法工程师面试中的一些不确定性因素和解决办法;3. 准备算法工程师面试的十条建议。


今年是我作为算法工程师工作的第七个年头,期间拿到过hulu,阿里巴巴,腾讯,美团以及一些startup的算法工程师offer,也作为面试官面试过清北,海外top30,北邮,以及一些二本学校等不同背景的百余位candidates,跟hulu的同事们一起写过一本书《百面机器学习》,作为面试者和面试官的经验还比较丰富。所以希望自己的经验对正在参加秋招的应届生和刚参加工作不久的同行们有所帮助。

既然我们的目标非常明确,就是斩获一线互联网公司机器学习岗的offer,那么在准备面试之前,我们首先要非常清楚:

一线互联网公司的机器学习岗对一名合格的算法工程师的要求应该是什么?


虽然每个岗位都有JD,但抛开具体的岗位需求,从稍高的角度看待这个问题,一名算法工程师的技术能力基本可以拆解成下面四个方面:知识、工具、逻辑、业务。

如果用技能雷达图的形式来展现机器学习岗相关的几个职位所需的能力,大致应如下图所示,大家可以初步体会一下。

机器学习相关岗位技能雷达图

简单来说,任何工程师都应该满足四项技能的最小要求,因为在成为一名合格的算法工程师之前,你应该是一名合格的“工程师”。我曾经面试过一位计算广告算法工程师职位的候选人,这位同学发过一些计算广告相关的paper和专利,从research的角度是不错的人选,但当我想验证一下他coding的能力时,他明确告诉我说他不愿意写代码。这就是不满足“工具”这项技能的最小要求,自然是不能通过面试的。

在最小要求的基础上,算法工程师的能力要求是相对全面的。作为算法模型的实现者和应用者,算法工程师在机器学习知识扎实的基础上,还应该具有算法的改进和实现的能力,因此工具和业务层面的要求也稍高。除此之外,大数据工程师更注重大数据工具和平台的改进,研究员则在知识和逻辑层面相对突出。有些临时抱佛脚的同学喜欢恶补知识,不注重理解业务和模型本身的内在逻辑,是我经常见到的面试“悲剧”情况。

当然,只用四个词描述四个方面的能力还是过于形而上了,这里我们用一些具体的内容来描述一下算法工程师的四个技能点:

  • 知识:主要是指你对 machine learning 相关知识和理论的储备
  • 工具:将你的 machine learning 知识应用于实际业务的工具
  • 逻辑:你的举一反三的能力,解决问题的条理性,发散思维的能力,你的聪明程度
  • 业务:深入理解所在行业的商业模式,从业务中发现 motivation 并进而改进模型算法的能力

也许还不够具体,那我们再从一些实际例子中体会一下,比如我去面试“计算广告算法工程师”的职位,上面四项对应着哪些具体的能力呢?

  • 知识:主流CTR模型以及预算控制,流量预估,bidding 策略等模型算法的原理和技术细节
  • 工具:coding 能力,spark、Flink、tensorflow、ps-lite 等模型训练、serving 相关工具
  • 逻辑:算法题,模型之间的演化关系
  • 业务:展示广告和搜索广告在构建模型时的区别和联系,如何根据公司的business model制定模型的 objective

当然,以上只是让大家体会一下这四项素质是什么,真实的计算广告算法工程师面试中,你不一定要都掌握,也不一定局限于这些内容。如果你遇到一位资深的面试官,他不会预设一个框架往面试者身上套,而是会从简历出发检验面试者能不能达到这四项素质的标准。所以为了能够有的放矢的准备算法工程师的面试,我们首先要清楚的是面试官是:

面试官会如何在"限定的时间内"检验你这四项素质能不能达到"技术合格"的标准呢?


既然是限定的时间,面试官就不可能拿出一本西瓜书,从头问到尾,也不可能拿出一本葫芦书,从 100 道面试题中抽出 50 道给你来个马拉松问答。面试官要做的是在 1 个小时的时间内确认你能力的"深度"和"广度"。所以在这里面试官就像一个采样算法,要从你脑子里采几个点,把你的能力雷达图描绘出来。
重点再重复一边,面试官会从“深度”和“广度”两个维度构建你的能力雷达图。

对于"深度"方面,有经验的面试官会从你已经做过的项目中挑出你最擅长的部分做层次式的递进。

比如一位面试同学介绍自己实习时候用过 XGBoost 预测股票涨跌,那面试官可能会由浅入深依次考察下列问题:

  • GBDT 的原理(知识)
  • 决策树节点分裂时是如何选择特征的?(知识)
  • 写出 Gini Index 和 Information Gain 的公式并举例说明(知识)
  • 分类树和回归树的区别是什么?(知识)
  • 与 Random Forest 作比较,并以此介绍什么是模型的Bias和Variance(知识)
  • XGBoost 的参数调优有哪些经验(工具)
  • XGBoost 的正则化是如何实现的(工具)
  • XGBoost 的并行化部分是如何实现的(工具)
  • 为什么预测股票涨跌一般都会出现严重的过拟合现象(业务)
  • 如果选用一种其他的模型替代 XGBoost 或者改进 XGBoost 你会怎么做,为什么?(业务+逻辑+知识)

这是一条由简历出发,由“知识”为切入点,不仅考察了“知识”的深度,而且还考察了“工具”、“业务”、“逻辑”深度的面试路径。

当然,如果你介绍的项目是实现了一种类似阿里 DIN 的 CTR 预估模型。那么问题路径可能是这样的:

  • softmax 函数的定义是什么?(知识)
  • 深度神经网络为什么会产生梯度消失现象,如何解决它?(知识)
  • 常见的激活函数有哪些?都有什么特点?(知识)
  • 挑一种激活函数推导梯度下降的过程。(知识+逻辑)
  • Attention 机制什么?(知识)
  • 阿里将attention机制引入推荐模型的动机是什么?(知识+业务)
  • DIN中将用户和商品进行了embedding,请讲清楚两项你知道的embedding 方法。(知识)
  • 推荐系统中 embedding 技术都可以有哪些应用?(业务+知识)
  • 你如何 serving 类似 DIN 这样的深度学习模型(工具+业务)

这条路径侧重于考查“知识”深度的路径。为了弥补其他方向考察的不足,面试官肯定还会问一个从工具或者业务出发的问题来确定你其他方面的深度。

因为面试官选择的是你最熟悉的领域深入下去,我们可以假设,如果一位面试者在最擅长的项目中都答不上一些细节性的问题,那几乎可以肯定你在任何其他领域的钻研都不够深入,你的技能雷达图的面积肯定是一个很小的面积。也有像我之前所提到的一些临时抱佛脚的面试者,也许知识方面达到了要求,但经不起面试官对“工具”和“逻辑”的考察,这也毫无疑问会“悲剧”。

如果面试者的能力深度达到了最低的要求,下一步面试官会确定你能力的广度,对于任何算法工程师,我都会随机check以下知识点中的几个:

  • NN,RNN,个别聚类算法,模型评估等知识的理解程度
  • spark的调优经验,model serving的主要方法,parameter server的原理
  • GAN,LSTM,online learning的基本理解
  • embedding方法,attention机制,multi task,GNN,reinforcement learning,online learning的基本理解

对于广度的检查是比较随意的,个别答不上来无伤大雅,但如果超过一半以上的知识点都miss了,可能有点说不过去。因为面试官要知道你是一个关注前沿,喜欢学习的人,试想除了你自己做过的项目,其他知识了了,那可以肯定你不是一个对技术有热情的人。很多面试官很看重“热情”这个属性,因为正是对技术的热情支撑你今后的学习,有些问题你可能不知道,你也要尽量用自己的理解去推导,去讨论。

以上基本包括了所有技术方面的面试内容,但在实际的面试过程中,往往存在着不少技术之外的因素影响着面试结果,很多同学觉得面试是一门“玄学”,但其实玄学背后也有迹可循,所以下面我希望介绍一下影响面试结果的其他因素。

除技术能力外,其他影响面试结果的要素有哪些?


一、与面试官的互动

站在面试官的角度,我经常把面试官给候选人“strong yes“的根本原因归结为一句话“找到了一个技术合格且愿意一起工作的人”。

所以面试通过要满足两个基本要求,一是“技术合格”,二是“愿意一起工作”,二者缺一不可。所以在你技能合格的前提下,面试官愿不愿意与你一起工作就成了一个关键且略主观的问题。

但这看似"草菅人命"的标准其实是有背后的逻辑的。往俗了说叫做看看candidate投不投缘,往大了说叫做符不符合公司文化,往实在了说,是要check你是不是能够顺利的与同事交流协作,得出合理的技术解决方案。

为了验证你未来会不会是一个合适的同事,面试官通常会用抛出一些开放性的问题与你讨论,这个问题可能来自一些业界通用的问题,比如请你设计一个电商主页商品类别排序模型;也许会来自一些生活中的算法,比如请你设计一个微信随机抢红包时生成红包金额的算法或机制;还有可能就来自面试官的工作实践,比如在构建CTR模型的时候,如何解决样本数据被模型影响产生bias的问题。

这类题的特点很明显,非常开放和发散,开放到题目本身并不清楚。正是因为不清楚,所以面试官希望面试者主动提问题,一起协同设计一个模型或系统来解决问题。在这样的前提下,有下面两类candidate可能会被无情的拒掉:

1. 面试过于被动,被面试官生硬的推着走。


比如针对“微信抢红包”这个问题,有的面试者就一句话,“每次用一个随机数生成器生成一个红包金额不就行了”。如果是这样的话,面试官根本无法了解你作为一名工程师的严谨性。面试官为了让你继续下去,还要向你提问,比如是否考虑过没有红包金额的总体分布问题?等等。而面试官期待的是这个问题被你推动着走下去。比如在问题不太清楚的前提下你应该反问面试官,每个红包的金额有没有上限和下限?需不需要考虑计算效率问题?我能否在红包产生时就预算好所有红包的金额等等。


2. 思路受限,没有严谨性、开放性和创新性。


在实际的工程问题中,解决一个问题不可能只有一个solution,解决一个问题的solution也不可能是一句话能说清楚的。比如我想跟你讨论一下如何设计一个电商主页商品类别排序模型。看到这个问题,很多人会直接说我想用 DNN 建一个 CTR prediction模型来排序。这当然可以,但最好请你抛出这个解决方案的时候严谨地系统地想一想这个问题,顺着工程实现的思路去跟面试官讨论下去。


比如:1、都能得到哪些数据和 feature;2、数据量有多大,数据延迟有多大;3、objective 如何制定;4、结合具体业务,我能不能把商品类别当作一个item来对待,或者把类别内部的商品当作一个 item 来对待;5、我能否使用 learning to rank /ctr prediction/ 多分类模型来解决这个问题;6、采用什么模型架构更适合这个问题。等等。在实际面试中,你可能无法想的这么细,体会意思即可,作为算法工程师,你应该足够严谨、开放、活跃、创新。


二、不是你不够优秀,而是你的技能树无法精确满足当前 position 的要求

这个问题在社招的情况下尤为突出。很多资深的工程师说感觉面试表现不错,算法题最优解,设计题聊半天,面试官全程微笑,就是不发 offer。这样的情况很大可能就是你的经验不能精确符合职位要求。

有些情况下公司对面试者的工作经验的要求是精确到系统模块级别的。同样是计算广告算法工程师,我们团队可能就想招一个做 yield optimization 或者“预算控制”算法的,你说你搞CTR搞得风生水起,但你没搞过这个方向,不能即插即用,那只能对不起。再比如我是一个推荐系统team的主管,团队最近在上 TensorFlow Serving,想找一个有相关经验的同学,你说你只做过 TensorFlow 离线训练,那也可能不符合我的要求。

在进行这种目的性很强的招聘时,面试官往往更加注重业务经验的沟通,如果面试官不检查基础知识,不检查算法题,甚至不管你过往的工作经验,而是一直从自己的角度出发着重问某一方面的业务知识,那么大概率他们有比较窄的招聘需求。

这类问题有没有解决的办法?其实是有几点大家可以注意的,在找工作之前还是要尽可能的多读几遍JD,找到那些跟一般JD有区别的,或者JD上明确写的“最好有 XXX 经验”,看与自己的经验是否匹配;有条件的 candidate 可以多跟猎头或者对方 hr 沟通一下,能够找到内推渠道的同学可以找团队的成员了解一下内幕消息,都是很有必要的。

三、不可抵抗力

不可抵抗力发生的情况虽然概率比较低,但也不是没有,特别是在目前市场较为“寒冬”的背景下。曾经 BAT 中的某一家就因为某些事件停止过一段时间的社会招聘,导致一些正在沟通中的 offer 全部作废的情况。另外在 offer 沟通的周期中,也有可能发生同样职位遇到更合适人选的情况,你无法掌握所有竞争者的情况,在书面 offer 发出前,一切变化都有可能发生。

准备算法工程师面试的十大忠告


以上的内容总结了所有机器学习岗面试的目的、方法,以及影响最终 offer 的一些要素。我们这里用一个框图来总结一下这些内容:


也许到这里我终于可以正面回答文章题目中的问题了——如何准备算法工程师面试,斩获一线互联网公司机器学习岗offer?在之前列出的所有面试知识的基础上,这里再给大家列出十个注意点:

  1. 打牢基础知识。推荐几本书《机器学习》周志华/《统计学习方法》李航+《百面机器学习》,一本系统学习知识点,一本针对面试查漏补缺,完全够了;
  2. 注意总结自己的实习项目和实验室项目,做到清楚所有技术细节,简历上列出的经历、模型、熟悉的工具语言也要有备而来,面对面试官的追问从容应对;
  3. 平时注重一些机器学习流行工具使用经验的积累,最少要熟悉下面两项 spark/flink, tensorflow/pytorch,一个做大数据处理,一个做模型的训练;
  4. 刷算法题,不用多解释;
  5. 尽早确定细分求职方向,广告/推荐/搜索/图像/NLP/语音,读业界的blog,分享,论文,积累对业务场景和解决方案的理解;
  6. 面试时积极提问,积极互动;
  7. 针对开放问题,提供多种解决方案,即使不成熟也不要紧,关键在于讨论和形成可行方案的过程;
  8. 投简历之前,熟悉JD,想办法找到对这个团队有所了解的人,获得一些岗位相关信息,做到经验和职位匹配;
  9. 轮到自己提问时,问一些公司相关的话题,不节外生枝,不提奇怪的问题;
  10. 不抱侥幸心理,强者运强。

事实上,以上所有注意点在找工作实习之前就应该开始准备,所以如果是明年参加秋招的同学,也应该提前有的放矢,增强相关的积累。

最后,祝大家拿到满意的offer。


原文链接:

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


(*本文为 AI科技大本营转载文章,转载请联系作者)



福利时刻



入群参与每周抽奖~


扫码添加小助手,回复:大会,加入福利群,参与抽奖送礼!



AI ProCon 2019 邀请到了亚马逊首席科学家@李沐,在大会的前一天(9.5)亲授「深度学习实训营」,通过动手实操,帮助开发者全面了解深度学习的基础知识和开发技巧。还有 9大技术论坛、60+主题分享,百余家企业、千余名开发者共同相约 2019 AI ProCon!5折优惠票抢购中!      

      


推荐阅读


你点的每个“在看”,我都认真当成了喜欢
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38281
 
358 次点击