深度學習中的常見問題匯總(一)


深度學習中的常見問題匯總(一)

轉自

1.CNN復雜度分析

在深度學習基礎網絡不斷進化的過程中,可以發現新的模型不僅性能有極大地提升,網絡的復雜度通常也會更低。深度學習網絡模型的復雜度直接關系到其實際應用中的速度與可行性,因此這里總結一下 CNN 復雜度的含義與計算方式。

1.1時間復雜度

通常,我們假設計算機運行一行基礎代碼需要一次運算,那么模型的時間復雜度即為模型的運算次數,用浮點運算次數 FLOPs(FLoating-point OPerations) 表示。首先來看一個最簡單的單層卷積的時間復雜度。

其中,

  • M 為每個卷積核輸出特征圖(Feature Map)的尺寸長度
  • K 為卷積核(Kernel)的尺寸大小
  • C_in 輸入的通道數,即上一層的輸出通道數目
  • C_out 卷積層具有的卷積核個數,即輸出通道數目

而特征圖的尺寸 M 又與輸入矩陣大小 X,卷積核尺寸 K,Padding 和步長 Stride 有關,其計算公式為:

M = (X - K + 2 * Padding )/Stride + 1

注:為了方便說明,上述所提到的卷積核尺寸 K 與輸入矩陣大小 X 均為正方形;
且為了簡潔,省略了模型中的偏置 bias。

對於整體的卷積網絡而言,其時間復雜度的計算方式為各層復雜度的累加。其計算方式如下:

其中,

  • D 為卷積層的數目
  • i 為第 i 個卷積層
  • Ci 為第 i 層卷積的輸出通道數目

1.2空間復雜度

在深度學習中,空間復雜度一般指的是訪存量,包括兩個部分:參數量,輸出特征圖。

參數量:模型所有帶參數的層的權重參數總量(即模型體積,下式左半部分)。

特征圖:模型在實時運行過程中,每層輸出的特征圖大小(下式右半部分)。

  • 參數量只與卷積核的尺寸 K 、通道數 C 、卷積的總層數 D 相關,而與輸入數據的大小無關。
  • 輸出特征圖的空間占用比較容易,就是其空間尺寸 M^2 和通道數 C 的連乘。

注:實際上有些層(例如 ReLU)其實是可以通過原位運算完成的,此時就不用統計輸出特征圖了。

2.CNN網絡的感受野

2.1感受野的含義

感受野是深度學習中最為重要的概念之一,定義為:在卷積神經網絡CNN中,決定某一層輸出結果中一個元素所對應的輸入層的區域大小,被稱作感受野(Receptive Field)。通俗來說就是卷積層輸出的一個點映射到輸入矩陣上的區域大小。感受野的大小直接影響到模型的輸出特征,如對於目標檢測模型,不同尺寸的目標所適配的感受野大小也不同,因此為了讓模型能夠適應多尺度的目標檢測,通常會借助圖像金字塔,或融合多個卷積層的特征,以獲得最佳的檢測性能。

為了更直觀的理解感受野,可以借助如下的示意圖(為了方便,將二維簡化成一維)。這是一個三層的 CNN 網絡,每一層卷積核的 kernel_size=3, stride=1 ,那么最上層的特征所對應的感受野為7x7。

2.2感受野的計算方式

其中 RF 表示特征感受野大小, l 表示層數,l=0 表示輸入層, 此時 RF0=1 , feature_stride_0=1 。

根據感受野的計算公式可以得到每一層的感受野大小:

第一層

第二層

第三層

但如果有dilated conv的話,計算公式為

3.梯度消失、爆炸的解決方案

深度學習的模型訓練通常采用梯度更新的方法,且一般層數越深,就可以處理更為復雜的問題。但是隨之也帶了許多弊端,如梯度消失與梯度爆炸。

3.1梯度消失

神經網絡的反向傳播是逐層對函數偏導相乘,因此當神經網絡層數非常深的時候,最后一層產生的偏差就因為乘了很多的小於1的數而越來越小,最終就會變為0,從而導致層數比較淺的權重沒有更新,這就是梯度消失。

產生的原因:

  • 網絡層數較深
  • 采用不合適的損失函數,比如sigmoid

3.2梯度爆炸

梯度爆炸與梯度消失類似,當每層的偏導數值都大於1時,經過多層的權重更新之后,梯度就會以指數形式增加,即為梯度爆炸。

產生原因:

  • 網絡層數較深
  • 權重初始值太大
  • 訓練樣本有誤

3.3解決方法

  • 逐層訓練加微調

    該方法由 Geoffrey Hinton 於2006年提出,具體流程為每次只訓練一層神經網絡,待權重穩定之后,再使用該層網絡的輸出進行后一層網絡的輸入,重復該步驟至訓練所有網絡層。最后再對整個模型進行finetune,得到最優的模型。

  • 梯度剪切

    梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然后更新梯度的時候,如果梯度超過這個閾值,那么就將其強制限制在這個范圍之內。這可以防止梯度爆炸。

  • 權重正則化

    比較常見的是L1正則,和L2正則,在各個深度框架中都有相應的API可以使用正則化。

  • relu、leakrelu、elu等激活函數

    Relu: 如果激活函數的導數為1,那么就不存在梯度消失爆炸的問題了,每層的網絡都可以得到相同的更新速度,relu就這樣應運而生。

  • batchnorm

    batchnorm全名是batch normalization,簡稱BN,即批規范化,通過規范化操作將輸出信號x規范化到均值為0,方差為1,保證網絡的穩定性。

  • 殘差結構

    殘差結構中的 shortcut 有效地避免了梯度消失與爆炸問題。

  • LSTM

    LSTM全稱是長短期記憶網絡(long-short term memory networks),是不那么容易發生梯度消失的,主要原因在於LSTM內部復雜的“門”(gates),如下圖,LSTM通過它內部的“門”可以接下來更新的時候“記住”前幾次訓練的”殘留記憶“,因此,經常用於生成文本中。

持續更新ing 。。。


免責聲明!

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



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