从零基础到斩获BAT算法岗offer,围观大佬的超神之路

本文作者:原果

本文作者是一位复旦大佬,这篇文章的内容都来自于他的GitHub,具体见上面这个仓库链接,里面包括了他的面试总结、心路历程,以及算法岗的学习指南等内容,可以说是非常用心的一个算法岗秋招指南了,大家可以关注一下。下面正文开始!

从零基础到斩获BAT算法岗offer,围观大佬的超神之路

秋招总结

2019年秋招计算机类面经

本菜鸡是上海东北某高校的计算机硕士,18年初自学机器学习,秋招之前在蚂蚁金服花呗实习,做营销推荐。

现offer情况详见表格,这个水平在学院排中等偏下(非自黑),17 18的学弟学妹可以作为参考。

本repo会实时更新本菜鸡和大佬们的面经,希望在秋招的路上能帮到大家!

秋招情况简述

投递方面,今年秋招算法岗聚堆,每个公司简历基本50%以上都是算法岗,有的甚至80%,竞争比较激烈,相对应的开发岗位比较缺。但并不代表着拿到算法岗就比拿到开发岗强,我也不知道很多做算法的对开发同学的蜜汁优越感从哪来的。

薪酬方面,今年全线提高,去年的薪资在25-35w之间,今年在30-50w之间,算法岗部分公司会比开发高1-3k,比如网易阿里;另一部分公司持平,比如腾讯头条。大厂薪资平均比小厂要低,尤其是yy pdd yitu等薪资非常高,BAT中腾讯最高,阿里次之,百度最低,具体薪资可以参考offershow。一般薪水会分三档,普通/sp/ssp。但也有分的更细的,比如爱奇艺和pdd,pdd据我所知有6档,所以我也不知道我的offer算不算sp;也有少的,比如阿里;也有加个劝退档的,就是比绝大多数低。每档之间差价一般每月在2、3k左右,sp以上可能有股票和期权。ssp一般没有固定薪资,能力高的有多少给多少,尤其某些AI厂,超乎你的想象。所有的公司都可以argue薪资,所有的,BAT也可以,但一定要有竞品,一般都有提升空间。也有HR直接说不给谈的,不知道什么意思。

不要跪舔大厂,无论是薪资还是成长上,小厂很多比大厂强,最重要的是技术。个人认为:大厂核心>小厂核心>大厂一般组>小厂一般组,另外只谈理想不给钱的行为都是耍流氓。 最后很重要的忠告,一定要多投,一定不要因为实习可以转正就放弃其他机会,也一定不要因为小公司而不屑一顾,世界变化很大,外面很精彩。

现有的面经:

代表SP 或比白菜高2k及以上(并不是所有公司都是3档)

代表待定,未出结果

代表白菜

代表

从零基础到斩获BAT算法岗offer,围观大佬的超神之路

从零基础到斩获BAT算法岗offer,围观大佬的超神之路

机器学习自学指南

机器学习资料准备以及自学方法

1 资料、课程

人工智能太火了,资料特别多,但是鱼龙混杂,实际上经典的课程资料 paper就足够

吴恩达系列

吴恩达老师真乃人工智能届的孔夫子,在这个水平上还能致力于基础教学和入门推广功德无量啊,吴老师的课讲的也是真的好。

CS229,强推,Stanford的公开课,网易云课堂有2008年的课件和讲义,我就是对着这个学的,打印讲义一点点对着推吧。

Coursera Machine Learning,Coursera的课比较基础,其实有了CS229就不推荐看这个了。 DeepLearning.ai,也是偏基础的课程,不过还是很值得看,对传统机器学习、CV、NLP都有一个不是很深入的讲解,作为入门很棒。

Machine Learning Yearning,这本书也是偏基础,工程向,讲了实际工程项目中调参等等东西,我学的时候只出了前几章,后面没有看过。

李沐 动手学深度学习系列

动手学深度学习,强推,非常好的课程,李沐是机器学习的大家,在分布式机器学习领域非常有建树,除了广为人知的mxnet,还有parameter server,这里就不展开说了。李沐的课程是将门斗鱼的直播,都录了下来,在网站上还有配套的代码讲解和书籍,唯一美中不足是基于gluon,这个稍微冷门一些。

莫凡系列

莫凡python,怎么说呢,比起其他课程还是逊色不少,不过讲的很基础,而且是不多的讲解RL的中文课程。

其他公开课

CS231N,强推,stanford公开课之二,李飞飞的cv实验室出品,讲师是大名鼎鼎的Justin Johnson,虽然是讲CV,但对DeepLearning的基础也讲的非常详细,cs229是最好的ML课程,cs231n是最好的DL课程。

附加:算法导论 6.046J,大名鼎鼎的MIT算法导论公开课,虽然不是ML/DL向,但是基础算法还是要会的,毕竟算法工程师首先是工程师,课程较难,很多名校本科上过这门课,大部分没有上过,还是有必要抽空看看的

2 书籍

《CS229讲义》,为啥把这个单独拿出来说呢,因为这个讲义真的就是一本书,有详细的推导过程,并且很多同学看公开课会忽略讲义,一定注意。

《统计学习方法》 李航,机器学习最常用的书,人称小蓝书,其实这本书不适合入门,里面很多推导晦涩难懂,但是讲的很详细。有些地方的推导方式和写作习惯跟吴恩达不一样,所以两个一起看有时候会很迷。

《机器学习》 周志华,人称西瓜书,不仅封面是西瓜,里面的例子也全是西瓜。难度比《统计学习方法》简单不少,还有各种西瓜例子,入门首选。

3 项目

其实这块是最难的,因为自学,实验室也没有项目,实习没有基础也难找,尤其我年初自学,3月份就开始暑期实习招聘,再找一个实习肯定来不及,好在我们有kaggle!

kaggle,强推kaggle!!!!

在开始kaggle之前,请看看Kaggle的三个Getting Started比赛,分别是手写识别(CV),泰坦尼克预测(分类),房价预测(回归),这三个比赛就是教学比赛,kernel和discuss版块有大量的教学,好几个会长篇讲如何基本的使用DNN、xgb、lgb、sklearn这些工具,和如何开始做机器学习。

当你开始打featured的比赛的时候,有一点要明确,去打比赛不是为了赢,你是个没有基础的初学者,很可能也没有队友,只能solo,想拿名次就算了,打kaggle的目的是为了学习,为什么选kaggle不选天池或其他比赛呢?因为kaggle的氛围非常非常open,讨论区和kernel区一定会有人给出自己的完整思路和代码,不仅有base model,还有各种有用的数据处理代码,甚至很常见到前10的队伍公开自己的思路甚至代码!这是其他比赛不具备的,你可以在看别人代码,改进自己代码中成长。

4 积累

这是自学最欠缺的,没有积累,尤其是科研积累,没有人带自己想搞出一篇工作就免了吧,但是熟读某个方向的paper,对该方向有深入了解是必须的,如果仅仅是达到见过或者会用的程度,肯定拿不到offer的。具体的积累看是什么方向,github上有很多repo是经典paper集合比如这个repo,可以对照着看,也要关注该领域顶会每年的文章,还有就是对自己项目中用到的model、方法的相关工作要熟读。

5 计划

时间紧迫,给自己定一个清晰的计划还是很重要的,笔者自己是打印了一份日历,然后把暑期实习、秋招等关键时间点和自己计划完成的deadline日期做上标记,每天干过的事情标在当天的日期上,然后划掉这一天,每天看着时间会有紧迫感促进你学习。

6 老师

自学没有老师,但俗话说三人行必有我师,周围相关方向的同学,该请教就请教,有些东西自己搞是搞不出来的,但会的同学随便点你一下这块就过去了。记得请教过你的大佬吃饭。

面试经验总结


  • 缘分很重要。
  • 编程能力很重要。
  • 基础很重要。
  • 面试有套路,常问的问题和面试官的面法都差不多,想去的公司千万不要第一个去,套路不懂的时候去大概率挂。
  • 不要怼面试官,即使他错了,委婉的说出你的想法和面试官的错误,不止我一个这样挂了。
  • 面试过不过不一定是你实力强不强,有可能是就没有HC了。
  • 不要硬怼热门方向,今年某厂和某厂和某厂AI部门几千人投简历,HC 10个,不是找死。
  • 尽量把面试官往你熟悉的地方带,如果反了,可能悲剧。
  • 面试过的问题全记下来,大概率重复。
  • 刷过的题一定记住了,一看题刷过,最优解忘了是很悲催的,我面试的遇到算法题读研期间都做过,但是就有两道想不起来最优解法了。
  • 控制时间,控制时间,面试时长是有限制的,算法题一般最后出,前面吹太high后面算法题只剩几分钟时间写就GG了。
  • 算法题和概率、智力题都是可以求tips的,解不出来可以问一问,这个没问题的,面试官的提示下解出来可能给80分,不要提示,自己又没有好解法可能就20分。

算法岗秋招准备

机器学习算法岗秋招准备

秋招是个大而全的考试,虽然套路差不多,但每个公司都有自己的风格和侧重点,想要变成收割机,你必须深谙这一点,并做好充分的准备。

本文可能会更大程度的站在一个没有paper并且偏重推荐、机器学习的角度讲,对于研究岗或者深度学习的岗位帮助可能不大。

自己的准备当然是重中之重,知识技术、定位规划、心理心态都要做好,当然技术是最重要的一环,但一定不能忽略了其他方面,没有短板有长处,把自己包装成一个特点突出的木桶才能神挡杀神佛挡杀佛。

技术

计算机基础

重要程度:⭐️⭐️

本部分大多出现在笔试中,面试中也略有出现。

计算机基础虽然不是重点,但是很容易被忽略掉的内容,一来是本科学的课程,研究生早忘光了;二来很多同学觉得我是搞算法的,这些不是开发问的问题么?殊不知计算机基础是非常重要的部分,算法工程师首先要是一个工程师,对计算机不够了解怎么做出更鲁棒的网络结构,怎么能提高计算效率?

这部分主要是4门最重要的基础课和对linux操作部分:计算机网络、操作系统、组成原理、数据结构。网络和操作系统是非常常问的学科。

其中最常问的是操作系统,参考书目:《操作系统概念》就是恐龙书啦。内核、进程、线程、调度算法、死锁等等都是常问问题。

计算机网络,参考书目《计算机网络》,其中TCP协议、还有拥塞控制都被问过。

组成原理,参考书目《计算机组成与设计 硬件/软件接口》,比较少见吧。

数据结构,参考书目《算法导论》,求复杂度,红黑树、B+树的一些结构和优点,有些跟算法题一起考察了,也不太分得清,求算法复杂度是最重要的部分,主定理背一背就搞定。

Linux操作,参考书目《鸟哥的linux私房菜》,讲真问的还挺多,不过都是基本操作,比如查找啊,几千条数据的移动啊之类。


编程语言

重要程度:⭐️⭐️⭐️

本部分笔试中非常常见,面试中也比较常见。

公司都会对语言有要求,再次强调,不要以为自己是算法岗就可以忽略语言和计算机基础部分。一般来说,根据公司和业务的不同对语言的要求也不一样,很多是会一种即可,不过对口是最好的嘛,比如腾讯是c++,阿里是java,百度是c++,其他大部分是java,python一般都要求,阿里有些还要求sql,毕竟在阿里,算法工程师 = sql工程师(开个玩笑)。

C++,参考书《c++ primer》当字典书吧,常见问题:多态、虚函数,指针、函数指针,指针函数,宏和内联,内存分配类问题。

Java,参考书...算了我觉得java没有参考书,笔者是个野路子出身,直接看了spring框架就杠杠造了,java方面面试没有问过,并不是很懂。

Python,没有参考书,人生苦短,请看文档。修饰符、多线程等基础问题,还有numpy、pandas的一些问题,这里其实还涉及到常用的深度学习框架,TF最多吧,笔者基本没有被问到,有的同学被问过,网上可以看看他们的面经。

数学

重要程度:⭐️⭐️⭐️⭐️

本部分笔试中非常常见,面试中也比较常见。

机器学习的知识说白了无非就是数学,但这里的数学特指面试官会单独问的一些数学知识。讲真啊,无论是笔试还是面试,笔者感觉自己总会碰到几道线代、概率、统计或者高数题。

尤其是概率题,几乎必考,大多是古典概型,什么不外乎摸球、抽牌求概率之类,有些需要算一算,有些可以直接往统计分布上靠,比如百度的一道面试题:n个人进餐馆吃饭,把帽子放在衣架上,走的时候随机拿一顶,问拿到属于自己帽子的人数量的期望,你要用排列组合算也可以算,但是往二项分布上想可以直接得到答案:每个人拿对概率是p= 1/n,期望不就是E_x=np=1嘛。

统计考察的也很多,毕竟传统机器学习就是统计,常用的分布,性质,变换清楚熟记就可以。还有一种题也很常见,就是给你某个概率1/n的随机数生成器让你求一个概率1/m的生成器,算法导论课后有类似的题,其实套路都一样,就是扔掉重来,比如给你一个均匀的正4面体,给出一个方案,得到每个数概率为1/7的随机数生成器,4<7<16,那就投两次,随便选7种排列,其他全部重新投就ok了。

线代部分主要还是跟着机器学习知识一起考的,比如PCA SVD神马的。

高数比较少,旷世的笔试题有很多这方面的考题,其他考的较少。

算法题

重要程度:⭐️⭐️⭐️⭐️⭐️

很多笔试只有算法题,面试几乎必考算法题最重要的两部分之一,即使是研究岗,写好代码也很重要。很多公司面试只有这部分考察,比如ms google,很多公司作为最大重点,比如头条、滴滴,可以说,你可以没有项目经验没有paper没有实习,但你不能不会编程。

这部分很难讲,因为不同公司的偏重不一样,难度差别也很大,甚至说同一个公司不同部门,差别都很大。难度最大的是google, 非OI和ACM选手连笔试都很难通过,头条、滴滴、依图、MS难度是leetcode mid +少量hard难度,其他公司一般是mid或者easy-mid。

不过好在算法题可以刷题突击,而且有一个很明显的现象:面试难度<<笔试难度,其实非常好理解,笔试是在线oj,机器判卷,直接比对case的结果就好。但是面试要肉眼debug,这就难得多,而且很多题有多种不同解法,面试官自己也不是很懂,自己只会一种解法。如果出一道难题,没有很深功力的面试官你给出一个不同解法他短时间很难判断对错。于是乎,除了上面提到的几家公司,绝大部份的面试官都只在现场出一些经典问题,比如百度系的巨喜欢问树的深度、公共父节点、最大路径等二叉树经典题的各种变种。然而经典代表着网上解法到处都是,代表着即使不刷题,刷刷面经也可以搞定。

笔试一般是1.5-2个小时做3-5道题,难度一般是几道mid一道hard,时间很紧迫,思路正确但是怎么写都不对是常有的事。所以能提前批尽量提前批,能学长部门内推,尽量部门内推,笔试过了,算法题这部分你就成功了一半。

算法题准备最主要的是刷题,这个跟数学考试一样的,需要灵感也需要手感,很多题看似不一样,解法也不同,但大多都是一个套路,比如DP啊、DFS啊、递增栈啊,能够抓住题的考察点,接下来就是实现问题了。这个时候手感就很重要,规定时间内写对并不是件容易的事,笔者前几个公司的笔试题就因为2年没刷题没有手感,做的稀烂。刷题的网站很多,最推荐的是leetcode,好处是题多;牛客也不错,而且还有企业真题,但是很奇怪,有些企业的真题跟笔试实际做的题不太一样。另外看书的话,《剑指offer》还是非常推荐,你可能觉得这些题都考烂了,不过别笔试,今年考的还是这些题,面试官很忙的,很多永远都是老三样。

算法题的另一个准备方法,可以说是性价比最高的准备方法就是:看面经,前面说过,面试官很忙的,大部分公司并没有为了秋招单独准备题库,所以面试官考来考去都是那些题,比如同一个岗位,昨天问的问题基本就是今天要问的问题,疯狂搜面经吧,撞原题概率非常大。

机器学习知识

重要程度:⭐️⭐️⭐️⭐️⭐️

算法工程师啊,最重要的当然是你的算法能力,其实这个突击不来,很靠积累。很多东西看得多了才能融会贯通,这点好实验室,本方向出身的同学会有极大的优势,如果还有一两篇不错的工作,那你就是ssp收割机,甚至可以不需要算法题能力,笔者周围就有算法题一个不答都进大牛组的同学,没办法,积累足够深嘛。但半路出家也不是完全没有机会,这部分笔者就结合自己的自学经历讲一讲,这里主要讲机器学习常见问题:

1 逻辑回归&交叉熵(重点)LR真的是经久不衰啊,其实能问的地方好多好多,关于sigmoid函数其实可以从指数函数族的角度推导推导,然后就是交叉熵啦,最基本的就是从极大似然角度推导交叉熵。LR的基础推导看这里 。

2 GBDT系列(重点)机器学习的话,gbdt肯定是重中之重了,跟LR一样是最最最常见的问题,工业界应用也很多,打比赛就不用说,xgb lgb是历届kaggle的两把快刀。

其实gbdt没有太多可说的,无非是boosting思想啊,为啥用负梯度啊之类。重点是在lgb和xgb对传统gbdt的优化上,这部分内容很多,这个博客做了一些总结,但我觉得还是看原始paper和源码比较好。具体就不展开说了。

3 SVM

这玩意貌似去年很火?说实话啊,我没怎么见过哪里用SVM,好像就RCNN用过SVM当分类器,后来就换成了softmax,我的面试也没人问过,曾经看了好久,后来忘了还很忐忑,结果却是没有被问到。推导 @靠靠靠谱 的回答

4 RF&bagging

随机森林本身没啥东西,不过bagging的思想倒是非常有用,比赛中常用的降低过拟合方案,简单来说就是选xgb中偏差低方差高的模型,做bagging,效果非常显著。再有一点就是RF可以用oob做特征选择,效果也不错。

5 决策树

怎么说呢,问的也比较少了,就是三种树,ID3,C4.5,CART,区别和剪枝记一记。

6 特征选择方法(重点)

特征选择是模型预处理的重要部分。方法很多:方差、相关系数、卡方检验、互信息、递归特征消除、基于惩罚的方法、树模型方法、单特征AUC、IV。

7 采样方法

主要有过采样和欠采样。

过采样:Smote方法及各种变种

欠采样:ensemble、nearMiss、Tomeklink、ENN

还有复杂分布的采样会用到MCMC。

8 聚类方法

也没多少,经典的就是:k-means、k-means++、meanshift、DBSCAN、EM聚类、层次聚类。

9 评估指标(重点)

精准率、召回率、ACC、AUC、F1、KS、熵系列、信息增益、CTR、CVR、MSE系列。其中AUC是重点中的重点,被问了好多次,而且很细节,包括本质意义、计算方法等等,注意AUC是有两种计算方法的,这里有介绍。

10 过拟合(重点)

起因基本不太会考,解决方法就多了,降低模型复杂程度啊,dropout啊、bagging、正则、earlystop,数据增强、交叉验证。Dropout本质也是个bagging。

11 batch normalization

这个问题下的回答很有价值 ,BN问的还挺多的。

12 梯度弥散/爆炸,怎么解决

改激活函数啊,BN啊,想lstm一样把*变+啊,加恒等映射的跳跃层啊,都可以。没有太好的文章,看看这篇讲resnet的吧。

13 激活函数,比较

sigmod tanh relu maxout... 好多,这个随便一搜就一堆,放一个不太切题的文章吧,我偶像何之源奆佬的回答,手动滑稽

14 优化方法(重点) 这就很多了,梯度下降系列、牛顿法系列,还有传统的模拟退火、遗传算法。牛顿法这回问的很多,不知道为啥。lan大神的花书讲的就很好,梯度下降的可以看这个 。这里要注意,有些面试官会让你实操,就比如给你一个方程,让你用梯度下降求解。

15 各种网络结构&模型(重点)

这个就太多了,CNN RNN就一堆,推荐的也是一堆,基本的DNN CNN RNN的forward和backprob都要熟悉,然后lstm、gru、attention也要会,还有各种encoder-decoder结构,这个就看积累了。 推荐部分有自己的一些模型,比如FM系列,lookalike、协同过滤之类的非深度学习模型,后面的W&D为首的融合模型也是搭积木。

项目

这块是很重点的部分,面试的大部分时间都是在聊你的项目,所以,写在简历上的项目一定要保证自己能说的头头是道,怎么做的,为什么这么做,最后的效果如何。还要把这样做的原因想清楚,面试官一定会找漏洞challenge你,一旦被问住了那就不好办了。

心态

人是感性动物,会随着自己的境遇和周围人的改变而受到极大影响。好的心态会帮助你超常发挥;差的心态可能直接导致秋招的失败。笔者在秋招的过程中就经历了大起大落,好在及时调整,否则肯定拿不到心仪的offer。

虽然这只能靠自己,但是有一个很重要的地方就是:不要主动打听别人的offer,我所见过的心态崩溃,几乎都是因为与别人比较:周围同学/朋友有offer自己没有,别人薪资高自己低。其实可能只是时候没到,我有个同学十一前0 offer,心情很崩溃,十一后迅速接到多个offfer call,最终拿到周围同学中薪资数一数二的工作。所以不是没offer,只是时候没到,不要瞎打听,相信自己的能力。

定位&规划

GM面或者HR面一般就不聊技术了,然而GM权利却比前几个面试官大的多,可以直接决定你的生死,所以技术之外,个人的定位规划、对公司的理解、愿景就很重要了,自我剖析、个人定位,这些往往是终面这个级别的大佬们所看重的。

总结

总之呢,秋招就是一次斗智斗勇,不仅要自己充分武装,还要清晰的了解你的“对手”,希望笔者的总结可以给大家一定的帮助,在明年的秋招厮杀中收获满满!

相关推荐