1. 程式人生 > 其它 >深度學習以及卷積基礎

深度學習以及卷積基礎

作者:石文華

編輯:龔 賽

介 紹

深度學習是機器學習的一個分支,是基於資料來學習表示資料的一組演算法。下面我們列出最受歡迎的一些深度學習演算法。

  • 卷積神經網路
  • 深度信念網路
  • 自動編碼器
  • 遞迴神經網路(RNN / LSTM / GRU)
  • 對抗生成網路(GAN)

深度學習的目的之一是他們將取代手工製作的特徵提取。這個想法是,他們將從給定的資料中“學習”到所需的最佳特徵。

層與層

深度學習模型由多層構成,在人工神經網路的情況下,具有2個以上隱藏層的多層感知器(MLP)已經是深度模型。 作為一個經驗法則,深層模型有可能比淺層模型表現更好。但是,越深的神經網路你需要越多的資料來避免過擬合。

層型別

這裡列出一些最常用的圖層:

  1. 卷積層
  2. 最大/平均池化層
  3. Dropout層
  4. 批量標準化層
  5. 全連線層
  6. Relu,Tanh,Sigmoid層(非線性層)
  7. Softmax,交叉熵,SVM,歐幾里得(損失層)

避免過擬合(正則化)

除了獲得更多的資料之外,還有一些技巧用於解決過度擬合問題,這裡列出了一些最常見的技術:

  • Dropout
  • L2正則化
  • 資料增強

Dropout

這是一種在訓練期間隨機關閉全連線層中一些神經元的技術。

Dropout迫使全連線層以不同的方式學習相同的概念。

L2正則化

最常見的正則化形式是L2正則化,L2正則化是給損失函式新增一個額外的懲罰項,這個懲罰項也就是我們正在優化的所有權重/引數的平方值。對於神經網路的每一個引數ω,我們加入一項0.5λω²到損失函式中去,λ表示正則化強度的引數,當我們反向傳播計算導數時,我們只是用了0.5λ作為正則化的強度。由於使用這種正規化,非常高價值的權重受到嚴重懲罰。所以我們更傾向於使用一層的所有權重作為輸入,而不是少數一些權重帶替代。這種方法的效果比較好,因為我們的模型權重將被最大限度地利用,並且我們有更少未使用的權重。

除了L2正則化之外,還有L1正則化和Max Norm,但這裡沒有討論,因為L2一般表現更好。

資料增強

通過對輸入資料進行一些轉換,可以合成新的訓練樣例。例如,進行影象翻轉或隨機移動RGB值。在2012年Imagenet競賽期間,Alex Krizhevesky(Alexnet)使用了2048倍的因子進行資料增強,這意味著用於訓練其模型的資料集實際上比開始時大2048倍,並且在不使用資料增強的情況下改進了泛化。

分層的特徵表示

它是讓學習演算法找到從輸入到更深層的最佳表示。 淺層學會用簡單的形式表示資料,深層用前面學到的特徵來學習更高緯度的特徵來表示資料。

卷 積

卷積是一種數學運算,它對兩個函式(訊號)乘積進行積分,其中一個訊號是被翻轉。例如下面我們對2個訊號f(t)和g(t)進行卷積。

首先要做的是水平翻轉(180度)訊號g,然後將翻轉後的g滑過f,對應相乘並累加所有的值。 conv(a,b)== conv(b,a)的結果是一樣的, 在這種情況下,規定藍色訊號 F(τ)F(τ) 是我們的輸入訊號和 G(t )G(Ť) 作為我們的卷積核,當使用卷積來過濾訊號時使用術語卷積核。

輸出一維訊號

在一維卷積的情況下,輸出尺寸計算如下: outputSize=(InputSize−KernelSize)+1

卷積的應用

人們在以下用例中對訊號處理使用卷積:

  • 濾波器訊號(1D音訊,2D影象處理)
  • 檢查一個訊號與另一個訊號的相關程度
  • 在訊號中查詢模式

在matlab和python(numpy)中的簡單例子

下面我們將兩個訊號x =(0,1,2,3,4)與w =(1,-1,2)進行卷積。

手工操作

為了更好地理解卷積的概念,我們手工完成上面的例子。我們要卷積2個訊號(x,w)。首先是水平翻轉W(或向左旋轉180度)

之後,我們將翻轉的W滑過輸入X.

注意到在步驟3,4,5中,翻轉後的視窗完全位於輸入訊號的內部。稱為“有效”卷積。在翻轉視窗不完全位於輸入視窗(X)內部的情況下,我們可以將其視為零,只計算位於視窗內的資料,例如在步驟1中,我們將1乘以零,其餘部分將被忽略。

對輸入進行填充

為了保持卷積結果大小與輸入大小相同,並避免稱為迴圈卷積的效應,我們用零填充訊號。 你把零放在哪個位置取決於你想要做什麼,例如:在1D的情況下,你可以在每一端連線它們,但在2D上它通常放置在原始訊號周圍。

在matlab上,你可以使用命令'padarray'來填充輸入訊號: >> x

x(:,:,1) =

 1     1     0     2     0
 2     2     2     2     1
 0     0     0     2     1
 2     2     2     2     1
 2     0     2     2     1

x(:,:,2) =

 2     1     0     0     0
 0     2     0     1     0
 1     0     1     2     0
 1     2     0     2     1
 1     2     1     2     2

x(:,:,3) =

 2     1     1     2     2
 1     1     1     0     0
 2     0     1     0     2
 0     2     0     2     1
 0     0     2     1     0

>> padarray(x,[1 1])

ans(:,:,1) =

 0     0     0     0     0     0     0
 0     1     1     0     2     0     0
 0     2     2     2     2     1     0
 0     0     0     0     2     1     0
 0     2     2     2     2     1     0
 0     2     0     2     2     1     0
 0     0     0     0     0     0     0

ans(:,:,2) =

 0     0     0     0     0     0     0
 0     2     1     0     0     0     0
 0     0     2     0     1     0     0
 0     1     0     1     2     0     0
 0     1     2     0     2     1     0
 0     1     2     1     2     2     0
 0     0     0     0     0     0     0

ans(:,:,3) =

 0     0     0     0     0     0     0
 0     2     1     1     2     2     0
 0     1     1     1     0     0     0
 0     2     0     1     0     2     0
 0     0     2     0     2     1     0
 0     0     0     2     1     0     0
 0     0     0     0     0     0     0

將卷積轉化為計算圖

將操作轉化為計算圖,更容易計算每個節點引數的偏導數,這裡我們演示將之前的一維卷積轉化為計算圖,這也可以擴充套件到二維卷積。

計算圖的建立是在翻轉的核心完全插入被卷積的資料之前的。

之後我們將使用這個圖來推斷卷積層的輸入(x)和權重(w)的梯度。

2D卷積

現在我們延伸到第二個維度。2D卷積被用作影象濾波器。下面是一個2D影象卷積的例子:

Matlab與Python示例

手工操作

首先,我們應該翻轉核心,然後在輸入訊號上滑動核心。

步 長

預設情況下,當我們進行卷積運算時,我們的視窗每次移動一個畫素(步幅= 1),但是在卷積神經網路中我們需要移動多個畫素。例如,在使用大小為2的核心進行卷積時,我們將使用2的步幅。將步幅和核心大小都設定為2將導致輸出沿著兩個維度恰好為輸入大小的一半。 觀察紅色核心視窗下方的移動遠遠多於一個畫素。

2D的輸出尺寸

下面提供了一個公式計算我們卷積之後的輸出尺寸 。 如果我們考慮將由P填充的空間大小[H,W]的輸入與大小為F的方形核並使用步長S進行卷積,那麼卷積的輸出大小被定義為:

F是核心的大小,通常我們使用方形核心,所以F既是核心的寬度又是高度。

實現卷積運算

下面的示例將對一個5x5x3的輸入進行卷積,其中具有以下引數Stride=2,Pad=1,F=3(3x3核心)和K=2(兩個濾波器)的conv層。 我們的輸入有3個通道,所以需要3x3x3的核心權重。有2個過濾器(K = 2),所以最後會有2個輸出。計算這兩個輸出的大小為:(5 - 3 + 2)/ 2 + 1 = 3。得到最終的尺寸(3x3x2)。

仔細看看這個例子,我們需要計算2個卷積,不要忘了給每個3x3x3濾波器(w0,w1)新增偏差。

參考文獻

  • https://en.wikipedia.org/wiki/Convolution
  • https://www.khanacademy.org/math/differential-equations/laplace-transform/convolution-integral/v/introduction-to-the-convolution
  • http://www.dspguide.com/ch6/2.htm