1.神經網絡
1.1各個激活函數的優缺點?

1.2為什么ReLU常用于神經網絡的激活函數?
1.在前向傳播和反向傳播過程中,ReLU相比于Sigmoid等激活函數計算量小;
2.避免梯度消失問題。對于深層網絡,Sigmoid函數反向傳播時,很容易就會出現梯度消失問題(在Sigmoid接近飽和區時,變換太緩慢,導數趨于0,這種情況會造成信息丟失),從而無法完成深層網絡的訓練。3.可以緩解過擬合問題的發生。Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,并且減少了參數的相互依存關系,緩解了過擬合問題的發生。
4.相比Sigmoid型函數,ReLU函數有助于隨機梯度下降方法收斂。為什么需要激活功能?
激活函數是用來加入非線性因素的,因為線性模型的表達能力不夠。
1.3 梯度消失和梯度爆炸的解決方案?梯度爆炸引發的問題?
梯度消失:靠近輸出層的hidden layer 梯度大,參數更新快,所以很快就會收斂;而靠近輸入層的hidden layer 梯度小,參數更新慢,幾乎就和初始狀態一樣,隨機分布。
另一種解釋:當反向傳播進行很多層的時候,由于每一層都對前一層梯度乘以了一個小數,因此越往前
傳遞,梯度就會越小,訓練越慢。
梯度爆炸:前面layer的梯度通過訓練變大,而后面layer的梯度指數級增大。
①在深度多層感知機(MLP)網絡中,梯度爆炸會引起網絡不穩定,最好的結果是無法從訓練數據中學習,而最壞的結果是出現無法再更新的 NaN 權重值。
②在RNN中,梯度爆炸會導致網絡不穩定,無法利用訓練數據學習,最好的結果是網絡無法學習長的輸入序列數據。

1.4如何確定是否出現梯度爆炸?
模型不穩定,導致更新過程中的損失出現顯著變化;
訓練過程中模型梯度快速變大;
訓練過程中模型權重變成 NaN 值;
訓練過程中,每個節點和層的誤差梯度值持續超過 1.0。
1.5神經網絡中有哪些正則化技術?
L2正則化(Ridge); L1正則化(Lasso);
權重衰減; 丟棄法;
批量歸一化; 數據增強
早停法
?
1.6批量歸一化(BN) 如何實現?作用?
實現過程: 計算訓練階段mini_batch數量激活函數前結果的均值和方差,然后對其進行歸一化,最后對其進行縮放和平移。
作用:
1.可以使用更高的學習率進行優化;
2.移除或使用較低的 dropout;
3.降低L2權重衰減系數;
4.調整了數據的分布,不考慮激活函數,它讓每一層的輸出歸一化到了均值為0方差為1的分布,這保證了梯度的有效性,可以解決反向傳播過程中的梯度問題。
1.7神經網絡中權值共享的理解?
權值共享這個詞是由LeNet5 模型提出來的。以CNN為例,在對一張圖偏進行卷積的過程中,使用的是同一個卷積核的參數。
比如一個3×3×1的卷積核,這個卷積核內9個的參數被整張圖共享,而不會因為圖像內位置的不同而改變卷積核內的權系數。
通俗說:就是用一個卷積核不改變其內權系數的情況下卷積處理整張圖片。
1.8 對fine-tuning(微調模型)的理解?為什么要修改最后幾層神經網絡權值?
使用預訓練模型的好處:在于利用訓練好的SOTA模型權重去做特征提取,可以節省我們訓練模型和調參的時間。
理由:
1.CNN中更靠近底部的層(定義模型時先添加到模型中的層)編碼的是更加通用的可復用特征,而更靠近頂部的層(最后添加到模型中的層)編碼的是更專業化的特征。微調這些更專業化的特征更加有用,它更代表了新數據集上的有用特征。
2.訓練的參數越多,過擬合的風險越大。很多SOTA模型擁有超過千萬的參數,在一個不大的數據集上訓練這么多參數是有過擬合風險的,除非你的數據集像Imagenet那樣大。
1.9 什么是Dropout?為什么有用?它是如何工作的?
背景:如果模型的參數太多,數據量又太小,則容易產生過擬合。為了解決過擬合,就同時訓練多個網絡。然后多個網絡取均值。費時!
介紹:Dropout可以防止過擬合,在前向傳播的時候,讓某個神經元的激活值以一定的概率 P停止工作,這樣可以使模型的泛化性更強。
Dropout效果跟bagging 效果類似(bagging是減少方差variance,而boosting是減少偏差bias)。加入dropout會使神經網絡訓練時間長,模型預測時不需要dropout,記得關掉。?
具體流程:
i.隨機刪除(臨時)網絡中一定的隱藏神經元,輸入輸出保持不變,
ii.讓輸入通過修改后的網絡。然后把得到的損失同時修改后的網絡進行反向傳播。在未刪除的神經元上面進行參數更新
iii.重復該過程(恢復之前刪除掉的神經元,以一定概率刪除其他神經元。前向傳播、反向傳播更新參數)
1.10如何選擇dropout 的概率?
input 的 dropout 概率推薦是 0.8, hidden layer 推薦是0.5
為什么dropout可以解決過擬合?
1.取平均的作用:
Dropout產生了許多子結構之后的操作,父神經網絡有N個節點,加入Dropout之后可以看做在權值不變的情況下(參數共享)將模型數量擴增到指數級別
2.減少神經元之間復雜的共適應關系,迫使網絡去學習更加魯棒;Dropout 在訓練和測試的區別?
訓練時隨機刪除一些神經元,在測試模型時將所有的神經元加入。
1.11什么是Adam?Adam和SGD之間的主要區別是什么?
1.12一階優化和二階優化的方法有哪些?為什么不使用二階優化?
一階優化方法有:
SGD -> SGDM ->NAG -> AdaGrad -> AdaDelta / RMSProp(加速梯度下降) -> Adam -> Nadam二階優化
定義:對目標函數進行二階泰勒展開,也就是二階梯度優化方法
牛頓法 + BFGS法
利用二階泰勒展開,即牛頓法需要計算Hessian矩陣的逆,計算量大,在深度學習中并不常用。因此一般使用的是一階梯度優化。

1.12為什么Momentum可以加速訓練?
動量其實累加了歷史梯度更新方向,所以在每次更新時,要是當前時刻的梯度與歷史時刻梯度方向相似,這種趨勢在當前時刻則會加強;要是不同,則當前時刻的梯度方向減弱。動量方法限制了梯度更新方向的隨機性,使其沿正確方向進行。
1.13什么時候使用Adam和SGD??
Adam等自適應學習率算法對于稀疏數據具有優勢,且收斂速度很快;但精調參數的SGD(+Momentum)往往能夠取得更好的最終結果Adam+SGD 組合策略:先用Adam快速下降,再用SGD調優。
如果模型是非常稀疏的,那么優先考慮自適應學習率的算法;
在模型設計實驗過程中,要快速驗證新模型的效果,用Adam進行快速實驗優化;在模型上線或者結果發布前,可以用精調的SGD進行模型的極致優化。
1.14 batch size和epoch的平衡

1.15 SGD每步做什么,為什么能online learning?
online learning強調的是學習是實時的,流式的,每次訓練不用使用全部樣本,而是以之前訓練好的模型為基礎,每來一個樣本就更新一次模型,這種方法叫做OGD(online gradient descent),目的是快速地進行模型的更新,提升模型時效性。而SGD的思想正是在線學習的思想。
1.16學習率太大(太小)時會發生什么?如何設置學習率??
1.基于經驗的手動調整
通過嘗試不同的固定學習率,如3、1、0.5、0.1、0.05、0.01、0.005,0.0001等,觀察迭代次數和loss的變化關系,找到loss下降最快關系對應的學習率。
太小,收斂過程將變得十分緩慢;
太大,梯度可能會在最小值附近來回震蕩(loss爆炸),甚至可能無法收斂。
2. 基于策略的調整
①fixed 、exponential、polynomial
②自適應動態調整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd
Logit:對它取對數。

1.17神經網絡為什么不用擬牛頓法而是用梯度下降?

牛頓法原理:使用函數f(x)的泰勒級數的前面幾項來尋找方程f(x)= 0的根。
1.18 BN和Dropout在訓練和測試時的差別?
BN:
訓練時:是對每一個batch的訓練數據進行歸一化,也即是用每一批數據的均值和方差。
測試時:都是對單個樣本進行測試。這個時候的均值和方差是全部訓練數據的均值和方差,這兩個數值
是通過移動平均法求得。
當一個模型訓練完成之后,它的所有參數都確定了,包括均值和方差,gamma和bata。
Dropout:只有在訓練的時候才采用,是為了減少神經元對部分上層神經元的依賴,類似將多個不同網絡結構的模型集成起來,減少過擬合的風險。
1.19若網絡初始化為0的話有什么問題?
w初始化全為0,很可能直接導致模型失效,無法收斂。
1.20 sigmoid和softmax的區別?softmax的公式?


1.21改進的softmax損失函數有哪些?
1.Large Margin Softmax Loss (L-Softmax)
加了一個margin,要保證大于某一個閾值。這樣可以盡量實現讓類間間距更大化,類內距離更小。
2.Center Loss
通過將特征和特征中心的距離和softmax loss一同作為損失函數,使得類內距離更小,有點L1,L2正則化。
1.22深度學習調參有哪些技巧?
1.準備數據
1.1 保證有大量、高質量并且帶有干凈標簽的數據;
1.2 樣本要隨機化,防止大數據淹沒小數據;
1.3 樣本要做歸一化.
2.預處理:0均值和1方差化