腾讯AI Lab面试 日常实习【超详细记录 已拿offer】
本篇经验目录:
一、前言
二、面经(详细版)
三、面经(简化版,只有问题)
四、小结
一、前言
本人本科211,硕士985,目前研一刚过一学期,做了一个多目标跟踪的项目,发表了一篇1区论文(但没在面试的时候提),刚好有个内推AI Lab的机会,导师也挺支持我去大厂实习,因此抓住机会,一发命中(本人第一次参加面试...)——AI Lab机器学习中心基础研究岗。
非常艰辛的准备之路,因为研一上学期还是有很多课程和项目任务,半年来平均每天有效学习的时长为6.8小时【不包括上课时间】。对于面试,前前后后加起来只准备了一个多月,心里是非常忐忑的,看了很多面经,大家都说要对自己的项目要非常非常熟悉,但却没有人说要熟悉到什么程度,所以很怕刚上来就被pass,结果面完发现项目其实是最好准备的,侃侃而谈就好了。对于其他的内容,我觉得自己挺幸运的,问到的知识点大部分都有准备过,尤其是3道算法题都刷过类似的,在指定时间内bug-free,并且给出最优解法。
言归正传,接下来请看详细面经。【写得很详细,是为了让像我这样第一次参加大厂面试的兄弟姐妹们能对面试过程有个比较清晰的了解,因为人们总是会对未知产生恐惧】
二、面经(详细版,只想看面试问题的话请直接去看第三部分)
一面(2020/02/13/ 微信语音,1h50min)
-
自我介绍。(这是你唯一能把握主动权的3分钟!!!)
上来先自我介绍,我主要从数学建模比赛(本科参加了很多次,岗位对这个比赛是nice to have)、项目、对强化学习的了解(这个部门主要是用强化学习)3个方面进行介绍,我并没有按照简历照本宣科,而是分别拿出3个方面最值得介绍的经历,以讲故事的方式来叙述,并且说完一个经历就会总结一句:我在这个经历中收获最多的是xx(eg:快速学习能力、团队合作意识等)。因为自我介绍是为了让面试官了解你身上具备的优点和潜质,至于你已有的能力,你的简历上已经写得清清楚楚,就不需要浪费这么宝贵的3分钟。 -
比赛、项目提问
面试官会根据自我介绍的内容进行提问,所以自我介绍显得尤为重要,你可以引导面试官接下来会对你提问什么。我在自我介绍时说到比赛中快速自学了元胞自动机模型并得到了应用,两面的面试官关于比赛的问题都问且只问了元胞自动机的相关知识,包括简介、原理、应用场景、有没有对其进行改进。
至于项目,只要把涉及到的整体流程、每个算法的原理&使用的原因、难点搞清楚就差不多了,并没有问到代码具体实现。 -
机器学习
①面试官:你参加那么多数学建模比赛,对机器学习方法应该挺了解,请你说下哪些模型可以用来做回归?
简要:我把回归分析里的方法都讲了,并提到了支持向量回归。②面试官:请讲下支持向量回归原理。
简要:我说不会,但知道支持向量机③面试官:支持向量机也差不多类似,那你说下吧
简要:我从SVM基本问题定义到对偶问题的推导过程,以及核函数、非线性问题、SMO、KKT条件都说了。 -
深度学习
①面试官:讲下BN。
简要:这个是常考的,一定要会。我从背景、原理、方法、训练和测试的差异、意义,各方面都详细说了。②面试官:你刚说到BN要重构,请问为什么?
简要:我之前看过博客,说是如果不做的话会破坏浅层的特征,结果面试官说不重构也可以学习到特征呀。然后又继续反问我为什么要重构。我想不出来。最后他告诉我是因为归一化后会降低表征能力。③面试官:你做过深度学习,那你说说卷积吧。
简要:我把卷积的整个过程详细讲了一遍。④面试官:pooling有什么意义
简要:我从降维减少参数量和减少卷积后的冗余两方面回答。结果面试官补充说pooling可以增大深层卷积的感受野。⑤面试官:刚才说到感受野,那谈谈你对感受野的理解吧。
简要:这个我之前没准备,就真的是凭自己的理解,结果也答的不好。面试官告诉我是一个卷积核可以映射原始输入图的区域大小。⑥面试官:讲下激活函数的意义
简要:讲了常用的几个的激活函数及意义⑦面试官:为什么要用relu而不用sigmoid
简要:从饱和区间、敏感区间和梯度三个方面来回答。⑧面试官:有了解过GAN吗?
简要:没有。。。(当时这个回答太快了,其实我是略有所闻,至少把自己知道的讲几句,直接回答没有,其实不太好) -
强化学习
①面试官:讲下q-learning。
简要:一步一步介绍了模型。②面试官:有了解过DDPG吗?讲一下原理。
简要:我说是属于Policy Gradient系列的,就从PG->Actor Critic->DDPG一路详细地讲了模型的流程和特点。 -
语言
①面试官:讲下python的staticmethod和staticclass
简要:没听过,但面试官谈到了装饰器,我就介绍了装饰器相关的。②面试官:讲下python的匿名函数和意义
简要:讲了lambda的形式和意义③面试官:对浅拷贝和深拷贝有了解吗,讲一下。
简要:很清晰地介绍了它们的特点和区别。 -
框架
①面试官:讲下tensorflow搭建网络和训练的流程。
简要:从定义占位符开始一步一步说下来,可能说的很顺畅,说到一半面试官就说不用了,下一个问题。②面试官:有没有学过pytorch
简要:我没学过,但我说知道现在很流行,如果以后工作需要用这个框架,那我可以快速学习,因为框架之间应该都差不多,况且pytorch还更简洁简便。 -
算法题
面试官发了一个腾讯文档,可以实时看到我敲的代码。然后问我有没有刷过算法题,我说这学期刚开始刷,刷了一些。他就说那我们先来一题简单的。就现场从leetcode搜了一题easy的。然后给3分钟思考,思考完跟他讲思路,讲完就让我在文档写代码,按leetcode的那种形式,给10分钟。看我很快想出来并很快写完,他就说那再来一题。结果出了一题medium。恰好我做过原题,前两天还复习了,所以秒解,用哈希集合+快慢指针,并且面试官问了我时间复杂度,因为快慢指针各遍历一次,所以是O(n)。以下是题目:
①原地删除排序后的数组中重复的数字。(要求空间复杂度为O(1))
②给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 -
开放性问题(都跟他们的温室挑战赛有关)
开放性问题是本来已经结束了,都已经在提问反转环节了,说到一半他突然说问我一个开放性问题。
①面试官:如何设计一个算法来实现自动控制温室种植,假设数据都已经收集好。
简要:我说了用强化学习,并给了几种现有算法。②面试官:那如果不用强化学习,你觉得可以用什么方法做。
简要:想了半天想不出。。 -
其他
①面试官:有没有学过搜索算法?
简要:这学期刚好学了相关课程,就都说了。然后实现过一些,比如启发式搜索算法:GA、SA等,都自己用代码写过,也在数学建模比赛中用过。 -
提问反转环节
①我问在腾讯我要怎么能得到系统性的成长。
②我问在腾讯的工作强度是怎么样的。
一面结束,面试官气场很温和,他一开口说话我就不紧张了,就跟聊天一样,还会在我回答不出的时候告诉我正确答案,人很好。在最后的时候,面试官说:今天的面试,我觉得你基础挺好的,我挺满意的,研一就这样很优秀【我就当补药吃了吧哈哈,给自己添点信心】。面试完自我感觉还是挺不错的,毕竟第一次,并且也只准备了一个多月,很满意自己了。
面试感受:★★★★★
面试难度:★★★
二面(2020/02/18 电话,1h40min)
-
自我介绍:
和一面一样,不过面试官遇到感兴趣的内容会直接打断来问你。 -
比赛、项目提问
这次项目问了很多算法实现的步骤,以及项目中遇到的难点,但都能回答的很顺畅。 -
机器学习
①面试官:为什么会发生过拟合?
简要:我讲了先前总结过的几种情况。②面试官:那如何降低过拟合?
简要:讲了几种降低过拟合的方法,这个面试官一直问:还有吗?强行憋出了6个。(降低模型复杂度、增大数据集、dropout、正则化、集成模型、BN)③面试官:讲下正则化
简要:讲了L0\L1\L2,L1和L2的具体形式和反向传播的时梯度的推导公式、以及它们如何降低过拟合都详细说了。④面试官:泛化误差如何产生,有哪些方法可以减小?
简要:讲了泛化误差的展开式,分别说了从bias、var和噪声三个方面减小,并说了相关的方式,以及如何平衡bias和var。⑤面试官:讲下dropout原理。
简要:从背景、原理、实现详细介绍。⑥面试官:dropout训练和测试有什么区别吗?
简要:从期望的角度,说明了训练时要除以概率p,或者测试时乘概率p。 -
强化学习
①面试官:on-policy 和off-polic的区别
简要:先从蒙特卡洛强化学习的同策略和异策略模型来说明;再根据q-learning和sarsa的区别来说明。②面试官:贪心策略和确定性策略区别
简要:从选择action的概率的角度,介绍了区别,并介绍了两种贪心策略:epsilon和softmax③面试官:有一些真实例子,还有一个模拟器,如何训练一个强化学习模型?(这个就是他们目前面临的问题)简要:讲了可以先用直接模仿学习和逆强化学习,然后再用一个强化学习的模型。④面试官:直接模仿学习和逆强化学习具体说下
简要:就按《机器学习》(西瓜书)中学到的详细说了。但逆强化学习没说太清楚。④面试官:强化学习的baseline
简要:我懵了,因为我项目是用深度学习做多目标跟踪的,对于强化学习只学了一些基本框架和基本的理论知识,但是还没时间去看过强化学习的论文,所以不懂啊。然后面试官最后告诉我说就是采用一个随机选择action的策略。。。 -
算法题
①求二维矩阵的人脸个数
简要:和leetcode的求岛屿数量那题非常像,算是medium的,刚好复习过,就秒解了,大概40行左右的代码,很顺地解下来。面试官看完说没问题。 -
开放性问题
①面试官:如何对一段python代码做加速,可以自己假设代码的应用场景
简要:这个问题又榨干我了,我一开始说了5种方式(优化算法从而减少循环次数、调整if elif语句的顺序、核心模块用cython、多线程多进程、生成器减少内存占用量)②面试官:追问了多线程和多进程是什么?
简要:详细说了区别,以及python中的实现,并说python没办法利用多线程,因为有GIL,面试官说他没听过,问我是不是真的,然后让我讲一下GIL,我也详细讲了GIL的流程。③面试官:还有什么办法可以加速python代码吗?提示说可以假设是一个训练神经网络的场景。
简要:我补充说可以用GPU、batchsize。然后面试官继续追问还有没有,最后他说了cpu加载数据和gpu训练数据的差异,如果只用cpu加载,那发挥不出gpu的优势,可以用异步来加速,即先加载一部分数据到缓存。【我有一种醍醐灌顶的感觉】④面试官:GPU如何加速?
简要:不懂。。 -
提问反转环节
①我问他们部门的工作机制是怎么样的②我问通过今天的面试,觉得我哪些方面需要加强
面试官说觉得我基础挺不错的,但是缺乏经验,如果过去实习的话,需要适应一段时间他们的节奏。(当时我感觉凉了,没想到过了两天给我发了offer)
面试感受:★★★
面试难度:★★★★★
三、面经(简洁版,仅问题)
一面
-
自我介绍
-
比赛、项目提问
-
机器学习
①哪些模型可以用来做回归
②支持向量回归原理
③支持向量机原理 -
深度学习
①BN
②BN为什么要重构
③卷积
④pooling有什么意义
⑤谈谈你对感受野的理解
⑥讲下激活函数的意义
⑦为什么要用relu而不用sigmoid
⑧有了解过GAN吗 -
强化学习
①q-learning
②DDPG -
语言
①python的staticmethod和staticclass
②python的匿名函数和意义
③浅拷贝和深拷贝 -
框架
①tensorflow搭建网络和训练的流程。
②有没有学过pytorch -
算法题
①原地删除排序后的数组中重复的数字。
②给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。 -
开放性问题(都跟他们的温室挑战赛有关)
①如何设计一个算法来实现自动控制温室种植,假设数据都已经收集好。
②那如果不用强化学习,你觉得可以用什么方法做。 -
其他
①搜索算法 -
提问反转环节
①我问在腾讯我要怎么能得到系统性的成长。
②我问在腾讯的工作强度是怎么样的。
二面
- 自我介绍
- 比赛、项目提问
- 机器学习
①为什么会过拟合
②如何降低过拟合
③正则化
④泛化误差如何产生,有哪些方法可以减小
⑤dropout原理,包括训练和测试的区别 - 强化学习
①on-policy 和off-polic的区别
②贪心策略和确定性策略区别
③有一些真实例子,还有一个模拟器,如何训练一个强化学习模型?
④强化学习的baseline - 算法题
①求二维矩阵的人脸个数【用dfs】 - 开放性问题
①如何对一段python代码做加速,可以自己假设代码的应用场景 - 提问反转环节
①我问他们部门的工作机制是怎么样的
②我问通过今天的面试,觉得我哪些方面需要加强
四、小结
第一次参加大厂面试,很幸运地我按照正确的方向准备了,准备的广度和深度都还过得去,算法题才刷了70道左右,就都被我碰上类似的了,果真机会都是留给有准备的人!以下是更有针对性的感悟:
- 比赛&项目:对用到的模型的原理都要能清晰地说出来,以及难点、创新点,都要明确。
- 机器学习(传统\深度学习\强化学习):大厂考察的基本都是底层的原理,要了解每个知识点的原理,最好是能用代码自己实现过,这样理解得更深。并且在准备的时候需要以点带面,在一个知识点涉及到的内容都要去掌握,因为面试官是串联式地提问的,也就是对你之前回答的内容中再提取新问题,如果你不懂,那就是相当于是给自己挖坑。对主流的框架要掌握,尤其是岗位对口的那个方向的相关方法,至少了解原理和步骤以及创新点,最好是用代码实现过,并且有自己的一两点想法。
- 语言:AI相关岗位的话基本是用python,要对python的语言特性有全面的了解,还需要知道它们的应用场景。
- 数据结构与算法:按分类来刷leetcode的题,一开始刷的时候先找经典的题,然后一题多练,经典的题至少做3遍,有利于记下每类的模板。题目不贪多,要精刷,即做完一题一定要去看题解,一题尽量掌握3种解法,并且都要会讨论时间、空间复杂度。做题要限制时间,因为面试的时候,3分钟给你思考,然后你就得跟面试官讲思路了,然后再给10分钟写代码,唯手熟尓。此后我自己会每天保持刷题,这可是进入大厂的门槛啊,我觉得这次能够顺利通过,也主要得益于3道算法题我都在指定时间内bug-free并给出最优解法了。
- 开放性问题:在面试前,最好去了解下这个部门主要是做什么的,有哪些成果,很可能他们会把他们遇到的问题来问你,这样你可以有针对性地准备。因为我发现,在面试的时候是很难临时想出什么方法的。
- 面试官:
①一面的面试官问的问题很广泛,基本各个方面都问到了,加上项目和比赛的话应该有30个问题左右,但是问的方式很简单,基本上就是:说下xx方法。那么你就可以根据你准备到的来回答,并且是串联式的提问,即根据你对上一个问题的回答中提取内容来提问,所以你要对自己说的话负责,哈哈,说到的东西就一定要懂,至少能说出原理,否则就干脆不要说,不然被问倒了就是坑自己。
②二面的面试官,差不多20个问题左右,但会更深入,并且提问的方式更难,主要提问方式是:说下有哪些方法可以解决xx问题?这比一面的那种提问方式难多了,因为需要你对这些方法有一个整体的认识,你的脑子里要有一个思维导图,或者说一个知识体系,这样的问法本身就更深入。所以腭面的体验更差,就是感觉被面试官榨干了,我说了所有自己所知道的方法,面试官还一直说:还有吗?还有吗?这样面试完就没有一面时的那种舒畅,因为总感觉自己掌握的不全面,很有可能凉。但其实大部分都是可以准备到的,有一两个点是需要大量的经验累积才会知道,所以这也不会有太大影响。