作者|汪哲
最近互联网公司的秋季招聘如火如荼,我也收到了很多同学关于面试和offer选择的咨询。因为之前的专栏和一些回答已经介绍了一些相关的经验,所以本文会做一个全面的总结。

本文将分为三个部分:
1.机器学习算法工程师的能力结构;
2.算法工程师面试中的不确定因素及解决方法:
3.准备算法工程师面试的十点建议。
今年是我从事算法工程师的第七个年头。在此期间,我收到了hulu,阿里巴巴,腾讯,美团和一些算法工程师创业公司的offer。我还面试了100多位不同背景的考生,比如清北,海外30强,北邮,还有一些二本学校。我和hulu的同事写了一本书《100张脸的机器学习》。我有丰富的面试和面试经验。所以希望我的经历对正在参加秋招的应届毕业生和刚参加工作的同事有所帮助。
既然我们的目标很明确,就是拿到一线互联网公司的机器学习岗offer,那么在准备面试之前,我们首先要非常明确:
一线互联网公司的机器学习岗位,合格的算法工程师需要具备哪些条件?
虽然每个岗位都有JD,但抛开具体的岗位要求,从稍微高一点的角度来看这个问题,一个算法工程师的技术能力基本可以分解为以下四个方面:知识、工具、逻辑、业务。
如果用技能雷达图来展示机器学习岗位相关的几个岗位所需要的能力,应该大致如下图所示,可以有个初步的体验。
学习机器相关工作技能的雷达图
简单来说,任何一个工程师都要满足四项技能的最低要求,因为你要成为一名合格的“工程师”,才能成为一名合格的算法工程师。我曾经面试过一个算法工程师计算广告职位的候选人。这位同学发表了一些计算广告相关的论文和专利,从研究的角度来说是个不错的人选。但当我想测试他的编码能力时,他明确告诉我,他不愿意写代码。也就是说,如果你达不到“工具”这个技能的最低要求,你自然无法通过面试。
在最低要求的基础上,算法工程师的能力要求比较全面。算法工程师作为算法模型的实现者和应用者,要有在扎实的机器学习知识基础上改进和实现算法的能力,所以对工具和业务水平的要求略高。除此之外,大数据工程师更注重大数据工具和平台的完善,而研究人员在知识和逻辑方面相对突出。有些填鸭式的学生喜欢为了知识而填鸭式,不注重理解业务的内在逻辑和模式本身,这是我在面试中经常看到的“悲剧”。
当然,只用四个字来形容四个方面的能力,未免太玄乎了。这里我们用一些具体的内容来描述算法工程师的四个技能点:
知识:主要是指你对机器学习相关知识和理论的储备工具:将你的机器学习知识运用到实际业务中的工具逻辑:你的举一反三的能力,你的有组织的解决问题的能力,你的广泛思考的能力,你的智力。业务:对你所在行业的商业模式的深入了解,从业务中发现动机进而改进模型算法的能力可能还不够具体,那就从一些实际的例子来体验吧,比如我面试“计算广告算法工程师”这个职位。以上四项分别对应哪些具体的能力?
知识:预算控制、流量估算、竞价策略等主流CTR模型和模型算法的原理和技术细节。工具:编码能力,spark,Flink,tensorflow,ps-lite等模型训练,以及serving的相关工具。逻辑:算法问题,模型之间的进化关系。商业:展示广告和搜索广告在建筑模型上的区别和联系。当然,以上只是让大家知道这四种素质是什么。在《算法工程师》真正的计算广告面试中,你不必全部掌握或者局限于它们。如果你遇到一个资深面试官,他不会给面试官预设一个框架,而是会从简历中测试面试官是否能达到这四个质量标准。因此,为了有针对性地准备算法工程师的面试,我们首先要明确面试官是:
面试官将如何在“有限时间”内测试这四项素质是否能达到“技术合格”的标准?
既然是有限的时间,面试官不可能拿出一本西瓜书,从头到尾提问,或者拿出一本葫芦书,从100个面试问题中抽出50个问题给你一个马拉松式的问答。面试官需要做的是在一个小时内确认你能力的“深度”和“广度”。所以在这里,面试官就像一个抽样算法,从你的头脑中抽取几个点,画出你能力的雷达图。
重复重点,面试官会从“深度”和“广度”两个维度来构建你的能力雷达图。
至于“深度”,有经验的面试官会从你已经做过的项目中挑出你最优秀的部分,分层次递进。
例如,如果面试官介绍自己在实习期间用XGBoost预测了股票的涨跌,面试官可能会按照由浅入深的顺序考察以下问题:
例如,如果面试官介绍自己在实习期间用XGBoost预测了股票的涨跌,面试官可能会按照由浅入深的顺序考察以下问题:
GBDT原理当决策树节点分裂时你如何选择特征?写出基尼指数和信息增益的公式,并举例说明分类树和回归树的区别。对比随机森林,介绍什么是模型偏差,VarianceXGBoost的参数整定是什么体验。XGBoost的正则化是如何实现的?XGBoost的并行化是如何实现的?为什么预测股票涨跌会出现严重的过拟合现象?如果选择另一个型号替代XGBoost或者改进XGBoost,你会怎么做?为什么?这是一条面试路径,从简历开始,从知识开始,考察的不仅是知识的深度,还有工具、业务、逻辑的深度。
当然,如果你介绍的项目是实现一个类似阿里DIN的CTR预测模型。那么问题路径可能是这样的:
max函数的定义是什么?深度神经网络为什么会产生梯度消失,如何解决?有哪些常见的激活功能?有什么特点?选择一个激活函数来推导梯度下降的过程。注意机制。什么?将阿里关注机制引入推荐模型的动机是什么?DIN嵌入了用户和商品。请解释你知道的两种嵌入方法。嵌入式技术在推荐系统中可以有哪些应用?如何服务DIN这样的深度学习模型?这条路径侧重于考察“知识”深度的路径。为了弥补其他方向考察的不足,面试官肯定会从工具或者业务的角度问一个问题,来确定你其他方面的深度。
因为面试官选择的是你最熟悉的领域去深入,我们可以假设,如果一个面试官不能回答他最擅长的项目中的一些细节问题,那么几乎可以肯定的是,你在其他任何领域的研究都不够深入,你的技能雷达图的区域一定是一个非常小的区域。也有一些面试官像我之前提到的那样临时抱佛脚。也许他们的知识已经达到要求,但却经不起面试官对“工具”和“逻辑”的考查,这无疑会“悲剧”。
如果面试官的能力深度达到最低要求,面试官会在下一步决定你能力的广度。对于任何一个算法工程师,我都会随机检查以下几个知识点:
神经网络、RNN、个体聚类算法、模型评估等。知识理解程度spark的调优经验,模型服务的主要方法,参数服务器的原理GAN,,在线学习嵌入法的基本理解,注意机制,多任务,,强化学习的基本理解,在线学习,对于广度的考查是比较随意的,有些答不上来也不痛。但是如果错过了一半以上的知识点,可能就有点说不过去了。因为面试官需要知道你是一个关注前沿、喜欢学习的人,只要想想自己做过的项目之外的其他知识,就可以确定你不是一个对技术充满热情的人。很多面试官都很看重“热情”这个属性,因为正是对技术的热情支撑着你未来的学习。有些问题你可能不知道,你要试着用自己的理解去推导和讨论。
以上基本包含了所有的技术面试内容,但在实际面试过程中,往往会有很多技术之外的因素影响面试结果。很多同学认为面试是“玄学”,但其实玄学背后是有迹可循的,所以我想介绍一些影响面试结果的其他因素。
除了技术能力,还有哪些因素影响面试结果?
I .与面试官的互动

站在面试官的角度,我常常把面试官给应聘者“强有力的肯定”的根本原因归结为一句话:“我找到了一个技术合格、愿意共事的人”。
所以要通过面试必须满足两个基本要求,一个是“技术资质”,一个是“合作意愿”,两者缺一不可。所以,在你的技能合格的前提下,面试官是否愿意和你一起工作,就成了一个关键且略带主观的问题。
但这个看似“漠视人命”的标准,其实背后是有逻辑的。说白了,这叫看应聘者是否合得来,说白了,这叫是否符合公司文化,说白了,就是考察你是否能和同事顺利沟通协作,得到合理的技术方案。
面试官为了验证你以后是否会是一个合适的同事,一般会抛出一些开放性的问题和你讨论。这个问题可能来自于行业内的一些常见问题,比如让你设计一个电商首页商品类目排序模型;也许会来自于生活中的一些算法,比如请设计一个微信随机抢红包时产生红包金额的算法或机制;也可能来自于面试官的工作实践,比如如何解决构建CTR模型时样本数据受模型影响产生偏差的问题。
这类题的特点很明显,很开放,很发散,问题本身一开就不清楚。因为不清楚,所以面试官希望面试官主动提问,一起设计一个模型或者系统来解决问题。在这个前提下,有两种候选人可能会被无情地拒绝:
1.面试太被动,被面试官生硬的推开。比如针对“微信抢红包”的问题,有面试官说“每次用随机数生成器生成一个红包金额就可以了”。如果是这样,面试官根本无法理解你作为工程师的严谨。为了让你坚持下去,面试官还得问你问题,比如你有没有考虑过没有红包的金额整体分配?等一下。面试官期望的是,这个问题由你来推进。比如,问题不清楚,你应该问面试官,每个红包的金额有上限和下限吗?不需要考虑计算效率?我可以预算所有红包产生时的金额吗,等等。
2.思维局限,没有严谨、开放、创新。在实际工程问题中,解决一个问题不可能只有一个方案,解决一个问题的方案也不是一句话就能说清楚的。比如我想和大家探讨一下如何设计一个电商首页商品类别排序模型。看到这个问题,很多人会直接说我要用DNN建立一个CTR预测模型来排序。当然可以,但是你在抛出这个解决方案的时候最好仔细系统的思考这个问题,按照项目实现的思路和面试官讨论。
比如:1。什么数据和特征;可以获得;2.数据量有多大,数据延迟就有多大;3.如何制定目标;4.结合具体业务,我可以把商品类别当做一个物品,还是把类别内的商品当做一个物品;5.我可以用学习排序/ctr预测/多分类模型来解决这个问题吗?6.什么模型架构更适合这个问题等等。在实际面试中,你可能没有想得那么细,只是感受其中的意义。作为一个算法工程师,你要严谨、开放、积极、创新。
第二,不是你不够优秀,而是你的技能树不能准确满足当前岗位的要求。
这个问题在社会招聘的情况下尤为突出。很多资深工程师表示,感觉面试表现不错,算法题是最佳解,设计题讲了很久,面试官全程微笑,但没有发offer。在这种情况下,很有可能你的经验并不能完全满足职位的要求。
有些情况下,公司对面试官工作经验的要求精确到系统模块层面。也是计算广告算法工程师。我们的团队可能只是想雇一个能做产量优化或“预算控制”算法的人。你说CTR已经成功了,但是你还没做这个方向,不能即插即用。我很抱歉比如我是一个推荐系统团队的总监。团队最近参加了TensorFlow服务,想找一个有相关经验的同学。你说你只做过TensorFlow的线下培训,可能不符合我的要求。
在这种有目的的招聘中,面试官往往更注重业务经验的沟通。如果面试官不去查基础知识,不去查算法题,甚至不去查你过去的工作经验,而总是从自己的角度去关注某一方面的业务知识,那么很大概率会出现招聘需求相对狭窄的情况。
这种问题有解决方法吗?其实有几点是可以注意的。在找工作之前,你要尽可能多的阅读JD,找到那些和一般JD不一样的,或者JD上明确写着“最好有XXX经验”的,看看是否和自己的经验相匹配;有条件的候选人可以多和对方的猎头或者hr沟通。能找到内推渠道的同学有必要从团队成员那里打探到内幕消息。
三。不可抗力
虽然不可抗力发生的概率比较低,但也不是没有,尤其是在目前市场“寒冬”的背景下。曾经的BAT公司有一家因为某些事件停止了一段时间的社会招聘,导致了沟通中有些offer全部作废的情况。此外,在offer沟通的循环中,也有可能遇到更适合同一职位的候选人。你不可能知道所有竞争对手的情况。在发出书面要约之前,所有的变更都是可能的。
准备算法工程师面试的十个小技巧
以上内容总结了所有机器学习求职面试的目的和方法,以及影响最终offer的一些因素。这里我们用一个框图来概括这些内容:
也许在这里我终于可以正面回答文章题目中的问题了——如何在算法工程师中准备面试,获得一线互联网公司的机器学习岗位offer?在之前列举的所有面试知识的基础上,下面再来十个注意点:
1.打牢基础。推荐几本书《机器学习》周志华/《统计学习方法》李航+《100面机器学习》,知识点的系统学习,还有一本面试查漏补缺的书,完全够用;
2.注意总结自己的实习项目和实验室项目,把所有的技术细节都讲清楚。简历上列出的经历、车型、熟悉的工具语言也要准备好,要冷静应对面试官的提问;
3.平时注意使用一些流行的机器学习工具的经验积累,至少熟悉以下两项:spark/flink、tensorflow/pytorch,一项是做大数据处理,一项是训练模型;
4.刷算法题不多解释;
5.尽早确定细分求职方向,广告/推荐/搜索/图片/NLP/语音,阅读博客、分享、行业内论文,积累对业务场景和解决方案的理解;
6.面试时提问,积极互动;
7.为公开的问题提供多种解决方案,即使这些方案不成熟。关键在于讨论和形成可行方案的过程;
8.在投简历之前,先熟悉JD,想办法找对这个团队有所了解的人,获取一些岗位相关的信息,让自己的经历和岗位相匹配;
9.轮到你提问的时候,问一些和公司有关的话题。不要节外生枝,不要提奇怪的问题;
10.不要碰运气,强者载强者。
其实以上所有的注意点都应该在找工作实习前准备好,所以如果你是明年要参加秋招的学生,也应该提前有的放矢,增强相关的积累。

最后祝大家一个满意的报价。
◆
精彩推荐
◆
2019中国大数据技术大会又来了!豪华的董事长阵容和数百位技术专家齐聚一堂,15场精选专题技术和行业论坛,超级干货+技术分析+行业实践立体解读,深度解析行业热点技术的实践。


