在此記錄下常見的深度學習面試問題。面試
softmax用於多分類過程當中,它將多個神經元的輸出,映射到(0,1)區間內,能夠當作機率來理解。softmax就是將原來輸出經過softmax函數一做用,就映射成爲(0,1)的值,而這些值的累和爲1(知足機率的性質),那麼咱們就能夠將它理解成機率,在最後選取輸出結點的時候,咱們就能夠選取機率最大(也就是值對應最大的)結點,做爲咱們的預測目標。
假設咱們有一個數組\(V\),\(V_i\)表示\(V\)中的第\(i\)個元素,那麼這個元素的softmax值就是:
\[ S_i = \frac{e^{V_i}}{\sum_k e^{V_k}} \]
假設咱們使用交叉熵損失函數:
\[ C=-\sum_i y_i \ln a_i \]
其中,\(y_i\)表示真實的分類結果,表示softmax第i個輸出值。
咱們要求的是loss對於神經元輸出(\(z_i\))的梯度,即:
\[ \frac{\partial C}{\partial z_i} \]
根據複合函數求導法則,可得:
\[ \frac{\partial C}{\partial z_i} = \frac{\partial C}{\partial a_j} \frac{\partial a_j}{\partial z_i} \]
其中:
\[ \frac{\partial C}{\partial a_j} = -sum_j y_j \frac{1}{a_j} \]
針對\(\frac{\partial a_j}{\partial z_i}\),將其分爲兩種狀況,
當\(i=j\):
\[ \frac{\partial a_i}{\partial z_i}=\frac{\partial \frac{e^{z_i}}{\sum_k e^{z_k}}}{\partial z_i}=\frac{e^{z_i}\sum_k e^{z_k} - (e^{z_i})^2}{(\sum_k e^{z_k})^2}=\frac{e^{z_i}}{\sum_k e^{z_k}}(1-\frac{e^{z_i}}{\sum_k e^{z_k}})=a_i (1-a_i) \]
當\(i \neq j\):
\[ \frac{\partial a_j}{\partial z_i}=\frac{\partial \frac{e^{z_j}}{\sum_k e^{z_k}}}{\partial z_i}=-e^{z_j}(\frac{1}{\sum_k e^{z_k}})^2 e^{z_i}=-a_i a_j \]
故,
\[ \frac{\partial C}{\partial z_i}= -sum_j y_j \frac{1}{a_j} (\frac{\partial a_j}{\partial z_i})=-\frac{y_i}{a_i}(a_i(1-a_i))+\sum_{j \neq i }\frac{y_j}{a_j}a_i a_j = -y_i + y_i a_i +sum_{j \neq i}y_j a_i \\ =-y_i+a_i \sum_j y_j =a_i - y_i \]算法
過擬合即在訓練偏差很小,而泛化偏差很大,由於模型可能過於的複雜,使其」記住」了訓練樣本,然而其泛化偏差卻很高編程
重要性:學習率>正則值>dropout
學習率:0.001,0.01,0.1,1,10 …….以10爲階數嘗試
小數據集上合適的參數大數據集上通常不會差,能夠先減小訓練類別。
欠擬合:
表現形式:訓練集,測試集準確率都很低
解決辦法:增長網絡層數,增長節點數,減小dropout值,減小L2正則值等等數組
過擬合:
表現形式:訓練集準確率較高,測試集準確率比較低
解決辦法:增長數據、數據加強、參數範數懲罰L一、L二、提早終止、增長dropout值、BatchNormalization網絡
Momentum
Momentum算法借用了物理中的動量概念,它模擬的是物體運動時的慣性,即更新的時候在必定程度上保留以前更新的方向,同時利用當前batch的梯度微調最終的更新方向。這樣一來,能夠在必定程度上增長穩定性,從而學習地更快,而且還有必定擺脫局部最優的能力
爲了防止波動,取前幾回波動的平均值當作此次的W。用到理論的計算梯度的指數加權平均數,引進超參數beta(通常取0.9)
beta的值越大,數據越平穩。可是beta的值過大會使數據有一種「滯後」的感受
\[ V_{dW} = \beta V_{dW} + (1-\beta) dW \\ W = W-\alpha V_{dW} \]分佈式
AdaGrad
一般,咱們在每一次更新參數時,對於全部的參數使用相同的學習率。而AdaGrad算法的思想是:每一次更新參數時(一次迭代),不一樣的參數使用不一樣的學習率。其中 \(ε\) 通常默認取 10−7,學習率$ α$通常取值爲 0.01
\[ G_t = G_{t-1}+g_t^2 \\ \theta_{t+1}=\theta_t - \frac{\alpha}{\sqrt{G_t}+\epsilon} \cdot g_t \]
從公式中咱們可以發現:
優勢:對於梯度較大的參數,\(G_t\)相對較大,則\(\frac{\alpha}{\sqrt{G_t}+\epsilon}\)較小,意味着學習率會變得較小。而對於梯度較小的參數,則效果相反。這樣就可使得參數在平緩的地方降低的稍微快些,不至於徘徊不前。
缺點:因爲是累積梯度的平方,到後面 \(G_t\) 累積的比較大,會致使梯度 \(\frac{\alpha}{\sqrt{G_t}+\epsilon} \rightarrow 0\),致使梯度消失。ide
RMSprop
RMSprop,全稱root mean square prop。也用到權重超參數beta(通常取0.999),和Momentum類似
RMSprop也是對Adagrad的擴展,以在非凸的狀況下效果更好。和Adadelta同樣,RMSprop使用指數加權平均(指數衰減平均)只保留過去給定窗口大小的梯度,使其可以在找到凸碗狀結構後快速收斂。
\[ S_{dW} = \rho S_{dW} + (1-\rho) (dW)^2 \\ W = W-\alpha \frac{dW}{\sqrt{S_{dW}}+\epsilon} \]
一樣 \(ε\)是爲了防止分母爲0,默認值設爲$ 1e^{-6}$ 。$β $ 默認值設爲$ 0.9$,學習率 \(\alpha\)默認值設爲$ 0.001$。函數
Adam
Adam其實是把momentum和RMSprop結合起來的一種算法。
\[ V_{dW} = \beta_1 V_{dW} + (1-\beta_1) dW \\ S_{dW} = \beta_2 S_{dW} + (1-\beta_2) (dW)^2 \\ V_{dW}^{correct}=\frac{V_{dW}}{1-\beta_1^t} \\ S_{dW}^{correct}=\frac{S_{dW}}{1-\beta_2^t} \\ W = W-\alpha \frac{V_{dW}^{correct}}{\sqrt{S_{dW}^{correct}}+\epsilon} \]
幾個參數推薦的默認值分別爲:\(α=0.001,β1=0.9,β2=0.999,ε=10−8α=0.001,β1=0.9,β2=0.999,ε=10−8\)。性能
若是參數都很大,那麼通過wx+b這個線性函數時,輸出的值也會很大,如果通過tanh/sigmoid激活函數,輸出的結果絕對值都幾乎接近於1,也就是說每一個神經元的輸出都幾乎相同,這徹底違背了神經網絡的初衷,事實上咱們但願每一個神經網絡都能去學習一個不一樣的特徵,他們的輸出值應該是有差別的。
若是w值設置地過小了,通過線性函數wx+b的時候,wx能夠忽略不計,因而線性函數的輸出都約等於b,通過激活函數後的輸出也幾乎相同,又形成了神經元彼此雷同。學習
初始化的基本思想:方差不變,即設法對權值進行初始化,使得各層神經元的方差保持不變。參數初始化可能致使梯度消失或爆炸,因此基本原則是確保每一層的權重矩陣的方差都近似爲 1。
1)爲網絡中的全部鏈接權值賦上一個服從均值爲0,標準差爲0.01的正態分佈的一個隨機數。爲第2、4、五層的卷積層和全部的全鏈接層神經元的偏置都賦予1的初始值,而其餘層神經元的偏置均爲0。這種初始化方法在模型的訓練初期,可以有效的提速。由於爲ReLU輸入的都是正值。
2)Xavier初始化
從高斯分佈或均勻分佈中對權值進行採樣,使得權值的方差是1/n,其中n是輸入神經元的個數。該推導假設激活函數是線性的。
Xavier,就是讓咱們每一層的輸入(也是上一層的輸出)都能控制必定範圍內,這樣就不會在激活函數那一塊產生太多的問題,也不會致使梯度過小。Xavier初始化假設咱們的數據(即xx)都是遵循必定的分佈(其實統計學不是很懂,但不少理念都建構在這個基礎上),而後讓咱們的權重(ww)遵循的分佈跟它相乘後(即ff)知足必定的條件。若是樣本空間與類別空間的分佈差別很大,好比說類別空間特別稠密,樣本空間特別稀疏遼闊,那麼在類別空間獲得的用於反向傳播的偏差丟給樣本空間後簡直變得微不足道,也就是會致使模型的訓練很是緩慢。一樣,若是類別空間特別稀疏,樣本空間特別稠密,那麼在類別空間算出來的偏差丟給樣本空間後簡直是爆炸般的存在,即致使模型發散震盪,沒法收斂。所以,咱們要讓樣本空間與類別空間的分佈差別(密度差異)不要太大,也就是要讓它們的方差儘量相等。
3)He初始化/MSRA初始化
從高斯分佈或均勻分佈中對權值進行採樣,使得權值的方差是2/n。該推導假設激活函數是ReLU。由於ReLU會將小於0的神經元置零,大體上會使一半的神經元置零,因此爲了彌補丟失的這部分信息,方差要乘以2。
4)批量規範化(batch-normalization,BN)
每層顯式地對神經元的激活值作規範化,使其具備零均值和單位方差。批量規範化使激活值的分佈固定下來,這樣可使各層更加獨立地進行學習。批量規範化可使得網絡對初始化和學習率不太敏感。此外,批量規範化有些許正則化的做用,但不要用其做爲正則化手段。
重要性:學習率>正則值>dropout
學習率:0.001,0.01,0.1,1,10 …….以10爲階數嘗試
小數據集上合適的參數大數據集上通常不會差,能夠先減小訓練類別。
欠擬合:
表現形式:訓練集,測試集準確率都很低
解決辦法:增長網絡層數,增長節點數,減小dropout值,減小L2正則值等等
過擬合:
表現形式:訓練集準確率較高,測試集準確率比較低
解決辦法:增長數據、數據加強、參數範數懲罰L一、L二、提早終止、增長dropout值、BatchNormalization
權值共享、VGG的感覺野、GoogLeNet的inception
CNN中減小網絡的參數的三個思想:
1) 局部鏈接(Local Connectivity)
每一個神經元沒有必要對全局圖像進行感知,只須要對局部進行感知,而後在更高層將局部的信息綜合起來就獲得了全局的信息。
2) 權值共享(Shared Weights)
對於同一個卷積核,它在一個區域提取到的特徵,也能適用於於其餘區域。在一個卷積核的狀況下,進行權值共享。
3) 池化(Pooling)
池化通常分爲max pooling和average pooling。定義池化窗口,最大池化爲取窗口中最大的那個值,平均池化爲取窗口中全部數的平均值。
1x1卷積核 inception
1x1的卷積核能夠進行降維或者升維,也就是經過控制卷積核(通道數)實現,這個能夠幫助減小模型參數,也能夠對不一樣特徵進行尺寸的歸一化;同時也能夠用於不一樣channel上特徵的融合。一個trick就是在降維的時候考慮結合傳統的降維方式,如PCA的特徵向量實現,這樣效果也能夠獲得保證。
在深度神經網絡中的梯度是不穩定的,在靠近輸入層的隱藏層中或會消失,或會爆炸。
梯度不穩定的緣由:根據鏈式求導法則,前面層上的梯度是來自後面層上梯度的乘積。當存在過多的層時,就會出現梯度不穩定場景,好比梯度消失和梯度爆炸。
梯度消失和梯度爆炸問題都是由於網絡太深,網絡權值更新不穩定形成的,本質上是由於梯度反向傳播中的連乘效應。對於更廣泛的梯度消失問題,能夠考慮一下三種方案解決:
Dropout是指在深度學習網絡的訓練過程當中,對於神經網絡單元,按照必定的機率將其暫時從網絡中丟棄。因爲是隨機丟棄,故而每個mini-batch都在訓練不一樣的網絡。
Dropout能夠被認爲是集成很是多的大神經 網絡的實用Bagging方法,防止參數過度依賴訓練數據,增長參數對數據集的泛化能力。在學習階段,以機率p主動臨時性地忽略掉部分隱藏節點。這一操做的好處在於,在較大程度上減少了網絡的大小,而在這個「殘缺」的網絡中,讓神經網絡學習數據中的局部特徵(即部分分佈式特徵)。
在測試階段,將參與學習的節點和那些被隱藏的節點以必定的機率p加權求和,綜合計算獲得網絡的輸出。
BatchNorm對於每一個隱層神經元,把逐漸向非線性函數映射後向取值區間極限飽和區靠攏的輸入分佈強制拉回到均值爲0方差爲1的比較標準的正態分佈,使得非線性變換函數的輸入值落入對輸入比較敏感的區域,以此避免梯度消失問題。BN爲了保證非線性的得到,對變換後的知足均值爲0方差爲1的x又進行了scale加上shift操做(y=scale*x+shift),每一個神經元增長了兩個參數scale和shift參數。
BN 的論文指出,傳統的深度神經網絡在訓練時,每一層的輸入的分佈都在變化,致使訓練變得困難,咱們只能使用一個很小的學習速率解決這個問題。而對每一層使用 BN 以後,咱們就能夠有效地解決這個問題,學習速率能夠增大不少倍,達到以前的準確率所須要的迭代次數只有1/14,訓練時間大大縮短。BN 某種意義上還起到了正則化的做用,因此能夠減小或者取消 Dropout 和 LRN,簡化網絡結構。
LeNet5 –沒啥特色-不過是第一個CNN應該要知道
AlexNet 引入了ReLU和dropout,引入數據加強、池化相互之間有覆蓋,三個卷積一個最大池化+三個全鏈接層
VGGNet 採用11和33的卷積核以及2*2的最大池化使得層數變得更深。經常使用VGGNet-16和VGGNet19
Google Inception Net
一、去除了最後的全鏈接層,而是用一個全局的平均池化來取代它;
二、引入Inception Module,這是一個4個分支結合的結構。全部的分支都用到了\(1*1\)的卷積,這是由於\(1*1\)能夠用不多的參數達到非線性和特徵變換。
三、Inception V2第二版將全部的\(5*5\)變成2個\(3*3\),並且提出了Batch Normalization;
四、Inception V3第三版就更變態了,把較大的二維卷積拆成了兩個較小的一維卷積,加速運算、減小過擬合,同時還更改了Inception Module的結構。
微軟ResNet殘差神經網絡(Residual Neural Network) 一、引入高速公路結構,可讓神經網絡變得很是深
二、ResNet第二個版本將ReLU激活函數變成y=x的線性函數
早期的V1 結構借鑑了 NIN 的設計思路,對網絡中的傳統卷積層進行了修改,針對限制深度神經網絡性能的主要問題,一直不斷改進延伸到 V4:
參數空間大,容易過擬合,且訓練數據集有限;
網絡結構複雜,計算資源不足,致使難以應用;
深層次網絡結構容易出現梯度彌散,模型性能降低。
GoogLeNet 對網絡中的傳統卷積層進行了修改,提出了被稱爲 Inception 的結構,用於增長網絡深度和寬度,提升深度神經網絡性能。
Inception V1
主要考慮多個不一樣 size 的卷積核可以加強網絡的適應力,paper 中分別使用\(1*1\)、\(3*3\)、\(5*5\)卷積核,同時加入\(3*3\) max pooling。
每一層 Inception module 的 filters 參數量爲全部分支上的總數和,多層 Inception 最終將致使 model 的參數數量龐大,對計算資源有更大的依賴。
Inception V2 學習了 VGG 用兩個\(3*3\)的卷積代替\(5*5\)的大卷積,在下降參數的同時創建了更多的非線性變換,使得 CNN 對特徵的學習能力更強:
另外提出了著名的 Batch Normalization(如下簡稱BN)方法。BN 是一個很是有效的正則化方法,可讓大型卷積網絡的訓練速度加快不少倍,同時收斂後的分類準確率也能夠獲得大幅提升。BN 在用於神經網絡某層時,會對每個 mini-batch 數據的內部進行標準化(normalization)處理,使輸出規範化到 N(0,1) 的正態分佈,減小了 Internal Covariate Shift(內部神經元分佈的改變)。
Inception V3
一是引入了 Factorization into small convolutions 的思想,將一個較大的二維卷積拆成兩個較小的一維卷積,好比將7´7卷積拆成1´7卷積和7´1卷積,或者將3´3卷積拆成1´3卷積和3´1卷積,一方面節約了大量參數,加速運算並減輕了過擬合(比將7´7卷積拆成1´7卷積和7´1卷積,比拆成3個3´3卷積更節約參數),同時增長了一層非線性擴展模型表達能力。
這種非對稱的卷積結構拆分,其結果比對稱地拆爲幾個相同的小卷積核效果更明顯,能夠處理更多、更豐富的空間特徵,增長特徵多樣性。
另外一方面,Inception V3 優化了 Inception Module 的結構,在 Inception Module 有35´3五、17´17和8´8三種不一樣結構。這些 Inception Module 只在網絡的後部出現,前部仍是普通的卷積層。而且 Inception V3 除了在 Inception Module 中使用分支,還在分支中使用了分支(8´8的結構中),
Inception V4
Inception V4 相比 V3 主要是結合了微軟的 ResNet,將錯誤率進一步減小
總結
Inception V1——構建了1x一、3x三、5x5的 conv 和3x3的 pooling 的分支網絡,同時使用 MLPConv 和全局平均池化,擴寬卷積層網絡寬度,增長了網絡對尺度的適應性;
Inception V2——提出了 Batch Normalization,代替 Dropout 和 LRN,其正則化的效果讓大型卷積網絡的訓練速度加快不少倍,同時收斂後的分類準確率也能夠獲得大幅提升,同時學習 VGG 使用兩個3´3的卷積核代替5´5的卷積核,在下降參數量同時提升網絡學習能力;
Inception V3——引入了 Factorization,將一個較大的二維卷積拆成兩個較小的一維卷積,好比將3´3卷積拆成1´3卷積和3´1卷積,一方面節約了大量參數,加速運算並減輕了過擬合,同時增長了一層非線性擴展模型表達能力,除了在 Inception Module 中使用分支,還在分支中使用了分支(Network In Network In Network);
Inception V4——研究了 Inception Module 結合 Residual Connection,結合 ResNet 能夠極大地加速訓練,同時極大提高性能,在構建 Inception-ResNet 網絡同時,還設計了一個更深更優化的 Inception v4 模型,能達到相媲美的性能
卷積中的特徵圖大小計算方式有兩種,分別是‘VALID’和‘SAME’。
若是計算方式採用'VALID',則:
\[ w_{out} = \frac{w_{in}-F}{stride}+1 \]
其中\({w_{out}}\)爲輸出特徵圖的大小,\({w_{in}}\)爲輸入特徵圖的大小,F爲卷積核大小,stride爲卷積步長。
若是計算方式採用'SAME',輸出特徵圖的大小與輸入特徵圖的大小保持不變,
\[ w_{out} = \frac{w_{in}+2*padding-F}{stride}+1 \]
其中padding爲特徵圖填充的圈數。
Tensorflow是一個經過計算圖的形式來表述計算的編程系統,計算圖也叫數據流圖,能夠把計算圖看作是一種有向圖,Tensorflow中的每個計算都是計算圖上的一個節點,而節點之間的邊描述了計算之間的依賴關係。
一、沒有對數據進行歸一化
二、忘記檢查輸入和輸出
三、沒有對數據進行預處理
四、沒有對數據正則化
五、使用過大的樣本
六、使用不正確的學習率
七、在輸出層使用錯誤的激活函數
八、網絡中包含壞梯度
九、初始化權重錯誤
十、過深的網絡
十一、隱藏單元數量錯誤
十二、優化算法不對,通常用adam居多。
1三、數據隨機性太強,同時網絡結構太複雜(樣本空間太大,同時樣本數量不夠,網絡函數空間也大)
1四、學習率過大。網絡可能快要收斂了,卻突然在下一個epoch走向了錯誤的方向,最終致使不收斂。
能夠歸結爲數據、網絡、優化算法(算法、學習率)三方面。