干貨 | 美團(tuán)推薦算法工程師崗8道面試題分享!

問題1:各種優(yōu)化器使用的經(jīng)驗(yàn)
梯度下降:在一個(gè)方向上更新和調(diào)整模型的參數(shù),來最小化損失函數(shù)。
隨機(jī)梯度下降(Stochastic gradient descent,SGD)對(duì)每個(gè)訓(xùn)練樣本進(jìn)行參數(shù)更新,每次執(zhí)行都進(jìn)行一次更新,且執(zhí)行速度更快。
為了避免SGD和標(biāo)準(zhǔn)梯度下降中存在的問題,一個(gè)改進(jìn)方法為小批量梯度下降(Mini Batch Gradient Descent),因?yàn)閷?duì)每個(gè)批次中的n個(gè)訓(xùn)練樣本,這種方法只執(zhí)行一次更新。
使用小批量梯度下降的優(yōu)點(diǎn)是:
1) 可以減少參數(shù)更新的波動(dòng),最終得到效果更好和更穩(wěn)定的收斂。
2) 還可以使用最新的深層學(xué)習(xí)庫中通用的矩陣優(yōu)化方法,使計(jì)算小批量數(shù)據(jù)的梯度更加高效。
3) 通常來說,小批量樣本的大小范圍是從50到256,可以根據(jù)實(shí)際問題而有所不同。
4) 在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),通常都會(huì)選擇小批量梯度下降算法。
SGD方法中的高方差振蕩使得網(wǎng)絡(luò)很難穩(wěn)定收斂,所以有研究者提出了一種稱為動(dòng)量(Momentum)的技術(shù),通過優(yōu)化相關(guān)方向的訓(xùn)練和弱化無關(guān)方向的振蕩,來加速SGD訓(xùn)練。
Nesterov梯度加速法,通過使網(wǎng)絡(luò)更新與誤差函數(shù)的斜率相適應(yīng),并依次加速SGD,也可根據(jù)每個(gè)參數(shù)的重要性來調(diào)整和更新對(duì)應(yīng)參數(shù),以執(zhí)行更大或更小的更新幅度。
AdaDelta方法是AdaGrad的延伸方法,它傾向于解決其學(xué)習(xí)率衰減的問題。Adadelta不是累積所有之前的平方梯度,而是將累積之前梯度的窗口限制到某個(gè)固定大小w。
Adam算法即自適應(yīng)時(shí)刻估計(jì)方法(Adaptive Moment Estimation),能計(jì)算每個(gè)參數(shù)的自適應(yīng)學(xué)習(xí)率。
這個(gè)方法不僅存儲(chǔ)了AdaDelta先前平方梯度的指數(shù)衰減平均值,而且保持了先前梯度M(t)的指數(shù)衰減平均值,這一點(diǎn)與動(dòng)量類似。
Adagrad方法是通過參數(shù)來調(diào)整合適的學(xué)習(xí)率η,對(duì)稀疏參數(shù)進(jìn)行大幅更新和對(duì)頻繁參數(shù)進(jìn)行小幅更新。因此,Adagrad方法非常適合處理稀疏數(shù)據(jù)。

?
問題2:python 垃圾處理機(jī)制
在Python中,主要通過引用計(jì)數(shù)進(jìn)行垃圾回收;
通過 “標(biāo)記-清除” 解決容器對(duì)象可能產(chǎn)生的循環(huán)引用問題;
通過 “分代回收” 以空間換時(shí)間的方法提高垃圾回收效率。
也就是說,python采用的是引用計(jì)數(shù)機(jī)制為主,標(biāo)記-清除和分代收集(隔代回收)兩種機(jī)制為輔的策略。

?
問題3:yield 關(guān)鍵字作用
yield是一個(gè)類似 return 的關(guān)鍵字,只是這個(gè)函數(shù)返回的是個(gè)生成器,可以節(jié)省巨大的時(shí)間、空間開銷。

?
問題4:python 多繼承,兩個(gè)父類有同名方法怎么辦?
super(Classname,self).methodname()或super(Classname, cls).methodname() 調(diào)用"下一個(gè)"父類中的方法
1、假設(shè)類A繼承B, C, D: class A(B, C, D), B/C/D都有一個(gè)show()方法
a.調(diào)用B的show()方法:
super().show()
super(A, self).show()
b.調(diào)用C的show()方法:
super(B,self).show()
c.調(diào)用D的show()方法:
super(C,self).show()
2.如果在B類中需要調(diào)用C類中的show()方法, 也是一樣的
class B:
def show(self):
super(B, self).show()
?
問題5:python 多線程/多進(jìn)程/協(xié)程


?
問題6:樂觀鎖/悲觀鎖?
參考:https://zhuanlan.zhihu.com/p/82745364
悲觀鎖
總是假設(shè)最壞的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)阻塞直到它拿到鎖
樂觀鎖
總是假設(shè)最好的情況,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)機(jī)制和CAS算法實(shí)現(xiàn)。
?
兩種鎖的使用場(chǎng)景
樂觀鎖適用于寫比較少的情況下(多讀場(chǎng)景),即沖突真的很少發(fā)生的時(shí)候,這樣可以省去了鎖的開銷,加大了系統(tǒng)的整個(gè)吞吐量。
悲觀鎖一般適用于多寫的場(chǎng)景下。
?
兩種鎖的實(shí)現(xiàn)方式
樂觀鎖常見的兩種實(shí)現(xiàn)方式
樂觀鎖一般會(huì)使用版本號(hào)機(jī)制或CAS算法實(shí)現(xiàn)。
悲觀鎖的實(shí)現(xiàn)方式是加鎖,加鎖既可以是對(duì)代碼塊加鎖(如Java的synchronized關(guān)鍵字),也可以是對(duì)數(shù)據(jù)加鎖(如MySQL中的排它鎖)。

?
問題7:coding: 合并兩個(gè)有序鏈表
方法一:遞歸
分兩種情況:空鏈表和非空鏈表
當(dāng)其中一個(gè)為空鏈表時(shí),可以直接返回另一個(gè)鏈表
當(dāng)兩個(gè)鏈表都為非空鏈表時(shí),可以使用下面方法進(jìn)行遞歸
?
代碼如下:

時(shí)間復(fù)雜度:O(m+n)
空間復(fù)雜度:O(m+n)
方法二:迭代
?
首先要設(shè)定一個(gè)哨兵節(jié)點(diǎn),可以在最后比較容易地返回合并后的鏈表。
維護(hù)一個(gè) pre 指針,根據(jù) l1和 l2 的大小不斷更新 prev 的next 指針。
?
代碼如下:

時(shí)間復(fù)雜度:O(m+n)
空間復(fù)雜度:O(1)

?
問題8:講下CNN發(fā)展史
1、LeNet:
廣為流傳LeNet誕生于1998年,網(wǎng)絡(luò)結(jié)構(gòu)比較完整,包括卷積層、pooling層、全連接層,這些都是現(xiàn)代CNN網(wǎng)絡(luò)的基本組件。被認(rèn)為是CNN的開端。
?
2、AlexNet:
2012年Geoffrey和他學(xué)生Alex在ImageNet的競(jìng)賽中,刷新了image classification的記錄,一舉奠定了deep learning 在計(jì)算機(jī)視覺中的地位。這次競(jìng)賽中Alex所用的結(jié)構(gòu)就被稱為作為AlexNet。
對(duì)比LeNet,AlexNet加入了:
(1)非線性激活函數(shù):ReLU;
(2)防止過擬合的方法:Dropout,Data augmentation。同時(shí),使用多個(gè)GPU,LRN歸一化層。其主要的優(yōu)勢(shì)有:網(wǎng)絡(luò)擴(kuò)大(5個(gè)卷積層+3個(gè)全連接層+1個(gè)softmax層);解決過擬合問題(dropout,data augmentation,LRN);多GPU加速計(jì)算。
?
3 VGG-Net:
VGG-Net來自 Andrew Zisserman 教授的組 (Oxford),在2014年的 ILSVRC localization and classification 兩個(gè)問題上分別取得了第一名和第二名,其不同于AlexNet的地方是:VGG-Net使用更多的層,通常有16-19層,而AlexNet只有8層。同時(shí),VGG-Net的所有 convolutional layer 使用同樣大小的 convolutional filter,大小為 3 x 3。
?
4 GoogLeNet:
提出的Inception結(jié)構(gòu)是主要的創(chuàng)新點(diǎn),這是(Network In Network)的結(jié)構(gòu),即原來的結(jié)點(diǎn)也是一個(gè)網(wǎng)絡(luò)。其使用使得之后整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的寬度和深度都可擴(kuò)大,能夠帶來2-3倍的性能提升。
?
5 Resnet
ResNet提出了一種減輕網(wǎng)絡(luò)訓(xùn)練負(fù)擔(dān)的殘差學(xué)習(xí)框架,這種網(wǎng)絡(luò)比以前使用過的網(wǎng)絡(luò)本質(zhì)上層次更深。其明確地將這層作為輸入層相關(guān)的學(xué)習(xí)殘差函數(shù),而不是學(xué)習(xí)未知的函數(shù)。
在ImageNet數(shù)據(jù)集用152 層(據(jù)說層數(shù)已經(jīng)超過1000==)——比VGG網(wǎng)絡(luò)深8倍的深度來評(píng)估殘差網(wǎng)絡(luò),但它仍具有較低的復(fù)雜度。在2015年大規(guī)模視覺識(shí)別挑戰(zhàn)賽分類任務(wù)中贏得了第一。
— 推薦閱讀 — 最新大廠面試題
學(xué)員最新面經(jīng)分享
七月內(nèi)推崗位
AI開源項(xiàng)目論文
NLP ( 自然語言處理 )
CV(計(jì)算機(jī)視覺)
推薦

