[深度學習] 面試常見問題+解析彙總

什麼是深度學習,與傳統機器學習算法的區別?

(1)傳統機器學習算法,在一開始,性能(識別率)會隨着數據的增加而增加,但一段時間後,它的性能會進入平臺期。這些模型無法處理海量數據。
(2)最近20年來,人類建立了數字王國,使得我們在電腦、網站、手機上的活動,都製造大量數據。便宜的相機、傳感器,也產生大量數據。
(3)不同規模的網絡,取得的性能也會有不同(具體如下)。

深度學習是一種特殊的機器學習,它將現實世界表示爲嵌套的層次概念體系(由較簡單概念間的聯繫定義複雜概念,從一般抽象概括到高級抽象表示),從而獲得強大的性能與靈活性。

Deep learning is a subset of machine learning that is concerned with neural networks: how to use backpropagation and certain principles from neuroscience to more accurately model large sets of unlabelled or semi-structured data.

In that sense, deep learning represents an unsupervised learning algorithm that learns representations of data through the use of neural nets.

 

 

爲什麼深層神經網絡難以訓練?

1、梯度消失。梯度消失是指通過隱藏層從後向前看,梯度會變得越來越小,說明前面層的學習會顯著慢於後面層的學習,所以學習會卡主,除非梯度變大。

梯度消失的原因:學習率的大小,網絡參數的初始化,激活函數的邊緣效應等。在深層神經網絡中,每一個神經元計算得到的梯度都會傳遞給前一層,較淺層的神經元接收到的梯度受到之前所有層梯度的影響。如果計算得到的梯度值非常小,隨着層數增多,求出的梯度更新信息將會以指數形式衰減,就會發生梯度消失。

2、梯度爆炸。在深度網絡或循環神經網絡(Recurrent Neural Network, RNN)等網絡結構中,梯度可在網絡更新的過程中不斷累積,變成非常大的梯度,導致網絡權重值的大幅更新,使得網絡不穩定;在極端情況下,權重值甚至會溢出,變爲Nan值,再也無法更新。

3、權重矩陣的退化導致模型的有效自由度減少。

參數空間中學習的退化速度減慢,導致減少了模型的有效維數,網絡的可用自由度對學習中梯度範數的貢獻不均衡,隨着相乘矩陣的數量(即網絡深度)的增加,矩陣的乘積變得越來越退化。在有硬飽和邊界的非線性網絡中(例如 ReLU 網絡),隨着深度增加,退化過程會變得越來越快。

神經網絡模型優化的常用方案

1、增加(減少)隱藏層的複雜度,如增加隱藏層數,調整隱藏層的神經元個數,或者在隱藏層使用更加複雜的網絡結構,如CNN、RNN、LSTM、GRU或者增加Attention層等等;

2、添加Dropout層,使用Dropout的原理優化網絡參數,防止過擬合;

3、嘗試不同的優化器,常用的優化器包括SGD、Adam、RMSprop(動量相關);

4、增加迭代次數,一般爲了快速檢驗模型效果訓練次數比較少,優化過程中可以增加訓練次數;

5、調整優化器的學習率,學習率太小會造成模型收斂速度下降,還有可能求出的是局部最優解,訓練模型時的損失函數下降慢;學習率過大會引起模型無法到達最優解,在最優解附近來回跳轉,但是一般情況下學習率並不是一成不變的,而是隨着模型的訓練在優化;

6、增加批處理的大小,採用批處理的方式訓練數據時每個batch的數據進行一次反向傳播,更新參數,所以每個batch的數據分佈對模型訓練有着一定的影響,調整batch_size的大小,對模型優化有一定的作用;

7、正則化,可以優化模型太過複雜而引起運行時間過長的問題,也可以在一定程度上防止模型過擬合。(過擬合也就是模型把訓練數據的內部關係都記下來了,在訓練集損失函數很小,但是在測試集上損失函數開始增大,也就是在測試集上的效果開始下降)

 

激活函數

1. 激活函數有哪些性質

  1. 非線性
  2. 可微性:當優化方法是基於梯度的時候,就體現了該性質;
  3. 單調性:當激活函數是單調的時候,單層網絡能夠保證是凸函數;
  4. f(x)≈x:當激活函數滿足這個性質的時候,如果參數的初始化是隨機的較小值,那麼神經網絡的訓練將會很高效;如果不滿足這個性質,那麼就需要詳細地去設置初始值;
  5. 輸出值的範圍:當激活函數輸出值是有限的時候,基於梯度的優化方法會更加穩定,因爲特徵的表示受有限權值的影響更顯著;當激活函數的輸出是無限的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的 Learning Rate。

2. 爲什麼需要非線性激活函數

  1. 激活函數可以把當前特徵空間通過一定的線性映射轉換到另一個空間,學習和模擬其他複雜類型的數據,例如圖像、視頻、音頻、語音等。
  2. 假若網絡中全部是線性部件,那麼線性的組合還是線性,與單獨一個線性分類器無異。這樣就做不到用非線性來逼近任意函數。
  3. 使用非線性激活函數 ,以便使網絡更加強大,增加它的能力,使它可以學習複雜的事物,複雜的表單數據,以及表示輸入輸出之間非線性的複雜的任意函數映射。使用非線性激活函數,能夠從輸入輸出之間生成非線性映射。

3. 如何選擇激活函數

  1. 如果輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,然後其它的所有單元都選擇 Relu 函數。
  2. 如果在隱藏層上不確定使用哪個激活函數,那麼通常會使用 Relu 激活函數。有時,也會使用 tanh 激活函數,但 Relu 的一個優點是:當是負值的時候,導數等於 0。
  3. sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。
  4. tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。
  5. 如果遇到了一些死的神經元,我們可以使用 Leaky ReLU 函數。

3. ReLu激活函數的優點

  1. sigmoid 和 tanh 函數的導數在正負飽和區的梯度都會接近於 0,這會造成梯度彌散,而 Relu 和Leaky ReLu 函數大於 0 部分都爲常數,不會產生梯度彌散現象。
  2. 在區間變動很大的情況下,ReLu 激活函數的導數或者激活函數的斜率都會遠大於 0,在程序實現就是一個 if-else 語句,而 sigmoid 函數需要進行浮點四則運算,在實踐中,使用 ReLu 激活函數神經網絡通常會比使用 sigmoid 或者 tanh 激活函數學習的更快。
  3. 需注意,Relu 進入負半區的時候,梯度爲 0,神經元此時不會訓練,產生所謂的稀疏性,而 Leaky ReLu 不會產生這個問題。

稀疏激活性:從信號方面來看,即神經元同時只對輸入信號的少部分選擇性響應,大量信號被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特徵。當  x<0  時,ReLU 硬飽和,而當 x>0  時,則不存在飽和問題。ReLU 能夠在  x>0  時保持梯度不衰減,從而緩解梯度消失問題。

4. 爲什麼Tanh收斂速度比Sigmoid快?

由上面兩個公式可知tanh(x)梯度消失的問題比sigmoid輕,所以Tanh收斂速度比Sigmoid快。

 

爲什麼在神經網絡中,ReLU是比Sigmoid更好、更常用的激活函數?

  

 

交叉熵損失函數及其求導推導

定義:

將交叉熵看做是代價函數有兩點原因。

第⼀,它是⾮負的, C > 0。可以看出:式子中的求和中的所有獨⽴的項都是負數的,因爲對數函數的定義域是 (0,1),並且求和前⾯有⼀個負號,所以結果是非負。

第⼆,如果對於所有的訓練輸⼊ x,神經元實際的輸出接近⽬標值,那麼交叉熵將接近 0。實際輸出和⽬標輸出之間的差距越⼩,最終的交叉熵的值就越低了。(這裏假設輸出結果不是0,就是1,實際分類也是這樣的)

交叉熵代價函數有⼀個⽐⼆次代價函數更好的特性就是它避免了學習速度下降的問題。

交叉熵函數關於權重的偏導數:

化簡後得到:

可以看到圈中學習的速度受到  ,也就是輸出中的誤差的控制。更⼤的誤差,更快的學習速度,特別地,這個代價函數還避免了像在⼆次代價函數中類似⽅程中  導致的學習緩慢。當我們使⽤交叉熵的時候, 

 被約掉了,所以我們不再需要關⼼它是不是變得很⼩。這種約除就是交叉熵帶來的特效。  

Batch_Size

1. 爲什麼需要 Batch_Size?

Batch的選擇,首先決定的是下降的方向。

如果數據集比較小,可採用全數據集的形式,好處是:

  1. 由全數據集確定的方向能夠更好地代表樣本總體,從而更準確地朝向極值所在的方向。

  2. 由於不同權重的梯度值差別巨大,因此選取一個全局的學習率很困難。Full Batch Learning 可以使用 Rprop 只基於梯度符號並且針對性單獨更新各權值。

對於更大的數據集,假如採用全數據集的形式,壞處是:

  1. 隨着數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。

  2. 以 Rprop 的方式迭代,會由於各個 Batch 之間的採樣差異性,各次梯度修正值相互抵消,無法修正。這纔有了後來 RMSProp 的妥協方案。

2. Batch_Size 值的選擇

假如每次只訓練一個樣本,即 Batch_Size = 1。線性神經元在均方誤差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網絡,在局部依然近似是拋物面。此時,每次修正方向以各自樣本的梯度方向修正,橫衝直撞各自爲政,難以達到收斂。

既然 Batch_Size 爲全數據集或者Batch_Size = 1都有各自缺點,可不可以選擇一個適中的Batch_Size值呢?

此時,可採用批梯度下降法(Mini-batches Learning)。因爲如果數據集足夠充分,那麼用一半(甚至少得多)的數據訓練算出來的梯度與用全部數據訓練出來的梯度是幾乎一樣的。

3. 在合理範圍內,增大Batch_Size有何好處?

  1. 內存利用率提高了,大矩陣乘法的並行化效率提高。

  2. 跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。

  3. 在一定範圍內,一般來說 Batch_Size 越大,其確定的下降方向越準,引起訓練震盪越小。

4. 盲目增大 Batch_Size 有何壞處?

  1. 內存利用率提高了,但是內存容量可能撐不住了。

  2. 跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同的精度,其所花費的時間大大增加了,從而對參數的修正也就顯得更加緩慢。

  3. Batch_Size 增大到一定程度,其確定的下降方向已經基本不再變化。

歸一化

1. 爲什麼要歸一化?

  1. 避免神經元飽和。就是當神經元的激活在接近 0 或者 1 時會飽和,在這些區域,梯度幾乎爲 0,這樣,在反向傳播過程中,局部梯度就會接近 0,這會有效地“殺死”梯度。

  2. 保證輸出數據中數值小的不被吞食。

  3. 加快收斂。數據中常存在奇異樣本數據,奇異樣本數據存在所引起的網絡訓練時間增加,並可能引起網絡無法收斂,爲了避免出現這種情況及後面數據處理的方便,加快網絡學習速度,可以對輸入信號進行歸一化,使得所有樣本的輸入信號其均值接近於 0 或與其均方差相比很小。

2. 爲什麼歸一化能提高求解最優解速度

 

上圖是代表數據是否歸一化的最優解尋解過程(圓圈可以理解爲等高線)。左圖表示未經歸一化操作的尋解過程,右圖表示經過歸一化後的尋解過程。

當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;而右圖對兩個原始特徵進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。

因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。

3. 歸一化有哪些類型?

1、線性歸一化

適用範圍:比較適用在數值比較集中的情況。

缺點:如果 max 和 min 不穩定,很容易使得歸一化結果不穩定,使得後續使用效果也不穩定。

2、標準差歸一化

經過處理的數據符合標準正態分佈,即均值爲 0,標準差爲 1

3、非線性歸一化

適用範圍:經常用在數據分化比較大的場景,有些數值很大,有些很小。通過一些數學函數,將原始值進行映射。該方法包括 log、指數,正切等。

4. 批歸一化(Batch Normalization)算法的優點

批歸一化(BN)就是在神經網絡中間層也進行歸一化處理。

優點:

  1. 減少了人爲選擇參數。在某些情況下可以取消 dropout 和 L2 正則項參數,或者採取更小的 L2 正則項約束參數;

  2. 減少了對學習率的要求。現在我們可以使用初始很大的學習率或者選擇了較小的學習率,算法也能夠快速訓練收斂;

  3. 可以不再使用局部響應歸一化。BN 本身就是歸一化網絡(局部響應歸一化在 AlexNet 網絡中存在)

  4. 破壞原來的數據分佈,一定程度上緩解過擬合(防止每批訓練中某一個樣本經常被挑選到,文獻說這個可以提高 1% 的精度)。

  5. 減少梯度消失,加快收斂速度,提高訓練精度。

 

訓練深層神經網絡很複雜,因爲在訓練過程中,隨着前幾層輸入的參數不斷變化,每層輸入的分佈也隨之變化。一種方法是將每層輸入規範化,輸出函數均值爲0,標準差爲1。對每一層的每個小批量輸入都採用上述方式進行規範化(計算每個小批量輸入的均值和方差,然後標準化)。這和神經網絡的輸入的規範化類似。

批量標準化的好處

對輸入進行規範化有助於神經網絡學習。但神經網絡不過是一系列的層,每層的輸出又成爲下一層的輸入。也就是說,我們可以將其中每一層視作子網絡的第一層。把神經網絡想象成一系列互相傳遞信息的網絡結構,因此在激活函數作用於輸出之前,先將每一層輸出規範化,再將其傳遞到下一層(子網絡)。

 

5. Batch Normalization和Group Normalization的比較

Batch Normalization:可以讓各種網絡並行訓練。但是維度進行歸一化會帶來一些問題-----批量統計估算不準確導致批量變小時,BN 的誤差會迅速增加。在訓練大型網絡和將特徵轉移到計算機視覺任務中(包括檢測、分割和視頻),內存消耗限制了只能使用小批量的 BN。

Group Normalization:GN將通道分組,並且每組內計算歸一化的均值和方差。GN的計算與批量大小無關,並且其準確度在各種批量大小下都很穩定。

6. Weight Normalization和Batch Normalization比較

兩者都屬於參數重寫的方式,只是採用的方式不同。

Weight Normalization 是對網絡權值 W 進行 normalization;Batch Normalization 是對網絡某一層輸入數據進行 normalization。

Weight Normalization相比Batch Normalization有以下三點優勢:

  1. Weight Normalization 通過重寫深度學習網絡的權重W的方式來加速深度學習網絡參數收斂,沒有引入 minbatch 的依賴,適用於 RNN(LSTM)網絡(Batch Normalization 不能直接用於RNN,進行 normalization 操作,原因在於:1) RNN 處理的 Sequence 是變長的;2) RNN 是基於 time step 計算,如果直接使用 Batch Normalization 處理,需要保存每個 time step 下,mini btach 的均值和方差,效率低且佔內存)。

  2. Batch Normalization 基於一個 mini batch 的數據計算均值和方差,而不是基於整個 Training set 來做,相當於進行梯度計算式引入噪聲。因此,Batch Normalization 不適用於對噪聲敏感的強化學習、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization 對通過標量 g 和向量 v  對權重  W  進行重寫,重寫向量 v 是固定的,因此,基於 Weight Normalization 的 Normalization 可以看做比 Batch Normalization 引入更少的噪聲。

  3. 不需要額外的存儲空間來保存 mini batch 的均值和方差,同時實現 Weight Normalization 時,對深度學習網絡進行正向信號傳播和反向梯度計算帶來的額外計算開銷也很小。因此,要比採用 Batch Normalization 進行 normalization 操作時,速度快。但是 Weight Normalization 不具備 Batch Normalization 把網絡每一層的輸出 Y 固定在一個變化範圍的作用。因此,採用 Weight Normalization 進行 Normalization 時需要特別注意參數初始值的選擇。

7.  Batch Normalization在什麼時候用比較合適?

在CNN中,BN應作用在非線性映射前。在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等無法訓練的狀況時可以嘗試BN來解決。另外,在一般使用情況下也可以加入BN來加快訓練速度,提高模型精度。

BN比較適用的場景是:每個mini-batch比較大,數據分佈比較接近。在進行訓練之前,要做好充分的shuffle,否則效果會差很多。另外,由於BN需要在運行過程中統計每個mini-batch的一階統計量和二階統計量,因此不適用於動態的網絡結構和RNN網絡。

   

學習率衰減常用參數有哪些

 

十 正則化

1. 爲什麼要正則化

深度學習可能存在過擬合問題-----高方差,有兩個解決方法,一個是正則化,另一個是準備更多的數據,這是非常可靠的方法,但你可能無法時時刻刻準備足夠多的訓練數據或者獲取更多數據的成本很高,但正則化通常有助於避免過擬合或減少你的網絡誤差。

 

左圖是高偏差,右圖是高方差,中間是Just Right。

2. 理解dropout正則化

不要依賴於任何一個特徵,因爲該單元的輸入可能隨時被清除,因此該單元通過這種方式傳播下去,併爲單元的四個輸入增加一點權重,通過傳播所有權重,dropout將產生收縮權重的平方範數的效果,和之前講的L2正則化類似;實施dropout的結果實它會壓縮權重,並完成一些預防過擬合的外層正則化;L2對不同權重的衰減是不同的,它取決於激活函數倍增的大小。

3. dropout率的選擇

1、經過交叉驗證,隱含節點dropout率等於0.5的時候效果最好,原因是0.5的時候dropout隨機生成的網絡結構最多。

2、dropout也可以被用作一種添加噪聲的方法,直接對input進行操作、輸入層設爲更更接近 1 的數。使得輸入變化不會太大(0.8)

3、對參數w的訓練進行球形限制(max-normalization),對 dropout 的訓練非常有用。

4、使用pretrain方法也可以幫助dropout訓練參數,在使用dropout時,要將所有參數都乘以1/p

4. dropout有什麼缺點

dropout一大缺點就是代價函數J不再被明確定義,每次迭代,都會隨機移除一些節點,如果再三檢查梯度下降的性能,實際上是很難進行復查的。定義明確的代價函數J每次迭代後都會下降,因爲我們所優化的代價函數J實際上並沒有明確定義,或者說在某種程度上很難計算,所以我們失去了調試工具來繪製這樣的圖片。我通常會關閉dropout函數,將keep-prob的值設爲1,運行代碼,確保J函數單調遞減。然後打開dropout函數,希望在dropout過程中,代碼並未引入bug。我覺得你也可以嘗試其它方法,雖然我們並沒有關於這些方法性能的數據統計,但你可以把它們與dropout方法一起使用。

十一 如何理解 Internal Covariate Shift?

深度神經網絡模型的訓練爲什麼會很困難?其中一個重要的原因是,深度神經網絡涉及到很多層的疊加,而每一層的參數更新會導致上層的輸入數據分佈發生變化,通過層層疊加,高層的輸入分佈變化會非常劇烈,這就使得高層需要不斷去重新適應底層的參數更新。爲了訓好模型,我們需要非常謹慎地去設定學習率、初始化權重、以及儘可能細緻的參數更新策略。

oogle 將這一現象總結爲 Internal Covariate Shift,簡稱 ICS。什麼是 ICS 呢?

大家都知道在統計機器學習中的一個經典假設是“源空間(source domain)和目標空間(target domain)的數據分佈(distribution)是一致的”。如果不一致,那麼就出現了新的機器學習問題,如 transfer learning / domain adaptation 等。而 covariate shift 就是分佈不一致假設之下的一個分支問題,它是指源空間和目標空間的條件概率是一致的,但是其邊緣概率不同。

大家細想便會發現,的確,對於神經網絡的各層輸出,由於它們經過了層內操作作用,其分佈顯然與各層對應的輸入信號分佈不同,而且差異會隨着網絡深度增大而增大,可是它們所能“指示”的樣本標記(label)仍然是不變的,這便符合了covariate shift的定義。由於是對層間信號的分析,也即是“internal”的來由。

那麼ICS會導致什麼問題?

簡而言之,每個神經元的輸入數據不再是“獨立同分布”。

其一,上層參數需要不斷適應新的輸入數據分佈,降低學習速度。

其二,下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。

其三,每層的更新都會影響到其它層,因此每層的參數更新策略需要儘可能的謹慎。

 

 

 

 

 

參考: 算法崗面試:Deep Learning 27類常見問題+解析彙總

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章