2021年6月9日,CVTE NLP算法岗面试题9道
共 2219字,需浏览 5分钟
·
2021-07-27 21:17
文 | 七月在线
编 | 小七
目录
FIGHTING
问题1:讲一下改进的tf-idf
问题2:讲一下k-means与谱聚类
问题3:蒸馏的思想,为什么要蒸馏?
问题4:有哪些蒸馏方式?蒸馏中的学生模型是?
问题5:python在内存上做了哪些优化?
问题6:怎么节省内存?
问题7:pandas库怎么读取超大型文件?
问题8:无重复字符的最长子串
问题9:判断链表是否有环、链表环的入口
问题1:讲一下改进的tf-idf
TF-IDF中的IDF是一种试图抑制噪声的加权,单纯的以为文本频率小的单词就越重要,文本频率越大的单词就越无用,这一方式会在同类语料库中存在巨大弊端,一些同类文本的关键词容易被掩盖。例如:语料库D中教育类文章偏多,而文本j是一篇属于教育类的文化在那个,那么教育类相关词语的IDF值就会较小,使提取本文关键词的召回率更低。
改进方法:TF-IWF (Term Frequency-Inverse Word Frequency)
问题2:讲一下k-means与谱聚类
聚类算法属于无监督的机器学习算法,即没有类别标签y,需要根据数据特征将相似的数据分为一组。K-means聚类算法即随机选取k个点作为聚类中心,计算其他点与中心点的距离,选择距离最近的中心并归类,归类完成后计算每类的新中心点,重新计算每个点与中心点的聚类并选择距离最近的归类,重复此过程,直到中心点不再变化。
谱聚类的思想是将样本看作顶点,样本间的相似度看作带权的边,从而将聚类问题转为图分割问题:找到一种图分割的方法使得连接不同组的边的权重尽可能低(这意味着组间相似度要尽可能低),组内的边的权重尽可能高(这意味着组内相似度要尽可能高),从而达到聚类的目的。
问题3:蒸馏的思想,为什么要蒸馏?
知识蒸馏就是将已经训练好的模型包含的知识,蒸馏到另一个模型中去。具体来说,知识蒸馏,可以将一个网络的知识转移到另一个网络,两个网络可以是同构或者异构。做法是先训练一个teacher网络,然后使用这个teacher网络的输出和数据的真实标签去训练student网络。
在训练过程中,我们需要使用复杂的模型,大量的计算资源,以便从非常大、高度冗余的数据集中提取出信息。在实验中,效果最好的模型往往规模很大,甚至由多个模型集成得到。而大模型不方便部署到服务中去,常见的瓶颈如下:推断速度慢
对部署资源要求高(内存,显存等),在部署时,我们对延迟以及计算资源都有着严格的限制。
因此,模型压缩(在保证性能的前提下减少模型的参数量)成为了一个重要的问题。而”模型蒸馏“属于模型压缩的一种方法。
问题4:有哪些蒸馏方式?蒸馏中的学生模型是?
以Bert模型举例:
Logit Distillation
Beyond Logit Distillation: TinyBert
Curriculum Distillation:
Dynamic Early Exit: FastBert。
问题5:python在内存上做了哪些优化?
python通过内存池来减少内存碎片化,提高执行效率。主要通过引用计数来完成垃圾回收,通过标记-清除解决容器对象循环引用造成的问题,通过分代回收提高垃圾回收的效率。
问题6:怎么节省内存?
手动回收不需要用的变量;
将数值型数据转化为32位或16位(对数据类型进行限制)
代码示例如下:
问题7:pandas库怎么读取超大型文件?
可以采取分块读取数据的方式。
代码示例如下:
问题8:无重复字符的最长子串
该题为leetcode-3,难度:【中等】
方法:双指针 + sliding window
定义两个指针 start 和 end 得到 sliding window
start 初始为0,用end线性遍历每个字符,用 recod 记录下每个字母最新出现的下标
两种情况:一种是新字符没有在 record 中出现过,表示没有重复,一种是新字符 char 在 record 中出现过,说明 start 需要更新,取 start 和 record[char]+1 中的最大值作为新的 start。
需要注意的是:两种情况都要对record进行更新,因为是新字符没在record出现过的时候需要添加到record中,而对于出现过的情况,也需要把record中对应的value值更新为新的下标。
代码:
问题9:判断链表是否有环、链表环的入口
判断链表是否有环为leetcode-141题
提供两种解题方法,如下:
方法一:哈希表
遍历所有节点,每次遍历一个节点时,判断该节点此前是否被访问过。
如果被访问过,说明该链表是环形链表,并返回True,如果没有,则将该节点加入到哈希表中,遍历完成即可。
代码如下:
方法二:快慢指针
定义两个指针,一快一慢,满指针每一移动一步,快指针每次移动两步,由于快指针比慢指针慢,如果链表有环,则快指针一定会和慢指针相遇。
代码如下:
推荐阅读 点击标题可跳转 戳↓↓“阅读原文”了解更多!