回馈牛客,从春招到秋招的算法之路(NLP算法面经总结)
写在前面
本文记录我从今年春招3月份一直到秋招10月底的面试情况,一直以来牛客网都为我提供了丰富的面经文章,我也因此得以学习到了很多知识,在此也记录我春招到秋招的大大小小面试经历,为后浪们提供我的一些些经验,同时也是回馈牛客网丰富的面经资源(来还愿了~)。
首先说一下我的基本情况:211渣本,top20硕。无实习无论文,有大大小小加起来4,5个项目,主要涉及NLP,搜索和CV等领域。在整个春招和秋招期间,分别投递了各个大小公司,春招主要投递暑期实习为主,但是因为准备不充分(没有刷题,八股以及项目细节)被全聚德;秋招总结了经验教训以后拿到了大小厂的一些offer。因此我希望大家引以为戒,在投递简历前关注以下几点:(1)leetcode经典题是否已经熟悉(2)深度学习,NLP基础是否牢固(3)简历上的项目是否熟悉。如果以上三点都已经做到,并且你有大厂的实习/顶会,那么offer离你也不远了。
主要投递企业:字节跳动,网易,小米,京东,科大讯飞,快手,腾讯,蔚来汽车,百度,阿里巴巴。
面经总结
1. 字节跳动
字节可以说是我春招到秋招最心痛的公司,我其实本来对它抱有特别大的期望,但是由于前期准备不充分导致我在面试字节的时候给予面试官极差的印象。这种印象导致我字节后期的面试极为失败,这里引以为戒。
第一次面试:字节搜索部门(一面挂),大概4月份。
- 面试官怼简历。问我项目中数据集的分布,有什么特点,是否存在标签不一致,文本平均长度,项目使用的方法,你的贡献。
- 项目中使用的BERT为何使用的是现成模型而非你们自己的预训练模型。
- Dropout的原理,训练集和测试集的区别
- 算法题:(1)最小编辑距离(2)冒泡排序
由于没有准备,我连冒泡排序都写错了,项目中细节也是一问三不知(因为项目时间有点久,细节全忘了),所以秒挂。
第二次面试:字节AL-LAB(二面挂),大概4月份。
一面:
- 依然怼项目,这次我准备了,项目答得不错。
- GBDT,XGBoost的区别,比voting算法好在哪里
- 你们是否做了消融实验
- focal loss的原理
- 算法题:(1)最小编辑距离(2)实现前缀树(trie-tree)
二面:
- 怼我另外一个项目
- recall precision f1介绍一下,auc介绍一下
- 算法题:(1)在一个只含有0和1的字符串中,找出含有k个1的字符子串的个数(前缀和)
第三次面试:提前批,字节电商部门,8月份(一面挂)
- 堆项目(开始找茬),你的项目数据分布不均衡:你有没有做处理,除此之外数据扩充的方法以及应对策略。(答:(1)过采样(2)CV数据的各种拉伸,收缩,翻转,放大和缩小(3)NLP数据可以translation back(4)同义词替换(5)GAN增强(6)focal loss)。然后针对这六种方法每种方法都详细解释并且问很久。
- 你项目里提出的的方法虽然在你这个项目里有效,但是我认为在其它数据集中不一定有效(无言以对,因为确实没有公开数据集上跑过)。然后我说我这个针对的就是小样本特定任务上的,所以只关注了部分数据集,然后被一顿嘲讽......
- 算法题:lc 螺旋矩阵
- 概率题:(1)圆上三个点,钝角三角形的概率(2)一对夫妇有两个孩子,已知其中有一个孩子是出生于周二的男孩,问另一个孩子也是男孩的概率。
第四次面试:9月份(一面挂)
- 介绍项目,各种问
- 机器翻译中attention介绍一下,它的优缺点
- greedy decoding 和 beam search介绍一下,它的优缺点
- Transformer和传统seq-seq的区别,seq-seq的翻译机制和语言模型的区别
- 场景题:一句话中有一个错别字,如何快速找到
- 概率题:一组数据同时扩大n倍,方差和均值的变化
- 代码提:(1)对于一个字符串,找出其中含有标点符号的token并且左右各加一个空格(2)lc wordbreak(给定一个字典和字符串,返回字符串是否可以由字典中的单词构成)
2. 科大讯飞
科大可以说面试的另一个极端了23333,几乎不考察代码的(笔试除外),两轮面试,每轮面试官听一下你的大概项目和一些你堆深度学习基础的了解。两面的问题如下:
- 广播机制介绍,维度(3,4,5)和(3,4)的矩阵在numpy和torch中是否可以直接相加
- 过拟合,欠拟合介绍一下
- python基础,比如 == 和 is;线程和进程的区别
- pytorch中你都常常使用什么模块
- 最近都读什么论文,介绍一下
- 个人的情况,薪水要求和工作地点的选取
3. 腾讯
腾讯其实也是很惋惜的,和字节状况一样,一开始没准备被挂了不少。第三次面试很可惜,差一点就能进去,然而hc数量有限。
第一次面试:IEG(一面挂),大概3月份。
- 问项目,各种细节
- 对于情感词,喜欢和不喜欢,模型可以判别出来吗。(答:BERT是可以的,self-attention介绍与个人的理解)
- 逻辑回归介绍一下
- 算法题:手撕tf-idf和bm-25
第二次面试:PCG(二面挂),大概4月份。
一面:
- 问项目
- 数据增强方法
- 介绍一下focal loss
- BERT,LSTM,RNN区别。梯度消失原因,过拟合原因解决方法
- 算法:(1)完全二叉树和满二叉树的区别(2)判断一棵树是否为BST(3)lc,打家劫舍
- 问项目和细节
- 项目中BERT使用的多,介绍BERT家族,RoBerta,XLnet,DistilBert和AlBert
- 在pre-training和fine-tuning范式中,f如何解决因为fine-tuning而遗忘的pre-trained知识
- self-attention中为什么除以,为什么方差改变以后self-attention会难以训练(softmax特性和梯度去说)
- self-attention和前馈神经网络区别
- 内存有限如何训练BERT
- 深度学习基础问题若干
- 算法:(1)lc,反转链表(2)lc,反转局部链表
第三次面试:CDG(三面挂),大概8-9月份。
一面(电话面试,30分钟):
- 问项目
- 数据增强如何实现
- 项目的创新点在哪里
- XGBOOST介绍(详细),怎么解决数据缺失问题,如何并行
- BERT和改进模型问答
- 问项目
- BPE,subword介绍
- 项目创新点,创新点有效性的探讨
- 问项目,基本上针对我项目问细节,外加我对深度学习的理解
- BERT的缺点(NSP任务的争议;训练集有[MASK]而测试集没有,因此产生的差异性;MLM任务中token的假设是独立的)(都是我个人当时瞎说的,如有错误请指正)
- seq-seq和语言模型的区别
- 机器翻译为什么需要attention机制,attention机制比传统seq-seq好在哪里。self-attention比attention好在哪里
- 过拟合,欠拟合,l1和l2,BN和LN
- 信息增益公式,决策树,GBDT介绍
- 学习器介绍,从SGD一直到Adam
- 损失函数介绍,交叉熵公式是什么,与极大似然关系
3. 蔚来汽车
蔚来是我秋招时候投递的,这时候已经复习的相对充分了。总体来说体验还是不错的,可能是招人较多和笔试结果较好的原因,蔚来的难度比BAT要低一些。
- 项目问答
- word2vec介绍,两种优化方法,负采样如何采样
- 手推skip-gram的负采样目标函数
- 算法题:lc,两数之和改进版
- 项目问答
- Bert基础问答(上上下下模型结构都说了一遍),比ELMO好在哪里
- attention种类,为什么有效
- 你的模型为什么recall高而precision低,如果让你改进你怎么做
- 算法题:(1)二叉树层次遍历(2)二叉树深度
- 项目介绍
- 过拟合欠拟合如何判断,如何解决
- macro-F1和micro-F1
- AUC指标介绍一下,怎么计算,实现一下,
- 除了Python,Java用的多还是C++
4. 百度
百度面试感觉就是:终 极 八 股!!!虽然八股,但是百度对八股的要求非常高,同时百度也会注意你项目的合理性,会针对项目做一些探讨。总体来说百度的面试策略相对保守,只要好好准备难度不是特别大(除了百度凤巢和大搜这样的部门,这些部门考察的更深)。
第一次面试:百度大搜提前批(二面挂)
一面:
- 问项目
- 数据增强的方法,focal loss的公式和解决的方法
- 介绍一下LSTM,RNN和GRU的公式,并且让我写出来全部的公式;然后让我把模型的结构图画出来(画结构图可是第一次)
- 介绍一下梯度消失在RNN中的原因,用公式写出来导数公式并指出哪一项最影响(我去?手推RNN反向传播还行)
- GBDT介绍一下,和XGBoost的区别,Lightgbm了解吗
- XGBoost如何处理缺失数据,如何防止过拟合,为什么使用二阶导数,公式写出来,常用参数有哪些,比逻辑回归好在哪(非常详细)
- 逻辑回归满足什么分布,参数如何求解。逻辑回归什么情况下效果好于GBDT
- Transformer有哪两个MASK机制,分别什么作用。
- 算法题:lc,螺旋矩阵
- 上来就做题,(1)链表反转,两种方法实现,并且print出结果(2)lc,链表合并
- word2vec和BERT介绍,BERT为什么采取80%概率替换为[MASK],10%随机,10%不变
- BERT和CBOW相似处和区别(CBOW学习到的是局部信息(受限于滑动窗口),并且word2vec不能捕捉顺序信息(依赖词频的共现性);BERT学习到的是全局信息)
- BERT的双向体现在哪里,有什么缺点,XLNet解决了BERT存在的什么潜在问题
- 过拟合欠拟合原因,解决方法
- BM25和TF-IDF区别
第二次面试:百度正式批(三面一下午完成)
一面:
- 梯度消失和爆炸的现象,RNN中梯度消失原因,如何解决
- l1为什么能比l2拥有更多的稀疏解(解空间形状,loss更新公式,分布假设三方面说)
- Resnet介绍(残差为何有效;BN训练集和测试集区别)
- 算法:(1)数组反转(2)二叉树层次遍历(3)lc,股票交易(4)数组链表差别(擦,没复习)
- 探讨项目,体验感非常好,面试官感觉就和我做的东西高度一致,非常能理解我的算法设计。
- 算法:(1)数组分为两组,如何使得两个子数组的和尽可能接近(背包)
- 怼项目。面试官对我的项目表示怀疑(看到面试官眉头一皱,立马慌了)
- Transformer中Q,K,V的含义;为什么使用多头;Transformer中参数共享在哪里;encoder和decoder端设计的区别
- BERT最大输入序列长度为什么是512,遇到更长的句子如何解决
- 算法:(1)两个杯子分别可以乘5和3升水,怎么倒出一个4升的水(2)寻找一个数组中缺失的第一个正数(要求时间复杂度O(n);空间复杂度O(1))
5. 快手
快手面试有点莫名其妙(大概率是我太菜了)。我投的快手的NLP部门,然而捞我的是搜索部门,面试官全程没问我项目,就问了我搜索推荐的一些基础部门,然后常面一度尴尬,emmmmmm。
面试(一面挂):
- recall和precision指标讲一下
- AUC指标讲一下,实际意义是什么,如何计算
- 推荐,搜索和广告点击指标的区别
- 在推荐中,特征如何筛选
- 怎样确认一个特征是不是好的特征
- GBDT,XGBoost和Lightgbm讲一下
- 算法题:两个字符串的最长公共子序列
6. 阿里巴巴
众所周知,阿里在所有大厂里面的流程是最长的,但是也得益于较长的周期,我得以充分准备。题外话:阿里巴巴面的面试风格更加独特,要我个人总结的话就是百度更注重基础;字节需要把算法题作对;腾讯会和你深入探讨项目;阿里则会考察应变能力和发散思维(只是我个人的直觉,实际面试取决于面试官的风格)。
第一次面试:蚂蚁金服(二面挂)
一面:
- 上来两道算法题:(1)LRU机制的介绍与实现(完全手写,没有一点提示)(2)最长上升子序列,要求O(nlog(n))实现(dp+二分)
- 怼项目。面试官认为我的训练集存在一些问题导致预测阶段会更加困难。我从数据来源上予以反驳。项目以后的改进点(考察发散思维)
- 算法:大数据排序问题(归并思想)
- 从头到尾设计一个情感分类算法(从数据清洗,模型搭建,loss设计到评价指标,数据不均衡该怎么做,指标的选取)
- 介绍项目
- AUC指标介绍和计算方法
- wide&deep中wide和deep分别代表什么,实际中什么样的特征分别适用于wide和deep,deep特征的缺点
- FM模型时间复杂度如何优化(推公式)
- 场景题:我们现在假如做一个多分类问题,上线率要求90%,但是目前只有85%,该如何解决。(问题分析,query识别与改进,负样本选择,多模态数据等...)
第二次面试:
阿里第二次面试的体验感真的很好,三个面试官都十分儒雅随和,非常专业。在我反问环节都给出了非常详细且认真的回答。
一面:
- 介绍项目,项目哪写改进使模型指标得到提升。
- 卷积计算的时间复杂度和空间复杂度
- 多模态bert都有哪些,他们的预训练任务都有什么
- focal loss解决什么问题
- 算法题:(1)topk(分别用快排以及改进快排)(2)两个栈实现队列(3)手写堆
- 介绍一下BERT和Transformer
- 介绍一下交叉熵,要具体一些(熵的定义,KL散度,参数更新等各个角度去说)
- 逻辑回归为什么不用MSE
- 多模态中的单流和双流机制
- 场景题:(1)搜索推荐中的下拉补全怎么做(2)电商场景输入“苹果”,如何知道到底是苹果手机还是吃的苹果(3)排序算法中都有哪些比较难以学习的负样本,如何学习
- 介绍项目
- 推荐搜索的全链路流程介绍
- 召回和粗排的方法(DSSM),这两阶段中DSSM模型在结构上的区别
- 冷启动的解决方案有哪些
- 个人情况问答,学习搜推广都是怎么学的
- 算法题:一个长度十万的字符串列表,找出具有部分相同字符的结果,例如:"apple"和"app"。(前缀树)
总结
1. 大厂实习和顶会依然是最具有竞争力的两项(尤其是搜推广,学术界和工业界差距真的有时候蛮大)。
2. 对于算法工程师来说,有项目和比赛是必不可少的(我说的项目不是用resnet识别minist这种入门demo。而至少是天池,kaggle或者data doundations这样级别的,如果你真能认真打两三个项目并且取得不错的成绩,那么面试中和面试官能进行有效交流)。
3. 秋招春招有时运气真的很重要,比如有没有对得上眼的面试官,比如简历和投递单位是否高度匹配,又或者你投递的组有没有充足的HC,这些都很大程度决定了你面试过程中的难度系数。如果运气不好,请不要丧气,对面试进行复盘以后再战,如果你足够优秀,总有offer会找上门。
4. Leetcode不可不刷。如果想要保险一些,我个人建议热门题目250-300道刷3遍,90%的代码都涵盖在这250道题中。
5. 基础要牢固。这个基础既指的是深度学习基础,又指的是算法基础。一个最基本NLP学徒,即使没有经过任何复习,也应该至少:(1)BERT基本结构要了解吧(别笑,很多人真的不知道)(2)冒泡排序,快排要写的出来(别笑,有的人真的找工作还会写不对)。这种基本中的基本希望大家都要了解,要不然面试会有差评。
6. 有时候面试时候会考一些概率论和数学的基础内容,建议有时间看看。