春招已近,这份GitHub万星的ML算法面试大全请收下
春季到來,春招不久也會(huì)開始。在本項(xiàng)目中,作者為大家準(zhǔn)備了 ML 算法工程師面試指南,它提供了完整的面試知識(shí)點(diǎn)、編程題及題解、各科技公司的面試題錦等內(nèi)容。目前該 GitHub 項(xiàng)目已經(jīng)有 1 萬+的收藏量,想要跳一跳的同學(xué)快來試試吧。
項(xiàng)目地址:https://github.com/imhuay/Algorithm_Interview_Notes-Chinese
如下所示為整個(gè)項(xiàng)目的結(jié)構(gòu),其中從機(jī)器學(xué)習(xí)到數(shù)學(xué)主要提供的是筆記與面試知識(shí)點(diǎn),讀者可回顧整體的知識(shí)架構(gòu)。后面從算法到筆試面經(jīng)主要提供的是問題及解答方案,根據(jù)它們可以提升整體的解題水平與編程技巧。
面試知識(shí)點(diǎn)
面試題多種多樣,但機(jī)器學(xué)習(xí)知識(shí)就那么多,那么為了春招或春季跳槽,何不過一遍 ML 核心知識(shí)點(diǎn)?在這個(gè) GitHub 項(xiàng)目中,作者前一部分主要介紹了機(jī)器學(xué)習(xí)及各子領(lǐng)域的知識(shí)點(diǎn)。其中每一個(gè)知識(shí)點(diǎn)都只提供最核心的概念,如果讀者遇到不熟悉的算法或者遇到知識(shí)漏洞,可以進(jìn)一步閱讀相關(guān)文獻(xiàn)。
項(xiàng)目主要從機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、自然語言處理和數(shù)學(xué)等方面提供詳細(xì)的知識(shí)點(diǎn),因?yàn)樽髡弑容^關(guān)注 NLP,所以并沒有提供詳細(xì)的計(jì)算機(jī)視覺筆記。
機(jī)器學(xué)習(xí)
首先對(duì)于機(jī)器學(xué)習(xí),項(xiàng)目主要從基礎(chǔ)概念、基本實(shí)踐、基本算法和集成學(xué)習(xí)專題這四個(gè)方面概括 ML 的總體情況。其中基礎(chǔ)概念可能是最基本的面試問題,例如「偏差方差怎么權(quán)衡?」、「生成模型和判別模型的差別是什么?」、「先驗(yàn)和后驗(yàn)概率都是什么,它們能轉(zhuǎn)換嗎?」。
這些知識(shí)點(diǎn)一般是入門者都需要了解的,而對(duì)于 ML 基本實(shí)踐,主要會(huì)從如何做好傳統(tǒng) ML 開發(fā)流程的角度提問。例如「你如何選擇超參數(shù),能介紹一些超參數(shù)的基本搜索方法嗎?」、「混淆矩陣、準(zhǔn)確率、精確率、召回率或 F1 值都是什么,如何使用它們度量模型的好壞?」、「你能介紹數(shù)據(jù)清洗和數(shù)據(jù)預(yù)處理的主要流程嗎,舉個(gè)例子?」。
這些問題都能在前兩部分的知識(shí)點(diǎn)中找到答案。后一部分的基本算法就非常多了,從最簡(jiǎn)單的 Logistic 回歸到復(fù)雜的梯度提升樹,這一部分總結(jié)了主流的機(jī)器學(xué)習(xí)算法:
信息論
邏輯斯蒂回歸
支持向量機(jī)
決策樹
集成學(xué)習(xí)
梯度提升決策樹 GBDT
隨機(jī)森林
其中每一種算法都提供了最核心的概念,例如對(duì)于決策樹中的 CART 算法,筆記主要引用了李航《統(tǒng)計(jì)學(xué)習(xí)方法》中的描述:
最后機(jī)器學(xué)習(xí)還有一個(gè)關(guān)于集成方法的專題。除了支持向量機(jī),集成方法相關(guān)的問題在 ML 中也比較重要,因?yàn)橄?XGboost 和隨機(jī)森林等方法在傳統(tǒng) ML 中效果應(yīng)該是頂尖的,被問到的概率也大得多。
深度學(xué)習(xí)
深度學(xué)習(xí)的內(nèi)容就相對(duì)比較多了,目前也有非常多的筆記或資料,但是我們可能會(huì)感覺深度學(xué)習(xí)的問題并沒有機(jī)器學(xué)習(xí)難。頂多會(huì)讓我們手推一個(gè)反向傳播算法,不會(huì)像手推支持向量機(jī)那樣讓我們從表達(dá)式推一下卷積網(wǎng)絡(luò)。如果要為深度學(xué)習(xí)打基礎(chǔ),其實(shí)最好的辦法是學(xué)習(xí) Ian Goodfellow 的《Deep Learning》,我們只要閱讀這本書的前兩部分:應(yīng)用數(shù)學(xué)與機(jī)器學(xué)習(xí)基礎(chǔ);深度網(wǎng)絡(luò):現(xiàn)代實(shí)踐。第三部分因?yàn)樯婕按罅壳把匮芯康臇|西,我們暫時(shí)可以不急著學(xué)。
該項(xiàng)目主要從以下幾個(gè)方面介紹深度學(xué)習(xí)面試知識(shí)點(diǎn):
深度學(xué)習(xí)基礎(chǔ)
深度學(xué)習(xí)實(shí)踐
CNN 專題
RNN 專題
優(yōu)化算法專題
序列建模專題
《Deep Learning》整理
前面 6 個(gè)專題都是介紹的筆記,每一個(gè)專題都有非常多的具體內(nèi)容,其中序列建模專題還引用了機(jī)器之心綜述的從循環(huán)到卷積,探索序列建模的奧秘。如下展示了優(yōu)化算法專題所包含的內(nèi)容:
在最后的《Deep Learning》整理中,項(xiàng)目作者給出了五十多道深度學(xué)習(xí)問題,并根據(jù)這些問題介紹《Deep Learning》中的知識(shí)點(diǎn)。如下為問題示例,不同的星號(hào)表示問題的難度:
自然語言處理與數(shù)學(xué)
后面的自然語言處理也是最近在重點(diǎn)更新的,目前介紹的方面主要有;
自然語言處理基礎(chǔ)
NLP 發(fā)展趨勢(shì)
詞嵌入專題
句嵌入專題
多模態(tài)專題
視覺問答綜述
深度理解查詢
NLP 很多知識(shí)點(diǎn)其實(shí)都不算基礎(chǔ)內(nèi)容,這需要根據(jù)我們自己學(xué)習(xí)的領(lǐng)域收集復(fù)習(xí)內(nèi)容。不過像 NLP 基礎(chǔ)或詞嵌入等知識(shí)點(diǎn),項(xiàng)目作者介紹得很詳細(xì),它們也是 NLP 面試必備知識(shí)。
最后還有一些數(shù)學(xué)知識(shí)點(diǎn),它們是算法工程師面試所需要具備的基礎(chǔ)。例如今日頭條算法工程師的實(shí)習(xí)生面試會(huì)問:「在圓環(huán)上隨機(jī)選取 3 個(gè)點(diǎn),這 3 個(gè)點(diǎn)組成銳角三角形的概率?」,或者其它算個(gè)積分之類的。項(xiàng)目作者主要為面試準(zhǔn)備了以下幾方面的知識(shí)點(diǎn);
概率論
微積分本質(zhì)
深度學(xué)習(xí)核心
其中深度學(xué)習(xí)核心主要包含非線性激活函數(shù)、梯度下降和反向傳播。
算法題和筆試題
對(duì)于編程面試,基礎(chǔ)算法是必不可少的,它們一般體現(xiàn)在筆試題上,例如數(shù)據(jù)結(jié)構(gòu)、動(dòng)態(tài)規(guī)劃或排列組合等。很多開發(fā)者可能感覺筆試解題會(huì)很難,因?yàn)轭}目并不會(huì)告訴你需要用什么樣的基礎(chǔ)算法來解決,全靠我們自己一步步解析題目。這就要求我們對(duì)各種基礎(chǔ)算法都比較熟悉,項(xiàng)目作者提供了以下基本算法專題:
字符串
數(shù)據(jù)結(jié)構(gòu)
高級(jí)數(shù)據(jù)結(jié)構(gòu)
動(dòng)態(tài)規(guī)劃
雙指針
區(qū)間問題
排列組合
數(shù)學(xué)問題
Shuffle、采樣、隨機(jī)數(shù)
大數(shù)運(yùn)算
海量數(shù)據(jù)處理
這些算法題會(huì)介紹具體的問題、解題思路以及對(duì)應(yīng)的解題代碼。例如在數(shù)據(jù)結(jié)構(gòu)中,我們?nèi)绾闻袛鄻?B 是不是樹 A 的子樹。
如下所示為解題代碼,注意基本上各基礎(chǔ)算法的題解都是用 C++寫的,作者會(huì)引用劍指 Offer 題解和 Leetcode 題解等的解決方案。
public:
????bool?HasSubtree(TreeNode*?p1,?TreeNode*?p2)?{
????????if?(p1?==?nullptr?||?p2?==?nullptr)??//?約定空樹不是任意一個(gè)樹的子結(jié)構(gòu)
????????????return?false;
????????return?isSubTree(p1,?p2)????//?判斷子結(jié)構(gòu)是否相同
????????????||?HasSubtree(p1->left,?p2)??????//?遞歸尋找樹?A?中與樹?B?根節(jié)點(diǎn)相同的子節(jié)點(diǎn)
????????????||?HasSubtree(p1->right,?p2);
????}
????bool?isSubTree(TreeNode*?p1,?TreeNode*?p2)?{
????????if?(p2?==?nullptr)?return?true;????????//?注意這兩個(gè)判斷的順序
????????if?(p1?==?nullptr)?return?false;
????????if?(p1->val?==?p2->val)
????????????return?isSubTree(p1->left,?p2->left)????//?遞歸判斷左右子樹
????????????????&&?isSubTree(p1->right,?p2->right);
????????else
????????????return?false;
????}
};
此外,該項(xiàng)目還提供了 IO 模板和必備算法模板。作者表示不少筆試不像 LeetCode 那樣可以自動(dòng)完成 I/O,我們需要手動(dòng)完成數(shù)據(jù) I/O,而且如果我們沒有 ACM 經(jīng)驗(yàn),很可能會(huì)在這上面浪費(fèi)很多時(shí)間。因此這里總結(jié)的幾種常見 IO 模板對(duì)于編程面試有很大的幫助,另外的算法模板同樣也是。
例如如果我們輸入不定數(shù)量個(gè) Input,且以某個(gè)特殊輸入為結(jié)束標(biāo)志,那么用 C 語言實(shí)現(xiàn)的模板為:
int?a,?b;
while?(scanf("%d?%d",?&a,?&b)?!=?EOF?&&?(a?!=?0?&&?b?!=?0))?{
????//?...
}
//?或者
while?(scanf("%d?%d",?&a,?&b)?!=?EOF?&&?(a?||?b))?{
????//?...
}
//?示例?2
int?n;
while?(scanf("%d",?&n)?!=?EOF?&&?n?!=?0)?{
????//?...
}
用 C++實(shí)現(xiàn)的模板為:
int?a,?b;
while?(cin?>>?a?>>?b)?{
????if?(a?==?0?&&?b?==?0)
????????break;
????//?...
}
//?示例?2
int?n;
while?(cin?>>?n?&&?n?!=?0)?{
????//?...
}
面試真題
最后,項(xiàng)目作者還收集了十多家科技企業(yè)面試真題,并介紹從一面到三面的內(nèi)容與經(jīng)驗(yàn)。
例如以下是頭條/字節(jié)跳動(dòng)-深度學(xué)習(xí)/NLP 方向的三面概覽:
具體的面試題也會(huì)提供,如下所示為字節(jié)跳動(dòng) 18 年 8 月的筆試題:積分卡牌游戲。
當(dāng)然給了題目,對(duì)應(yīng)的解決方案也會(huì)提供:
n?=?int(input())
x,?y?=?[],?[]
for?i?in?range(n):
????_x,?_y?=?list(map(int,?input().split()))
????x.append(_x)
????y.append(_y)
xy?=?list(zip(x,?y))
xy?=?sorted(xy,?key=lambda?t:?t[1])
ret?=?0
if?sum(x)?%?2?==?0:??#?如果所有?x?的和為偶數(shù)
????print(sum(y))????#?直接輸出所有?y?的和
else:
????for?i?in?range(len(xy)):
????????if?xy[i][0]?%?2?==?1:??#?去掉?x?中為奇數(shù)的那一項(xiàng)
????????????ret?=?sum([xy[j][1]?for?j?in?range(len(xy))?if?j?!=?i])
????????????print(ret)
????????????break
————
編輯?∑ Gemini
來源:機(jī)器之心
微信公眾號(hào)“算法數(shù)學(xué)之美”,由算法與數(shù)學(xué)之美團(tuán)隊(duì)打造的另一個(gè)公眾號(hào),歡迎大家掃碼關(guān)注!
更多精彩:
?如何向5歲小孩解釋什么是支持向量機(jī)(SVM)?
?自然底數(shù)e的意義是什么?
?費(fèi)馬大定理,集驚險(xiǎn)與武俠于一體
?簡(jiǎn)單的解釋,讓你秒懂“最優(yōu)化” 問題
?一分鐘看懂一維空間到十維空間
??本科、碩士和博士到底有什么區(qū)別?
?小波變換通俗解釋
?微積分必背公式
?影響計(jì)算機(jī)算法世界的十位大師
?數(shù)據(jù)挖掘之七種常用的方法
算法數(shù)學(xué)之美微信公眾號(hào)歡迎賜稿
稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結(jié)
以上是生活随笔為你收集整理的春招已近,这份GitHub万星的ML算法面试大全请收下的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从小白到年薪10万+,优秀的数据分析能力
- 下一篇: Matlab高级绘图功能