深信服算法工程师实习一面面经
求职岗位:NLP算法工程师实习
首先例行自我介绍,但是不知道咋的,有点小紧张,中途还中断了下,双方都有点小尴尬,自我介绍完了之后,面试官开始扫简历,因为我简历上有几篇二作的论文,面试官就简单询问了一下每一篇论文你的工作量大概多少,分别做了什么,面试官问完之后,便说你挑一篇你觉得做的比较好的论文讲一讲,于是我就挑了AAAI那篇论文,开始巴拉巴拉的讲了起来,但是这里我犯了一个错误,我一开始还是从很多基础铺垫开始讲,主轴是像PPT展示那样:
先讲很多基础知识,再讲是基于什么框架,然后再讲是基于哪篇论文,那篇论文主要讲了些啥,最后再讲我自己论文的创新点在哪,是基于什么问题改进的,怎么改进之类的。
殊不知,后来自己晚上面试完想了想,在面试中这种讲自己论文的方式是最愚蠢的方式,一来面试官会觉得你“准备的很充分”(说句不好听的,就是背的很流畅),二来99%以上的面试官是听不下去的,面试官会听的稀里糊涂的,而且会感觉你叙述的逻辑很混乱。果不其然,面试官听到基于什么框架这一块的时候就打断了,说你直接讲你自己的论文就行了,我不清楚的会再问你。所以从这个点,自己大概领悟到讲论文的一个大概思路:
开门见山,自己讲自己的论文,首先讲自己的论文是做了一个啥东西,什么领域的 ==> 再讲自己论文的动机是什么 ==> 然后再讲自己论文中是怎么做的,为什么这么做,有什么直观上的解释 ==> 最后再提一下论文中的其他部分
这期间面试官有问题要打断的话,再回答面试官的问题即可。
论文讲完了,面试官开始问一些实际项目中的问题,具体如下:
如果有n种类别(比如新闻类,体育类等)的网站,目前收集到一些网站,及其网站中不良信息的位置,那么新来一个网站,如何判断该网站中是否含有不良信息,若含有,不良信息在哪个位置?
这时我提问题,新来的这个网站的类别知道吗?然后面试官说,知道和不知道,分别有什么处理方式?
对于新来的网站知道类别的,我觉得既然要检测不良信息在哪个位置,这种问题一般比较难,我说如果要考虑公司部署等问题的话,可以每种类别都有监督的训练一个模型,面试官听了之后,具体细节面试官就没问下去了。
对于新来的网站不知道类别的,我说还是每种类别都有监督的训练一个模型,然后用判断新来的网站跟哪个网站相似度更高,再用其训练好的模型预测。
- 这个问题是给自己挖了个坑,感觉答的很不好,新来的网站不知道类别的这种做法估计有挺大的问题。
面试官听完上述描述之后,也没有做什么评价,然后他说,要不我们直接把问题简单一点,如果收集到一些网站的语料,如何判断这些网站中是否有不良信息。
这个我就直接答了,我说这个直接跑一个BERT就可以了,先对网站预处理,如果过长就切成几个para就好了,然后跑BERT做个分类即可;
- PS:其实这里如果面试官问下细节,怎么切?切的依据是什么?最后怎么综合几个para做分类的?我可能懵了,这块细节没去看。
然后这时候面试官说,但是公司部署的话,一般不直接采用BERT,你有其他办法吗?我说那可以用tf-idf表示新闻语料,然后过一个LR就好了,用PCA降维之后,效果也还行,应该做的比较好有70%+的准确率。
- 这时面试官就问了,那你说一下tf-idf的公式是怎么样的?有什么缺陷?然后我有点懵逼,没太答好
之后面试官说,那我们聊聊BERT吧,他说你觉得BERT有哪些可以改进的地方?我说您是说BERT的缺点吗?然后我就巴拉巴拉说了BERT的那几个缺点,面试官好像不太满意,他又说,我说的是针对模型上的改进,比如说:对模型进行压缩,压缩之后的模型比较轻量级,而且工业界能顺畅使用的。然后我说,有现成的模型可以用啊,比如Albert,中文的还有Albert-tiny,但是面试官似乎不知道这个模型,让我讲一下原理,orz,我没看过论文原文,所以实话跟面试官说了,我说没看过原文,但是应该压缩原理是张量压缩那一套,这时候面试官又说,你觉得降低word embedding维度这个可行吗?然后我没听懂???
聊完上面的,面试官就说,那给你一堆语料,你怎么训练一个类似于BERT这样的模型,但是又比BERT轻量级很多,准确率下降也不大,工业界可用的那种。我答,要么用Albert这种模型,要么如果语料不是很大的话,减少encoder层数,然后得到表征之后,再接下游模型或者与其他embedding concat起来,例如腾讯的word embedding,elmo embedding,但是面试官似乎还是不太满意,我就反问一句,我想听一下您的见解,面试官便说,这些都是我们在实际项目中遇到的一些问题,这个我暂时也没有答案。
问完上面这些,面试官开始聊一些其他的东西,他问我学过C/C++吗,我说学过,还算熟悉,然后他问我,如果结构体中,声明了一个char型变量,一个int型变量,那么这个结构体占多少字节?我说如果cpu是32位的话,那么占用8个字节,因为要内存对齐,然后面试官说,那char型变量和int型变量的位置对这个结构体占多少字节有什么影响吗?这个我不太清楚,就瞎答的说有影响,什么char型在前不一定是8字节,int型在前肯定是8字节(其实这个问题真没考虑过,要补一下了)。然后他又问了一个Python问题,说如果我一个函数返回一个列表和返回一个生成器有什么区别?我说返回列表节省内存,面试官继续追问,那如果返回列表和返回一个生成器,都是用变量x来接收,如果修改x,二者有什么区别吗?我说有区别的吧,列表中的变量赋值只是传递引用,这样会修改到原列表,但是生成器这个我没太明白..
最后面试官又回到一个情景问题,他说如果有一些语料,然后还有一些关键词,如何判断这些语料中是否含有这些关键词,然后我问,关键词长度多少,是一个词语还是一句话甚至更长,然后面试官说这个重要吗?然后我就回答,如果只是判断关键词,那可以用原来的语料先分词,然后再做一个vocabulary,再将vocabulary中的单词做hash,这样后续就能实现O(1)查找了。然后面试官问,那你这个建立vocabulary的过程的时间复杂度是多少?我说应该是O(n)吧,如果针对英文语料的话(毕竟直接空格隔开),然后他说如果是中文呢?时间复杂度是多少?我说中文还真没了解过底层分词的时间复杂度,然后他就问,那中文分词有哪些处理方式,是怎么做的?我说CRF序列标注那一套?然后他让我讲一下CRF的原理以及分词的过程,然后我说不会,面试官就没有盘问下去了,便回到原来的问题,他说关键词长度不限,有没有什么好用的方法,然后我说那要不然kmp算法吧,然后他问我kmp算法的时间复杂度,我说O(m+n),然后我就让我描述一下kmp算法的算法流程,orz,实在是想不起来了next数组的生成过程,就跟他说本科学过,也写过代码实现,但是现在忘了。
最后结束面试,面试官问我有什么想问他的吗?我说您觉得我在这场面试中有什么可以提高的地方吗?他就说,建议算法与数据结构再好好复习一下,orz..
#实习##深信服##算法工程师##面经#