深度神經網路(DNN)

以下內容來自劉建平Pinard-博客園的學習筆記,總結如下:

深度神經網路(Deep Neural Networks, 以下簡稱DNN)是深度學習的基礎,而要理解DNN,首先我們要理解DNN模型,下面我們就對DNN的模型與前向傳播演算法做一個總結。

1 從感知機到神經網路

感知機的模型,它是一個有若干輸入和一個輸出的模型,如下圖:

輸出和輸入之間學習到一個線性關係,得到中間輸出結果:

接著是一個神經元激活函數:

從而得到想要的結果1或者-1.

這個模型只能用於二元分類,且無法學習比較複雜的非線性模型,因此在工業界無法使用。而神經網路則在感知機的模型上做了擴展,總結下主要有三點:

(1)加入了隱藏層,隱藏層可以有多層,增強模型的表達能力,如下圖實例,當然增加了這麼多隱藏層模型的複雜度也增加了好多。

(2)輸出層的神經元也可以不止一個輸出,可以有多個輸出,這樣模型可以靈活的應用於分類回歸,以及其他的機器學習領域比如降維和聚類等。多個神經元輸出的輸出層對應的一個實例如下圖,輸出層現在有4個神經元了。

(3)對激活函數做擴展,感知機的激活函數是 sign(z) ,雖然簡單但是處理能力有限,因此神經網路中一般使用的其他的激活函數,比如我們在邏輯回歸裡面使用過的Sigmoid函數,即:

f(z) = frac{1}{1+e^{-z}}

還有後來出現的tanx, softmax,和ReLU等。通過使用不同的激活函數,神經網路的表達能力進一步增強。

2 DNN的基本結構

神經網路是基於感知機的擴展,而DNN可以理解為有很多隱藏層的神經網路。多層神經網路和深度神經網路DNN其實也是指的一個東西,DNN有時也叫做多層感知機(Multi-Layer perceptron,MLP)。

  從DNN按不同層的位置劃分,DNN內部的神經網路層可以分為三類,輸入層,隱藏層和輸出層,如下圖示例,一般來說第一層是輸入層,最後一層是輸出層,而中間的層數都是隱藏層。

層與層之間是全連接的,也就是說,第i層的任意一個神經元一定與第i+1層的任意一個神經元相連。雖然DNN看起來很複雜,但是從小的局部模型來說,還是和感知機一樣,即一個線性關係 z = sum_{}^{}{w_{i} x_{i}}+b 加上一個激活函數 sigma(z)

由於DNN層數多,則我們的線性關係係數w和偏倚b的數量也就是很多了。具體的參數在DNN是如何定義的呢?

首先看線性關係係數w的定義。以下圖一個三層的DNN為例,第二層的第4個神經元到第三層的第2個神經元的線性關係定義為 w_{24}^{3} .上標3代表線性係數w所在的層數,而下標對應的是輸出的第三層索引2和輸入的第二層索引4。你也許會問,為什麼不是 w_{42}^{3} 呢?這主要是為了便於模型用於矩陣表示運算,如果是 w_{42}^{3} 而每次進行矩陣運算是 w^{T}x+b ,需要進行轉置。將輸出的索引放在前面的話,則線性運算不用轉置,即直接為 wx+b 。第l?1層的第k個神經元到第l層的第j個神經元的線性係數定義為 w_{jk}^{l} 。注意,輸入層是沒有w參數的。

再看偏倚b的定義。還是以這個三層的DNN為例,第二層的第三個神經元對應的偏倚定義為 b_{3}^{2} .其中,上標2代表所在的層數,下標3代表偏倚所在的神經元的索引。同樣的道理,第三層的第一個神經元的偏倚應該表示為 a_{1}^{3} .輸出層是沒有偏倚參數的。

3 DNN前向傳播演算法數學原理

假設選擇的激活函數是 sigma(z) ,隱藏層和輸出層的輸出值為 a ,則對於下圖的三層DNN,利用和感知機一樣的思路,我們可以利用上一層的輸出計算下一層的輸出,也就是所謂的DNN前向傳播演算法。

從上面可以看出,使用代數法一個個的表示輸出比較複雜,而如果使用矩陣法則比較的簡潔。假設第l?1層共有m個神經元,而第l層共有n個神經元,則第l層的線性係數w組成了一個n×m的矩陣 W^{l} 。第l層的偏倚b組成了一個 n	imes 1 的向量 b^{l} ,第l-1層的輸出 a 組成了一個 m	imes1 的向量 a^{l-1} ,第l層的未激活前線性輸出z組成了一個 n	imes1 的向量 z^{l} ,第l層的輸出 a 組成了一個 n	imes1 的向量 a^{l} 。用矩陣法表示,第l層的輸出為:

4 DNN前向傳播演算法

所謂的DNN前向傳播演算法就是利用若干個權重係數矩陣W,偏倚向量b來和輸入值向量x進行一系列線性運算和激活運算,從輸入層開始,一層層的向後計算,一直到運算到輸出層,得到輸出結果為值。

輸入: 總層數L,所有隱藏層和輸出層對應的矩陣W,偏倚向量b,輸入值向量x

輸出:輸出層的輸出。

5 DNN反向傳播演算法要解決的問題

假設我們有m個訓練樣本 left{ (x_{1} ,y_{1}),(x_{2} ,y_{2}),...,(x_{m} ,y_{m})
ight} ,其中x為輸入向量,特徵維度為n_in,而y為輸出向量,特徵維度為n_out。我們需要利用這m個樣本訓練出一個模型,當有一個新的測試樣本 (x_{test},?) 時,可以預測 y_{test} 向量的輸出。

如果我們採用DNN的模型,即我們使輸入層n_in個神經元,而輸出層有n_out個神經元。再加上一些含有若干神經元的隱藏層。此時需要找到合適的所有隱藏層和輸出層對應的線性係數矩陣 W ,偏倚向量 b ,讓所有的訓練樣本輸入計算出的輸出儘可能的等於或很接近樣本輸出。怎麼找到合適的參數呢?

可以用一個合適的損失函數來度量訓練樣本的輸出損失,接著對這個損失函數進行優化求最小化的極值,對應的一系列線性係數矩陣W,偏倚向量b即為我們的最終結果。在DNN中,損失函數優化極值求解的過程最常見的一般是通過梯度下降法來一步步迭代完成的,也可以是其他的迭代方法比如牛頓法與擬牛頓法。

6 DNN反向傳播演算法的基本思路

在進行DNN反向傳播演算法前,我們需要選擇一個損失函數,來度量訓練樣本計算出的輸出和真實的訓練樣本輸出之間的損失。

DNN可選擇的損失函數有不少,為了專註演算法,這裡使用最常見的均方差來度量損失。即對於每個樣本,我們期望最小化下式:

損失函數有了,用梯度下降法迭代求解每一層的w,b。

首先是輸出層第 L 層。注意到輸出層的W,b滿足下式:

對於輸出層的參數,損失函數變為:

求解W,b的梯度:

7 DNN反向傳播演算法過程

由於梯度下降法有批量(Batch),小批量(mini-Batch),隨機三個變種,為了簡化描述,這裡我們以最基本的批量梯度下降法為例來描述反向傳播演算法。實際上在業界使用最多的是mini-Batch的梯度下降法。區別僅僅在於迭代時訓練樣本的選擇。

輸入:總層數 L ,以及各隱藏層與輸出層的神經元個數,激活函數,損失函數,迭代步長 a ,最大迭代次數 max 與停止迭代閾值 varepsilon ,輸入的m個訓練樣本

輸出:各隱藏層與輸出層的線性關係係數矩陣W和偏倚向量。

8 均方差損失函數+Sigmoid激活函數的問題

在講反向傳播演算法時,我們用均方差損失函數和Sigmoid激活函數做了實例,首先我們就來看看均方差+Sigmoid的組合有什麼問題。

首先我們回顧下Sigmoid激活函數的表達式為:

sigma(z) = frac{1}{e^{-z}}

sigma(z) 的函數圖像如下:

從上圖可以看出,對於Sigmoid,當z的取值越來越大後,函數曲線變得越來越平緩,意味著此時的導數 sigma^{}(z) 也越來越小。同樣的,當z的取值越來越小時,也有這個問題。僅僅在z取值為0附近時,導數 sigma^{}(z) 的取值較大。

在均方差+Sigmoid的反向傳播演算法中,每一層向前遞推都要乘以 sigma^{}(z) ,得到梯度變化值。Sigmoid的這個曲線意味著在大多數時候,我們的梯度變化值很小,導致我們的

W,b更新到極值的速度較慢,也就是我們的演算法收斂速度較慢。那麼有什麼什麼辦法可以改進呢?

9 交叉熵損失函數+Sigmoid激活函數改進DNN演算法收斂速度

推薦閱讀:

TAG:深度學習DeepLearning | 神經網路 |