2021年6月9日,CVTE NLP算法崗面試題9道
文 | 七月在線
編 | 小七

目錄
FIGHTING
問題1:講一下改進(jìn)的tf-idf
問題2:講一下k-means與譜聚類
問題3:蒸餾的思想,為什么要蒸餾?
問題4:有哪些蒸餾方式?蒸餾中的學(xué)生模型是?
問題5:python在內(nèi)存上做了哪些優(yōu)化?
問題6:怎么節(jié)省內(nèi)存?
問題7:pandas庫怎么讀取超大型文件?
問題8:無重復(fù)字符的最長子串
問題9:判斷鏈表是否有環(huán)、鏈表環(huán)的入口

問題1:講一下改進(jìn)的tf-idf
TF-IDF中的IDF是一種試圖抑制噪聲的加權(quán),單純的以為文本頻率小的單詞就越重要,文本頻率越大的單詞就越無用,這一方式會(huì)在同類語料庫中存在巨大弊端,一些同類文本的關(guān)鍵詞容易被掩蓋。例如:語料庫D中教育類文章偏多,而文本j是一篇屬于教育類的文化在那個(gè),那么教育類相關(guān)詞語的IDF值就會(huì)較小,使提取本文關(guān)鍵詞的召回率更低。
改進(jìn)方法:TF-IWF (Term Frequency-Inverse Word Frequency)
問題2:講一下k-means與譜聚類
聚類算法屬于無監(jiān)督的機(jī)器學(xué)習(xí)算法,即沒有類別標(biāo)簽y,需要根據(jù)數(shù)據(jù)特征將相似的數(shù)據(jù)分為一組。K-means聚類算法即隨機(jī)選取k個(gè)點(diǎn)作為聚類中心,計(jì)算其他點(diǎn)與中心點(diǎn)的距離,選擇距離最近的中心并歸類,歸類完成后計(jì)算每類的新中心點(diǎn),重新計(jì)算每個(gè)點(diǎn)與中心點(diǎn)的聚類并選擇距離最近的歸類,重復(fù)此過程,直到中心點(diǎn)不再變化。
譜聚類的思想是將樣本看作頂點(diǎn),樣本間的相似度看作帶權(quán)的邊,從而將聚類問題轉(zhuǎn)為圖分割問題:找到一種圖分割的方法使得連接不同組的邊的權(quán)重盡可能低(這意味著組間相似度要盡可能低),組內(nèi)的邊的權(quán)重盡可能高(這意味著組內(nèi)相似度要盡可能高),從而達(dá)到聚類的目的。
問題3:蒸餾的思想,為什么要蒸餾?
知識(shí)蒸餾就是將已經(jīng)訓(xùn)練好的模型包含的知識(shí),蒸餾到另一個(gè)模型中去。具體來說,知識(shí)蒸餾,可以將一個(gè)網(wǎng)絡(luò)的知識(shí)轉(zhuǎn)移到另一個(gè)網(wǎng)絡(luò),兩個(gè)網(wǎng)絡(luò)可以是同構(gòu)或者異構(gòu)。做法是先訓(xùn)練一個(gè)teacher網(wǎng)絡(luò),然后使用這個(gè)teacher網(wǎng)絡(luò)的輸出和數(shù)據(jù)的真實(shí)標(biāo)簽去訓(xùn)練student網(wǎng)絡(luò)。
在訓(xùn)練過程中,我們需要使用復(fù)雜的模型,大量的計(jì)算資源,以便從非常大、高度冗余的數(shù)據(jù)集中提取出信息。在實(shí)驗(yàn)中,效果最好的模型往往規(guī)模很大,甚至由多個(gè)模型集成得到。而大模型不方便部署到服務(wù)中去,常見的瓶頸如下:推斷速度慢
對(duì)部署資源要求高(內(nèi)存,顯存等),在部署時(shí),我們對(duì)延遲以及計(jì)算資源都有著嚴(yán)格的限制。
因此,模型壓縮(在保證性能的前提下減少模型的參數(shù)量)成為了一個(gè)重要的問題。而”模型蒸餾“屬于模型壓縮的一種方法。
問題4:有哪些蒸餾方式?蒸餾中的學(xué)生模型是?
以Bert模型舉例:
Logit Distillation
Beyond Logit Distillation: TinyBert
Curriculum Distillation:
Dynamic Early Exit: FastBert。
問題5:python在內(nèi)存上做了哪些優(yōu)化?
python通過內(nèi)存池來減少內(nèi)存碎片化,提高執(zhí)行效率。主要通過引用計(jì)數(shù)來完成垃圾回收,通過標(biāo)記-清除解決容器對(duì)象循環(huán)引用造成的問題,通過分代回收提高垃圾回收的效率。
問題6:怎么節(jié)省內(nèi)存?
手動(dòng)回收不需要用的變量;
將數(shù)值型數(shù)據(jù)轉(zhuǎn)化為32位或16位(對(duì)數(shù)據(jù)類型進(jìn)行限制)
代碼示例如下:
問題7:pandas庫怎么讀取超大型文件?
可以采取分塊讀取數(shù)據(jù)的方式。
代碼示例如下:
問題8:無重復(fù)字符的最長子串
該題為leetcode-3,難度:【中等】
方法:雙指針 + sliding window
定義兩個(gè)指針 start 和 end 得到 sliding window
start 初始為0,用end線性遍歷每個(gè)字符,用 recod 記錄下每個(gè)字母最新出現(xiàn)的下標(biāo)
兩種情況:一種是新字符沒有在 record 中出現(xiàn)過,表示沒有重復(fù),一種是新字符 char 在 record 中出現(xiàn)過,說明 start 需要更新,取 start 和 record[char]+1 中的最大值作為新的 start。
需要注意的是:兩種情況都要對(duì)record進(jìn)行更新,因?yàn)槭切伦址麤]在record出現(xiàn)過的時(shí)候需要添加到record中,而對(duì)于出現(xiàn)過的情況,也需要把record中對(duì)應(yīng)的value值更新為新的下標(biāo)。
代碼:
問題9:判斷鏈表是否有環(huán)、鏈表環(huán)的入口
判斷鏈表是否有環(huán)為leetcode-141題
提供兩種解題方法,如下:
方法一:哈希表
遍歷所有節(jié)點(diǎn),每次遍歷一個(gè)節(jié)點(diǎn)時(shí),判斷該節(jié)點(diǎn)此前是否被訪問過。
如果被訪問過,說明該鏈表是環(huán)形鏈表,并返回True,如果沒有,則將該節(jié)點(diǎn)加入到哈希表中,遍歷完成即可。
代碼如下:
方法二:快慢指針
定義兩個(gè)指針,一快一慢,滿指針每一移動(dòng)一步,快指針每次移動(dòng)兩步,由于快指針比慢指針慢,如果鏈表有環(huán),則快指針一定會(huì)和慢指針相遇。
代碼如下:
推薦閱讀 點(diǎn)擊標(biāo)題可跳轉(zhuǎn) 戳↓↓“閱讀原文”了解更多!







