這些問題是我在面試 AI 工程師崗位時常問到的問題。事實上,并非所有面試都需要用到所有這些問題,因為這取決于面試者的經(jīng)驗以及之前做過的項目。經(jīng)過很多面試(尤其是與學(xué)生的面試)之后,我收集了 12 個深度學(xué)習(xí)領(lǐng)域的面試問題。我將在本文中將其分享給你。
問題1
闡述批歸一化的意義
這是一個非常好的問題,因為這涵蓋了面試者在操作神經(jīng)網(wǎng)絡(luò)模型時所需知道的大部分知識。你的回答方式可以不同,但都需要說明以下主要思想:
算法 1:批歸一化變換,在一個 mini-batch 上應(yīng)用于激活 x。
批歸一化是一種用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型的有效方法。這種方法的目標(biāo)是對特征進行歸一化處理(使每層網(wǎng)絡(luò)的輸出都經(jīng)過激活),得到標(biāo)準(zhǔn)差為 1 的零均值狀態(tài)。所以其相反的現(xiàn)象是非零均值。這將如何影響模型的訓(xùn)練:
首先,這可以被理解成非零均值是數(shù)據(jù)不圍繞 0 值分布的現(xiàn)象,而是數(shù)據(jù)的大多數(shù)值大于 0 或小于 0。結(jié)合高方差問題,數(shù)據(jù)會變得非常大或非常小。在訓(xùn)練層數(shù)很多的神經(jīng)網(wǎng)絡(luò)時,這個問題很常見。如果特征不是分布在穩(wěn)定的區(qū)間(從小到大的值)里,那么就會對網(wǎng)絡(luò)的優(yōu)化過程產(chǎn)生影響。我們都知道,優(yōu)化神經(jīng)網(wǎng)絡(luò)將需要用到導(dǎo)數(shù)計算。
假設(shè)一個簡單的層計算公式 y = (Wx + b),y 在 W 上的導(dǎo)數(shù)就是這樣:dy=dWx。因此,x 的值會直接影響導(dǎo)數(shù)的值(當(dāng)然,神經(jīng)網(wǎng)絡(luò)模型的梯度概念不會如此之簡單,但理論上,x 會影響導(dǎo)數(shù))。因此,如果 x 引入了不穩(wěn)定的變化,則這個導(dǎo)數(shù)要么過大,要么就過小,最終導(dǎo)致學(xué)習(xí)到的模型不穩(wěn)定。而這也意味著當(dāng)使用批歸一化時,我們可以在訓(xùn)練中使用更高的學(xué)習(xí)率。
批歸一化可幫助我們避免 x 的值在經(jīng)過非線性激活函數(shù)之后陷入飽和的現(xiàn)象。也就是說,批歸一化能夠確保激活都不會過高或過低。這有助于權(quán)重學(xué)習(xí)——如果不使用這一方案,某些權(quán)重可能永遠不會學(xué)習(xí)。這還能幫助我們降低對參數(shù)的初始值的依賴。
批歸一化也可用作正則化(regularization)的一種形式,有助于實現(xiàn)過擬合的最小化。使用批歸一化時,我們無需再使用過多的 dropout;這是很有助益的,因為我們無需擔(dān)心再執(zhí)行 dropout 時丟失太多信息。但是,仍然建議組合使用這兩種技術(shù)。
問題2闡述偏置和方差的概念以及它們之間的權(quán)衡關(guān)系
偏置(bias)是什么?這很好理解,偏置是當(dāng)前模型的平均預(yù)測結(jié)果與我們需要預(yù)測的實際結(jié)果之間的差異。當(dāng)模型的偏置較高時,說明其不夠關(guān)注訓(xùn)練數(shù)據(jù)。這會使得模型過于簡單,無法在訓(xùn)練和測試上同時實現(xiàn)優(yōu)良的準(zhǔn)確度。這個現(xiàn)象也被稱為「欠擬合」。
方差(variance)可以簡單理解為是模型輸出在一個數(shù)據(jù)點上的分布(或聚類)。方差越大,模型越有可能更密切關(guān)注訓(xùn)練數(shù)據(jù),而無法提供在從未見過的數(shù)據(jù)上的泛化能力。由此造成的結(jié)果是,模型可在訓(xùn)練數(shù)據(jù)集上取得非常好的結(jié)果,但在測試數(shù)據(jù)集上的表現(xiàn)卻非常差。這個現(xiàn)象被稱為過擬合。
這兩個概念的關(guān)系可通過下圖說明:
上圖中,圓圈中心是能夠完美預(yù)測精準(zhǔn)值的模型。事實上,你永遠無法找到這樣好的模型。隨著我們離圓圈中心越來越遠,模型的預(yù)測也越來越差。
我們可以改變模型,使得我們可以增大模型猜測的數(shù)量,使其盡可能多地落在圓圈中心。偏置和方差之間需要保持平衡。如果我們的模型過于簡單,有非常少的參數(shù),那么它就可能有較高的偏置和較低的方差。
另一方面,如果我們的模型有大量參數(shù),則其將有較高的方差和較低的偏置。這是我們在設(shè)計算法時計算模型復(fù)雜度的基礎(chǔ)。
問題3假設(shè)深度學(xué)習(xí)模型已經(jīng)找到了 1000 萬個人臉向量,如何通過查詢以最快速度找到一張新人臉?
這個問題涉及到深度學(xué)習(xí)算法的實際應(yīng)用,關(guān)鍵點在于索引數(shù)據(jù)的方法。這是將 One Shot Learning 應(yīng)用于人臉識別的最后一步,但這也是最重要的步驟,讓該應(yīng)用易于實際部署。
基本上來說,對于這個問題,你首先應(yīng)該通過 One Shot Learning 給出人臉識別方法的整體概況。這可以簡單地理解成將每張臉轉(zhuǎn)換成一個向量,然后識別新的人臉是尋找最接近(最相似)于輸入人臉的向量。通常來說,人們會使用有三元組損失(triplet loss)的定制損失函數(shù)的深度學(xué)習(xí)模型來完成這一任務(wù)。
但是,如果有文章開頭那樣的圖像數(shù)量增長,那么在每次識別中都計算與 1000 萬個向量的距離可不是個聰明的解決方案,這會使得系統(tǒng)的速度非常慢。我們需要思考在真實向量空間上索引數(shù)據(jù)的方法,以便讓查詢更加便捷。
這些方法的主要思想是將數(shù)據(jù)劃分成簡單的結(jié)構(gòu),以便查詢新數(shù)據(jù)(可能類似于樹結(jié)構(gòu))。當(dāng)有新數(shù)據(jù)時,在樹中查詢有助于快速找到距離最近的向量。
有一些可以用于這一目的的方法,比如局部敏感哈希(LSH)、Approximate Nearest Neighbors Oh Yeah——Annoy Indexing、Faiss等。
問題4對于分類問題,準(zhǔn)確度指數(shù)完全可靠嗎?你通常使用哪些指標(biāo)來評估你的模型?
針對分類問題的評估方法有很多。準(zhǔn)確度是一種很簡單的指標(biāo),也就是用正確的預(yù)測數(shù)據(jù)除以總的數(shù)據(jù)。這聽起來很合理,但現(xiàn)實情況是,這種度量方式對不平衡的數(shù)據(jù)問題來說并不夠顯著。假設(shè)我們正在構(gòu)建用于預(yù)測網(wǎng)絡(luò)攻擊的預(yù)測模型(假設(shè)攻擊請求大約占請求總數(shù)的 1/100000)。
如果該模型預(yù)測所有請求都是正常的,那么其準(zhǔn)確率也高達 99.9999%,但在這個分類模型中,這個數(shù)字通常是不可靠的。上面的準(zhǔn)確度計算得到的結(jié)果通常是被正確預(yù)測的數(shù)據(jù)的百分比,但沒有詳細說明每個類別的分類細節(jié)。相反,我們可以使用混淆矩陣。基本上來說,混淆矩陣展示了數(shù)據(jù)點實際屬于的類別,以及模型預(yù)測的類別。其形式如下:
除了表達真正例和假正例指標(biāo)對應(yīng)于定義了該分類的每個閾值的變化之外,我們還有名為受試者工作特征(ROC)的圖表; ROC,我們可以知道該模型是否有效。
理想的 ROC 越接近左上角的橙色線(即真正例較高,假正例較低),結(jié)果就越好。
問題5你怎么理解反向傳播?請解釋動作(action)的機制。
這個問題的目標(biāo)是測試參加面試的人是否理解神經(jīng)網(wǎng)絡(luò)的工作方式。你需要說明以下幾點:
前向過程(前向計算)是幫助模型計算每層的權(quán)重的過程,所得到的計算會得到一個結(jié)果 yp。這時候會計算損失函數(shù)的值;損失函數(shù)的這個值能體現(xiàn)模型的優(yōu)劣程度。如果這個損失函數(shù)不夠好,我們就需要找到一種能夠降低這個損失函數(shù)的值的方法。神經(jīng)網(wǎng)絡(luò)的訓(xùn)練目標(biāo)實際上就是最小化某個損失函數(shù)。損失函數(shù) L(yp,yt) 表示 yp 模型的輸出值與 yt 數(shù)據(jù)標(biāo)簽的實際值之間的差異程度。
為了降低損失函數(shù)的值,我們需要使用導(dǎo)數(shù)。反向傳播能幫助我們計算網(wǎng)絡(luò)每一層的導(dǎo)數(shù);诿恳粚由蠈(dǎo)數(shù)的值,優(yōu)化器(Adam、SGD、AdaDelta 等)可通過梯度下降來更新網(wǎng)絡(luò)的權(quán)重。
反向傳播會使用鏈?zhǔn)椒▌t機制或?qū)?shù)函數(shù),從最后一層到第一層計算每一層的梯度值。
問題6激活函數(shù)有什么含義?激活函數(shù)的飽和點是什么?
1. 激活函數(shù)的含義
激活函數(shù)的目的是突破神經(jīng)網(wǎng)絡(luò)的線性性質(zhì)。我們可以將這些函數(shù)簡單理解成是一種過濾器,作用是決定信息是否可以通過神經(jīng)元。在神經(jīng)網(wǎng)絡(luò)訓(xùn)練期間,激活函數(shù)在調(diào)整導(dǎo)數(shù)斜率方面具有非常重要的作用。
相比于使用線性函數(shù),使用非線性激活函數(shù)能讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)更復(fù)雜的函數(shù)表征;但為了有效地使用它們,我們需要理解這些非線性函數(shù)的性質(zhì)。大多數(shù)激活函數(shù)都是連續(xù)可微的函數(shù)。
這些函數(shù)是連續(xù)函數(shù),也就是說如果輸入有較小的可微分的變化(在其定義域中的每個點上都有導(dǎo)數(shù)),那么輸出也會有較小的變化。當(dāng)然,如前面提到的那樣,導(dǎo)數(shù)的計算是非常重要的,而且決定了我們的神經(jīng)元是否可以訓(xùn)練。值得提及的幾種激活函數(shù)有 Sigmoid、Softmax 和 ReLU。
2. 激活函數(shù)的飽和范圍
Tanh、Sigmoid 和 ReLU 函數(shù)等非線性激活全都有飽和區(qū)間。
很容易理解,激活函數(shù)的飽和范圍就是當(dāng)輸入值變化時輸出值不再變化的區(qū)間。這個變化區(qū)間存在兩個問題。
第一個問題是在神經(jīng)網(wǎng)絡(luò)的前向方向上,落在激活函數(shù)的飽和范圍內(nèi)的層的值將會逐漸得到許多同樣的輸出值。這會導(dǎo)致整個模型出現(xiàn)同樣的數(shù)據(jù)流。這個現(xiàn)象被稱為協(xié)方差偏移(covariance shifting)。
第二個問題是在反向方向上,飽和范圍內(nèi)的導(dǎo)數(shù)為零,由此導(dǎo)致網(wǎng)絡(luò)幾乎無法再學(xué)習(xí)到任何東西。這就是我們在批歸一化問題中提到的要將值的范圍設(shè)定為零均值的原因。
問題7模型的超參數(shù)是什么?超參數(shù)與參數(shù)有何不同?
1. 模型參數(shù)是什么?
先稍微回顧一下機器學(xué)習(xí)的本質(zhì),要做機器學(xué)習(xí),我們需要有一個數(shù)據(jù)集。沒有數(shù)據(jù)我們怎么學(xué)習(xí)呢?一旦有了數(shù)據(jù),機器需要找到數(shù)據(jù)之間的關(guān)聯(lián)。
假設(shè)我們的數(shù)據(jù)是溫度和濕度等天氣信息,我們希望機器執(zhí)行的任務(wù)是找到這些因素與我們的愛人是否生氣之間的關(guān)聯(lián)。這聽起來似乎并無關(guān)聯(lián),但機器學(xué)習(xí)的待辦事項有時候確實很可笑,F(xiàn)在,我們用變量 y 表示我們的愛人是否生氣,變量 x_1、x_2、x_3……表示天氣元素。我們用下面的函數(shù) f(x) 表示這些變量之間的關(guān)系:
看到系數(shù) w_1、w_2、w_3 了嗎?這就代表了數(shù)據(jù)和結(jié)果之間的關(guān)系,這就是所謂的模型參數(shù)。因此,我們可以這樣定義「模型參數(shù)」:
模型參數(shù)是模型基于訓(xùn)練數(shù)據(jù)生成的值,有助于展示數(shù)據(jù)中數(shù)據(jù)量之間的關(guān)系。
所以當(dāng)我們說要為某問題找到最佳的模型時,我們的意思是要基于已有的數(shù)據(jù)集為該問題找到最合適的模型參數(shù)。模型參數(shù)有如下特性:
可用于預(yù)測新數(shù)據(jù);
能展現(xiàn)我們使用的模型的能力,通常通過準(zhǔn)確度等指標(biāo)表示;
是直接從訓(xùn)練數(shù)據(jù)集學(xué)習(xí)到的;
不是由人類人工設(shè)置的。
模型參數(shù)也有不同的形式,比如在神經(jīng)網(wǎng)絡(luò)中是權(quán)重、在支持向量機中是支持向量、在線性回歸和 logistic 回歸算法中是系數(shù)。
2. 什么是模型超參數(shù)?
可能有人認為模型超參數(shù)就是或者像是模型參數(shù),但事實并非如此。實際上這兩個概念是完全不同的。模型參數(shù)是從訓(xùn)練數(shù)據(jù)集建模的,而模型超參數(shù)卻完全不是這樣,其完全位于模型之外而且不依賴于訓(xùn)練數(shù)據(jù)。所以模型超參數(shù)的作用是什么?實際上它們有以下任務(wù):
在訓(xùn)練過程中使用,幫助模型尋找最合適的參數(shù);
通常是在模型設(shè)計時由人工選擇的;
可基于幾種啟發(fā)式策略來定義。
對于某個具體問題,我們完全不知道最佳的超參數(shù)模型是怎樣的。因此,實際上我們需要使用某些技術(shù)(比如網(wǎng)格搜索)來估計這些值的最佳范圍(比如, k 最近鄰模型中的 k 系數(shù))。下面是模型超參數(shù)的一些示例:
訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)時的學(xué)習(xí)率指數(shù);
訓(xùn)練支持向量機時的 C 和 σ 參數(shù);
k 最近鄰模型中的 k 系數(shù)。
問題8當(dāng)學(xué)習(xí)率過高或過低時會怎樣?
當(dāng)模型的學(xué)習(xí)率過低時,模型的訓(xùn)練速度會變得非常慢,因為其每次對權(quán)重的更新會變得非常小。模型將需要大量更新才能到達局部最優(yōu)點。
如果學(xué)習(xí)率過高,模型很可能無法收斂,因為權(quán)重的更新過大。在加權(quán)的步驟中,模型有可能無法實現(xiàn)局部優(yōu)化,然后使模型難以更新到最優(yōu)點(因為每步更新都跳得過遠,導(dǎo)致模型在局部最優(yōu)點附近搖擺)。
問題9當(dāng)輸入圖像的尺寸加倍時,CNN 參數(shù)的數(shù)量會增加多少倍?為什么?
對于參加面試的人來說,這個問題很有誤導(dǎo)性,因為大部分人思考這個問題的方向都是 CNN 的參數(shù)數(shù)量會增加多少倍。但是,我們看看 CNN 的架構(gòu):
可以看到,CNN 模型的參數(shù)數(shù)量取決于過濾器的數(shù)量和大小,而非輸入圖像。因此,將輸入圖像的尺寸加倍不會改變模型的參數(shù)數(shù)量。
問題10處理數(shù)據(jù)不平衡問題的方法有哪些?
這個問題檢驗的是面試者是否知道處理有真實數(shù)據(jù)的問題的方法。通常來說,實際數(shù)據(jù)和樣本數(shù)據(jù)(無需調(diào)整的標(biāo)準(zhǔn)數(shù)據(jù)集)在性質(zhì)和數(shù)據(jù)量上都有很大的不同。使用真實數(shù)據(jù)集時,數(shù)據(jù)有可能是不平衡的,也就是說不同類別的數(shù)據(jù)不平衡。針對這個問題,我們可以考慮使用以下技術(shù):
為模型的評估選擇適當(dāng)?shù)闹笜?biāo):當(dāng)使用的數(shù)據(jù)集不平衡時,使用準(zhǔn)確度來進行評估是很不合適的(前面已經(jīng)提到過),而應(yīng)該選擇精確度、召回率、F1 分數(shù)、AUC 等評估指標(biāo)。
對訓(xùn)練數(shù)據(jù)集進行重新采樣:除了使用不同的評估指標(biāo)外,人們還可以通過某些技術(shù)來獲得不同的數(shù)據(jù)集;诓黄胶獾臄(shù)據(jù)集創(chuàng)建平衡的數(shù)據(jù)集的方法有兩種:欠采樣和過采樣,具體技術(shù)包括重復(fù)、自舉或 SMOTE(合成少數(shù)過采樣技術(shù))。
集成多個不同模型:通過創(chuàng)建更多數(shù)據(jù)來實現(xiàn)模型的通用性在實踐中是不可取的。舉個例子,假設(shè)你有兩個類別:一個有 1000 個數(shù)據(jù)樣本的罕見類別以及一個有 10000 個數(shù)據(jù)樣本的常見類別。我們可以不必努力為罕見類別尋找 9000 個數(shù)據(jù)樣本來進行模型訓(xùn)練,而是可以采用一種 10 個模型的訓(xùn)練方案。其中每個模型都使用 1000 個罕見數(shù)據(jù)樣本和 1000 個常見數(shù)據(jù)樣本進行訓(xùn)練。然后使用集成技術(shù)得到最佳結(jié)果。
重新設(shè)計模型——成本函數(shù):在成本函數(shù)中使用懲罰技術(shù)來嚴(yán)厲懲罰數(shù)據(jù)豐富的類別,以幫助模型自身更好地學(xué)習(xí)罕見類別的數(shù)據(jù)。這能使損失函數(shù)的值更全面地覆蓋所有類別。
問題11在訓(xùn)練深度學(xué)習(xí)模型時,epoch、batch(批)和 iteration(迭代)這些概念都是什么意思?
這些是訓(xùn)練神經(jīng)網(wǎng)絡(luò)時非;镜母拍,但實際上很多面試者在區(qū)分這些概念時常常搞混淆。具體來說,你應(yīng)該這樣回答:
epoch:代表在整個數(shù)據(jù)集上的一次迭代(所有一切都包含在訓(xùn)練模型中);
batch:是指當(dāng)我們無法一次性將整個數(shù)據(jù)集輸入神經(jīng)網(wǎng)絡(luò)時,將數(shù)據(jù)集分割成的一些更小的數(shù)據(jù)集批次;
iteration:是指運行一個 epoch 所需的 batch 數(shù)。舉個例子,如果我們的數(shù)據(jù)集包含 10000 張圖像,批大。╞atch_size)是 200,則一個 epoch 就包含 50 次迭代(10000 除以 200)。
問題12數(shù)據(jù)生成器的概念是什么?使用數(shù)據(jù)生成器需要什么?
生成函數(shù)在編程中也非常重要。數(shù)據(jù)生成函數(shù)可幫助我們在每個訓(xùn)練 batch 中生成能直接擬合模型的數(shù)據(jù)。
使用生成函數(shù)在訓(xùn)練大數(shù)據(jù)時大有助益。因此數(shù)據(jù)集并不是需要全部都載入 RAM,這是浪費內(nèi)存;此外,如果數(shù)據(jù)集過大,還可能導(dǎo)致內(nèi)存溢出,對輸入數(shù)據(jù)的處理時間也會變得更長。