北京百分点面经
前几天试着投了简历,没想到有两家约了面试,一个是得物一个是北京百分点,得物面试没有怎么准备,太仓促了,二面挂了,百分点拿到了offer,但决定考研了就没去,记录一下面试的问题。岗位是nlp算法岗。
一面:技术面
先自我介绍,然后介绍了一下项目。根据印象提问有以下内容:
- 有没有数据不平衡问题,是怎么解决的?欠采样,过采样,focal loss,着重介绍了一下focal loss的参数含义。
- 对分类问题最后一层要怎么做:max、mean,全连接
- 有没有尝试过别的模型:没有,然后面试官说其实textcnn和fasttext效果不一定比bert效果差。
- 对传统的神经网络了解吗?了解。介绍一下lstm。按照三个门分析就行,哪个门是什么作用,注意一下激活函数的不同。
- 介绍一下bert,从输入开始介绍就行,把两个任务也展开说一下。
- 介绍一下tfidf,这个很简单,说一下tf和idf的含义和公式就行。
- 数据增强怎么做的?同义词替换、回译。
- 介绍一下提示学习。说一下主要思想,还有离散prompts和连续prompts。
大体就记得问了这些,总体来说不是很难,而且大多数都是神经网络相关的,准备了一些传统的机器学习方法也没有用上。
然后是两道算法题:
第一题:已知一随机发生器,产生0的概率是p,产生1的概率是1-p,
现在要你构造一个发生器,
使得它构造0和1的概率均为 1/2;
def res():
= random()
a
= random()
b
if a == 0 and b == 1:
return 0
if a == 1 and b == 0:
return 1
else:
return res()
由于需要产生1/2,而用1位0,或1位1无法产生等概率, 因此,考虑将随机数扩展成2位: 00 pp 01 p(1-p) 10 (1-p)p 11 (1-p)(1-p) 有上述分析知道,01和10是等概率的,因此我们只需要产生01和10就行了。 于是可以,遇到00和11就丢弃,只记录01和10。可以令,01表示0,10表示1,则等概率1/2产生0和1了。
当时面试官问了这个问题的时候有点懵,因为之前从来没有做过,但是经过面试官的提示也是写出来了。
第二题是LCS问题,就是最长公共子序列问题,当时想到了使用动态规划,但是懒得在纸上推转移方程了,就直接暴力解决了。
def LCS(s1, s2):
= [[0 for _ in range(len(s1))] for _ in range(len(s2))]
dp = 0
res for i in range(len(s1)):
for j in range(i, len(s2)):
if s1[i:j+1] in s2:
= max(res, j+1-i)
res return res
print(LCS("baced", "acefg"))
二面综合面
上来也是自我介绍加项目介绍,有些问题和一面重复了,就不赘述。
- 介绍几种bert的变体,albert、roberta,就介绍了这两种。
- bert的mask策略。
具体的也忘了,当时也没有想直接记录下来,后面就等到了口头offer,过几天也发了正式offer,但是因为要考研等一些原因就拒了,等考完研再找吧。这次只在软件上投了投简历,没有内推等,还是挺有收获的。
总结
这几轮面试还是很有收获的,也算是模拟了以后的考研复试,虽然以后大概率是线下复试了。还有就是简历上最最重要的就是实习经历,我之前也没有实习经历,因此没有实习经历的情况下最重要的就是项目,别的基本上都没有问,不过还是要保证你写上去的都是真的会的。因此重要的就是实习和项目,获奖经历可能只是给面试的机会更大一些。这次拒绝offer少了一次实习经历还算有点可惜,不过相对而言还是考研重要一些。