(一)深度學習基礎部分面試題


一些總結比較好的鏈接:

https://blog.csdn.net/woaidapaopao/article/details/77806273

 

1、請簡要介紹下tensorflow的計算圖

答:計算圖是一張有節點有方向的數據流圖,每一個節點都是一個張量,每個節點之間的邊描述了計算之間的依賴關系和數學操作

2、你有哪些深度學習(rnn、cnn)調參的經驗?

https://www.julyedu.com/question/big/kp_id/26/ques_id/998

3、Sigmoid、Tanh、ReLu這三個激活函數有什么缺點或不足,有沒改進的激活函數。

答:sigmoid:缺點:若激活值很大的時候或者很小,激活函數在其區域梯度很小使得訓練速度很慢 Tanh:缺點:同上,優點:數據類似於集中於零左右, relu缺點:在零的時候不可導,若激活值小於零,梯度為零,使得訓練速度很慢,不過這種情況很少發生,有足夠多的神經元使得其z值大於零; 改進:采用含虛弱的relu激活函數,即若小於零時,也讓其有點梯度。比如小於零時,激活函數為:0.01Z。

4、為什么引入非線性激勵函數?

答:激勵函數可以給神經網絡引入非線性因素,可以把當前特征空間映射到其他空間,使其幾乎能擬合現實中任何問題,增加網絡的能力。

第一,對於神經網絡來說,網絡的每一層相當於f(wx+b)=f(w'x),對於線性函數,其實相當於f(x)=x,那么在線性激活函數下,每一層相當於用一個矩陣去乘以x,那么多層就是反復的用矩陣去乘以輸入。
根據矩陣的乘法法則,多個矩陣相乘得到一個大矩陣。所以線性激勵函數下,多層網絡與一層網絡相當。比如,兩層的網絡f(W1*f(W2x))=W1W2x=Wx。 第二,非線性變換是深度學習有效的原因之一。原因在於非線性相當於對空間進行變換,變換完成后相當於對問題空間進行簡化,原來線性不可解的問題現在變得可以解了。 下圖可以很形象的解釋這個問題,左圖用一根線是無法划分的。經過一系列變換后,就變成線性可解的問題了。
其實很像SVM中的核函數(如高斯核函數)

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

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

5、
什麽樣的資料集不適合用深度學習?
1、數據集太小,數據樣本不足時,深度學習相對其它機器學習算法,沒有明顯優勢。

2、數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單詞組合成句子,這些特征元素的組合一旦被打亂,表示的含義同時也被改變。
對於沒有這樣的局部相關性的數據集,不適於使用深度學習算法進行處理。
舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。
6、如何解決梯度消失和梯度膨脹
(1)梯度消失:
根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都小於1的話,那么即使這個結果是0.99,在經過足夠多層傳播之后,誤差對輸入層的偏導會趨於0
可以采用ReLU激活函數有效的解決梯度消失的情況,也可以用Batch Normalization解決這個問題。關於深度學習中 Batch Normalization為什么效果好?參見:https://www.zhihu.com/question/38102762

(2)梯度膨脹
根據鏈式法則,如果每一層神經元對上一層的輸出的偏導乘上權重結果都大於1的話,在經過足夠多層傳播之后,誤差對輸入層的偏導會趨於無窮大
可以通過激活函數來解決,或用Batch Normalization解決這個問題。

補充:
批歸一化(Batch Normalization)
https://www.cnblogs.com/skyfsm/p/8453498.html
 
7、請簡述神經網絡的發展史。
sigmoid會飽和,造成梯度消失。於是有了ReLU。
ReLU負半軸是死區,造成梯度變0。於是有了LeakyReLU,PReLU。
強調梯度和權值分布的穩定性,由此有了ELU,以及較新的SELU。
太深了,梯度傳不下去,於是有了highway。
干脆連highway的參數都不要,直接變殘差,於是有了ResNet。

強行穩定參數的均值和方差,於是有了BatchNorm。
在梯度流中增加噪聲,於是有了 Dropout。
RNN梯度不穩定,於是加幾個通路和門控,於是有了LSTM。
LSTM簡化一下,有了GRU。
GAN的JS散度有問題,會導致梯度消失或無效,於是有了WGAN。
WGAN對梯度的clip有問題,於是有了WGAN-GP。

 8、神經網絡中激活函數的真正意義?一個激活函數需要具有哪些必要的屬性?還有哪些屬性是好的屬性但不必要的?

 

1. 非線性:即導數不是0。這個條件是多層神經網絡的基礎,保證多層網絡不退化成單層線性網絡。這也是激活函數的意義所在。

2. 幾乎處處可微(可導):可微性保證了在優化中梯度的可計算性。傳統的激活函數如sigmoid等滿足處處可微。對於分段線性函數比如ReLU,只滿足幾乎處處可微(即僅在有限個點處不可微)。對於SGD算法來說,由於幾乎不可能收斂到梯度接近零的位置,有限的不可微點對於優化結果不會有很大影響[1]。

3. 計算簡單:非線性函數有很多。極端的說,一個多層神經網絡也可以作為一個非線性函數,類似於Network In Network[2]中把它當做卷積操作的做法。但激活函數在神經網絡前向的計算次數與神經元的個數成正比,因此簡單的非線性函數自然更適合用作激活函數。這也是ReLU之流比其它使用Exp等操作的激活函數更受歡迎的其中一個原因。

4. 非飽和性(saturation):飽和指的是在某些區間梯度接近於零(即梯度消失),使得參數無法繼續更新的問題。最經典的例子是Sigmoid,它的導數在x為比較大的正值和比較小的負值時都會接近於0。更極端的例子是階躍函數,由於它在幾乎所有位置的梯度都為0,因此處處飽和,無法作為激活函數。ReLU在x>0時導數恆為1,因此對於再大的正值也不會飽和。但同時對於x<0,其梯度恆為0,這時候它也會出現飽和的現象(在這種情況下通常稱為dying ReLU)。Leaky ReLU[3]和PReLU[4]的提出正是為了解決這一問題。

5. 單調性(monotonic):即導數符號不變。這個性質大部分激活函數都有,除了諸如sin、cos等。個人理解,單調性使得在激活函數處的梯度方向不會經常改變,從而讓訓練更容易收斂。

6. 輸出范圍有限:有限的輸出范圍使得網絡對於一些比較大的輸入也會比較穩定,這也是為什么早期的激活函數都以此類函數為主,如Sigmoid、TanH。但這導致了前面提到的梯度消失問題,而且強行讓每一層的輸出限制到固定范圍會限制其表達能力。因此現在這類函數僅用於某些需要特定輸出范圍的場合,比如概率輸出(此時loss函數中的log操作能夠抵消其梯度消失的影響[1])、LSTM里的gate函數。

7. 接近恆等變換(identity):即約等於x。這樣的好處是使得輸出的幅值不會隨着深度的增加而發生顯著的增加,從而使網絡更為穩定,同時梯度也能夠更容易地回傳。這個與非線性是有點矛盾的,因此激活函數基本只是部分滿足這個條件,比如TanH只在原點附近有線性區(在原點為0且在原點的導數為1),而ReLU只在x>0時為線性。這個性質也讓初始化參數范圍的推導更為簡單[5][4]。額外提一句,這種恆等變換的性質也被其他一些網絡結構設計所借鑒,比如CNN中的ResNet[6]和RNN中的LSTM。

8. 參數少:大部分激活函數都是沒有參數的。像PReLU帶單個參數會略微增加網絡的大小。還有一個例外是Maxout[7],盡管本身沒有參數,但在同樣輸出通道數下k路Maxout需要的輸入通道數是其它函數的k倍,這意味着神經元數目也需要變為k倍;但如果不考慮維持輸出通道數的情況下,該激活函數又能將參數個數減少為原來的k倍。

9. 歸一化(normalization):這個是最近才出來的概念,對應的激活函數是SELU[8],主要思想是使樣本分布自動歸一化到零均值、單位方差的分布,從而穩定訓練。在這之前,這種歸一化的思想也被用於網絡結構的設計,比如Batch Normalization[9]。

 

 

9、簡單說說CNN常用的幾個模型

 

10、什么是梯度爆炸?來的的問題是?
w = w - lr*梯度
反向傳播中,求導的鏈式法則,將梯度不斷相乘相乘再相乘,如果都是>1的話,最后得到的梯度會很大,損失函數將會發散而不會收斂。
梯度的定義:
誤差梯度是神經網絡訓練過程中計算的方向和數值,用於以正確的方向和合適的量更新網絡權重。
梯度爆炸產生的原因:在深層網絡或循環神經網絡中,誤差梯度可在更新中累積,變成非常大的梯度,然后導致網絡權重的大幅更新,並因此使網絡變得不穩定。
在極端情況下,權重的值變得非常大,以至於溢出,導致 NaN 值。網絡層之間的梯度(值大於 1.0)重復相乘導致的指數級增長會產生梯度爆炸。

梯度爆炸帶來的問題:
在深度多層感知機網絡中,梯度爆炸會引起網絡不穩定,最好的結果是無法從訓練數據中學習,而最壞的結果是出現無法再更新的 NaN 權重值。
梯度爆炸導致學習過程不穩定。

在循環神經網絡中,梯度爆炸會導致網絡不穩定,無法利用訓練數據學習,最好的結果是網絡無法學習長的輸入序列數據。

11、如何確定是否出現梯度爆炸?
訓練過程中出現梯度爆炸會伴隨一些細微的信號,如:
模型無法從訓練數據中獲得更新(如低損失)。
模型不穩定,導致更新過程中的損失出現顯著變化。
訓練過程中,模型損失變成 NaN。
如果你發現這些問題,那么你需要仔細查看是否出現梯度爆炸問題。

以下是一些稍微明顯一點的信號,有助於確認是否出現梯度爆炸問題。
訓練過程中模型梯度快速變大。
訓練過程中模型權重變成 NaN 值。
訓練過程中,每個節點和層的誤差梯度值持續超過 1.0。

12、如何修復梯度爆炸問題?
 
        
1. 重新設計網絡模型
在深度神經網絡中,梯度爆炸可以通過重新設計層數更少的網絡來解決。
使用更小的批尺寸對網絡訓練也有好處。
在循環神經網絡中,訓練過程中在更少的先前時間步上進行更新(沿時間的截斷反向傳播,truncated Backpropagation through time)可以緩解梯度爆炸問題。

2. 使用 ReLU 激活函數
在深度多層感知機神經網絡中,梯度爆炸的發生可能是因為激活函數,如之前很流行的 Sigmoid 和 Tanh 函數。
使用 ReLU 激活函數可以減少梯度爆炸。采用 ReLU 激活函數是最適合隱藏層的新實踐。

3. 使用長短期記憶網絡
在循環神經網絡中,梯度爆炸的發生可能是因為某種網絡的訓練本身就存在不穩定性,如隨時間的反向傳播本質上將循環網絡轉換成深度多層感知機神經網絡。
使用長短期記憶(LSTM)單元和相關的門類型神經元結構可以減少梯度爆炸問題。
采用 LSTM 單元是適合循環神經網絡的序列預測的最新最好實踐。

4. 使用梯度截斷(Gradient Clipping)
在非常深且批尺寸較大的多層感知機網絡和輸入序列較長的 LSTM 中,仍然有可能出現梯度爆炸。如果梯度爆炸仍然出現,你可以在訓練過程中檢查和限制梯度的大小。這就是梯度截斷。
處理梯度爆炸有一個簡單有效的解決方案:如果梯度超過閾值,就截斷它們。
 ——《Neural Network Methods in Natural Language Processing》,2017.
具體來說,檢查誤差梯度的值是否超過閾值,如果超過,則截斷梯度,將梯度設置為閾值。
梯度截斷可以一定程度上緩解梯度爆炸問題(梯度截斷,即在執行梯度下降步驟之前將梯度設置為閾值)。
     ——《深度學習》,2016.
在 Keras 深度學習庫中,你可以在訓練之前設置優化器上的 clipnorm 或 clipvalue 參數,來使用梯度截斷。
默認值為 clipnorm=1.0 、clipvalue=0.5。詳見:https://keras.io/optimizers/。

5. 使用權重正則化(Weight Regularization)
如果梯度爆炸仍然存在,可以嘗試另一種方法,即檢查網絡權重的大小,並懲罰產生較大權重值的損失函數。該過程被稱為權重正則化,通常使用的是 L1 懲罰項(權重絕對值)或 L2 懲罰項(權重平方)。
對循環權重使用 L1 或 L2 懲罰項有助於緩解梯度爆炸。
——On the difficulty of training recurrent neural networks,2013.
在 Keras 深度學習庫中,你可以通過在層上設置 kernel_regularizer 參數和使用 L1 或 L2 正則化項進行權重正則化。









免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM