前幾天看到一份深度學習面試題狼纬,抽空做個解答疗琉,溫故而知新盈简。
解答多來自網(wǎng)絡,后文附上了鏈接香浩。
深度學習
模型評估方法
Accuracy的局限
當正負樣本極度不均衡時存在問題邻吭!比如镜盯,正樣本有99%時速缆,分類器只要將所有樣本劃分為正樣本就可以達到99%的準確率艺糜。但顯然這個分類器是存在問題的破停。
當正負樣本不均衡時真慢,常用的評價指標為ROC曲線和PR曲線黑界。
ROC(receiver operating characteristic)曲線
ROC接受者操作特征曲線朗鸠,其顯示的是分類器的TPR和FPR之間的關系烛占,如下圖所示:
常用于二分類問題中的模型比較。具體方法是在不同的分類閾值 (threshold) 設定下分別以TPR和FPR為縱芽卿、橫軸作圖蹬竖。曲線越靠近左上角流酬,意味著越多的正例優(yōu)先于負例芽腾,模型的整體表現(xiàn)也就越好。
優(yōu)點
- 兼顧正例和負例的權衡阴绢。因為TPR聚焦于正例呻袭,F(xiàn)PR聚焦于與負例左电,使其成為一個比較均衡的評估方法篓足。
- ROC曲線選用的兩個指標栈拖, TPR和FPR涩哟,都不依賴于具體的類別分布染簇。
缺點
- ROC曲線的優(yōu)點是不會隨著類別分布的改變而改變锻弓,但這在某種程度上也是其缺點青灼。因為負例N增加了很多杂拨,而曲線卻沒變弹沽,這等于產(chǎn)生了大量FP炸渡。像信息檢索中如果主要關心正例的預測準確性的話蚌堵,這就不可接受了吼畏。
- 在類別不平衡的背景下嘁灯,負例的數(shù)目眾多致使FPR的增長不明顯丑婿,導致ROC曲線呈現(xiàn)一個過分樂觀的效果估計。ROC曲線的橫軸采用FPR毅贮,根據(jù)公式 滩褥,當負例N的數(shù)量遠超正例P時瑰煎,F(xiàn)P的大幅增長只能換來FPR的微小改變酒甸。結(jié)果是雖然大量負例被錯判成正例插勤,在ROC曲線上卻無法直觀地看出來玩裙。(當然也可以只分析ROC曲線左邊一小段)
PR(Precision - Recall)曲線
PR曲線與ROC曲線的相同點是都采用了TPR (Recall),都可以用AUC來衡量分類器的效果枉圃。不同點是ROC曲線使用了FPR虐块,而PR曲線使用了Precision,因此PR曲線的兩個指標都聚焦于正例哩牍。類別不平衡問題中由于主要關心正例姐叁,所以在此情況下PR曲線被廣泛認為優(yōu)于ROC曲線洗显。
使用場景
- ROC曲線由于兼顧正例與負例,所以適用于評估分類器的整體性能玄组,相比而言PR曲線完全聚焦于正例俄讹。
- 如果有多份數(shù)據(jù)且存在不同的類別分布患膛,比如信用卡欺詐問題中每個月正例和負例的比例可能都不相同踪蹬,這時候如果只想單純地比較分類器的性能且剔除類別分布改變的影響跃捣,則ROC曲線比較適合疚漆,因為類別分布改變可能使得PR曲線發(fā)生變化時好時壞娶聘,這種時候難以進行模型比較趴荸;反之发钝,如果想測試不同類別分布下對分類器的性能的影響,則PR曲線比較適合涛碑。
- 如果想要評估在相同的類別分布下正例的預測情況蒲障,則宜選PR曲線揉阎。
- 類別不平衡問題中毙籽,ROC曲線通常會給出一個樂觀的效果估計坑赡,所以大部分時候還是PR曲線更好毅否。
- 最后可以根據(jù)具體的應用螟加,在曲線上找到最優(yōu)的點仰迁,得到相對應的precision徐许,recall雌隅,f1 score等指標恰起,去調(diào)整模型的閾值检盼,從而得到一個符合具體應用的模型吨枉。
AUC(Area Under the Curve)
可解讀為:從所有正例中隨機選取一個樣本A貌亭,再從所有負例中隨機選取一個樣本B圃庭,分類器將A判為正例的概率比將B判為正例的概率大的可能性剧腻。
所以根據(jù)定義:我們最直觀的有兩種計算AUC的方法
繪制ROC曲線恕酸,ROC曲線下面的面積就是AUC的值
假設總共有(m+n)個樣本蕊温,其中正樣本m個遏乔,負樣本n個盟萨,總共有mn個樣本對捻激,計數(shù),正樣本預測為正樣本的概率值大于負樣本預測為正樣本的概率值記為1垃杖,累加計數(shù)调俘,然后除以(mn)就是AUC的值
編程實現(xiàn)AUC的計算彩库,并指出復雜度骇钦?
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和相應的AUC
排序復雜度:O(log2(P+N))
計算AUC的復雜度:O(P+N)
AUC指標有什么特點?放縮結(jié)果對AUC是否有影響鳍烁?(待解答)
余弦距離與歐式距離有什么特點幔荒?
余弦距離
余弦距離爹梁,也稱為余弦相似度姚垃,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量积糯。如果兩個向量的方向一致看成,即夾角接近零川慌,那么這兩個向量就相近梦重。
歐式距離
余弦距離使用兩個向量夾角的余弦值作為衡量兩個個體間差異的大小琴拧。相比歐氏距離艾蓝,余弦距離更加注重兩個向量在方向上的差異赢织。
當對向量進行歸一化后于置,歐式距離與余弦距離一致八毯。
基本方法
如何劃分訓練集?如何選取驗證集讶踪?
- 通常80%為訓練集乳讥,20%為測試集
- 當數(shù)據(jù)量較小時(萬級別及以下)的時候?qū)⒂柧毤剖Ⅱ炞C集以及測試集劃分為6:2:2研乒;若是數(shù)據(jù)很大雹熬,可以將訓練集橄唬、驗證集仰楚、測試集比例調(diào)整為98:1:1
- 當數(shù)據(jù)量很小時僧界,可以采用K折交叉驗證
- 劃分數(shù)據(jù)集時可采用隨機劃分法(當樣本比較均衡時)捂襟,分層采樣法(當樣本分布極度不均衡時)
隨機采樣
import numpy as np
def split_train_test(data,test_ratio):
#設置隨機數(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ù)序列中所對應的行
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")
什么是偏差和方差?
- 偏差:描述預測值的期望與真實值之間的差別扒吁,偏差越大說明模型的預測結(jié)果越差雕崩。
- 方差:描述預測值的變化范圍。方差越大說明模型的預測越不穩(wěn)定粗蔚。
- 高方差過擬合支鸡,高偏差欠擬合牧挣。
- 常用交叉驗證來權衡模型的方差和偏差瀑构。
- 也可以比較均方誤差
img
什么是過擬合?深度學習解決過擬合的方法有哪些呻征?
過擬合是指模型擬合了訓練樣本中的噪聲罢浇,導致泛化能力差嚷闭。
解決方法如下:
- 增加訓練數(shù)據(jù)
- 縮減模型表達能力
- Dropout
- 訓練時提前終止
- 集成多種模型
解決欠擬合的方法有哪些灾锯?
- 增加模型復雜度
- 調(diào)整模型初始化方式
- 調(diào)整學習率
- 集成多種模型
深度模型參數(shù)調(diào)整的一般方法論顺饮?
- 學習率:遵循小->大->小原則
- 初始化:選擇合適的初始化方式兼雄,有預訓練模型更好
- 優(yōu)化器選擇:adam比較快君旦,sgd較慢
- loss:回歸問題選L2 loss金砍,分類問題選交叉熵
- 可視化
- 從小數(shù)據(jù)大模型入手琅绅,先過擬合千扶,再增加數(shù)據(jù)并根據(jù)需要調(diào)整模型復雜度
本節(jié)參考
- https://zhuanlan.zhihu.com/p/34655990
- https://www.zhihu.com/question/19640394
- https://zhuanlan.zhihu.com/p/48976706
- https://www.zhihu.com/question/20448464
- https://www.zhihu.com/question/59201590
- https://zhuanlan.zhihu.com/p/29707029
- https://www.zhihu.com/question/25097993
優(yōu)化方法
簡述了解的優(yōu)化器澎羞,發(fā)展綜述?
深度學習優(yōu)化算法經(jīng)歷了 SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam 這樣的發(fā)展歷程枫攀。
優(yōu)化算法框架
首先定義:待優(yōu)化參數(shù):w括饶,目標函數(shù):f(w),初始學習率来涨。
而后图焰,開始進行迭代優(yōu)化。在每個epoch t :
- 計算目標函數(shù)關于當前參數(shù)的梯度:
- 根據(jù)歷史梯度計算一階動量和二階動量:
- 計算當前時刻的下降梯度:
- 根據(jù)下降梯度進行更新:
- SGD:沒有動量的概念
- SGDM:加入一階動量
- NAG:加入牛頓加速
- AdaGrad:加入二階動量
- AdaDelta:
- Adam: 加入SGDM的一階動量和AdaDelta二階動量
- NAdam:Adam加上牛頓加速
SGD
- 下降速度慢技羔,而且可能會在溝壑的兩邊持續(xù)震蕩,停留在一個局部最優(yōu)點
- 精調(diào)參數(shù)笤闯,往往能取得更好的效果
Adam
- 收斂速度快
- 可能在訓練后期引起學習率的震蕩,導致模型無法收斂
- 自適應學習率算法可能會對前期出現(xiàn)的特征過擬合,后期才出現(xiàn)的特征很難糾正前期的擬合效果晶默,可能錯過全局最優(yōu)解
常用的損失函數(shù)有哪些?分別適用于什么場景?
均方誤差(MSE)是最常用的回歸損失函數(shù)拍冠,計算方法是求預測值與真實值之間的距離的平方和。
平均絕對值誤差(MAE)是目標值和預測值之差的絕對值之和。
MSE計算簡便,但MAE對異常點具有更好的魯棒性。
Huber損失仇让,平滑的絕對平均誤差踊淳,對異常點沒有平方誤差那么敏感剪芥。本質(zhì)上是絕對誤差榜田。
Log-Cosh損失邦鲫,預測誤差的雙曲余弦對數(shù)。基本類似與均方誤差你画,同時不易受異常點影響适滓。
嗅绸。
在x較小時約等于
瞧柔,在x較大時約等于
。
分位損失糙箍,更關注預測區(qū)間而不僅僅是預測點咕晋。當
值小于0.5時坪哄,對高估的懲罰更大念祭,使得預測值略低于中值。
梯度下降與擬牛頓法的異同蜒什?
- 參數(shù)更新模式相同
- 梯度下降法利用誤差的梯度來更新參數(shù)钞瀑,擬牛頓法利用海塞矩陣的近似來更新參數(shù)
- 梯度下降是泰勒級數(shù)的一階展開缠俺,而擬牛頓法是泰勒級數(shù)的二階展開
- SGD能保證收斂唯笙,但是L-BFGS在非凸時不收斂
L1和L2正則分別有什么特點?為何L1稀疏鞋拟?
P-norm:
將向量投影到[0,)范圍內(nèi),其中只有0向量的norm取到0
p=1為L1-norm澄成,p=2為L2-norm列赎,用作正則項則對應為L1正則,L2正則
L1對異常值更魯棒
L1在0點不可導感耙,計算不方便
L1沒有唯一解
L1輸出稀疏,會把不重要的特征直接置零
L2計算方便
L2對異常值敏感
-
L2有唯一解
img
在梯度更新時,不管 L1 的大小是多少(只要不是0)梯度都是1或者-1逗堵,所以每次更新時,它都是穩(wěn)步向0前進。從而導致L1輸出稀疏。
本節(jié)參考:
深度學習基礎
以一層隱層的神經(jīng)網(wǎng)絡,relu激活,MSE作為損失函數(shù)推導反向傳播
http://galaxy.agh.edu.pl/%7Evlsi/AI/backp_t_en/backprop.html
https://blog.csdn.net/login_sonata/article/details/76737482
NN的權重參數(shù)能否初始化為0疮鲫?
不能默责,可能導致模型無法收斂
什么是梯度消失和梯度爆炸?
https://cloud.tencent.com/developer/article/1374163
常用的激活函數(shù)皮仁,導數(shù)?
sigmoid
tanh
ReLu
leaky ReLu
https://zhuanlan.zhihu.com/p/39673127
relu的有優(yōu)點谈宛?又有什么局限性?他們的系列改進方法是啥共啃?
- 部分解決了梯度消失問題
- 收斂速度更快
- 在小于0部分相當于神經(jīng)元死亡而且不會復活
- Leaky ReLU解決了神經(jīng)元死亡問題
https://zhuanlan.zhihu.com/p/31742800
sigmoid和tanh為什么會導致梯度消失赶站?
一個隱層需要多少節(jié)點能實現(xiàn)包含n元輸入的任意布爾函數(shù)位迂?
https://zhuanlan.zhihu.com/p/32579088
多個隱層實現(xiàn)包含n元輸入的任意布爾函數(shù)锣杂,需要多少節(jié)點和網(wǎng)絡層播聪?
dropout為何能防止過擬合?
- 相當于同時訓練了多個網(wǎng)絡猿推,類似集成學習的效果
- 削弱了神經(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
給定卷積核的尺寸叉弦,特征圖大小計算方法?
網(wǎng)絡容量計算方法(待解答)
共享參數(shù)有什么優(yōu)點
- 削減參數(shù)量,壓縮模型復雜度
- 實現(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
背景:當模型深度增加到某個程度后捏题,在增加深度,模型效果可能不升反降肉渴,出現(xiàn)退化現(xiàn)象公荧。(不是過擬合也不是梯度爆炸或消失)
核心理論:恒等映射
空洞卷積是什么?有什么應用場景同规?
https://www.zhihu.com/question/54149221
在卷積圖上注入空洞循狰,增加感受野窟社。注入空洞的數(shù)量由dilation rate確定。常規(guī)卷積的dilation rate為1绪钥。
多尺度檢測灿里,利于檢測出小物體
語義分割中常用dilation rate。但是人像分割中無用程腹,應該就是我們的應用場景沒有特別小的物體匣吊。