机器学习岗面试总结
本人渣硕一枚,将秋招面试情况做一点简单的汇总,希望各位大佬批评指正。
首先谈一下算法岗,个人认为算法岗是一个大体的统称,里边包括了数据挖掘岗、机器学习岗、深度学习岗、基础研究岗等等。不同的岗位对求职者的“软硬件”要求略有不同,但总体上是大同小异。面试这些岗位,求职者至少需要哪些能力呢?这里进行简单的汇总,希望各位大佬批评指正:
一、编码能力、基础算法与数据结构
一般面试都会要求现场写代码,每一场技术面试一般都会要求写两道题的代码。这里边涉及到的问题涵盖了编程语言、基础算法、数据结构的方方面面,因此求职者最好有强悍的编码能力、基础算法以及数据结构功底。
快速准备这些知识的方法就是:剑指offer以及leetcode上边的题,多刷几遍。这里边的知识点涵盖了基础算法中的排序、递推、递归、贪心、DFS/BFS、动态规划等等,以及数据结构中的栈、对列、链表、树等等。这里给出链接https://www.nowcoder.com/activity/oj。
LZ没有刷过这些题,因为LZ做了一年的信息学奥林匹克竞赛NOIP家教,所以对这些知识点掌握的稍微熟悉一些^_^。如果你是本科生,强烈建议你本科阶段参加ACM竞赛。
二、机器学习基础知识点
1、分类、回归算法:Bayes、KNN、LR、SVM、Adaboost、RF、GDBT、XGBoost等
2、聚类算法:k-means等
3、推荐算法:协同过滤等
4、神经网络模型:BP、CNN、RNN等
5、自然语言处理:神经网络语言模型、LDA、word2vec等
6、机器视觉、图像处理
7、CTR预估:FM、FFM模型等
8、EM、HMM算法等,PageRank、Apriori算法等,SVD算法等
9、L0、L1、L2正则化
10、各种损失函数(对数损失、指数损失、铰链损失、均方误差损失、Huber损失等等)的区别以及应用场景
11、各种优化方法(批量梯度下降、随机梯度下降、牛顿法、拟牛顿法等等)的区别以及应用场景
12、各种评价指标,尤其是AUC的计算方法
13、信息熵、信息增益、信息增益率、基尼指数;ID3、C4.5、CART;决策树的剪枝方法
14、线性分类器、非线性分类器;生成模型、判别模型
15、常见融合框架及其优缺点以及代表算法
16、特征工程中的一些列问题:归一化/标准化、去除噪声、样本不平衡问题、特征选择各种方法、降维各种方法等等
17、偏差、方差,过拟合、欠拟合,学习曲线,交叉验证等等
18、常见基础算法的时间复杂度(尤其是排序算法),能够现场解决复杂问题时间复杂度的计算
19、海量数据top k问题、中位数问题;海量item本文相似度优化方法
20、hadoop、spark等常考的问题也需要掌握
对于以上提到的算法,不仅要求掌握算法的原理、应用场景、关键参数、如何并行化,还必须能够手动推导当下流行的算法(主要是损失函数的梯度下降等)。
掌握算法的改进算法,比如通过k-means++改进k-means初始类簇中心的选取,通过KD-Tree降低KNN时间复杂度,通过FP-Growth降低Apriori挖掘频繁项集时间复杂度等等。
掌握算法之间的区别与联系,比如k-means和EM算法的关系,Adaboost、RF、GDBT、XGB的关系等等。
面试的时候如果知识量丰富,并且细节掌握的很好,要主动扩展,向面试官主动输出,也就是说不仅要清楚明白每个算法的流程细节、公式推导,还要明白算法的优缺点应用场景,要有完整的机器学习知识体系和架构。例如,讲起bayes就可以讲讲拉普拉斯校准;讲到生成模型,就可以讲讲EM(讲讲GMM,以及初始值选取),可以讲讲HMM,最好现场把HMM预测模型的维特比算法完整代码写出来。Adaboost、RF、GBDT、XGB最好一起讲,boosting、bagging穿插其中,过拟合欠拟合随口引出,学习曲线、正则项等等,太多了,只要有信息,只要了解的很详细,那就大声说出来吧。
讲算法的时候,可以把工具也讲一下,比如SVM,不仅要会推导,还要说明核函数的选取,软间隔(这里就可以谈一谈损失函数的区别),还可以说sk-learn中通过GrideSearchCV来调参等等。
以上只是简单的罗列了一部分知识点,其实还有很多的扩展,也都是经常考的问题,例如CNN中的pooling的选择、feature map、多通道问题,softmax如何解决多分类、softmax梯度下降推导等等。建议没事儿多在牛客网上刷刷面经,里边涵盖了各种大牛面试不同公司被问到的问题。
快速准备这些知识的参考书籍:李航《统计学习方法》、周志华《机器学习》、各种权威博客、论文源刊等等。多翻几遍、克服遗忘曲线。
三、简历以及项目
自我介绍完,一般面试官先问科研项目、实习项目、竞赛等等,需要把简历上的项目、竞赛了解的非常透彻,比如各种关键参数、各种知识点的扩展、甚至是其中关键函数的推导都要非常清楚,不然会被问哭的。
最好发表过高质量的论文,切勿胡编乱造,面试官一般都会现场百度学术/谷歌学术上查找你的论文的,最好提前想想自己的论文有什么实际的应用场景,这个挺重要的。最好有实习经验,当然去实习不是去打杂,实习要有实际项目做支撑。最好有竞赛经验,例如天池竞赛、数模竞赛等。这些都是加分项。
四、总结
秋招是个艰辛的过程,9月中上旬开始大量笔试,面试集中在9月中下旬,一般知名互联网公司最晚在10月中旬以前结束秋招。但是,内推提前批一般7月份开始,所以能参加提前批就参加提前批吧。所以复习时间,复习进度,自行把握吧。
LZ准备的太晚了,8月中旬才开始预习+复习,还好基础相对扎实,很多知识在之前的科研、实习以及竞赛中都有涉及,所以复习的相对较快,9月中旬之前就完成了复习。整个秋招下来收获5个offer。
LZ学校非985、211,本科理学院学渣一枚、研究生计算机学院开始写代码,所以两年时间,可以改变很多事情。接下来的路,继续加油吧。