【面經】研一下-算法實習-面試經驗匯總


后續的文章

匯總貼:

北郵讀研期間的打怪升級

目錄:

1. 青藤雲安全-2月26日-已掛
2. 陌陌一面-3月3日-已過
3. 陌陌二面-3月4日-已過
4. 字節跳動一面-3月10日-已掛
5. 陌陌三面-3月11日-已掛
6. 將門創投-3月17日-offer
7. 睿企科技筆試-3月18日-已過
8. 交叉科技筆試-3月18日-已過
9. 感易智能-3月19日-已掛
10. 千芯科技-3月19日-已掛
11. 微播易筆試-3月20日-已過
12. 東方棱鏡-3月20日-被鴿
13. 微播易一面-3月20日-已過
14. 交叉科技一面-3月20日-已過
15. 微播易二面-3月23日-已掛
16. 有魚科技-3月23日-已掛
17. 鯨航科技-3月23日-offer
18. 亞信科技-3月23日-已掛
19. 百度一面-3月24日-已掛
20. 交叉科技二面-3月24日-offer
21. 雲日未來-3月24日-已掛
22. 求職總結-3月26日
23. 之后的學習方向-3月30日

1. 青藤雲安全(2月26日) 機器學習算法實習崗

微信視頻面試,15分鍾。主要問了下簡歷上做阿里雲比賽的經歷,后未聯系,預計已掛。
主要存在的問題:
1)做的東西太簡單太基礎,不夠看,導致面試官其實沒啥可問的;
2)對自己做的項目不夠清楚,模型怎么融合的說不上來;(xgboost,np.hstack)
3)在項目中遇到了什么問題,怎么解決的,收獲了什么;(star模式)
4)缺乏深度學習、BERT等相關的了解;
5)沒有論文閱讀、代碼復現的經驗,工作中需要;
6)沒有考六級;
7)說話邏輯性不好,斷斷續續的,(少說,“額,然后”,“就,那個”這種詞)
返回目錄

2. 陌陌一面(3月3日)自然語言處理實習崗

acmcoder平台面試,1小時,主要是現場做了一道題,還有就是問了下阿里雲比賽那個項目,一面過了。
主要存在的問題:
1)現場做題的能力還得加強,雖然題目簡單,但思路比較亂。
流程大概就是,面試官讓我實現個split,然后我直接str.split()寫出來了,
然后她讓我不要用現成的方法,直接代碼實現一下,然后我就寫了個for循環,然后切分字符串,這兒寫對了,
然后她讓封裝成函數,然后傳入一個待切分次數的參數,然后這兒實現也簡單,也對了,
再之后她說還有兩個問題,一是分隔符長度可能不是1,二是如果字符串最后幾個字符剛好是分隔符,切分結果的最后面還要有個空字符串。
到這兒的時候,我當時感覺好像要調整代碼結構,然后思路就有點亂了,寫了一段好像不對,沒寫出來。

### 當時寫的代碼
def my_split(str, s, times):
    s_len = len(s)
    temp = ''
    result = []
    left = 0
    for i in range(len(str)):
        if (len(result) == times):
            result.append(str[i:])
            break
        if str[i:(i+s_len)] != s:
            temp += str[i]
        else:
            i += s_len
            result.append(temp)
            temp = ''
            continue
        if (i == len(str) - 1):
            result.append(temp)
    return result

print(my_split("abc,ef,ee,aaa,", ',e', 2))
# 后來復盤寫的代碼
def my_split(str, s, times=-1):
    s_len = len(s) # 待切字符長度
    str = str + s # 拼接一下
    temp = ''
    result = [] # 待返回
    left = 0
    next = 0
    for i in range(len(str)):
        if i < next:
            continue
		# 指定times參數
        if (times != -1 and len(result) == times):
            result.append(str[i:-(s_len)])
            break
			
        if str[i:(i+s_len)] != s:
            temp += str[i]
			
        else:
            next = i + s_len
            result.append(temp)
            temp = ''
            continue
			
        if (i == len(str) - 1):
            result.append(temp)
			
    return result
	
print(my_split("abc,ef,ee,aaa,", ",e"))

后面回想的話,其實題目很簡單,只是現場編程有點緊張,沒法深入思考,思路有點亂,沒寫對。
面試官倒是態度很好,一直指引着我完善這個代碼。

2)后面半小時在問項目,主要就問了阿里雲比賽那個。
因為上次面試的經驗,我專門看了下BERT,CNN,之類的東西。
面試的時候也算是用到了吧。

3)大概問了以下問題:
問:做ngram用的啥模型?面試官說,因為ngram只算是提取特征這塊,我說,xgboost,決策樹應該是,
問:有多少的數據量?
我說具體數字不太記得了,反正是很多,當時跑一個模型訓練要三四個小時,
(單個文本長度10萬左右,訓練集文本數約1.3萬,測試集約1.2萬)
問:既然有這么多數據量,而且ngram這種特征工程的方法現在業界基本也不用,除了這個之外你還有沒有試過一些其他的深度學習之類的方法?
我說,我主要做的是ngram,tf-idf,word2vec這塊,其他隊友有做textcnn,lstm之類的

問:那你對CNN之類這些有沒有了解,你們有沒有交流?
我說,有了解,CNN做出來的效果和ngram差不多,
問:CNN和ngram的效果差不多可以理解,其實都是提取特征,(我:CNN里有很多filter),對,那既然效果差不多,為啥不直接用CNN,還要用ngram?
我說,額,當時我主要是負責這塊的,做的ngram,tf-idf,最后幾個模型最后做的融合,(她:也就是各種模型都融合了一下是吧),對(捂臉。。。)
我說,雖然原理上差不多,不過提取的特征還是不一樣的,所以融合之后效果提升了,

問:像這類問題之前我們也做過,如果是說,某些api出現沒有什么問題,但api形成一個特定序列的話,就會是病毒,你怎么考慮?
答:序列問題,RNN?

問:那么對最新的技術有沒有了解,BERT啥的,(我當然說有了解了,畢竟上次面完專門學了下)
問:那么你覺得這些技術對比之前的方法有什么優勢?
我說,BERT里最重要的就是Transformer里的注意力機制,像ngram之類的,輸出的向量,其實是把詞都同等看待的,注意力機制的話,詞的權重是不同的。
面試官:ngram的詞頻不同也是不同的權重,不是這個原因,是因為BERT里加了序列信息,(我:長程依賴?)不只是長程依賴,還有xxx(這兒忘了說啥了)
(其實序列信息我也知道,BERT里集合了RNN,CNN等的優點,當時不知道為啥,就是沒說到點子上,可能是還不熟悉)

問:你覺得為什么要用這些預訓練模型?
我說,主要是比較方便,做實際任務的時候,可能沒有那么多的數據量去訓練這些參數,用預訓練模型的話,可以節省工作量,不用再從頭訓練,只需要做一些微調既可。

問:看你用到了交叉熵,做分類任務的時候通常用交叉熵作為損失函數,解釋下是怎么做的?如果是二分類,softmax,0/1,結果分別為1/4, 3/4,交叉熵是多少?
我這答得比較含糊,說之前沒拿交叉熵做過損失函數,,,
(其實不對,這個比賽評測的指標就是交叉熵。。。xgboost里的評測參數設的也是mlogloss,
主要是因為搞錯了交叉熵和相對熵的概念(數學之美書里有個錯誤),其實我當時算測試集與訓練集分布差異用的是相對熵,簡歷上寫錯了,
還有就是當時其實算測試集,是通過全0,全1提交,然后得到的分布,這個也沒說)

還說了一些問題,也不記得了。

4)經驗教訓就是,一定要錄音,不然忘了的話,總結都不知道咋總結,

5)還有就是要問一下人家對我的面試評價,以便於自己回顧,然后學習提高,

6)感覺這次自己說話邏輯比上次清楚多了,

7)和HR約時間,面試之間應該要留些時間間隔,以便及時整理完善面試經驗,總結提升。
返回目錄

3. 陌陌二面(3月4日) 自然語言處理實習崗

第二天面了二面,40分鍾,二面面得很順利,輕松過了。
這次面試和一面流程差不多,問了下簡歷上的東西(這次簡歷上的項目都問到了,不過主要還是在問比賽那個),然后做了道編程題。

(這回錄了音)
首先上來還是一樣,先自我介紹了一下。然后介紹了下項目經歷。
(此處略)

問:為什么想到要用ngram方法
問:ngram用的多少gram
問:有沒有看過原始數據,序列會不會特別長,重復很多
問:textcnn和ngram比較哪個好
問:word2vec在這個任務里主要是用來做什么
問:你是直接把這兩個向量concat到一起嗎(ngram和Word2vec的)
問:說一下xgboost的原理
問:xgboost里加入采樣主要是為了解決什么問題
問:xgboost里會有一些正則,L1,L2,有沒有了解過它的作用
問:xgboost的優缺點(缺點沒答上來,可能是參數比較多,不好調?)
問:xgboost和cnn具體到case上,有沒有看過模型結果上的對比(這個真沒有做過)
問:能寫下互信息的公式嗎(不會寫,應該是 I(x,y) = p(x, y)log(p(x, y) / (p(x)p(y))) )
問:或者你描述一下它是干什么的

(二面時這些問題大部分都回答地比較好,所以只列舉下問題,不記錄回答內容了)

編程的話,給了幾個case的真實值,預測值,讓寫代碼計算下准確率,召回率。(很慶幸我居然記得這兩個公式,所以這個題很容易就寫對了)

# p = TP / TP + FP, r = TP / TP + FN

def read_data():
    pred = ['B', 'A', 'B', 'A', 'A', 'B']
    real = ['A', 'A', 'B', 'B', 'A', 'A']
    return pred, real

def compute(pred, real, true_flag):
    TP = 0
    FP = 0
    FN = 0
    if (len(pred) != len(real)):
        return -1
    for i in range(len(pred)):
        T = (pred[i] == true_flag)
        P = (pred[i] == real[i])
        if (T and P): TP = TP + 1
        if (not T and not P): FN = FN + 1
        if (not T and P): FP = FP + 1

    p = TP / (TP + FP)
    r = TP / (TP + FN)
    return p, r

pred, real = read_data()
print(compute(pred, real, 'B'))

我問了下,到第幾輪了,說后面至少還有一次技術面,
然后是,問了下建議,
說我的項目經歷和工作是比較相關的,文本處理的一些工作,
希望把用到的模型原理再加強一下,因為工作中沒有人能告訴用什么樣的方法,這就得基於自己對於模型的理解,
這些是在學校里要加強的,工作之后會更得心應手一些。

(兩次技術面的面試官都是小姐姐,但通知面試的HR卻是男的,有點意外)

自我感覺,兩次面試比較順利的原因是:
1)找實習難在做出這一決定,找實習的過程倒並不是很難。雖然算法崗校招競爭慘烈,但實習的門檻相對來說並不高。
2)學歷加分。這段時間在拉勾網上只點投了幾個大小公司,投出了十來份簡歷,就得到了很好的反饋,要么是看到HR轉發了簡歷,要么就是收到了面試邀請。
簡歷的通過率比較高,我覺得這還是得歸功於北郵碩士這一頭銜的學歷加分,個人能力還是有很大的不足,這是目前要認真看待的事實。
3)比賽經歷加分。雖然只是一個新人賽,但組隊做比賽的過程中,討論了很多,學到了很多,對模型、問題理解地較深入,在面試的過程中不至於翻車。
4)善於總結的好習慣。因為經常寫博客(學習筆記之類),寫FP(學習計划+總結),有總結的習慣。在面試的過程中,每面完一場之后有總結反思,所以感覺一次比一次更輕松了。
返回目錄

4. 字節跳動一面(3月10日) 算法實習生(抖音/火山)

在牛客網平台面試,1小時,現場做了兩道題,簡單問了下項目就結束了,已掛。

給定一個矩陣里面只包含0和1兩種數字,給出每個單元距離最近的0的距離,上下左右都算作相鄰,相鄰的距離為1
示例1
輸入:
[[0,0,0],
[0,1,0],
[0,0,0]]
輸出:
[[0,0,0],
[0,1,0],
[0,0,0]]
示例2
輸入:
[[0,0,0],
[0,1,0],
[1,1,1]]
輸出:
[[0,0,0],
[0,1,0],
[1,2,1]]

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
說明:每次只能向下或者向右移動一步。
示例:
輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 因為路徑 1→3→1→1→1 的總和最小。

兩道題都是常規題,不過當時寫得都比較亂,沒寫對。BFS的題,我大一都會寫,現在反而寫不對了,郁悶了一個下午。

后面還問了下,文本分類還有哪些方法,為什么要用朴素貝葉斯?
當時說了,用朴素貝葉斯是因為簡單,在大文本上處理速度快。
還可以用決策樹(問:不是和ngram差不多嗎,大文本上怎么會用這么慢的方法),還有LDA主題模型等
(后記:長文本的話,應該考慮預訓練模型,速度會快)

然后就結束了,這一場面試表現極差。

復盤分析,主要原因如下:
1)下午面試狀態不好。當時剛剛睡醒,頭腦昏沉,思路不清晰,邊界條件啥的想不清楚。此外還忘了錄音。還有就是之前陌陌開的是語音,字節開的視頻,視頻寫代碼有點緊張。
2)長期沒做過OJ題,手太生。從去年復試完之后就沒有再碰過OJ,今年找實習也是臨時起意,沒有做足准備。還有就是以前刷題用C++,沒用python做過,臨時寫題,還遇到了語言層面的問題。
3)簡歷項目上准備地不夠。第一個比賽的項目,准備地比較充分,后面的項目因為比較簡單,覺得面試不太會關注,沒有認真思考過,結果回答問題時很懵。

教訓:
1)一般面試都會讓現場寫道題,這次面試居然掛在了簡單的算法題上,看來以后平時每周要做點題,到面試前更是要好好刷一下。
2)以后面試盡量改到早上,下午實在是狀態不行。臨場發揮都發揮不出來。
3)但凡是簡歷上列出的項目都要好好准備,做足回答各種問題的准備。
返回目錄

5. 陌陌三面(3月11日)自然語言處理實習崗

1小時,主要問了下學校學的課程內容,以及做了一個簡繁體轉換的題。三面掛了。
問題如下:
1)自我介紹。
2)喬姆斯基文法有哪些,可以用什么自動機來解決?
3)正則表達式,用來解決什么文法的問題?
4)解釋下DFA和NFA,區別及聯系?
5)描述一下隱馬爾可夫模型,怎么解決一個具體的詞性標注問題?(這塊答得比較籠統,只描述了下原理,沒答好,應該把怎么解決三個問題描述一下)
6)隱馬爾可夫有哪三個問題要解決?
7)朴素貝葉斯的朴素是什么意思?(這個不知道,沒答好,應該是條件獨立性假設)
8)關聯規則算法舉一個例子,然后描述下怎么解決NLP的問題?(Apriori,算法具體的不記得了,沒答好)
9)講一下tf-idf的原理。

評價:學校這些課程都是好課,理論的學好,工作中需要去讀博客什么的,理論的沒學好看不明白,不能學過的都不記得。

編程題目大概就是一個讀入一百萬份文本,然后做簡繁轉換。(問題忘了保存了)

# 代碼只描述算法思路,不需要運行

# 調包的話可以用 opencc -i

word_dic1 = {} # 繁體簡體對照表

# 讀入詞表
with open("word_dict.txt", encoding="utf-8") as f:
    content = f.readlines()
    for line in content:
        words = line.split("——")
        if len(words[0]) > 1:
            w = words[0].split("/")
            for i in w:
                word_dic1[i] = words[1]
        else:
            word_dic1[words[0]] = words[1]

for file_path in file_list:
    # 替換
    with open(file_path, "r") as f:
        content = f.readlines()
        
        str_list = []
        str = ""
        for i in range(len(content)):
            for j in range(len(content[i])):
                if content[i][j] in word_dic1:
                    temp = word_dic1[content[i][j]]
                    str += temp
                else:
                    str += content[i][j]
            str_list.append(str + "\n")
            str = ""
        
    # 寫入文件
    with open("out_" + file_path, "w") as f:
        for str in str_list:
            f.writeline(str)

問:線上的話,這個代碼怎么優化?
我說,可以用散列表解決一下查找簡繁轉換表這塊。
面試官說,散列表並沒有優化啥,主要耗時操作在IO上,這個字符串處理是不是有問題?
我說,我這兒全部寫一遍確實有問題,應該是只修改需要做簡繁轉換的字符,做寫操作。

總體評價:
1)編碼能力還可以,但是讀題目不夠仔細,還有代碼細節小問題比較多。
2)看了前面幾輪的面試評價。簡歷上的術語不要太多,這些術語無非就是想說明做了很多東西,但寫的很多都是面試官感興趣的、想問的。
能寫在簡歷上的就得是確定會的,問不倒的。如果問了之后回答不清楚,反而成為減分項。

自我總結:
1)沒想到會問課程的東西,一來可能學得也馬虎,二來面試前沒有復習一下,有些問題回答得不清楚;
2)現場編程細節還是注意不夠,暴露出來潛在的習慣問題。
兩方面的習慣問題,一是平時寫代碼經常簡單地隨便寫完大體,然后再調試細節,沒有在寫代碼的過程中關注細節問題,等於給自己挖坑。
二是經常題目看個大概有思路就開始寫了,對題目中的細節關注不夠,沒有提前把需求里的點理清楚,也是在給自己挖坑。
返回目錄

6. 將門創投(3月17日) 自然語言處理實習崗

20分鍾,微信電話。給了口頭offer,已拒。技術戰略部,部門主管面試。
問了下,是否在北京,最快何時能到崗,一周能實習多久,還有薪資要求,以及對於他們的業務需求有沒有興趣之類的。
還有就是給我介紹了下他們公司,以及介紹了下他們的初創團隊,業務需求之類。並約時間周內和他們CTO聊一下。
(主要考慮到他們公司沒有專職的NLP工程師可以帶我,當天下午拒絕了)
這周開始在BOSS直聘以及拉勾網上海投簡歷。
返回目錄

7. 睿企科技(3月18日)自然語言處理實習崗

1個小時,筆試。題目比較簡單,不過時間有點緊。
1)元組與列表的區別。
2)寫一個動物類(Animal),初始化函數輸入名稱(name),類型為字符串,再寫一個狗類(Dog)繼承動物類,初始化函數輸入名稱(name)和顏色(color)。
3)DataFrame:

import string
import random
import numpy as np
import pandas as pd
# 隨機生成一些名字和分數
name = set()
while len(name) < 100:
    name.add(''.join(random.choice(string.ascii_lowercase) for _ in range(5)))
name = list(name)
df_score = pd.DataFrame({'name': name, 'score': np.random.randint(80, 100, 100)})
df_score.head()
# 給隨機名字分配班級
classes = ['A', 'B', 'C']
df_class = pd.DataFrame({'name': name, 'class': [random.choice(classes) for _ in range(100)]})
df_class = df_class.sample(frac=1).reset_index(drop=True)
df_class.head()
# 題目 1: 按照名字合並分數和班級
# 題目 2: 取出 A 班的成績表,按照分數降序排序
# 題目 3: 計算 A、B、C 班的平均分

4)訓練集、驗證集和測試集的區別是什么,為什么需要驗證集?
5)介紹你使用的深度學習框架(如 TensorFlow、PyTorch)。
6)介紹卷積運算的過程,比如輸入一個 3通道,尺寸為 (5, 5) 的圖像,如果要輸出 6 通道,尺寸為 (3, 3),卷積層的參數應該如何設置?
假設輸出矩陣 A 的尺寸為 (6, 3, 3),它的第一個數字A[0, 0, 0] 是如何計算出來的。
7)排好序的數組,從中找到相加等於target數字的兩個數的所有可能
比如,輸入
數組:[2, 3, 4, 7, 10, 12]
Target數:14
輸出: [(2, 12), (4, 10)]
def get_all_combs(array, target)
8)編寫正則表達式,匹配身份證號碼、電話號碼、手機號碼或銀行卡號,要求寫出兩個或以上的表達式。
9)輸入一個變形數組,及某個數字,輸出這個數字在變形數組中的位置
def find_num(array, num) 要求算法復雜度為 log(n)
變形的方法是將一個排好序的數組某個位置之前的數放到數組末尾,比如
原始數組為:
2 3 6 9 10 12 24 34
得到以下變形數組(將2 3 6放在了數組末尾):
9 10 12 24 34 2 3 6
比如,輸入24和變形數組,輸出 3
說明:
不需要寫變形的code,輸入已經是一個變形的數組了
不知道具體將多少個數放在了數組的末尾
返回目錄

8. 交叉科技(3月18日)自然語言處理實習崗

2個多小時,筆試。題目有點難。
1)100!(100 階乘)最后有多少個連續的零!。例如,12!=479001600 結尾處有兩個連續的零。
2)匹配生日:你在一個滿屋子有 N 個人,你問他們的生日是什么時候。假設每人生日是 365 天中隨機的一天,至少有兩個人共享同一個生日的概率有多大?
3)什么是蒙特卡羅方法?設計一個 Monte Carlo 實驗來估計π?(或其他類似的 monte carlo 實驗)
4)國王要求從他國家的 10 個地區各征收 1000 金幣的稅。每個地區的稅務員在年底都會給他帶來一袋金幣。一個線人告訴國王,一個稅務員作弊,給的硬幣總是比標准硬幣輕 10%,但他不知道哪個稅務員作弊。國王知道每一枚硬幣的重量應該正好是一盎司。國王怎么能准確地用一次稱重來識別那個騙子呢?
5)你站在半徑 R 的圓形區域的中心。該區域周圍有一個低鐵絲網。附在鐵絲網上的是一條餓狗,它喜歡吃任何它能抓住的人。你可以以速度 v 跑。不幸的是,狗可以以 4 v 的速度跑。如果你試圖逃離戰場,狗會盡力抓住你。你的跑動策略是什么,不用喂狗就可以逃出球場?
6)輸入是一個 32 位無符號整數 A。現在要求輸出 32 位無符號整數 B,滿足 B 的二進制表示是 A 的二進制表示的顛倒。
例子
輸入:10
輸出:5
解釋:10 的二進制表示是 1010,二進制表示 0101 對應數字 5
輸入最多可以是 9 位數
7)我們給你一個三角形的矩陣(見例子)
你的任務是找出自頂向下的最短路徑。路徑上的每一步只能移動到下一行中相鄰的結點上。
輸入:
[2 2],
[1 1,4],
[6,2 2,7],
[4,1 1,7,3]
輸出:6
解釋:自頂向下的最小路徑和為 6(即,2 2 + 1 1 + 2 2 + 1 1 = 6)。
8)給定 n 個非負整數,每個那一列柱子的高度(如下圖),計算最多能接多少水。

示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
解釋:數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示柱子的高度,藍色部分代表水,這個例子可以接 6 個單位的雨水。
9)Explain how to view (soft-margin) SVM as a penalization method (i.e.,explain the objective SVM as a Loss+Regularization term)
10)Explain the principle of the stochastic gradient descent algorithm. What is the benefit of using stochastic gradient descent (instead of gradient descent)?
11)What is overfitting? How to prevent overfitting (in both traditional method and deeplearning)?
12)Explain what are the gradient vanishing/explosion problems in RNN? (we need the underlying mathematical reason)
13)Consider the image captioning problem. Given a picture as the input, your algorithm should output a sentence describing the picture.
(a)Describe a neural network structure that can do this. (if you use well known CNN or RNN structures, you don’t need to go into the details. Just say how to use them (what the input, what is the output).)
(b)Describing the training process (what is the training data? what is the objective?)
(c)Describe the test process (In the testing phase, give a picture as the input, how your algorithm output a sentence describing the picture.)
(d)Suppose we want to have a parameter to determine the diversity of the output sentence (on one extreme, the output is almost a deterministic sentence, and on the other extreme, the output is almost a random sequence) This can be done by adding a temperature parameter to the softmax function. How would you do it? (there may be more than one reasonable answers.)
返回目錄

9. 感易智能(3月19日)自然語言處理實習崗

電話面試,30分鍾。未通過。
面試過程:
1)自我介紹
2)介紹下參加的比賽
3)比較下ngram和tf-idf
4)為什么ngram更適合這個場景
5)還用過別的方法嗎
6)最后集成用了哪些模型
7)比較過不同方法的差異嗎,為什么集成后效果會提升
8)解釋一下方法之間的差異
9)說一下CNN和全連接層的差別,是如何把參數變少的
10)為什么這樣做可行,這種簡化是滿足了什么條件
11)說一下平移不變性,subsampling
12)說一下word2vec的原理
13)詞向量是怎么學出來的
14)還記得訓練過程中的小trick嗎,層次softmax,nagative sampling,(沒回答好)
15)了解NLP一些任務,比如問答,閱讀理解之類的
16)了解最新的技術嗎
17)能說一下Transformer
18)可以介紹下多頭注意力機制,怎么實現的(沒回答好)
19)attention的權重是怎么訓練出來的(沒回答好)
返回目錄

10. 千芯科技(3月19日) 深度學習/人工智能實習生

我看JD里有NLP相關的就投了,沒想到是一個sb公司。
約好的面試時間,遲到了半小時(因為他們時間安排不合理,上一個還沒面完)。
面試居然是多面一,好幾個人面,甚至HR都在。
一上來就問CV的東西,我還以為自己投錯了崗位。
我說我是做NLP的,另一個人問我更喜歡NLP還是ASR。
還問我一般用啥模型,我說了幾個,人說這不都是機器學習的嗎,(內心os:機器學習的方法就不能用來做NLP了?)
問我用沒用過最新的技術,我說去年預訓練模型BERT很火,我用BERT跑過MRPC,
問我roBERTa知道不,我說沒用過roBERTa,人說那你還說自己是做NLP的,roBERTa都不知道。(內心os:一個BERT變種,這都能奚落人?)
然后沒人再問問題,HR說面試結束了,讓我退群。
(遲到半小時,面試十分鍾,還不尊重人,真是一個sb公司)
返回目錄

11. 微播易(3月20日) NLP算法實習生

筆試,1小時,做了一道簡單的編程題,tf-idf, 生成文檔的向量表示。代碼如下。

# 讀入文件
content = None # 文本列表
with open("./segmented.txt", encoding="utf-8") as f:
    content = f.readlines()
content[:5]
['\ufeff好 了 我 要 放大 招 了 我們 班 的 美女 們 看 壓軸 的 哦 有沒有 小 啊\n',
 '小 舞王\n',
 '現在 的 小朋友 都 這么 6 的 嗎\n',
 '不斷 給 你們 帶新 的 作品 新 的 造型 我 是 咖啡師 因為 有 你們 在 我 才能 一直 堅持下去 點 贊點 贊\n',
 '老 胳膊 老 腿 了 不 接受批評 哦\n']
# 預處理
content[0] = content[0][1:-1]
for i in range(1, len(content)):
    content[i] = content[i][:-1]
    
content[:5]
['好 了 我 要 放大 招 了 我們 班 的 美女 們 看 壓軸 的 哦 有沒有 小 啊',
 '小 舞王',
 '現在 的 小朋友 都 這么 6 的 嗎',
 '不斷 給 你們 帶新 的 作品 新 的 造型 我 是 咖啡師 因為 有 你們 在 我 才能 一直 堅持下去 點 贊點 贊',
 '老 胳膊 老 腿 了 不 接受批評 哦']
# 文檔總數
n = len(content)
n
4570
# 掃描文件和計數
docCount = {}
tf = []
content_lst = []
for i in range(len(content)):
    word_lst = content[i].split(' ')
    content_lst.append(word_lst)
    tfCount = {}
    for word in word_lst:
        if word != ' ':
            if word not in tfCount:
                tfCount[word] = 1
                if word not in docCount:
                    docCount[word] = 1
                else:
                    docCount[word] += 1
            else:
                tfCount[word] += 1
    tf.append(tfCount)
tf[0]
{'好': 1,
 '了': 2,
 '我': 1,
 '要': 1,
 '放大': 1,
 '招': 1,
 '我們': 1,
 '班': 1,
 '的': 2,
 '美女': 1,
 '們': 1,
 '看': 1,
 '壓軸': 1,
 '哦': 1,
 '有沒有': 1,
 '小': 1,
 '啊': 1}
# 詞表大小
dic_cnt = len(docCount)
dic_cnt
8927
import math

vect = [] # 向量表示,用tf-idf值
for i in range(len(content_lst)):
    word_lst = content_lst[i]
    tf_idf = [0] * dic_cnt
    cnt = 0
    for word in docCount:
        if word in word_lst:
            idf = math.log(n / docCount[word], 2)
            tf_idf[cnt] = tf[i][word] * idf
        cnt += 1
    vect.append(tf_idf)
print(docCount['了'], tf[0]['了'], len(vect))
print(math.log(n / docCount['了'], 2))
916 2 4570
2.3187746618484883
print(vect[0][:30], len(vect[0]))
[4.723350222308707, 4.637549323696977, 2.3015529213199013, 5.203782139558557, 12.157978449945432, 9.573015949224276, 5.543268605830224, 9.157978449945434, 3.0902199053087824, 8.350623527887828, 6.514122260170708, 5.403090947781964, 12.157978449945432, 5.968153891065415, 7.29999745481786, 3.340994826690051, 5.180698526445516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 8927
print(vect[1][:30], len(vect[1]))
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3.340994826690051, 0, 11.157978449945432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 8927

返回目錄

12. 東方棱鏡(3月20日) 算法實習崗

約好了面試時間,然后被放鴿子,聯系不上HR了。。。。
返回目錄

13. 微播易(3月20日) NLP算法實習崗

電話面試,30分鍾。
1)講下做文本分類的項目
2)准確率怎么定義,准確率高意味着什么,召回率高意味着什么(沒答好)
3)如何衡量兩個分類器的好壞(沒答好)
4)用混淆矩陣的作用是什么
5)如何把混淆嚴重的兩類分開(沒答好,應該是特征工程這塊)
6)對NLP哪個細分領域有比較深入的研究
7)對工程,還是科研更有興趣
8)介紹了下他們有深度學習/多模態方面的業務需求
返回目錄

14. 交叉科技(3月20日)算法實習崗

遲到了半小時,因為HR把這事給忘了。CEO面試,微信電話面試半小時。(感覺會給offer)
主要是看簡歷問了些問題,基本這些問題之前面試都問過了,所以回答地挺好的。
其他問題的話,包括LDA,word2vec,bert的原理之類的,也有所准備,回答的也蠻好的。
然后介紹了下他們在做一個根據新聞事件預測股票漲跌的需求,然后問了下有沒有興趣,目前有幾個offer,一周能實習幾天之類的問題。
返回目錄

15. 微播易(3月23日)NLP算法實習崗

電話溝通,10分鍾左右。后來沒聯系,感覺應該沒通過,微播易兩輪面試都答得不好。
算法負責人是北郵的一個學長,問的問題也偏基礎,沒有答好,挺遺憾的。

1)對深度學習有哪些了解
2)做文本分類有用過其他的方法
3)朴素貝葉斯效果不好,有沒有什么改進思路
4)textcnn有做過嗎
5)cnn的輸入輸出是什么
6)對pytorch,TensorFlow有哪些了解
7)對實習有哪些期望
8)一周可以實習幾天
返回目錄

16. 有魚科技(3月23日)算法實習崗

電話面試,20分鍾左右。已掛。
1)問了下個人情況
2)講一下項目
3)講一下tf-idf
4)講一下word2vec的負采樣
5)文本分類有沒有試過其他方法
6)問了下數據結構的問題,最長遞增子序列(動態規划)、快速排序(以及計算復雜度)(這塊沒回答好,不熟)
返回目錄

17. 鯨航科技(3月23日)語音識別算法實習崗

視頻面試。半個多小時。然后給了口頭offer
1)面試主要講了下項目
2)問了准確率,回歸率,分類與回歸的區別,分類方法等各種基礎問題
3)然后就是,面試官介紹了下他們公司的業務啥的
4)然后問有沒有興趣做語音識別語言模型這塊
5)這個是北郵校友的公司,感覺對北郵人很開放,所以聊的挺愉快的,希望我能去

返回目錄

18. 亞信科技(3月23日)算法實習崗

電話面試,20分鍾。可能未通過。
他們這邊主要是做聊天機器人,我對這方面不了解。

返回目錄

19. 百度(3月24日)數據挖掘實習崗

視頻面試,一個小時,問了一些機器學習的問題,然后做了兩道算法題。面試過程非常友好。
我這問題回答地都比較好,然后算法題也寫對了(當然應該不是最優解法)。
(總共應該是有兩輪技術面,加一輪經理面)
未聯系,可能是因為崗位不對口,未通過。

問題包括:
0)為什么研一就出來實習等個人問題
1)對圖像這方面感不感興趣
2)講一下xgboost,還有就是向量表示方法
3)xgboost和GBDT的差別
4)講一下隨機森林以及它的優點
5)講一下后向傳播算法
6)python你常用的庫有哪些
7)python2和python3的區別(除了語法上有些區別之外,其他不清楚)
8)word2vec了解多少,講一下
9)講一下CNN和RNN的區別,以及優缺點,使用上有什么區別
10)平衡二叉樹相比於普通樹有哪些優點
11)監督學習和非監督學習的區別
12)講一下自監督學習(這塊不清楚,我問是不是和強化學習差不多,然后我講了下強化學習的)
13)其他問題,忘記錄音了,不記得了

編程題目如下:
1)一個循環有序數組,比如[4, 5, 6, 7, 8, 1, 2, 3],找出數組中的最大值

def compute(lst):
    i = len(lst) // 2
    if len(lst) < 1:
        return -1
    if lst[i] > lst[i+1]:
        return lst[i]
    else:
        first = compute(lst[:i])
        return first if first != -1 else compute(lst[i+1:])

2)跳步計算,查了下,是一道LeetCode原題
比如[2, 3, 1, 1, 4],每個位置是可以跳的最大值,問最少可以跳幾步到最后一個位置。示例的答案是2

def compute2(lst2):
    temp_lst = [] # 保存狀態信息
    steps = [] # 保存最終步數信息
    if len(lst2) == 0:
        return
    temp_lst.append([lst2[0], 0, 0])
    
    while len(temp_lst) > 0:
        # 取數據
        data, index, step = temp_lst[0]
        temp_lst.pop(0)
        
        # print(data, index, step)
        
        # 添加最終步數
        if index == len(lst2) - 1:
            steps.append(step)
            continue
            
        for i in range(1, data+1):
            if index+i < len(lst2):
                temp_lst.append([lst2[index+i], index+i, step+1])
                # print("add", lst2[index+i], "index", index+i, "step", step+1)
    
    # print(steps)
    min_step = -1
    for j in steps:
        if j < min_step or min_step == -1:
            min_step = j
    return min_step

返回目錄

20. 交叉科技(3月24日)自然語言處理實習崗

20分鍾,部門經理+同事面。
拿我之前的筆試題簡單問了下。因為之前CEO已經面試通過了,所以這輪比較水。
面完后次日HR發了offer。
返回目錄

21. 雲日未來(3月24日)自然語言處理實習崗

1小時,釘釘視頻面,面試過程挺不友好的。
一上來,自我介紹完,我說我講下我的項目吧,人說,不用,你就說下你會啥吧。(當時就感覺挺尷尬的)
然后整個過程問了很多問題,簡歷上的,還有python,SVM,BERT,word2vec等等,問得都很細節,一些問題我也答不上來。
面試過程中,面試官自顧自地接聽同事電話,完全無視我的存在,感覺不太尊重求職者。
不過確實問的很多問題也是我的知識盲點,所以也算是一次不錯的面試經歷,學到了很多,雖然過程不太舒服。

返回目錄

22. 求職總結(3月26日)

在交叉科技和鯨航科技之間,糾結了足足兩天。
交叉科技是清華交叉信息學院(姚班)老師的公司,給的NLP實習崗,可能會做新聞事件抽取,根據新聞事件預測股票漲跌,NLP+金融。在清華旁邊,啟迪大廈那兒。
鯨航是北郵校友的公司,給的ASR實習崗(語言模型方向),可能會重寫一下一些底層框架之類的,也可能偏產品。在北航旁邊,給錢更多一些。
最終還是決定去交叉科技,感覺在那邊成長速度會更快一些。

求職過程中,最遺憾的是面陌陌。JD和經歷很對口,幾輪面試,面試官都很好,可惜最終因為自己的基礎不夠扎實,沒能通過。
最氣惱的是面字節跳動。自己狀態不好,簡單的圖算法題都沒寫對,浪費了大廠面試機會。

最終還是從拿到的小公司offer中選擇了一個自認為最好的,也算是一個月的求職有了一個還不錯的結果。
總而言之,自身實力硬傷很多。專業知識還是學的不夠扎實,知識面也不夠廣。
尤其比較遺憾的是,面試前的寒假,沒有能夠好好刷刷LeetCode,結果面試出的很多題都是LeetCode原題。
而且面試前期不知道有百面機器學習這本書,面試后期才發現。如果早一點看的話,很多機器學習相關的問題都可以回答地比較好。

返回目錄

23. 之后的學習方向(3月30日)

數據結構與算法:之前學得比較零散,需要系統地梳理一遍,然后把LeetCode刷幾遍,同時參與一些平台的競賽。
基礎知識:包括機器學習、深度學習、自然語言處理在內的基礎知識,需要系統復習並歸納,同時重視了解面試相關的題目。
個人簡歷:需要不斷補充完善,需要更優質的經歷添加到簡歷中,包括論文、實習、競賽、開源項目等。
時間精力:放棄一些不切實際的幻想,不做無謂的嘗試,把主要精力集中到專業方向上來,多學習,多實踐。

返回目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM