深度學習以及卷積基礎
作者:石文華
編輯:龔 賽
介 紹
深度學習是機器學習的一個分支,是基於資料來學習表示資料的一組演算法。下面我們列出最受歡迎的一些深度學習演算法。
- 卷積神經網路
- 深度信念網路
- 自動編碼器
- 遞迴神經網路(RNN / LSTM / GRU)
- 對抗生成網路(GAN)
深度學習的目的之一是他們將取代手工製作的特徵提取。這個想法是,他們將從給定的資料中“學習”到所需的最佳特徵。
層與層
深度學習模型由多層構成,在人工神經網路的情況下,具有2個以上隱藏層的多層感知器(MLP)已經是深度模型。 作為一個經驗法則,深層模型有可能比淺層模型表現更好。但是,越深的神經網路你需要越多的資料來避免過擬合。
層型別
這裡列出一些最常用的圖層:
- 卷積層
- 最大/平均池化層
- Dropout層
- 批量標準化層
- 全連線層
- Relu,Tanh,Sigmoid層(非線性層)
- 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