深度學習常見問題解析


深度學習常見問題解析

計算機視覺與自動駕駛 今天

一、為什么深層神經網絡難以訓練?

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

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

2、梯度爆炸。在深度網絡或循環神經網絡(Recurrent Neural Network, RNN)等網絡結構中,梯度可在網絡更新的過程中不斷累積,變成非常大的梯度,導致網絡權重值的大幅更新,使得網絡不穩定;在極端情況下,權重值甚至會溢出,變為 值,再也無法更新。3、權重矩陣的退化導致模型的有效自由度減少。參數空間中學習的退化速度減慢,導致減少了模型的有效維數,網絡的可用自由度對學習中梯度范數的貢獻不均衡,隨着相乘矩陣的數量(即網絡深度)的增加,矩陣的乘積變得越來越退化。在有硬飽和邊界的非線性網絡中(例如 ReLU 網絡),隨着深度增加,退化過程會變得越來越快。

二、深度學習和機器學習有什么不同?傳統的機器學習需要定義一些手工特征,從而有目的的去提取目標信息, 非常依賴任務的特異性以及設計特征的專家經驗。而深度學習可以從大數據中先學習簡單的特征,並從其逐漸學習到更為復雜抽象的深層特征,不依賴人工的特征工程。

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

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

五、如何選擇激活函數

1.       如果輸出是 0、1 值(二分類問題),則輸出層選擇 sigmoid 函數,然后其它的所有單元都選擇 Relu 函數。

2.       如果在隱藏層上不確定使用哪個激活函數,那么通常會使用 Relu 激活函數。有時,也會使用 tanh 激活函數,但 Relu 的一個優點是:當是負值的時候,導數等於 0。

3.       sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。

4.       tanh 激活函數:tanh 是非常優秀的,幾乎適合所有場合。

5.       如果遇到了一些死的神經元,我們可以使用 Leaky ReLU 函數。

六、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  時保持梯度不衰減,從而緩解梯度消失問題。

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

定義:

 

 

 將交叉熵看做是代價函數有兩點原因。第⼀,它是⾮負的, C > 0。可以看出:式子中的求和中的所有獨⽴的項都是負數的,因為對數函數的定義域是 (0,1),並且求和前⾯有⼀個負號,所以結果是非負。第⼆,如果對於所有的訓練輸⼊ x,神經元實際的輸出接近⽬標值,那么交叉熵將接近 0。實際輸出和⽬標輸出之間的差距越⼩,最終的交叉熵的值就越低了。(這里假設輸出結果不是0,就是1,實際分類也是這樣的)交叉熵代價函數有⼀個⽐⼆次代價函數更好的特性就是它避免了學習速度下降的問題。交叉熵函數關於權重的偏導數:

 

 

 化簡后得到:

 

 

 可以看到圈中學習的速度受到 

 

  ,也就是輸出中的誤差的控制。更⼤的誤差,更快的學習速度,特別地,這個代價函數還避免了像在⼆次代價函數中類似⽅程中 

 

 

 導致的學習緩慢。當我們使⽤交叉熵的時候,

 

 

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

八、為什么Tanh收斂速度比Sigmoid快?

 

 

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

九、為什么需要 Batch_Size?Batch的選擇,首先決定的是下降的方向。如果數據集比較小,可采用全數據集的形式,好處是:

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

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

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

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

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

十、Batch_Size 值的選擇假如每次只訓練一個樣本,即 Batch_Size = 1。線性神經元在均方誤差代價函數的錯誤面是一個拋物面,橫截面是橢圓。對於多層神經元、非線性網絡,在局部依然近似是拋物面。此時,每次修正方向以各自樣本的梯度方向修正,橫沖直撞各自為政,難以達到收斂。既然 Batch_Size 為全數據集或者Batch_Size = 1都有各自缺點,可不可以選擇一個適中的Batch_Size值呢?此時,可采用批梯度下降法(Mini-batches Learning)。因為如果數據集足夠充分,那么用一半(甚至少得多)的數據訓練算出來的梯度與用全部數據訓練出來的梯度是幾乎一樣的。

十一、在合理范圍內,增大Batch_Size有何好處?

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

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

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

十二、盲目增大 Batch_Size 有何壞處?

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

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

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

十三、為什么要歸一化?

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

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

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

十四、為什么歸一化能提高求解最優解速度

 

 

上圖是代表數據是否歸一化的最優解尋解過程(圓圈可以理解為等高線)。左圖表示未經歸一化操作的尋解過程,右圖表示經過歸一化后的尋解過程。當使用梯度下降法尋求最優解時,很有可能走“之字型”路線(垂直等高線走),從而導致需要迭代很多次才能收斂;而右圖對兩個原始特征進行了歸一化,其對應的等高線顯得很圓,在梯度下降進行求解時能較快的收斂。因此如果機器學習模型使用梯度下降法求最優解時,歸一化往往非常有必要,否則很難收斂甚至不能收斂。

十五、歸一化有哪些類型?

1、線性歸一化

 

 

 適用范圍:比較適用在數值比較集中的情況。缺點:如果 max 和 min 不穩定,很容易使得歸一化結果不穩定,使得后續使用效果也不穩定。2、標准差歸一化

 

 經過處理的數據符合標准正態分布,即均值為 0,標准差為 13、非線性歸一化適用范圍:經常用在數據分化比較大的場景,有些數值很大,有些很小。通過一些數學函數,將原始值進行映射。該方法包括 log、指數,正切等。

十六、局部響應歸一化作用LRN 是一種提高深度學習准確度的技術方法。LRN 一般是在激活、池化函數后的一種方法。

 

 

 其中,

1.       a :表示卷積層(包括卷積操作和池化操作)后的輸出結果,是一個四維數組[batch,height,width,channel]。

  • batch:批次數(每一批為一張圖片)。
  • height:圖片高度。
  • width:圖片寬度。
  • channel:通道數。可以理解成一批圖片中的某一個圖片經過卷積操作后輸出的神經元個數,或理解為處理后的圖片深度。

2.  

 

   表示在這個輸出結構中的一個位置 [a,b,c,d] ,可以理解成在某一張圖中的某一個通道下的某個高度和某個寬度位置的點,即第 a  張圖的第  d  個通道下的高度為b寬度為c的點。

3.       N :論文公式中的  N  表示通道數 (channel)。

4.       a , n/2 ,  k  分別表示函數中的 input,depth_radius,bias。參數 k, n,   都是超參數,一般設置

 

 

 5.   

 

       疊加的方向是沿着通道方向的,即每個點值的平方和是沿着 a 中的第 3 維 channel 方向的,也就是一個點同方向的前面  n/2  個通道(最小為第  0  個通道)和后  n/2  個通道(最大為第  d-1  個通道)的點的平方和(共  n+1  個點)。而函數的英文注解中也說明了把 input 當成是 d  個 3 維的矩陣,說白了就是把 input 的通道數當作 3 維矩陣的個數,疊加的方向也是在通道方向。


在 ALexNet 中,提出了 LRN 層,對局部神經元的活動創建競爭機制,使其中響應比較大對值變得相對更大,並抑制其他反饋較小的神經元,增強了模型的泛化能力。

十七、 批歸一化(BN)算法的優點批歸一化(BN)就是在神經網絡中間層也進行歸一化處理。優點:

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

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

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

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

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

十八、BN算法流程下面給出 BN 算法在訓練時的過程輸入:

 

 

m是此次訓練樣本batch的大小2、計算上一層輸出數據的標准差

 

 

3、歸一化處理,得到

 

 其中

 

    是為了避免分母為 0 而加進去的接近於 0 的很小值4、重構,對經過上面歸一化處理得到的數據進行重構,得到

 

 其中, 

 

 為可學習參數。

 

 十九、Batch Normalization和Group Normalization的比較Batch Normalization:可以讓各種網絡並行訓練。但是維度進行歸一化會帶來一些問題-----批量統計估算不准確導致批量變小時,BN 的誤差會迅速增加。在訓練大型網絡和將特征轉移到計算機視覺任務中(包括檢測、分割和視頻),內存消耗限制了只能使用小批量的 BN。Group Normalization:GN將通道分組,並且每組內計算歸一化的均值和方差。GN的計算與批量大小無關,並且其准確度在各種批量大小下都很穩定。

二十、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 時需要特別注意參數初始值的選擇。

二十一、Batch Normalization在什么時候用比較合適?在CNN中,BN應作用在非線性映射前。在神經網絡訓練時遇到收斂速度很慢,或梯度爆炸等無法訓練的狀況時可以嘗試BN來解決。另外,在一般使用情況下也可以加入BN來加快訓練速度,提高模型精度。BN比較適用的場景是:每個mini-batch比較大,數據分布比較接近。在進行訓練之前,要做好充分的shuffle,否則效果會差很多。另外,由於BN需要在運行過程中統計每個mini-batch的一階統計量和二階統計量,因此不適用於動態的網絡結構和RNN網絡。
二十二、學習率衰減常用參數有哪些

 

 

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

 

 

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

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

二十五、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

二十六、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會導致什么問題?簡而言之,每個神經元的輸入數據不再是“獨立同分布”。其一,上層參數需要不斷適應新的輸入數據分布,降低學習速度。其二,下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區,使得學習過早停止。其三,每層的更新都會影響到其它層,因此每層的參數更新策略需要盡可能的謹慎。

 


免責聲明!

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



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