算法岗必须人手一篇顶会?超详细面经:无论文、无实习拿下腾讯CV算法岗
本文授权转自知乎作者清雨卢,https://zhuanlan.zhihu.com/p/138523753。未经作者许可,不得二次转载。不为盈利,只为自己存一哈以后看
本人非科班,本科所学为如何搬砖。18年跨考到浙大计算机,因为跨专业(其实主要是自己菜。。。)导致复试完后找导师四处碰壁,最后找到AI方向的导师后满心欢喜地以为自己捡了漏。后来怀着对学术的满腔热情来到了浙大,却被现实打击的不行,原来老板早在多年前就已经不做学术,一心搞行政,所有科研全部靠自己。那么作为一个刚跨考过来还想搞算法的菜鸡而言,有多凉凉可想而知。
个人认为自己还算是一个挺有想法的人,但是科研光靠想法多并没有什么卵用。没有一个靠谱的引路人帮你指引方向、把关ideal的话,想要做出成果难如登天。最初也想着认命了,认为反正作为一个浙大计算机的研究生而言,至少工作不用担心了。所以,当刚入学的时候,师姐意味深长地问我们想继续做算法还是做开发的时候,曾经信誓旦旦地表示誓于AI共存亡!然而研一面试网易实习的失利,以及接下来接二连三的海投但简历基本毫无回应地时候,残酷地现实还是彻底地把我敲醒了。后经过各方打听,才发现现在各行各业,学机械的、学自动化的、学船舶的。。。等等,哦对,还有学中文的,基本只要是个专业就有很大一部分人在搞算法,搞CV,毕竟有着算法高级码农,事少钱多高大上的说法,导致当前市场上上算法岗严重供过于求。
于是乎,招聘市场流传起了算法岗找工作必须人手一篇顶会的传说。那么,事实是否真是如此呢?没有那么夸张!没有那么夸张!没有那么夸张!这里划重点!如上所述,本人研究生期间基本没有什么正儿八经科研地经历,也只有两个比较水的项目,但没有发过任何论文。至于实习经历,也基本为零。但是!今年春招本人还是有幸拿到腾讯AI平台部的算法实习offer。接下来本文将从几个方面来介绍本人在疫情期间春招算法时的一点经验,希望能对大家有些用处。
信心篇
首先,找工作前第一点需要具备的就是强大的内心(大佬如果是offer收割机请自动忽略),需要相信自己一定没问题。虽然相比于其他岗位而言,算法岗确实要难上一个量级,但也完全没有达到人手一篇顶会的地步。大厂招聘时,如果有顶会论文的确会相当加分。但是!一来,研究生期间能够发篇顶会的人真的时凤毛麟角,就算是我们院这一级我知道的发过顶会的也绝对没到两手之数,这一部分神人基本都已经被各大公司的研究院,如阿里达摩院,腾讯AIlab等顶级部门挖走,我们这等凡人基本没有和他们同台竞技的机会。二来,像腾讯阿里这样的大厂,他们需要的是一群有创造力,能解决问题的年轻人。之所以更喜欢要发过顶会的同学,其实更主要是因为顶会是对一位同学是否有足够的创新能力以及解决问题的能力的很好证明。但另一方面,这些能力却并非只有顶会才能证明,也就是说,如果在面试过程你更够表现出自己的这些能力,再加上基础知识扎实,编程能力过关,基本一个算法offer跑不掉了。
恰好,这些所谓的面试时表现得能力,知识,编程全部都是可以通过一段时间的准备获得,或者更赤裸裸的说,只要是面试就永远是可以速成的。以下,则是我的算法面试速成之路。
经验篇
面试,尤其是算法岗的面试总有一个固定的套路(不排除个别公司,个别面试官会不走寻常路),即自我介绍,项目经历,算法基础知识,编程题这四大项。接下来,本文将从这四个方面的准备进行阐述。
1 自我介绍
自我介绍是所有面试都会有的一个环节,很多人会觉得这个环节一般最多三分钟,甚至觉得面试官可能也不太会看重这些,毕竟该有的简历上都有了,因此往往会忽视其重要性,进而草草准备、直接上场。倒不是说,自我介绍不好就一定会跪,只能说这么多年检验下来所有面试都放在第一个的环节,对于一个经验丰富的面试官而言,他一定是会看重的。
一个没有用心准备的自我介绍,或者说一个不好的自我介绍往往会有以下三种模式:
1. 照本宣科型。简历上写了什么,就像流水账一样从上到下念下来。干嘛呢?干嘛呢?人家面试官稀罕听你的富有磁性的声音从头到尾念一下简历啊?面试官的时间是宝贵的,人家自己扫一眼就能看完不香嘛?
2. 内容干瘪型。上来就说自己性格开朗,有很强的科研能力等等。So?你倒是说说你怎么就性格开朗了呀?你说你开朗面试官就觉得你开朗了?那你要是说你飞机开得好呢?。。。一个良好的介绍或阐述永远是有论点支撑的。
3. 夸夸其谈型。觉得该说的东西简历上面都有了,应该说一些简历上没有的来彰显自己与众不同的。各方面去阐述自己有强大的沟通能力,组织能力,各种唱歌、演讲比赛出类拔萃等等。如果内心活动能转化成表情包,面试官此时一定是个超大的黑人问号脸。。。我们公司招个算法工程师,你会唱歌会演讲过来干啥来了?方便自己拍个视频做成数据集??
那么一个良好的自我介绍究竟如何准备呢。其实,好的自我介绍和一个吸引人的演讲是一样的,需要关注的永远是听众更想听什么,然后把你想说的东西用听众喜欢的方式表达出来。那么对于面试的自我介绍而言,我们需要关注的就应当是面试官想要招一个什么样的员工,然后对应的去组织自己的语言。所以,一般一个好的自我介绍的核心内容往往就是三段式:
1.首先,面试官招聘的很有可能以后就是他的同事,所以他一定希望面试者是一个有趣的人。毕竟谁愿意整天面对着一个面瘫脸工作呢,因此自我介绍里面一定要有能体现自己性格开朗,沟通能力等软实力方面的内容。但是严防出现大段这类话的形况,防止喧宾夺主,毕竟人家招的还是技术岗,技术最重要。
2.和其他行业不同,IT届的技术岗非常重视你的技术实力,因此自我介绍中用简短的语言介绍你的技术以及科研经历、能力也非常重要。
3.计算机技术日新月异,迭代的速度完全不是其他任何行业可以比拟的。因此工作的时候需要不断地学习新知识,否则根本无法适应不断提升地业务需要。所以面试官希望的面试者还是一个对于技术、新鲜事物有强烈好奇心的骚年。
但需要这三段,并不是说只要包含这三个内容就足够了。表达的方法也很重要,不能像第二种类型一样,只是干瘪的介绍。每一个论述都需要有论点的支撑,最好的方法就是每个你想介绍的方面都选取你的经历中最典型的,能表现这一方面的用几句话概括起来,然后加上所以我觉得沟通能力还不错之类的总结。这样才能让自我介绍更加丰满,让面试官感觉好像听故事一样。
同时,自我介绍的时候语气也非常重要!!首先全程一定要用中气十足的语气,让人觉得你很有自信,千万千万不要蔫儿蔫儿的。对于不同的内容,要注意情绪的转换,比如说自己幽默、性格开朗的时候,你就需要用一种积极向上的,话里都带着笑得语气表达出来,千万不要像白开水水一样让人感觉你在背书。否则,你的内容准备得再好也没有半毛钱用处。
项目经历
不同于外企,国内的互联网非常非常重视项目经验,又或者说是因为面试官在面试过程中,往往从聊项目中可以看到得东西最多。因此,一般一轮60分钟的面试有45-50分钟基本都是在问项目,我腾讯的三面甚至于就只问我的其中一个项目就问了一个小时,可想而知面试官对于项目的问题问的有多么深入。但同样的,对于项目经历这一环节仍然有套路可循(当然前提是你有项目,啥项目都没有的。。。emmm)。
首先,项目在精,不在多。千万不要把自己曾经做过的大大小小的项目一股脑地全都放到简历上去,因为你简历上的每一个项目都有可能被面试官当成重点,抽丝拨茧式进行提问,如果你因为对这个项目准备得不够充分而某几个问题回答的不够好,基本这轮面试结束就是可以去准备别的公司了。因此,每把一个项目写到简历上之前,你都需要确保这个项目你能把它弄得非常透彻,达到任何一个细节都了如执掌的地步才可以。
那对于一个项目该如何进行面试前的准备呢?同样,对于这个问题,仍旧需要先站在面试官的角度,思考面试官想要从和你交流项目的过程中知道什么。还是那句话,面试官需要招聘的是基础知识扎实、有能力解决问题的、富有创造性的、同时又有一定沟通能力的人。因此,接下来的准备过程中,都需要处处以能展现这几点为目的。面试官问项目的时候也往往遵循着一个套路:简单整体介绍项目,你的创新点是什么?项目中用到的某个网络或者某个技术你了解吗?这个项目你遇到了哪些困难、你是如何解决的?这个项目的评价标准是什么?最终达到什么样的性能?咋一看似乎这些问题不是很有规律可言,但其实就像拔萝卜的过程一样:
1. 从宏观上认识萝卜。也就是你首先要用简短的语言,几句话将你的萝卜整体展现给面试官。一般这几句话我们往往会依照STAR法则去组织语言,即在什么背景(Situation)下,为了解决什么问题(Target),采取了什么方法(Action),最后达到了什么效果(Result).
2. 把主体拔出来。一般面试官会让你介绍你项目中所用到的网络,此时作为面试者就可以按照:为什么用这个网络,网络结构和特点是什么,训练和测试的差别等进行回答。例如我其中的一个项目用到了一个检测网络SSD,那我就会从速度要求引出one_stage和two_stage的区别,因此使用较快的SSD。然后介绍其网络结构和其全卷积、先验框、多尺度的特点,最后解释测试时NMS的处理等等。
3. 把细小末梢一点点抽出来。只准备到能够将主体拔出来的水平仍然不够,你需要做到的是对于其有可能会牵引出来的一切问题都尽可能准备的足够充分。例如,第二点所提到的目标检测,训练过程中如何区分正样本?既然提到了two stage,那么two stage 网络中的ROI-pooling 又是怎么回事?为了让准备的过程中更有逻辑性且考虑更加全面,可以画一棵树,树的主干是此项目所用的主要方法,分出的枝干是所有细节的技术,叶子又是细节技术所牵引出来的其他技术知识。一般也就是准备到两级问题就没基本可以了。如果面试官问到三级、四级。。。那这个面试官真是毫无人性啊,怼他!
4. 对于拔萝卜的评价。评价问题就非常好准备了,主要为两类评价:
对方法的性能的评价,一般会问你用的评价指标是什么,达到什么水平。例如我的一个项目用到了灵敏度、特异性、AUC,基本所有面试官都问了我这些指标的含义,如何计算,以及的方法达到了什么程度。
在拔萝卜过程中的创新点有哪些,和现有的方法好在哪些方面。在这个过程中遇到了哪些困难,你是如何解决的。(此问题尤为重要!)
基本按着这四点进行准备,项目经历这一块就没什么问题了。当然,还需要重复的一点语气!语气!语气!重要的问题说三遍!同样的话,被不同人,用不同的语气说出来,说服力也完全不一样,哪怕你觉得你的项目就是个渣渣,其实没有任何创新型可言,效果也贼烂,但你在与面试官的交流过程中也一定要底气十足。你需要不停的催眠自己,我做的东西就是最棒的!这一点非常重要!
基础知识
算法面试过程中,还有的非常看重的一点就是对于基础知识的掌握。这些基础知识有可能是在项目经历的交流过程中在第二级问题的时候问,也可能在项目之外单独问,但这些问题其实说来说去也就那么点,无非是如何处理过拟合问题,BN是怎么回事?怎么去理解SVM和逻辑斯蒂回归的区别等等。这些只要花时间认真准备,对每一个问题准备的尽可能充分就妥妥的了。
那么。。。问题来了,想把这些问题都准备地很充分这得多久,时间来得及吗?答,还是挺费时的,对于一个问题如果仅仅简单的概述式的介绍给面试官,那基本是凉了的,那到底怎么样才算是准备的足够高充分了呢?
简单举个栗子,面试官问你知道Batch Normalization吗?你需要这么回答:
BN的背景是什么(即为什么会提出这种方法)
BN的基本原理是什么,以理解的方式介绍大概步骤
训练和测试时的方差和均值选取的差别
BN的多卡同步又是怎么回事?甚至,你可以进一步了解下,BN所针对的激活函数一般是sigmoid,可以将参数拉离饱和区,那么如果换成Relu的话,BN是否还有效呢?再进一步的话还可以了解下主流的规范化方法有哪些?(这种程度的问题就知道个名字就好了,不知道也没问题)。
如果你能对一个问题理解到这种程度,基本面试官只要不是压根看你不爽,基本都会觉得你很棒棒了。But! 这么准备下来,一个问题都得准备好久,岂不是根本来不及了?因此!要懂得借用集体的智慧,比如我就组织了我们实验室的五个小伙伴建立一个讨论小组,每天轮流三个人每个人准备一个问题,把问题准备到上面的那个地步,将自己组织好的问题答案共享到腾讯文档,然后每天晚上八点半大家一起讨论。这样还有一个好处就是一个人去理解一个问题的时候往往很容易陷入牛角尖,理解的也很容易片面,但大家一起讨论之后,基本就能很快豁然开朗了。这么准备起来,每天其实只要花很少的时间就可以在相对较短的时间内把这个环节准备的非常充分了。以下是我们讨论小组准备的材料部分预览,我们5个花了大约一个月的时间,共讨论了约70+的问题,约四万五千字的文档使我在面试过程中,基本没有遇到过没讨论过的问题。这些问题可以自己觉得重要的,或者去牛客网上找面经中的问题,同时也非常推荐《百面机器学习》这本书,我们的很多问题也是直接在这本书上找的。
在小组讨论的过程中,千万千万不要存在”留一手“的心思。你要知道,你的竞争对手永远不是你身边的这几个人,而是成千上万的其他面试者,最后你们几个一起打下了坚实的基础,一起拿到大厂offer岂不美哉。
编程能力
如果你能按照上面三点贯彻地执行下来,可以说就已经离大厂的offer很近了。但仍有一个坎,如果没有把它买过去的话,之前的所有努力仍有可能付之东流,那就是编程能力。在这个问题上,就没有任何捷径可以走了,只能刷题!刷题!刷题!如果时间不够的话,可以先刷剑指offer,基本面试中碰到的大部分问题都在里面,时间充足的话,就可以按照类别或者其他任何方式,刷大量的leetcode,至于到底多大量算是够了。。。只能说越多越好吧。当然对于ACM大佬而言,应该是不需要怎么刷了。。。随便来几题找找手感可能就好了吧。
刷题的过程中,还有些问题需要注意:
1. 首先,尽可能不要在本地编译器上写和调试,最好直接leetcode上直接编辑,然后肉眼debug。因为面试过程中面试官很有可能直接给你个白板链接让你写代码,因此平时就要有意识地练习在没有编译器、没有自动补全的环境下写。
2. 命名规则要合理,可能很多人在刷题的过程中只求能AC就好了,对于这些细节完全不注意。但是面试官却往往很看重这些,毕竟在正式工作中,代码的可读性非常重要。以函数的命名为例,findMedianSortedArrays()像leetcode官方提供的这样命名方式就非常合理。
3,刷题的过程中要有意识地自己想出足够多的测试样例。在面试过程中,面试官往往会让你自己想测试样例去测试你自己的代码,希望以此看出你在coding过程中思维的全面性。如果你能够凭借自己的测试样例找出自己代码中的漏洞,并且将其修复的话,在面试官这里一定是相当加分的一项!
最后还需要注意的一点就是,要多多面试。每一场面试下来,只要你认真总结,你就会发现自己的漏洞在被不断地补全,然后把自己最想去的几家公司放在最后去投。千万千万不要在自己还没怎么准备、还没怎么面试过的时候就去面试自己心仪的公司。否则,哭晕在厕所的时候就已经于事无补了!
以上,基本上就已经是我们这等没有论文、没实习经历的菜鸡们对于算法岗的面试所能达到的极限了吧。这么准备起来,可能不能保证你能拿到BAT的算法岗,但是如果你跟我说最后还是连个算法岗的工作都没找到。。。那只能说,天道不公啊-_-hh,其实要相信自己,算法岗虽然现在很难,但也没有像外界传言的那种登天般的难度,只要认真准备,拿一个相对心仪的offer还是没问题滴!最后,祝大家都能拿到最理性的offer!!