1. 程式人生 > 其它 >【面經】研一下-演算法實習-面試經驗彙總

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

技術標籤:演算法pythonemacs機器學習人工智慧

目錄:

1. 青藤雲安全-2月26日-已掛2. 陌陌一面-3月3日-已過3. 陌陌二面-3月4日-已過4. 位元組跳動一面-3月10日-已掛5. 陌陌三面-3月11日-已掛6. 將門創投-3月17日-offer7. 睿企科技筆試-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日-offer18. 亞信科技-3月23日19. 百度一面-3月24日20. 交叉科技二面-3月24日-offer21. 雲日未來-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刷幾遍,同時參與一些平臺的競賽。
基礎知識:包括機器學習、深度學習、自然語言處理在內的基礎知識,需要系統複習並歸納,同時重視瞭解面試相關的題目。
個人簡歷:需要不斷補充完善,需要更優質的經歷新增到簡歷中,包括論文、實習、競賽、開源專案等。
時間精力:放棄一些不切實際的幻想,不做無謂的嘗試,把主要精力集中到專業方向上來,多學習,多實踐。

返回目錄