万字长文 | 2023届推荐算法岗面经总结!
共 7046字,需浏览 15分钟
·
2022-06-11 08:19
作者:落尽 | 编辑:对白的算法屋
985渣硕,保研本校之后因为没有大规模开发的经验,再加上不太想背八股,所以转算法。研究方向是医学图像,SCI2区一篇水刊医学+计算机结合论文。
组内有做推荐算法的于是花了一个月时间转推荐,慢慢对推荐感兴趣。21年底有个非常好的朋友(阿里P8级别的)把我捞去了小红书实习,base北京,接触到了企业级别的推荐算法。推荐算法实习的意义可能就是接触线上+业务,毕竟在学校里面是不能碰到这种场景的,推荐算法需要大数据+场景支撑。
万事开头难,原本迟迟没有下决心的,4月初的时候一天晚上下班,字节hr打电话给我(本科大三的时候曾经投递了字节的简历,后来因为身体原因没有面试),问我有没有意向,刚好hr是抖音app推荐算法团队的,所以下决心开始准备春招实习。可以说投得非常晚,准备得也很晚。于是回到了学校开始准备。因为是第一次开始海投,没经验所以没录音,回忆一下大概,可能漏掉了很多问题跟细节。
一. 抖音APP推荐
一面4.8下午18:00
当时其实自己还在小红薯实习,所以请了一天假。
自我介绍
答:语速放慢,背;挑一个小红薯的项目仔细介绍
答:主要在小红薯做了一些向量召回+点召回工作,语速放慢,慢慢讲;模型的时效性怎么样?
答:我是t - 1更新,还会离线把ANN结果写入redis,因为线上qps目前暂时不支持;聊聊AUC吧。
答:随机取两个样本,正样本排在负样本之前的概率;追问:AUC怎么快速计算
答:把样本按照预测值排序,编号从大到小,看正样本的编号,巴拉巴拉~。PS:这里主动输出了一下知识,简单证明了一下 曲线下面积 = AUC的物理定义;线上线下AUC不一致怎么办?(这里有点懵,而且因为没有做过排序,只能按照自己的阅历尽可能全面去回答。)
答:有可能召回侧拿到的样本是之前旧版本排序模型的结果,会导致模型间的gap,采样的时候要变换方式;检测离线训练模型有没有过拟合;检查线上线下特征是否一致(可能存在穿越现象);导致线上线下auc不一致最可能出现的情况就是样本穿越,因为离线训练计算auc是所有样本一起计算的,而线上不可能出现一个用户去点击排序给另一个用户的item的情况,所以过滤掉那些点击为0,或者点击率过高的用户)你们排序是怎么做的,时效性如何?(可能是看到我对第6个问题的回答,直接转向了排序)
答:目前基建还不完善,没有prerank,postrank,rerank阶段,排序侧只有一个排序模型wide&deep,排序模型是实时的,每30分钟线上发射session label,然后把样本+特征dump到云上,模型自动训练。召回的时候具体怎么做的?
答:每天离线训练完之后,模型会产出当天的向量,写到oss上,下游消费向量建立NN索引(HNSW),然后我再刷一遍全量的商品,把nn结果写入redis,线上从用户画像取用户lastn,做trigger selection和时间衰减,最后送到排序模型。如果现在我上一路DSSM召回,发现AB实验效果不好怎么办?
答:首先看样本+特征。召回的样本是不是跟当前线上排序模型关联,特征穿越之类的;其次看当前召回渠道的结果是不是跟线上已有的重复;追问了一下还有呢?当时有点紧张,只能说那就加大流量,5%不行就到10%,再不行就到20%。到这里面试官笑了,感觉这才是他想要的回答,hh。两道Easy算法题。
10.1. 一个m * n棋盘,只能往右或者往下走,问从左上到右下路径和的最小值。简单dp(当时直接用二维dp写的,写到一半自己就说了其实可以用滚动数组,然后又让用滚动数组写了一遍)
10.2. 斐波那契数列第n个数。当时看到这个想到肯定是有别的想考的,所以就把记忆化,跟直接用数组保存比较了一遍。最后又问我时间复杂度能不能再低?我说通项公式,有追问还有其他方法嘛?当时紧张给忘了,面试刚结束就想起来了 ,其实就是矩阵的n次方,然后就转化成快速幂了,O(logn)。
二面4.12晚上20:00
一面面完不到半个小时直接约了二面。
自我介绍
答:语速放慢,背;挑一个你做的比较熟悉的召回渠道,详细讲一下(跟一面差不多)
答:dssm召回巴拉巴拉。其中着重提到了样本的问题,想让面试官问我。你刚刚提到了样本,说说你的样本具体是怎么做的
答:召回本身最看重的也是样本,又巴拉巴拉一堆,又着重讲到了负采样(因为负采样的逻辑都是我自己做的,所以比较熟)。说说你负采样具体是怎么做的
答:第一版i2i在batch内随机负采样,并加了bias进行修正;第二版u2i借鉴w2v,以uv曝光为权重,全局负采样,但是由于全局负彩成本太大,做了二次哈希,根据样本uv进行了分桶;你简历上说对FM,DeepFM跟FFM有一定了解,讲讲。
答:回答了一下各自的特点和改进点。你简单写一下FM训练整个过程的伪代码吧(懵了,降低时间复杂度的证明会,但是直接手撕GG)
答:因为以前手撕过SGD跟LR,所以稀稀拉拉写了点出来,然后写了下FM化简的推导,但是FM对w0, w1, Vij的导数求错了 。线下痛定思痛,直接numpy手撕了一版简易的FM。算法题。
数组第K大的数, 没看到要求用快排,我用堆排写了一遍,问了时空复杂度+证明。最后又问到了快排怎么做,临结束又问了快排怎么做到近线形是件复杂度的,这里全忘了。其实就是在partition的时候引入随机性,证明的话网上一堆。
反问环节略。二面过去一天,第二天晚上问hr,hr说面试官很忙还没写面评价(其实就是在横向),当时就知道自己凉了,果然hr说挂了,问需不需要投其他nlp或者图像方向,婉拒了。第一次面试直接gg,狠狠的emo了好几个小时 。
二. 美团优选
笔试4.9下午16:00
四道算法题+几道选择题(参加过这场的应该都知道,全都是easy题,很快全部ac,甚至感觉自己出现了幻觉hh,反而是后面的选择概念题比较难)
一面4.13晚上20:00
自我介绍;
项目介绍;
你说模型里面batch内负采样用到了bias修正,具体怎么做的?
上线前的准备,怎么看召回指标
答:首先看auc,虽然召回模型的auc基本没有参考价值,但是如果auc太低说明根本不行;其次本来应该看topn的hr,但是由于业务比较紧急,所以当时就直接拉取了头部的item做了nn,肉眼评测结果;负采样怎么做的?
跨域i2i怎么做的
答:以swing为例,在UDTF阶段生成item -> item_list的领域对,不同的是,左侧的item来源于社区,右侧的item_list来源于商品。swing跟adamic具体细节
答:balabala一堆,然后说到了高活用户和热门item的打压算法题
也是easy题,判断是否是一棵合法的二叉搜索树(我当时用的栈去做非递归,pre指针保存中序遍历前一个节点,然后跟当前节点判断值大小,面试官说我这个做法有问题,应该用一个int保存遍历过的节点的最大值,我其实觉得我做法没问题,而且还能AC,但是不敢反驳hh,甚至还附和了面试官,哎0offer的孩子就是这么卑微)
二面4.19晚上19:00
不得不说,美团的流程相比字节速度真的慢很多很多。二面问的基本全都是业务问题,这里就不展开了(貌似现在基本不问八股了,什么SVM,对偶问题,过拟合,BN,dropout,生成模型判别模型,lr为什么用sigmoid,最大似然,L1和L2(拉普拉斯分布和高斯分布))
美团二面感觉还是挺好的,全程都在聊业务,本来字节挂了还对美团挺抱有希望的,但是直到今天还没消息,公众号回复跟大家的一样,面试官正在考虑(其实就是横向比较)。
算法题:求最短的子数组长度,子数组满足总和 >= target。简单双指针。
三. 抖音电商推荐
当时抖音APP推荐凉了之后emo了好几个小时,后来在高铁上的时候缓过来想找抖音电商,结果没想到抖音电商hr主动联系上我了,可能就是猿粪吧,又燃起了生活的希望,hh,被捞之后重新充满斗志。
一面4.18下午18:00
自我介绍;
项目介绍;
挑一个最熟悉的项目;
模型batch内负采样怎么做的?
加bias有什么用?
答:负采样的本质是想打压高曝光item,但是由于高曝光的item本身就频繁出现在样本中,随机采可能会打压过头,因此加一个bias tower进行修正(其实就是学一个值取平衡正负样本)。带权负采样的逻辑?
答:如果按照uv曝光进行带权负采样,就是先按照uv曝光排序,之后累加,最后生成一个随机数,看着随机数落到哪两个item的uv累加和(前缀和)区间,就采样哪个item。我看你做了swing,分析一下swing的时间复杂度?
答:swing是基于用户行为共现的,首先取一个时间周期,获取这个时间周期内的用户点击行为历史(最长50个),得到user->item_list;在UDTF阶段,需要根据用户的行为历史得到item->item_neighbors领域集合,假设用户数量为U,人均点击的item个数位I,UDTF阶段时间复杂度就是O(U*I*I);在UDAF阶段要根据领域去计算每个item的最近个topk个item,假设共现当中出现的item总数是N,时间复杂就是O(N* I * I),最后还需要根据大根堆排序,假设取topK个,则时间复杂度位O(N * I * I * logK);可能看我算得很仔细面试官就没有继续细问了。Swing跟Adamic有什么区别?(略)
概率题。8个箱子编号1-8,扔进箱子的概率是 4 / 5,扔进每个箱子的概率相同;仍不进箱子的概率是 1 / 5。扔一次之后,现在打开1号箱子发现没有球,问球在8号箱子的概率。(条件概率)
算法题。链表排序,要求快排
答:其实链表的快排有2种写法, 最简单的是交换值,节点不变;最难的是直接交换节点,这里面有无数的边界case需要处理,当时衡量了一下,直接把递归+归并, 迭代+归并排序都写出来了。还给面试官分析了一下,说前面一种时空都是nlogn,后面一种空间复杂度为0,然后说说抱歉没看到是快排hh。面试官说没事,还是让我说了一下快排的思路,我就把两种都说了。
二面4.19下午16:00
不得不说字节的速度是真的很快,大致问题跟之前都差不多,不过这里问了一下基础。
自我介绍;
项目介绍;
挑一个最熟悉的项目(语速放慢,到这里基本上前三个问题,回答的都一模一样)
了解过nlp吗(不太了解,只知道最最简单的,最基础的)
仍然是一堆业务相关问题;
说一下FM,DeepFM,FFM的区别联系,以及每个模型的改进;
你说你们排序是wide&deep,那你对wide&deep有过一定了解吗?
答:回答了一下自己的见解你知道wide&deep优化的方式吗?
答:以前看过,主要是两边的优化器不同,面试的时候忘了 (wide用的Follow-the-regularization-loss, FTRL, deep用深度学习常见的AdamGrad)为什么优化器不同?
答:当时忘了,就乱说一通。到后来想起来然后跟面试官解释了一下:FTRL主要为了解决L1不能真正得到稀疏解的问题(由于SGD),wide侧很需要稀疏解,第一避免过拟合,第二线上部署的时候稀疏那部分直接去掉,能提高超高多的性能;deep部分就是传统的deeplearning了。了解优化器吗?
答:之前记得很多,包括公式,就简单说了一下SGD,Adaptive,AdamGrad之类的,其实主要是为了动态去调整学习率,然后从局部最小值收敛性简单瞎BB了几下。最后又说好多都忘了,面试官很温柔说不记得也没事。概率题。西游记主题盲盒,抽中师徒四人任意一人的概率相同,问要抽中孙悟空的平均次数。
答:当时面试官表达得很含糊,我战战兢兢回答了4次,他问思路,我说就是伯努利实验,n重伯努利实验就是二项分布,二项分布的期望是np,np = 1的时候,n = 4。面试官说,哦你直接套公式啊。。。。。我感觉面试官是想让我手撕二项分布的期望方差?下去之后自己推导了一下。算法题。easy题,背包,给定硬币面值,组成target需要的最小硬币数。
反问环节的时候跟面试官探讨了一下那道概率题,面试官最后又拓展说抽全4种的平均次数,让我线下去思考一下。直接的思路就是算n次,抽全的概率,E(x) = sum(np),最后演变成无穷级数收敛值的问题。后来到处请教查资料,发现可以构造数列An,表示 还剩下n种没有集齐的卡片时候,需要抽的次数。An = 1 + n / 4 * An-1 + (4 - n) / 4 * An。这个做法惊呆了。。。。
三面4.20上午11:00
说在前面,第一次体验字节三面,面完整个人都不好了。前面的问题直接略过看重点。
你说你做过对比学习(实验室医学图像项目,面试这么久第一次被问到,当时用的是自监督对比),谈谈你对对比学习的理解。
现在如果要把自监督用到召回里做i2i该怎么做?
你接触过图像,现在要建模商品图片对于点击/购买的影响该怎么做?
用一行代码写出对比学习的loss?(当时直接懵了,对比学习最后做对抗loss的时候,涉及到很多计算技巧,一行代码GG)
如果写不出来的话,写一下ce的loss也行(貌似是最容易回答的)
你觉得siamese跟simclr有什么异同,你是怎么理解的?
从数学推导的角度证明一下,自监督能够提高模型性能?(懵了,难道不都是直接看实验结果才能知道吗?当时就只能bb,数学推导gg)
现在如果想要增加图搜功能,拍照搜索商品,该怎么做?
了解统计学派跟贝叶斯学派吗?你觉得最大似然更接近哪个?
概率题,4支球队,单循环赛,输赢平概率相同,分别得分3,0,1.问最后4支队伍得分总和服从什么分布?
答:其实相当于做6次伯努利实验,每次实验得3分的概率是 2 / 3, 平了2分概率是1 / 3,最后分数范围为12 - 18,概率递增,相当于一个离散分布列。但是当时让我回答服从什么分布,GG,好像叫得上名字的分布跟这个都没关系,当时只能支支吾吾的说服从广义的二项分布,然后面试官让我写公式,我写到一半面试官直接说那面试就到这里。。。
反问:这里不省略,是因为我这辈子都会记得。当时我整个人都是万脸懵逼的状态,鬼使神差脱口问了句实习的话有转正hc吗?面试官手都已经准备合上电脑盖了,然后他笑了,没错他笑了。。
HR面4.26上午11:00
其实三面之后自己都觉得凉透了,甚至还问过hr小姐姐,小姐姐人特别好,说帮我争取一下。看到争取一下心里又凉了半截,甚至一度又emo了好几个小时,美团又迟迟不给回应,整个人都裂开。当时hr给我发微信的时候突然说技术面过了,约hr面。想象一下一个高考落榜的人突然告诉你系统分数算错了。。(其实还是怪自己菜,三面发散性思维,回答得太差了,但是不知道为什么居然能过?)
自我介绍+职业规划+遇到问题怎么结局+入职时间,实习时常+如果碰到身边有同事划水怎么办= =!.27今天下午已OC。感谢小姐姐!字节流程是真的速度!
四. 快手主站推荐
当时觉得字节凉透了,于是开启了海投模式。让实验室师兄忙帮内推了。PS:快手的面试官好温柔,温文尔雅。这半个月的面试,快手的面试体验是最好的,其次是美团,说错了不打断,但是会善意提醒你。
一面4.25下午17:00
自我介绍;
项目;
写出对比学习的Loss;
对比学习本质是想区分不用的内容,拉近相同内容,但是相同内容纯天然就有一定相似性,怎么解决?
你觉得在做对比学习的时候最主要需要注意的地方是什么?
Siamisese跟SimCLR有什么不同?
聊聊项目吧,说说你最熟悉的一项工作。
负采样怎么做的?为什么要负采样?
模型怎么部署的,特征怎么处理的?
排序了解吗?FM知道吗?为什么能降低时间复杂度?系列FM之间的差别在哪儿?
我看你写了XGBoost,讲讲他对于GBDT的优化点。(第一次碰到,终于有人问了hh)
XGBoost叶子节点的值怎么得到的(这个忘了,瞎说说分裂之后的平均值,还会在分裂的时候正则化,面试官纠正我其实是根据优化目标得来的)
随机了一道算法题。二叉树层序遍历(啊这)
今天跟我约了明天二面;
五. 总结
我投递的比较晚,基本上是4.5才开始准备。结果刚投腾讯WXG,直接宣布不招人;刚投阿里,又直接锁HC。。整体的面试还是业务的偏多,准备了好多好多基础,树,LR,SVM推导(软硬间隔),KKT,SVM回归,手撕SGD,手撕DNN,手撕Softmax,手撕LR,XGB损失函数推导,LightGBM优化,Boost&Bagging,GBDT,卷积,BN,激活函数,L1,L2,近段梯度下降,牛顿法,最大似然,几乎都没用上(只有快手的面试官问过一些)。 算法题也都oc了(不过都是easy题)
一路走来几乎每天都过的浑浑噩噩,从最开始被拒绝的失落难受到振作,到嘴里一边骂一边leetcode的量子叠加态,最后终于从0到1有了个offer。也祝愿大家春招收获满满(马上就要结束了),秋招备战!最后借用小红书那个跟我关系很铁的前辈说的话收个尾:年轻的时候我们都梦想大厂,但是最后一定要找到最适合自己的那个角落!没有找到的牛友也别泄气,面试7分靠实力,3分靠运气,最重要就是别否认自己。
——The End——
分享
收藏
点赞
在看