深度學習面試100題(第16-20題)

深度學習面試100題(第16-20題)

來自專欄 BAT面試1000題277 人贊了文章

1、為什麼引入非線性激勵函數?

解析:

第一,對於神經網路來說,網路的每一層相當於f(wx+b)=f(wx),對於線性函數,其實相當於f(x)=x,那麼在線性激活函數下,每一層相當於用一個矩陣去乘以x,那麼多層就是反覆的用矩陣去乘以輸入。根據矩陣的乘法法則,多個矩陣相乘得到一個大矩陣。所以線性激勵函數下,多層網路與一層網路相當。比如,兩層的網路f(W1*f(W2x))=W1W2x=Wx。

第二,非線性變換是深度學習有效的原因之一。原因在於非線性相當於對空間進行變換,變換完成後相當於對問題空間進行簡化,原來線性不可解的問題現在變得可以解了。

下圖可以很形象的解釋這個問題,左圖用一根線是無法劃分的。經過一系列變換後,就變成線性可解的問題了。

如果不用激勵函數(其實相當於激勵函數是f(x) = x),在這種情況下你每一層輸出都是上層輸入的線性函數,很容易驗證,無論你神經網路有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當,這種情況就是最原始的感知機(Perceptron)了。

正因為上面的原因,我們決定引入非線性函數作為激勵函數,這樣深層神經網路就有意義了(不再是輸入的線性組合,可以逼近任意函數)。最早的想法是sigmoid函數或者tanh函數,輸出有界,很容易充當下一層輸入(以及一些人的生物解釋)。

2、請問人工神經網路中為什麼ReLu要好過於tanh和sigmoid function?

解析:

先看sigmoid、tanh和RelU的函數圖:

第一,採用sigmoid等函數,算激活函數時(指數運算),計算量大,反向傳播求誤差梯度時,求導涉及除法和指數運算,計算量相對大,而採用Relu激活函數,整個過程的計算量節省很多。

第二,對於深層網路,sigmoid函數反向傳播時,很容易就會出現梯度消失的情況(在sigmoid接近飽和區時,變換太緩慢,導數趨於0,這種情況會造成信息丟失),這種現象稱為飽和,從而無法完成深層網路的訓練。而ReLU就不會有飽和傾向,不會有特別小的梯度出現。

第三,Relu會使一部分神經元的輸出為0,這樣就造成了網路的稀疏性,並且減少了參數的相互依存關係,緩解了過擬合問題的發生(以及一些人的生物解釋balabala)。當然現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,具體的大家可以找相關的paper看。

多加一句,現在主流的做法,會多做一步batch normalization,儘可能保證每一層網路的輸入具有相同的分布[1]。而最新的paper[2],他們在加入bypass connection之後,發現改變batch normalization的位置會有更好的效果。大家有興趣可以看下。

[1] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.

[2] He, Kaiming, et al. "Identity Mappings in Deep Residual Networks." arXiv preprint arXiv:1603.05027 (2016).

3、為什麼LSTM模型中既存在sigmoid又存在tanh兩種激活函數,而不是選擇統一一種sigmoid或者tanh?這樣做的目的是什麼?

解析:

sigmoid 用在了各種gate上,產生0~1之間的值,這個一般只有sigmoid最直接了。

tanh 用在了狀態和輸出上,是對數據的處理,這個用其他激活函數或許也可以。

二者目的不一樣

另可參見A Critical Review of Recurrent Neural Networks for Sequence Learning的section4.1,說了那兩個tanh都可以替換成別的。

4、如何解決RNN梯度爆炸和彌散的問題?

解析:

為了解決梯度爆炸問題,Thomas Mikolov首先提出了一個簡單的啟發性的解決方案,就是當梯度大於一定閾值的的時候,將它截斷為一個較小的數。具體如演算法1所述:

演算法:當梯度爆炸時截斷梯度(偽代碼)

下圖可視化了梯度截斷的效果。它展示了一個小的rnn(其中W為權值矩陣,b為bias項)的決策面。這個模型是一個一小段時間的rnn單元組成;實心箭頭表明每步梯度下降的訓練過程。當梯度下降過程中,模型的目標函數取得了較高的誤差時,梯度將被送到遠離決策面的位置。截斷模型產生了一個虛線,它將誤差梯度拉回到離原始梯度接近的位置。

梯度爆炸,梯度截斷可視化

為了解決梯度彌散的問題,我們介紹了兩種方法。第一種方法是將隨機初始化

改為一個有關聯的矩陣初始化。第二種方法是使用ReLU(Rectified Linear Units)代替sigmoid函數。ReLU的導數不是0就是1.因此,神經元的梯度將始終為1,而不會當梯度傳播了一定時間之後變小。

5、什麽樣的資料集不適合用深度學習?

解析:

(1)數據集太小,數據樣本不足時,深度學習相對其它機器學習演算法,沒有明顯優勢。

(2)數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習演算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。


推薦閱讀:

訓練深度學習網路時候,出現Nan是什麼原因,怎麼才能避免?
CNN Float16 vs Float32
Keras 的 Web 填坑記
2018 年 深度學習框架 盤點 比較 推薦
深度學習面試100題(第11-15題)

TAG:TensorFlow | 深度學習DeepLearning | Keras |