18届本科,现已入职头条算法工程师。说一下我当时拿sp的面经(校招本硕学历,正常情况下sp就是极限,当然我见过SSP,那是骨骼惊奇背景极好(ACM世界决赛有牌?)一进来就级别高一级)。面试这个东西最重要的还是对面试官胃口,这点可通过多看面经来把握。还有头条19年校招,50%以上拿到offer的同学都是实习转正的,所以实习可以说是除硬实力之外最重要的了。
一面
讲实习做的事
面试官定义了一些接口函数:batch数据生成器,前向传播函数,SGD优化函数,损失函数。手写神经网络训练的train函数。Pytorch类似,随手写。
一个数据文件,记录了训练样本。写个程序统计方差之类的统计量。码题。
怎么调模型超参数?理想gird search,实际固定变量,一个一个取优,但是主要还是看多次实验的经验和sense。
解释梯度消失的原理。
讲batch normlization原理。读过原论文,知乎上看过相关回答。
softmax回归,learning rate为0.1一切正常,Learning rate为0.08却求解失败为什么?
二面
讲实习做的事
两个链表,无序,某些节点会有del标记。输出同时出现在两个链表中,且无del标记的数。hashmap秒,手写。
文件有很多int32的数字,内存只有500M,统计他们的个数。
500M存不下所有数,hashmap超内存,我说了个trie树,面试官说简单点的。
我说B+树,可以放在磁盘,面试官说这不更难了么。
我说bitmap,然后手算了一下,刚好存下2^32个数字的内存。面试官说牛逼。
一个m*n的矩阵A(m 1e7, n 1e7),一个n*1的向量V,求A*V的向量前k大。
A可以离线,n*1是在线询问,需要100ms查寻前k大。这是面试官工作中遇到的。
m*n离线处理方法就是按照向量的模聚类,然后求与查寻点积最大的类的那些类,然后求他们中的前k大得出最后的前k大。
三面
无序数组前k大。我:快速排序partion,O(n)。
证明O(n)。我n + n/ 2 + n/4 + n/ 8,等比数列求和。
不交换数组内元素,O(1)空间算法。想了一下,二分秒。
进程和线程,进程通信,什么时候用多进程,多进程共享内存速度慢的原因。
多个线程意味着它们之间的联系很紧密,需要共享同样的数据,处理相似的任务,都在一个进程里面,所以需要特别注意资源的竞争,也就是需要特别小心的设计互斥和加锁。多进程,以为着两者有一定的关联,但是操作过程相互独立,或者说不那么需要共享同样的数据,偶尔有数据通信就通过IPC进行 。还有就是多线程是有数量限制的,单个进程只能开【内存大小/stack大小】个线程,比如32位的linux,默认stack是8m,而最大可用内存是3G,所以最多可以开3G/8M=384个线程,而进程却几乎可以开无限个…
速度慢意思处理进程同步问题(比如信号量),而是对chache命中率的影响。
tcp慢启动算法。我只记得,每次乘2增大cwand,当发生丢包就减小。细节忘记。
手写逻辑回归目标函数,目标函数对w求导,手写。基础题。
谈了一下做的kaggle数据竞赛,考察我对数据源头的敏感性。但是看了讨论区老哥说数据源头有问题,有人为了税乱报,说了。
用过头条么?你觉得目前缺点是什么?如何改进?如何衡量推荐系统的结果?(以上内容都是凭感觉答的,当时我只会协同过滤。)
谈face++等各视觉大公司的过去和未来,这个感觉就是对业界的把握。
最后,祝各位同学新年快乐!明年offer收割!