万字长文 | 2023届推荐算法岗面经总结!

共 7046字,需浏览 15分钟

 ·

2022-06-11 08:19

作者:落尽 |  编辑:对白的算法屋

https://www.nowcoder.com/discuss/943070


985渣硕,保研本校之后因为没有大规模开发的经验,再加上不太想背八股,所以转算法。研究方向是医学图像,SCI2区一篇水刊医学+计算机结合论文


组内有做推荐算法的于是花了一个月时间转推荐,慢慢对推荐感兴趣。21年底有个非常好的朋友(阿里P8级别的)把我捞去了小红书实习,base北京,接触到了企业级别的推荐算法推荐算法实习的意义可能就是接触线上+业务,毕竟在学校里面是不能碰到这种场景的,推荐算法需要大数据+场景支撑。


万事开头难,原本迟迟没有下决心的,4月初的时候一天晚上下班,字节hr打电话给我(本科大三的时候曾经投递了字节的简历,后来因为身体原因没有面试),问我有没有意向,刚好hr是抖音app推荐算法团队的,所以下决心开始准备春招实习。可以说投得非常晚,准备得也很晚。于是回到了学校开始准备。因为是第一次开始海投,没经验所以没录音,回忆一下大概,可能漏掉了很多问题跟细节。


一. 抖音APP推荐

一面4.8下午18:00

当时其实自己还在小红薯实习,所以请了一天假。

  1. 自我介绍
    答:语速放慢,背;

  2. 挑一个小红薯的项目仔细介绍
    答:主要在小红薯做了一些向量召回+点召回工作,语速放慢,慢慢讲;

  3. 模型的时效性怎么样?
    答:我是t - 1更新,还会离线把ANN结果写入redis,因为线上qps目前暂时不支持;

  4. 聊聊AUC吧。
    答:随机取两个样本,正样本排在负样本之前的概率;

  5. 追问:AUC怎么快速计算
    答:把样本按照预测值排序,编号从大到小,看正样本的编号,巴拉巴拉~。PS:这里主动输出了一下知识,简单证明了一下 曲线下面积 = AUC的物理定义;

  6. 线上线下AUC不一致怎么办?(这里有点懵,而且因为没有做过排序,只能按照自己的阅历尽可能全面去回答。)
    答:有可能召回侧拿到的样本是之前旧版本排序模型的结果,会导致模型间的gap,采样的时候要变换方式;检测离线训练模型有没有过拟合;检查线上线下特征是否一致(可能存在穿越现象);导致线上线下auc不一致最可能出现的情况就是样本穿越,因为离线训练计算auc是所有样本一起计算的,而线上不可能出现一个用户去点击排序给另一个用户的item的情况,所以过滤掉那些点击为0,或者点击率过高的用户)

  7. 你们排序是怎么做的,时效性如何?(可能是看到我对第6个问题的回答,直接转向了排序)
    答:目前基建还不完善,没有prerank,postrank,rerank阶段,排序侧只有一个排序模型wide&deep,排序模型是实时的,每30分钟线上发射session label,然后把样本+特征dump到云上,模型自动训练。

  8. 召回的时候具体怎么做的?
    答:每天离线训练完之后,模型会产出当天的向量,写到oss上,下游消费向量建立NN索引(HNSW),然后我再刷一遍全量的商品,把nn结果写入redis,线上从用户画像取用户lastn,做trigger selection和时间衰减,最后送到排序模型。

  9. 如果现在我上一路DSSM召回,发现AB实验效果不好怎么办?
    答:首先看样本+特征。召回的样本是不是跟当前线上排序模型关联,特征穿越之类的;其次看当前召回渠道的结果是不是跟线上已有的重复;追问了一下还有呢?当时有点紧张,只能说那就加大流量,5%不行就到10%,再不行就到20%。到这里面试官笑了,感觉这才是他想要的回答,hh。

  10. 两道Easy算法题。
    10.1. 一个m * n棋盘,只能往右或者往下走,问从左上到右下路径和的最小值。简单dp(当时直接用二维dp写的,写到一半自己就说了其实可以用滚动数组,然后又让用滚动数组写了一遍)
    10.2. 斐波那契数列第n个数。当时看到这个想到肯定是有别的想考的,所以就把记忆化,跟直接用数组保存比较了一遍。最后又问我时间复杂度能不能再低?我说通项公式,有追问还有其他方法嘛?当时紧张给忘了,面试刚结束就想起来了 ,其实就是矩阵的n次方,然后就转化成快速幂了,O(logn)。


二面4.12晚上20:00

一面面完不到半个小时直接约了二面。

  1. 自我介绍
    答:语速放慢,背;

  2. 挑一个你做的比较熟悉的召回渠道,详细讲一下(跟一面差不多)
    答:dssm召回巴拉巴拉。其中着重提到了样本的问题,想让面试官问我。

  3. 你刚刚提到了样本,说说你的样本具体是怎么做的
    答:召回本身最看重的也是样本,又巴拉巴拉一堆,又着重讲到了负采样(因为负采样的逻辑都是我自己做的,所以比较熟)。

  4. 说说你负采样具体是怎么做的
    答:第一版i2i在batch内随机负采样,并加了bias进行修正;第二版u2i借鉴w2v,以uv曝光为权重,全局负采样,但是由于全局负彩成本太大,做了二次哈希,根据样本uv进行了分桶;

  5. 你简历上说对FM,DeepFM跟FFM有一定了解,讲讲。
    答:回答了一下各自的特点和改进点。

  6. 你简单写一下FM训练整个过程的伪代码吧(懵了,降低时间复杂度的证明会,但是直接手撕GG)
    答:因为以前手撕过SGD跟LR,所以稀稀拉拉写了点出来,然后写了下FM化简的推导,但是FM对w0, w1, Vij的导数求错了 。线下痛定思痛,直接numpy手撕了一版简易的FM。

  7. 算法题。
    数组第K大的数, 没看到要求用快排,我用堆排写了一遍,问了时空复杂度+证明。最后又问到了快排怎么做,临结束又问了快排怎么做到近线形是件复杂度的,这里全忘了。其实就是在partition的时候引入随机性,证明的话网上一堆。

反问环节略。二面过去一天,第二天晚上问hr,hr说面试官很忙还没写面评价(其实就是在横向),当时就知道自己凉了,果然hr说挂了,问需不需要投其他nlp或者图像方向,婉拒了。第一次面试直接gg,狠狠的emo了好几个小时 。


二. 美团优选

笔试4.9下午16:00

四道算法题+几道选择题(参加过这场的应该都知道,全都是easy题,很快全部ac,甚至感觉自己出现了幻觉hh,反而是后面的选择概念题比较难)

一面4.13晚上20:00

  1. 自我介绍;

  2. 项目介绍;

  3. 你说模型里面batch内负采样用到了bias修正,具体怎么做的?

  4. 上线前的准备,怎么看召回指标
    答:首先看auc,虽然召回模型的auc基本没有参考价值,但是如果auc太低说明根本不行;其次本来应该看topn的hr,但是由于业务比较紧急,所以当时就直接拉取了头部的item做了nn,肉眼评测结果;

  5. 负采样怎么做的?

  6. 跨域i2i怎么做的
    答:以swing为例,在UDTF阶段生成item -> item_list的领域对,不同的是,左侧的item来源于社区,右侧的item_list来源于商品。

  7. swing跟adamic具体细节
    答:balabala一堆,然后说到了高活用户和热门item的打压

  8. 算法题
    也是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

  1. 自我介绍;

  2. 项目介绍;

  3. 挑一个最熟悉的项目;

  4. 模型batch内负采样怎么做的?

  5. 加bias有什么用?
    答:负采样的本质是想打压高曝光item,但是由于高曝光的item本身就频繁出现在样本中,随机采可能会打压过头,因此加一个bias tower进行修正(其实就是学一个值取平衡正负样本)。

  6. 带权负采样的逻辑?
    答:如果按照uv曝光进行带权负采样,就是先按照uv曝光排序,之后累加,最后生成一个随机数,看着随机数落到哪两个item的uv累加和(前缀和)区间,就采样哪个item。

  7. 我看你做了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);可能看我算得很仔细面试官就没有继续细问了。

  8. Swing跟Adamic有什么区别?(略)

  9. 概率题。8个箱子编号1-8,扔进箱子的概率是 4 / 5,扔进每个箱子的概率相同;仍不进箱子的概率是 1 / 5。扔一次之后,现在打开1号箱子发现没有球,问球在8号箱子的概率。(条件概率)

  10. 算法题。链表排序,要求快排
    答:其实链表的快排有2种写法, 最简单的是交换值,节点不变;最难的是直接交换节点,这里面有无数的边界case需要处理,当时衡量了一下,直接把递归+归并, 迭代+归并排序都写出来了。还给面试官分析了一下,说前面一种时空都是nlogn,后面一种空间复杂度为0,然后说说抱歉没看到是快排hh。面试官说没事,还是让我说了一下快排的思路,我就把两种都说了。


二面4.19下午16:00

不得不说字节的速度是真的很快,大致问题跟之前都差不多,不过这里问了一下基础。

  1. 自我介绍;

  2. 项目介绍;

  3. 挑一个最熟悉的项目(语速放慢,到这里基本上前三个问题,回答的都一模一样)

  4. 了解过nlp吗(不太了解,只知道最最简单的,最基础的)

  5. 仍然是一堆业务相关问题;

  6. 说一下FM,DeepFM,FFM的区别联系,以及每个模型的改进;

  7. 你说你们排序是wide&deep,那你对wide&deep有过一定了解吗?
    答:回答了一下自己的见解

  8. 你知道wide&deep优化的方式吗?
    答:以前看过,主要是两边的优化器不同,面试的时候忘了 (wide用的Follow-the-regularization-loss, FTRL, deep用深度学习常见的AdamGrad)

  9. 为什么优化器不同?
    答:当时忘了,就乱说一通。到后来想起来然后跟面试官解释了一下:FTRL主要为了解决L1不能真正得到稀疏解的问题(由于SGD),wide侧很需要稀疏解,第一避免过拟合,第二线上部署的时候稀疏那部分直接去掉,能提高超高多的性能;deep部分就是传统的deeplearning了。

  10. 了解优化器吗?
    答:之前记得很多,包括公式,就简单说了一下SGD,Adaptive,AdamGrad之类的,其实主要是为了动态去调整学习率,然后从局部最小值收敛性简单瞎BB了几下。最后又说好多都忘了,面试官很温柔说不记得也没事。

  11. 概率题。西游记主题盲盒,抽中师徒四人任意一人的概率相同,问要抽中孙悟空的平均次数。
    答:当时面试官表达得很含糊,我战战兢兢回答了4次,他问思路,我说就是伯努利实验,n重伯努利实验就是二项分布,二项分布的期望是np,np = 1的时候,n = 4。面试官说,哦你直接套公式啊。。。。。我感觉面试官是想让我手撕二项分布的期望方差?下去之后自己推导了一下。

  12. 算法题。easy题,背包,给定硬币面值,组成target需要的最小硬币数。

反问环节的时候跟面试官探讨了一下那道概率题,面试官最后又拓展说抽全4种的平均次数,让我线下去思考一下。直接的思路就是算n次,抽全的概率,E(x) = sum(np),最后演变成无穷级数收敛值的问题。后来到处请教查资料,发现可以构造数列An,表示 还剩下n种没有集齐的卡片时候,需要抽的次数。An = 1 + n / 4 * An-1 + (4 - n) / 4 * An。这个做法惊呆了。。。。


三面4.20上午11:00

说在前面,第一次体验字节三面,面完整个人都不好了。前面的问题直接略过看重点。

  1. 你说你做过对比学习(实验室医学图像项目,面试这么久第一次被问到,当时用的是自监督对比),谈谈你对对比学习的理解。

  2. 现在如果要把自监督用到召回里做i2i该怎么做?

  3. 你接触过图像,现在要建模商品图片对于点击/购买的影响该怎么做?

  4. 用一行代码写出对比学习的loss?(当时直接懵了,对比学习最后做对抗loss的时候,涉及到很多计算技巧,一行代码GG)

  5. 如果写不出来的话,写一下ce的loss也行(貌似是最容易回答的)

  6. 你觉得siamese跟simclr有什么异同,你是怎么理解的?

  7. 从数学推导的角度证明一下,自监督能够提高模型性能?(懵了,难道不都是直接看实验结果才能知道吗?当时就只能bb,数学推导gg)

  8. 现在如果想要增加图搜功能,拍照搜索商品,该怎么做?

  9. 了解统计学派跟贝叶斯学派吗?你觉得最大似然更接近哪个?

  10. 概率题,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

  1. 自我介绍;

  2. 项目;

  3. 写出对比学习的Loss;

  4. 对比学习本质是想区分不用的内容,拉近相同内容,但是相同内容纯天然就有一定相似性,怎么解决?

  5. 你觉得在做对比学习的时候最主要需要注意的地方是什么?

  6. Siamisese跟SimCLR有什么不同?

  7. 聊聊项目吧,说说你最熟悉的一项工作。

  8. 负采样怎么做的?为什么要负采样?

  9. 模型怎么部署的,特征怎么处理的?

  10. 排序了解吗?FM知道吗?为什么能降低时间复杂度?系列FM之间的差别在哪儿?

  11. 我看你写了XGBoost,讲讲他对于GBDT的优化点。(第一次碰到,终于有人问了hh)

  12. XGBoost叶子节点的值怎么得到的(这个忘了,瞎说说分裂之后的平均值,还会在分裂的时候正则化,面试官纠正我其实是根据优化目标得来的)

  13. 随机了一道算法题。二叉树层序遍历(啊这)

今天跟我约了明天二面;


五. 总结

我投递的比较晚,基本上是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——

分享

收藏

点赞

在看

浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报