深度學(xué)習(xí)面試題解答(持續(xù)更新)

前幾天看到一份深度學(xué)習(xí)面試題,抽空做個解答,溫故而知新。
解答多來自網(wǎng)絡(luò),后文附上了鏈接。

深度學(xué)習(xí)

模型評估方法

Accuracy的局限

Accuracy=\frac{N_{correct}}{N_{total}}

當(dāng)正負樣本極度不均衡時存在問題!比如,正樣本有99%時,分類器只要將所有樣本劃分為正樣本就可以達到99%的準(zhǔn)確率。但顯然這個分類器是存在問題的。

當(dāng)正負樣本不均衡時,常用的評價指標(biāo)為ROC曲線和PR曲線。

ROC(receiver operating characteristic)曲線

ROC接受者操作特征曲線,其顯示的是分類器的TPR和FPR之間的關(guān)系,如下圖所示:


img

TPR=\frac{TP}{P}=\frac{TP}{TP+FN}

FPR=\frac{FP}{N}=\frac{FP}{FP+TN}

常用于二分類問題中的模型比較。具體方法是在不同的分類閾值 (threshold) 設(shè)定下分別以TPR和FPR為縱、橫軸作圖。曲線越靠近左上角,意味著越多的正例優(yōu)先于負例,模型的整體表現(xiàn)也就越好。

優(yōu)點

  • 兼顧正例和負例的權(quán)衡。因為TPR聚焦于正例,F(xiàn)PR聚焦于與負例,使其成為一個比較均衡的評估方法。
  • ROC曲線選用的兩個指標(biāo), TPR和FPR,都不依賴于具體的類別分布。

缺點

  • ROC曲線的優(yōu)點是不會隨著類別分布的改變而改變,但這在某種程度上也是其缺點。因為負例N增加了很多,而曲線卻沒變,這等于產(chǎn)生了大量FP。像信息檢索中如果主要關(guān)心正例的預(yù)測準(zhǔn)確性的話,這就不可接受了。
  • 在類別不平衡的背景下,負例的數(shù)目眾多致使FPR的增長不明顯,導(dǎo)致ROC曲線呈現(xiàn)一個過分樂觀的效果估計。ROC曲線的橫軸采用FPR,根據(jù)公式 ,當(dāng)負例N的數(shù)量遠超正例P時,F(xiàn)P的大幅增長只能換來FPR的微小改變。結(jié)果是雖然大量負例被錯判成正例,在ROC曲線上卻無法直觀地看出來。(當(dāng)然也可以只分析ROC曲線左邊一小段)

PR(Precision - Recall)曲線

PR曲線與ROC曲線的相同點是都采用了TPR (Recall),都可以用AUC來衡量分類器的效果。不同點是ROC曲線使用了FPR,而PR曲線使用了Precision,因此PR曲線的兩個指標(biāo)都聚焦于正例。類別不平衡問題中由于主要關(guān)心正例,所以在此情況下PR曲線被廣泛認為優(yōu)于ROC曲線。

recall=\frac{TP}{TP+FN}

precision=\frac{TP}{TP+FP}

img

使用場景

  • ROC曲線由于兼顧正例與負例,所以適用于評估分類器的整體性能,相比而言PR曲線完全聚焦于正例。
  • 如果有多份數(shù)據(jù)且存在不同的類別分布,比如信用卡欺詐問題中每個月正例和負例的比例可能都不相同,這時候如果只想單純地比較分類器的性能且剔除類別分布改變的影響,則ROC曲線比較適合,因為類別分布改變可能使得PR曲線發(fā)生變化時好時壞,這種時候難以進行模型比較;反之,如果想測試不同類別分布下對分類器的性能的影響,則PR曲線比較適合。
  • 如果想要評估在相同的類別分布下正例的預(yù)測情況,則宜選PR曲線。
  • 類別不平衡問題中,ROC曲線通常會給出一個樂觀的效果估計,所以大部分時候還是PR曲線更好。
  • 最后可以根據(jù)具體的應(yīng)用,在曲線上找到最優(yōu)的點,得到相對應(yīng)的precision,recall,f1 score等指標(biāo),去調(diào)整模型的閾值,從而得到一個符合具體應(yīng)用的模型。

F1=\frac{2TP}{2TP+FN+FP}=\frac{2?Precision?Recall}{Precision+Recall}

AUC(Area Under the Curve)

可解讀為:從所有正例中隨機選取一個樣本A,再從所有負例中隨機選取一個樣本B,分類器將A判為正例的概率比將B判為正例的概率大的可能性。

所以根據(jù)定義:我們最直觀的有兩種計算AUC的方法

  1. 繪制ROC曲線,ROC曲線下面的面積就是AUC的值

  2. 假設(shè)總共有(m+n)個樣本,其中正樣本m個,負樣本n個,總共有mn個樣本對,計數(shù),正樣本預(yù)測為正樣本的概率值大于負樣本預(yù)測為正樣本的概率值記為1,累加計數(shù),然后除以(mn)就是AUC的值

編程實現(xiàn)AUC的計算,并指出復(fù)雜度?

def get_roc(pos_prob,y_true):
    pos = y_true[y_true==1]
    neg = y_true[y_true==0]
    threshold = np.sort(pos_prob)[::-1]        # 按概率大小逆序排列
    y = y_true[pos_prob.argsort()[::-1]]
    tpr_all = [0] ; fpr_all = [0]
    tpr = 0 ; fpr = 0
    x_step = 1/float(len(neg))
    y_step = 1/float(len(pos))
    y_sum = 0                                  # 用于計算AUC
    for i in range(len(threshold)):
        if y[i] == 1:
            tpr += y_step
            tpr_all.append(tpr)
            fpr_all.append(fpr)
        else:
            fpr += x_step
            fpr_all.append(fpr)
            tpr_all.append(tpr)
            y_sum += tpr
    return tpr_all,fpr_all,y_sum*x_step         # 獲得總體TPR,F(xiàn)PR和相應(yīng)的AUC

排序復(fù)雜度:O(log2(P+N))

計算AUC的復(fù)雜度:O(P+N)

AUC指標(biāo)有什么特點?放縮結(jié)果對AUC是否有影響?(待解答)

余弦距離與歐式距離有什么特點?

余弦距離

余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。如果兩個向量的方向一致,即夾角接近零,那么這兩個向量就相近。

cos\theta=\frac{<x,y>}{\left \| x \right \|.\left \| y \right \|}

歐式距離

d(x,y)=\sqrt{\sum_{i=0}^{N}(x_{i}-y_{i})^2}

余弦距離使用兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比歐氏距離,余弦距離更加注重兩個向量在方向上的差異。

當(dāng)對向量進行歸一化后,歐式距離與余弦距離一致。

euc=\sqrt{2-2.cos\theta}

基本方法

如何劃分訓(xùn)練集?如何選取驗證集?

  • 通常80%為訓(xùn)練集,20%為測試集
  • 當(dāng)數(shù)據(jù)量較小時(萬級別及以下)的時候?qū)⒂?xùn)練集、驗證集以及測試集劃分為6:2:2;若是數(shù)據(jù)很大,可以將訓(xùn)練集、驗證集、測試集比例調(diào)整為98:1:1
  • 當(dāng)數(shù)據(jù)量很小時,可以采用K折交叉驗證
  • 劃分數(shù)據(jù)集時可采用隨機劃分法(當(dāng)樣本比較均衡時),分層采樣法(當(dāng)樣本分布極度不均衡時)

隨機采樣

import numpy as np
def split_train_test(data,test_ratio):
    #設(shè)置隨機數(shù)種子,保證每次生成的結(jié)果都是一樣的
    np.random.seed(42)
    #permutation隨機生成0-len(data)隨機序列
    shuffled_indices = np.random.permutation(len(data))
    #test_ratio為測試集所占的半分比
    test_set_size = int(len(data)) * test_ratio
    test_indices = shuffled_indices[:test_ratio]
    train_indices = shuffled_indices[test_set_size:]
    #iloc選擇參數(shù)序列中所對應(yīng)的行
    return data.iloc[train_indices],data.iloc[test_indices]

#測試
train_set,test_set = split_train_test(data,0.2)
print(len(train_set), "train +", len(test_set), "test")

什么是偏差和方差?

  • 偏差:描述預(yù)測值的期望與真實值之間的差別,偏差越大說明模型的預(yù)測結(jié)果越差。
  • 方差:描述預(yù)測值的變化范圍。方差越大說明模型的預(yù)測越不穩(wěn)定。
  • 高方差過擬合,高偏差欠擬合。
  • 常用交叉驗證來權(quán)衡模型的方差和偏差。
  • 也可以比較均方誤差MSE=\mathbb{E}[(\hat \theta_{m}-\theta)^2]=Bias(\hat \theta_{m})^2+Var(\hat \theta_{m})
    img

什么是過擬合?深度學(xué)習(xí)解決過擬合的方法有哪些?

過擬合是指模型擬合了訓(xùn)練樣本中的噪聲,導(dǎo)致泛化能力差。

解決方法如下:

  • 增加訓(xùn)練數(shù)據(jù)
  • 縮減模型表達能力
  • Dropout
  • 訓(xùn)練時提前終止
  • 集成多種模型

解決欠擬合的方法有哪些?

  • 增加模型復(fù)雜度
  • 調(diào)整模型初始化方式
  • 調(diào)整學(xué)習(xí)率
  • 集成多種模型

深度模型參數(shù)調(diào)整的一般方法論?

  • 學(xué)習(xí)率:遵循小->大->小原則
  • 初始化:選擇合適的初始化方式,有預(yù)訓(xùn)練模型更好
  • 優(yōu)化器選擇:adam比較快,sgd較慢
  • loss:回歸問題選L2 loss,分類問題選交叉熵
  • 可視化
  • 從小數(shù)據(jù)大模型入手,先過擬合,再增加數(shù)據(jù)并根據(jù)需要調(diào)整模型復(fù)雜度

本節(jié)參考

優(yōu)化方法

簡述了解的優(yōu)化器,發(fā)展綜述?

深度學(xué)習(xí)優(yōu)化算法經(jīng)歷了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 這樣的發(fā)展歷程。

優(yōu)化算法框架

首先定義:待優(yōu)化參數(shù):w,目標(biāo)函數(shù):f(w),初始學(xué)習(xí)率\theta。

而后,開始進行迭代優(yōu)化。在每個epoch t :

  1. 計算目標(biāo)函數(shù)關(guān)于當(dāng)前參數(shù)的梯度: g_{t}=\bigtriangledown f(w_{t})
  2. 根據(jù)歷史梯度計算一階動量和二階動量:m_{t}=\phi(g_{1},g_{2},...gg_{t}),V_{t}=\varphi(g_{1},g_{2},...gg_{t})
  3. 計算當(dāng)前時刻的下降梯度: \eta_{t}=\alpha.\frac{m_{t}}{\sqrt{V_{t}}}
  4. 根據(jù)下降梯度進行更新: w_{t+1}=w_{t}-\eta_{t}
  • SGD:沒有動量的概念
  • SGDM:加入一階動量m_{t}=\beta_{1}.m_{t-1}+(1-\beta1).g_{t}
  • NAG:加入牛頓加速 g_{t}=\bigtriangledown f(w_{t}-\alpha.m_{t-1}/\sqrt{V_{t-1}})
  • AdaGrad:加入二階動量V_{t}=\sum_{t=1}^{t}g_{t}^2
  • AdaDelta:V_{t}=\beta_{2}.V_{t-1}+(1-\beta_{2})g_{t}^2
  • Adam: 加入SGDM的一階動量和AdaDelta二階動量
  • NAdam:Adam加上牛頓加速

SGD

  • 下降速度慢,而且可能會在溝壑的兩邊持續(xù)震蕩,停留在一個局部最優(yōu)點
  • 精調(diào)參數(shù),往往能取得更好的效果

Adam

  • 收斂速度快
  • 可能在訓(xùn)練后期引起學(xué)習(xí)率的震蕩,導(dǎo)致模型無法收斂
  • 自適應(yīng)學(xué)習(xí)率算法可能會對前期出現(xiàn)的特征過擬合,后期才出現(xiàn)的特征很難糾正前期的擬合效果,可能錯過全局最優(yōu)解

常用的損失函數(shù)有哪些?分別適用于什么場景?

img
  • 均方誤差(MSE)是最常用的回歸損失函數(shù),計算方法是求預(yù)測值與真實值之間的距離的平方和。MSE=\sum_{i=1}^{n}(y_{i}-y_{i}^p)^2

  • 平均絕對值誤差(MAE)是目標(biāo)值和預(yù)測值之差的絕對值之和。MAE=\sum_{i=1}^{n}|y_{i}-y_{i}^{p}|

  • MSE計算簡便,但MAE對異常點具有更好的魯棒性。

  • Huber損失,平滑的絕對平均誤差,對異常點沒有平方誤差那么敏感。本質(zhì)上是絕對誤差。
    L_{\delta}(y,f(x)= \left\{\begin{matrix}\frac{1}{2}(y-f(x))^2 & for|y-f(x)|\leq\delta, & \\ \delta|y-f(x)|-\frac{1}{2}\delta^2 &otherwise \end{matrix}\right.

  • Log-Cosh損失,預(yù)測誤差的雙曲余弦對數(shù)?;绢愃婆c均方誤差,同時不易受異常點影響。L(y,y^p)=\sum_{i=1}^{n}log(cosh(y_{i}^p-y_{i})) 。log(cosh(x))在x較小時約等于(x^2)/2,在x較大時約等于abs(x)-log(2)

  • 分位損失,更關(guān)注預(yù)測區(qū)間而不僅僅是預(yù)測點。當(dāng)\gamma值小于0.5時,對高估的懲罰更大,使得預(yù)測值略低于中值。L_{\gamma}(y,y_{p})=\sum_{i:y_{i}<y{i}^p}(1-\gamma)|y_{i}-y_{i}^p|+\sum_{i:y_{i}\geq y_{i}^p}\gamma|y_{i}-y_{i}^p|

梯度下降與擬牛頓法的異同?

  • 參數(shù)更新模式相同
  • 梯度下降法利用誤差的梯度來更新參數(shù),擬牛頓法利用海塞矩陣的近似來更新參數(shù)
  • 梯度下降是泰勒級數(shù)的一階展開,而擬牛頓法是泰勒級數(shù)的二階展開
  • SGD能保證收斂,但是L-BFGS在非凸時不收斂

L1和L2正則分別有什么特點?為何L1稀疏?

  • P-norm:\left \|x \right \|_{p}:=(\sum_{i=1}^{n}|x_{i}|^p)^{\frac{1}{p}} 將向量投影到[0,)范圍內(nèi),其中只有0向量的norm取到0

  • p=1為L1-norm,p=2為L2-norm,用作正則項則對應(yīng)為L1正則,L2正則

  • L1對異常值更魯棒

  • L1在0點不可導(dǎo),計算不方便

  • L1沒有唯一解

  • L1輸出稀疏,會把不重要的特征直接置零

  • L2計算方便

  • L2對異常值敏感

  • L2有唯一解

    img

在梯度更新時,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1,所以每次更新時,它都是穩(wěn)步向0前進。從而導(dǎo)致L1輸出稀疏。

本節(jié)參考:

深度學(xué)習(xí)基礎(chǔ)

以一層隱層的神經(jīng)網(wǎng)絡(luò),relu激活,MSE作為損失函數(shù)推導(dǎo)反向傳播

http://galaxy.agh.edu.pl/%7Evlsi/AI/backp_t_en/backprop.html

https://blog.csdn.net/login_sonata/article/details/76737482

NN的權(quán)重參數(shù)能否初始化為0?

不能,可能導(dǎo)致模型無法收斂

什么是梯度消失和梯度爆炸?

https://cloud.tencent.com/developer/article/1374163

常用的激活函數(shù),導(dǎo)數(shù)?

sigmoid

sigmoid(x)=\frac{1}{1+e^{-x}}

{(sigmoid(x))}'=\frac {e^(-x)}{(1+e^{-x})^2}=sigmoid(x)(1-sigmoid(x))

tanh

tanh(x)=\frac{sinh(x)}{cosh(x)}=\frac{\frac{e^z-e^(-z)}{2}}{\frac{e^z+e^{-z}}{2}}=\frac{e^z-e^{-z}}{e^z+e^{-z}}

{(tanh(x))}'=1-tanh^{2}(x)

ReLu

f(x)=\left\{\begin{matrix}x & if&x\geq0 &\\ 0&if&x<0 \end{matrix}\right.

{f(x)}'=\left\{\begin{matrix}1 & if&x\geq0 &\\ 0&if&x<0 \end{matrix}\right.

leaky ReLu

f(x)=\left\{\begin{matrix}x & if&x\geq0 &\\ \lambda x&if&x<0 \end{matrix}\right.
{f(x)}'=\left\{\begin{matrix}1 & if&x\geq0 &\\ \lambda&if&x<0 \end{matrix}\right.
https://zhuanlan.zhihu.com/p/39673127

relu的有優(yōu)點?又有什么局限性?他們的系列改進方法是啥?

  • 部分解決了梯度消失問題
  • 收斂速度更快
  • 在小于0部分相當(dāng)于神經(jīng)元死亡而且不會復(fù)活
  • Leaky ReLU解決了神經(jīng)元死亡問題

https://zhuanlan.zhihu.com/p/31742800

sigmoid和tanh為什么會導(dǎo)致梯度消失?

sigmoid
tanh

一個隱層需要多少節(jié)點能實現(xiàn)包含n元輸入的任意布爾函數(shù)?

https://zhuanlan.zhihu.com/p/32579088

多個隱層實現(xiàn)包含n元輸入的任意布爾函數(shù),需要多少節(jié)點和網(wǎng)絡(luò)層?

dropout為何能防止過擬合?

  • 相當(dāng)于同時訓(xùn)練了多個網(wǎng)絡(luò),類似集成學(xué)習(xí)的效果
  • 削弱了神經(jīng)元之間的依賴性

dropout和BN 在前向傳播和反向傳播階段的區(qū)別?

drouput:

https://blog.csdn.net/oBrightLamp/article/details/84105097

BN:

https://blog.csdn.net/silent_crown/article/details/78121270

CNN

給定卷積核的尺寸,特征圖大小計算方法?

featuresize=\frac{(inputsize-ksize+2*padsize)}{stride}+1

網(wǎng)絡(luò)容量計算方法(待解答)

共享參數(shù)有什么優(yōu)點

  • 削減參數(shù)量,壓縮模型復(fù)雜度
  • 實現(xiàn)平移不變性

常用的池化操作有哪些?有什么特點?

  • 下采樣

  • 實現(xiàn)非線性

  • 擴大感受野

  • 實現(xiàn)不變性(平移、旋轉(zhuǎn)和尺度)

  • maxpooling:取最大值,加上index,在上采樣時可以盡量還原信息,比如deep matting的上采樣,必須用帶有index的,才能保證摳出頭發(fā)絲

  • averagepooling:取平均值,計算簡單

CNN如何用于文本分類?

https://zhuanlan.zhihu.com/p/28087321

resnet提出的背景和核心理論是?

https://www.zhihu.com/question/64494691

背景:當(dāng)模型深度增加到某個程度后,在增加深度,模型效果可能不升反降,出現(xiàn)退化現(xiàn)象。(不是過擬合也不是梯度爆炸或消失)

核心理論:恒等映射

空洞卷積是什么?有什么應(yīng)用場景?

https://www.zhihu.com/question/54149221

在卷積圖上注入空洞,增加感受野。注入空洞的數(shù)量由dilation rate確定。常規(guī)卷積的dilation rate為1。

多尺度檢測,利于檢測出小物體

語義分割中常用dilation rate。但是人像分割中無用,應(yīng)該就是我們的應(yīng)用場景沒有特別小的物體。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容