MSRA实习面经
2021-09-01 20:57:54 # 面经

​ 前几天心血来潮投了MSRA的实习,本来是打算好好准备到冬天再投的,但是心想投下简历试试应该没事,也没有仔细选组,看到实习计划上第一个组是DKI组,然后也是侧重NLP方向,就直接投了。做了中英文的简历然后发了过去。大概投简历三天后邮箱收到了回信,回信是英文的,提了三个问题,首先问我接下来一年有多长时间能够实习,然后问我毕业后的打算,最后约面试的时间,英语菜鸡的我这才发现Interview是面试的英文单词。回邮件以后,大概等了三四天,收到了回信,一面的研究员貌似是小组组长的角色,和我聊了大概四十分钟,聊了之前超算的比赛经验,还有我参加的那个科大讯飞的翻译比赛,问了一些项目的细节,我情绪比较激动,偶尔有点语无伦次,但面试官全程很温柔,和我保持友好的交流,让人很舒服。

​ 大概一星期后,二面的电话打过来,微软好像都是010开头的号码。二面就开始考核算法啦,但也没给我发做题的网页链接,而是和我简单的聊了一下,因为当天在优化IPCC比赛的代码,(比赛赛题是优化超像素分割算法)看到网上有个博客说用扫描线算法比原本普通的种子生长要更快,所以看了一下扫描线算法,然后面试官就问我有关IPCC这个比赛的细节,我就顺便说了一下那天看到的优化,然后他居然也很懂这个!(看来是计算机图形学大佬),就问我为什么扫描线算法比泛洪更快,我刚好有在博客看到!因为访问相邻内存,都在同一CacheLine的原因(网上博客也是猜测,我也没具体试验过),然后聊完了这些,他就开始让我共享屏幕,因为之前打算法比赛都是用java,我本身也是个c++菜鸡(高中没打过算法比赛),所以就在Inteli J上开始写。他提问的问题也很基础:给定一个序列[x1,x2,x3,x4],然后找到 $X_i和X_j$​​​​​​​​​的和大于给定数字K,求满足条件的所有i,j的数字对数目。首先要排序,所以复杂度已经是O(NlogN),然后我想到了一个二分查找去插入的解决方案:比如序列[30,50,70],k=40,从30开始,然后二分搜40-30这个数的下标,这里应该是1,也就是1往后的数都满足与30的和大于等于k,这样算下来复杂度也是O(NlogN),但这样不是最优的。实际上,维护一个双指针,起始阶段,一个指向头,一个指向尾,如果当前和满足条件,就让尾指针左移一次,满足条件的数目加一,如果当前和不满足条件,就让头指针右移一次,同时加上(序列长度-当前尾指针)的数目,然后继续判断是否满足条件。这样做的原因是,对于头指针右移后对应的数,尾指针之后的数和它的和都是满足条件的,因此直接加上他们的下标差值就可以了。这样的话复杂度是O(N)级别。后面又问了一些简单的概率论问题,比如六颗球,三颗红,三颗白,不放回抽两个,颜色相同的概率是多少。。

​ 三面是昨晚刚刚打过来的,三面的面试官是做NLP的,问了一些机器学习和深度学习的基础知识,具体问题大概是:

​ 如何解决长文本输入带来的显存占用?

​ 自回归decoder是如何并行训练的?

​ 如何判断过拟合和欠拟合,如何解决过拟合?

​ 贝叶斯公式,逻辑回归的损失函数

​ 一个硬币不规则,如何估计正面概率,(只能扔1000次)

感觉面试的体验很好,面试官一直在引导我去往正确的思路去想,有些东西之前并没有看过,但是面试的时候却想出了解决思路,感觉他们更看重思维能力这方面,但主要可能还是因为我才大三,他们也放宽了要求。

​ 接下来就是等结果啦,希望能拿到Offer.