2021年7月面试总结
写在前面
按照学院课程安排的进度,大三基本已经把课程修完了,所以我腾出了大四上学期,准备找份实习工作。面试完以后,我越发觉得自己所掌握知识的浅薄、个人能力的不足。想起来,自己博客也已经荒废了好久了,重新执笔写下这一篇也算是对自己做一下总结反省,与有同感的读者共勉。
个人情况
本人目前是本科大三,某三档985计科专业,简历里面主要讲述的是自己的科研经历、学术成果、获奖情况和个人技能(编程、英语等),之后的面试也基本是根据简历内容开展的。本人是有三段科研经历,大二的时候申请了实验室的研究助理岗位,主要的研究内容是计算机视觉,low level做的是增强,high level做的是目标检测,实验中也用到了GAN网络(这是后面面试官考察的重点)。成果方面是有EI检索国际会议论文一篇(一作),另有两篇在投(一篇一作,一篇三作),软件著作权一项,还有数竞、美赛等奖项。
实习面试
简历投递
根据自己的科研经历、知识和个人兴趣,我申请的实习都是CV算法岗,有偏开发的,也有偏科研的。前前后后一共投递了差不多十个岗位,大部分都是走的内推,简历初选通过了五家:商汤、地平线、字节跳动、亚马逊和微软亚洲研究院。
面试准备
因为没有什么太多的经验,都是从网上看各种面经,复习准备的针对点都是机器学习、图像处理等基础,熟悉一下自己做过的项目中用到的知识,然后刷刷算法题。
商汤科技
第一个面试的商汤科技,投递了两个岗位,一个是画质算法部,另一个是和工业视觉相关的(HR电话通知我初选通过了,说之后会安排面试,然后就没有然后了???当时真应该打个电话过去问问,所以只参加了第一个安排的面试)。
1、首先是做自我介绍,和简历写的内容差不多。参考了别人的一些建议,自我介绍部分最好准备一份文稿,但不要照着稿子读,熟悉了之后可以*发挥,自信很重要。
2、挑选一个项目做介绍,我选的项目是关于CGAN、异常检测、目标检测等内容。相关的考核内容:
1)数据增强方法。我和面试官在数据增强在该项目中的应用有一些争论,花费了很多时间。
2)Faster R-CNN的流程
3)RPN的原理
4)NMS算法。这个地方问的很详细,包括基本流程、如何选择box、交并比计算等
5)介绍一下GAN和CGAN,为什么选用CGAN?
3、有没有了解其他GAN模型?这里我简答说了一下StyleGAN和CycleGAN,讲解了基本的原理
4、图像增强算法。空间域和频率域都问了,主要谈了空间域增强。
5、是否了解基于深度学习的low-level算法?之前有看过相关论文,但了解的不是很多。
6、Python的装饰器、生成器、迭代器
7、Python的copy(),和deepcopy()区别
8、代码考核:由于前面交流的时间太多,没有时间考核代码,就直接跳过了[捂脸][捂脸](每天一个面试小技巧,你学会了吗?)
地平线
和自动驾驶相关的CV开发岗位,和深度学习平台有关。值得一提的是,介绍里面写的只有mxnet和pytorch,而我之前用的都是tensorflow。所以说,除非应聘google,学好pytorch,走遍天下都不怕。
1、自我介绍
2、项目介绍
3、Faster R-CNN。流程、RPN、RoI pooling
4、GAN的基本原理,怎么训练(G和D交替训练)
5、为什么使用U-Net和FCN(二者优点是什么)
6、GAN生成效果的评价指标
7、图像增强算法。这里重点考核的是CLAHE,算法基本流程、双线性插值
8、快速排序的原理,最好、最差、平均时间复杂度。介绍一下其他的排序算法
9、代码考核:给定一个不重复的无序数组和整数k,寻找前k大的数。如array=[5,4,6,1,3,7],k=2,返回[6,7];k=4,则返回[5,4,6,7]。并给出相应的算法复杂度,要求时间复杂度尽可能小(不能做排序)。
亚马逊
一面:重点考核代码能力,面试官人很好,会逐步引导你的思路。
1、自我介绍
2、简单介绍项目
3、代码考核:
1)手写卷积。这个地方做了简化,stride=1,padding=1,core_size = 3*3。面试官点名要求用C++ vector容器来写,输入输出都是vector<int>。这个地方还考察了卷积的基本知识,padding的作用是什么,卷积和池化的区别。
2)逻辑题:已知某random()函数会返回0或1,但二者概率不相等。请设计一种方法,利用random()函数,等概率返回0或1。(答案很巧妙,这个地方调用两次random(),写出所有结果的概率,就知道答案了)
二面:知识点考核,简单考核代码
1、介绍项目
2、Faster R-CNN。和之前考察的差不多
3、GAN、CGAN,项目中做了什么改进?(改进loss)
4、项目中数据集的建立和处理,测试方法和评价指标
5、传统机器学习算法SVM、朴素贝叶斯等,做了简答的原理考察
6、代码考核:将三进制字符串(只含有‘0’‘1’‘2’)用[0-9, a-z]中的字符压缩编码,并且过程可逆,要求压缩数据越小越好(说白了就是映射的越满越好)
字节跳动
投了字节好多岗位,AILab等等CV岗简历筛选都没通过,应该是把我推到了数据挖掘那边的岗位去了,那边也有个新开始的项目,正好缺劳动力,就安排了一次面试。这个面试官非常帅,和胡明轩很像。因为他迟到了一会,所以就直接介绍项目,边介绍边提问。
1、Faster RCNN。这个面试官问的非常详细,我记得到的几个点如下:
1)RPN原理
2)anchor的计算
3)box做了几次修正,分别在什么地方
4)RoI pooling的作用
5)如何做分类
6)RPN的loss是什么
7)……
2、项目中U-Net结构(细节,具体到每个层和操作)
3、上采样和下采样原理和在代码中如何实现的
4、Batch Normalization原理和作用
5、什么是梯度爆炸和梯度消失,如何避免
6、如何避免过拟合
7、sigmoid函数(写出来),relu比sigmoid的优势,leaky relu比relu的优势
8、代码考核:给定一个无序的、不重复的整数数组和一个整数k,返回数组中相加等于k且长度最小的元素组合,找到一个即可。如array=[4,1,5,3,2,0],k=9,则返回[4,5]。
MSRA
这是唯一一个电话面试的,而且是面试官直接和我通讯联系。这样交谈起来倒是很轻松。就是面试时间有点紧张,安排在了中午一点,困得要死,涂了好多药才提起神来。
1、自我介绍
2、介绍项目。这里交谈的时间比较长,几乎对实验的每一个细节都做了说明
3、Faster R-CNN:
1)算法流程
2)RPN原理
3)NMS算法
4)softmax分类
4、常用的损失函数(最小二乘回归、极大似然估计、交叉熵等)
5、交叉熵公式
6、算法考核:给定一个整数,向下取整求平方根,并计算其时间复杂度,T(n)越小越好。因为是电话面试所以没有具体写代码,只描述了算法。
面试结果
由于开始缺乏经验,准备的不是很充分,商汤和地平线都是一面后三天内直接收到了感谢信。亚马逊一面发挥的不是很好,二面表现还是可以的,所有问题应该都答对了,编程也没有什么问题。没有被拒,但一周过去了还是under consideration状态。从网上看帖子说亚马逊技术岗一般出结果在两周之内,不知道是真是假。字节,我已经不抱希望了,答的不是很好,现在四五天过去了没有安排二面,估计是凉了。MSRA是希望最大的一个,也是我比较想去的地方,面试官说这周会再联系我。之后他邮件说希望我八月就入职,但这和夏令营冲突了,我说最快只能九月入职,不知道会不会对最终的录用结果有影响。
这一波申请主要还是抱着试试的态度,积累经验为主,目前来看貌似只能积累经验了[捂脸][捂脸]。虽然基本以失败告终,但收获还是蛮大的。我打算先多做些准备,这一两个月刷刷算法题,对相关的知识做一些针对性的复习,等到夏令营结束了再申请一波。
总结
总的来讲,这一波面试暴露的最大问题就是学艺不精,或者说有太多的知识点存在一知半解的情况。这是平时学习习惯的问题,在学业方面存在太多的ddl导向和考试导向的情况,独立思考不足,所以对很多知识没有深刻的理解。而且,很多旧的知识点也没有充分地复习,比如双线性插值那里第一次就答错了,虽然在面试官提醒下改正了,但说明自己知识漏洞已经很严重了。从小就背诵“温故而知新”,现在想来很是惭愧。
由于前两次面试都考察了Faster R-CNN,所以我又温习了一遍,但还是对很多细节知识的理解不足。值得一提的是,凡是有和目标检测相关的内容,每次面试都考察了Faster R-CNN,而Yolo系列、SSD等都没有考察。
从这几次面试里面可以总结一下经验:
1、简历:面试官考核的内容大部分是简历里面的项目,所以一定要熟悉所有的项目,对每一个算法都要充分复习
2、CV的low-level和high-level最好都要了解一下,对整个CV和DL的认知要有广度,对你研究领域的认知要有深度。这也不仅是面试准备,对个人整体的技术素养提升也有帮助
3、目标检测的话重点复习Faster R-CNN,RPN是重中之重,NMS、softmax等也要熟悉。yolo系列、SSD等也是要复习的,虽然我没有被问到,但不代表别的面试官不会考察
4、GAN模型,毕竟是fashion,还有auto-decoder(虽然我没有被问到)
5、DL的一些基础知识,如Batch Normalization,sigmoid、relu等激活函数,过拟合、梯度爆炸、梯度消失等现象和解决措施,等等
6、CNN的原理和技术细节,相关的计算,各种操作的作用
7、ResNet、VGG等backbone,U-Net、FCN等网络
9、编程语言。简历中提到的语言一定要复习,可以去各种教程网站上顺一遍基础和常用的函数。C++是基础,入门应该都学过,和CV相关的话Python考察可能性较大。tensorflow、pytorch这些可能会问一点,如果简历里面有提到的话,至少我没有被问很多
8、代码考核。可以去各刷题网站看最热门的算法题,并且复习数据结构相关知识。一般代码考核不会特别难,需要计算时间复杂度。个人认为排序算法是很好的练习对象,一方面是可以较快地入门时间复杂度的计算,另一方面可以学到很多编程技巧,比如哨兵的设置。而且不同的排序算法涉及了递归、分治等多种思想,可以作为基础来复习巩固。除此以外,二分查找、二叉树前中后层序遍历等也是重点掌握的。比较难的就是动态规划之类的,甚至融合回溯等方法。
当然,我刷题刷的也不是很多,编程能力不算特别突出,这里只是根据几次面试的经验,做一点简单的总结罢了。
这个博客是之前某课程要求建立的,之后就荒废了。自己在学习、实验中的经验教训,很多没有及时整理下来就随风消逝了,特别可惜。经过这一波面试,我也深感自己知识之浅薄,所以写下此篇,反省自我,并于诸君共勉。之后也会多经营这个博客,总结整理自己的笔记和代码。如果这个面经也能对你有所帮助,那就再好不过了。
最后祝大家面试顺利,前程似锦!
我们都有光明的未来