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,如果没有,则将该节点加入到哈希表中,遍历完成即可。


代码如下:


方法二:快慢指针

定义两个指针,一快一慢,满指针每一移动一步,快指针每次移动两步,由于快指针比慢指针慢,如果链表有环,则快指针一定会和慢指针相遇。


代码如下:



推荐阅读  点击标题可跳转

1、TP-LINK提前批(图像算法岗)面试题...

2、好未来暑期算法实习面试题5道...

3、好未来算法实习面试题8道...

4、百度机器学习/NLP算法面试题8道

阅读原文”了解更多!

浏览 47
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报