CV深度学习算法岗面试准备
本次秋招我是从6月份开始准备的,到现在签署了三方已接近尾声。从原本不知道怎么准备,到一点点看牛客面经,最后收获了远超预期的offer,十分感谢牛客网友的分享和师兄师姐的帮助。
鉴于牛客上对各个公司面试题和流程的分享已经很全面了,这里想结合自己准备经历以及面试官的角度(实习转正后帮老东家面了一些候选人)分享一下CV深度学习算法岗位需要准备的知识体系,以此回馈牛客网和实验室的同学们。
先介绍下个人情况:
国内Top20+的985非科班渣硕,无顶会,两篇水会,本科+硕士阶段各有一段实习经历(国内自动驾驶独角兽和国内CV头部独角兽),参与一个开源项目,有竞赛(但没被问过),Leetcode250题左右。
定位算是一个实习比较多的没有顶会的普通硕士,一共投了十几家公司,都是自动驾驶和CV方向的。最后收获的offer有:大疆、商汤、旷视、百度、依图、滴滴、图森、地平线、海康、蔚来等。
整体感觉面试官最关注我的实习经历,还有我做了三年的小众方向(三年没一篇顶会也是够菜了),不过基础知识是敲门砖,起码在我面试时占了很大一部分。
简单介绍一下面试的评分问题,大部分公司面试是采取打分制度,比如1到5分,或者ABCD这种,而不是只有通过/不通过两种选项。评分越高,相应的评级和薪资也就越高,如果出现了较低的评分可能就不安排后续面试了。所以在学习基础知识或是刷题时尽量早点准备,和考试一样,分数的上限是比较高的。希望有时间准备的同学可以追求高评级,而不是担心能不能通过面试。
前两三轮的技术面试重点考察论文项目(科研竞赛能力)、基础知识以及编程能力(工程能力),也会有一些开放性问题。科研能力和工程能力往往可以互补,即如果科研能力特别强,对工程能力的要求会稍微放宽,反之亦然。但是如果想拿到比较高的评级,有时间准备的话尽量二者兼顾。老板让我面一些博士同学的时候特意嘱咐要考察代码能力,所以如果确定去互联网发展的博士同学们也尽量抽时间刷刷Leetcode(论文巨佬除外)。
硕士同学们如果有扎实的工程能力会让面试官眼前一亮,较强的编程能力和基础知识积累会有更好的可塑性,也会在前几轮面试中获得更高的评分。如果前几面评分较高,之后的leader面基本就是谈人生谈理想,或者安利你来他们组了。
下面分享下需要准备的知识:
(1)自己所研究方向的积累(※※※※※)
这部分很重要,因为反应了几年的积累,不是突击出来的,所以更有区分度。对于投CV算法岗的同学来说,在学校期间至少是有一个研究领域的。对于该领域的发展过程、近几年SOTA方法、此领域的难点问题及解决方法、工业界(落地时)常用方法、未来可以研究的一些点都要有很精细的认知。拿图像目标检测举例,首先要能讲清楚单阶段双阶段目标检测的pipeline,包括各种常用的argumentation,针对大小物体轻重量级或是Nas搜出的backbone,一阶段部分有多少种方法把GT分配到各个anchor上(正负、难易样本),怎样通过GT得到回归的target,或者anchor-free方法的heatmap如何计算,各种RoI pooling和NMS底层代码等等。总之就是要把用过的代码每一行都看懂(最好包括C++和CUDA部分),而不只是应用现有框架或是关注自己修改过的部分。对于这类问题的拔高部分,面试官可能选择深挖(一直挖到底层具体实现)或是考察广度(针对一个问题或现象提出很多种解决方法)。多数大SSP都是对其研究领域有很深理解,甚至超过面试官(面试官也有自己的几个研究方向,不一定完全match)。
(2)编程语言基础知识(※※※※※)
这部分也很重要,能不能很快看懂代码或是写出高效规范的代码,很大程度取决于对编程语言的熟练程度。Python和C++是CV算法工程师经常使用的两种语言,需要深入学习。Python上手简单但是想精通不容易,除了对基本数据类型、语法的学习,一些高级特性也是要掌握的,建议找本书或是视频课程(我是在B站上)完整系统地学习一遍。很多深度学习代码的底层都是C++或是CUDA实现的,而且公司更希望招到有造包(而不只是调包调参)能力的同学,所以建议系统学习一下C++(我还是在B站上),最好用C++刷leetcode题,最后看牛客面经和专栏整理一下C++常考的知识点突击背诵一下,就基本可以跟面试官说熟悉C++了(没人敢说精通...)。对于CUDA我建议有时间的同学好好看看,这部分属于拔高部分,不必须,但对评级加分有用。对于非专业高性能编程的岗位,了解GPU设备上的各种资源,掌握多核多线程编程的思想和一些常见的CUDA并行加速算法,基本就可以看懂由CUDA编写的ops了,这对于更细致的理解代码也有好处。CUDA的学习也是各种书籍、视频资源(没错还是B站)结合官方文档,动手实现一下会理解的更深。
(3)Coding题(※※※※※)
这部分很重要,刷Leetcode就完事了。其实CV深度学习算法岗对于coding题的要求没有开发岗那么高,论文少一些的建议刷200道以上就差不多了,当然多多益善。我刷了250道,整个秋招十几家公司面试手撕代码环节基本都能撕出最优解(除了竞赛级的解法)。博士同学我感觉刷Top100热题就差不多?面试官看论文多了在coding题上就不会特别难为候选人,有时候撕不出来说说思路可能也能过。但即使是没撕出来但这轮面试给过了,也会体现在评分评级上,所以有时间还是尽量刷够,各种类别题尽量都刷到。初次刷Leetcode建议按类别刷(递归、二叉树、队列&栈...),也可以看一些公众号(东哥的就不错)里面图文并茂的讲解。
此外一些特殊的深度学习常用算法(NMS、BN前向反向)或是海量数据题偶尔也会被考到(谁让咱们是做算法的,各种算法都要能很快上手),这类题建议在看面经时一点点攒起来。
(4)深度学习&机器学习基础知识(※※※※)
这部分知识点很多很杂,依个人能力和时间选知识点学习。深度学习知识的考点基本都在《Deep Learning》花书上,这部分我也没完全啃完,一部分是攒面经里的知识点或者在Github上有些针对面试的repo里找的。像各种(Depthwise、Group、转置、空洞)卷积、GEMM、BN、交叉熵等都是需要能讲明白的。一些基础网络(ResNet、MobileNet等)还有剪枝量化FP16等方法也属于深度学习的基础知识了。
机器学习的书籍和视频(b站)比较多,可以系统学习推导下经典算法。这部分知识有的我没有完全理解,先背下来面试时候也能答出来,看的次数多了有的自然就理解了。
(5)各种数学知识(※※※)
我也被问到过,但频率不是很高,像线性代数里各种矩阵操作、奇异值分解、求逆,以及李航老师的《统计学习方法》和一些经典智力题。有时间可以准备一下,没时间也可以攒面经。
(6)传统计算机视觉算法(※※※)
有些面试官也会问些传统视觉方法,包括直方图、各种算子、投影变换等。
(7)非自己所研究方向的积累(※※※)
关注下其他领域的先进CV和深度学习论文,可以拓宽解决问题的思路,对开放性问题和情景题有帮助。
(8)面经(※※※※※※)
个人认为的唯一六星知识点写在最后。不管准备的充不充分,在面一个公司前尽量在牛客上看一遍该公司的面经,没准会碰到差不多的题。对于没时间系统上面这些知识的同学,也可以通过攒面经的方式突击准备面试,效果不会太好但比不准备强。
能想到的方面暂时就这么多,第一次可能也是最后一次写面经,祝牛客网和实验室的同学们都能收获远超预期的offer。
#学习路径##深度学习##计算机视觉岗#