深度神經網絡(Deep Neural Networks, 如下簡稱DNN)是深度學習的基礎,而要理解DNN,首先咱們要理解DNN模型,下面咱們就對DNN的模型與前向傳播算法作一個總結。html
在感知機原理小結中,咱們介紹過感知機的模型,它是一個有若干輸入和一個輸出的模型,以下圖:算法
輸出和輸入之間學習到一個線性關係,獲得中間輸出結果:$$z=\sum\limits_{i=1}^mw_ix_i + b$$網絡
接着是一個神經元激活函數:機器學習
$$sign(z)=
\begin{cases}
-1& {z<0}\\
1& {z\geq 0}
\end{cases}$$函數
從而獲得咱們想要的輸出結果1或者-1。學習
這個模型只能用於二元分類,且沒法學習比較複雜的非線性模型,所以在工業界沒法使用。3d
而神經網絡則在感知機的模型上作了擴展,總結下主要有三點:htm
1)加入了隱藏層,隱藏層能夠有多層,加強模型的表達能力,以下圖實例,固然增長了這麼多隱藏層模型的複雜度也增長了好多。blog
2)輸出層的神經元也能夠不止一個輸出,能夠有多個輸出,這樣模型能夠靈活的應用於分類迴歸,以及其餘的機器學習領域好比降維和聚類等。多個神經元輸出的輸出層對應的一個實例以下圖,輸出層如今有4個神經元了。索引
3) 對激活函數作擴展,感知機的激活函數是$sign(z)$,雖然簡單可是處理能力有限,所以神經網絡中通常使用的其餘的激活函數,好比咱們在邏輯迴歸裏面使用過的Sigmoid函數,即:$$f(z)=\frac{1}{1+e^{-z}}$$
還有後來出現的tanx, softmax,和ReLU等。經過使用不一樣的激活函數,神經網絡的表達能力進一步加強。對於各類經常使用的激活函數,咱們在後面再專門講。
上一節咱們瞭解了神經網絡基於感知機的擴展,而DNN能夠理解爲有不少隱藏層的神經網絡。這個不少其實也沒有什麼度量標準, 多層神經網絡和深度神經網絡DNN其實也是指的一個東西,固然,DNN有時也叫作多層感知機(Multi-Layer perceptron,MLP), 名字實在是多。後面咱們講到的神經網絡都默認爲DNN。
從DNN按不一樣層的位置劃分,DNN內部的神經網絡層能夠分爲三類,輸入層,隱藏層和輸出層,以下圖示例,通常來講第一層是輸入層,最後一層是輸出層,而中間的層數都是隱藏層。
層與層之間是全鏈接的,也就是說,第i層的任意一個神經元必定與第i+1層的任意一個神經元相連。雖然DNN看起來很複雜,可是從小的局部模型來講,仍是和感知機同樣,即一個線性關係$z=\sum\limits w_ix_i + b$加上一個激活函數$\sigma(z)$。
因爲DNN層數多,則咱們的線性關係係數$w$和偏倚$b$的數量也就是不少了。具體的參數在DNN是如何定義的呢?
首先咱們來看看線性關係係數$w$的定義。如下圖一個三層的DNN爲例,第二層的第4個神經元到第三層的第2個神經元的線性係數定義爲$w_{24}^3$。上標3表明線性係數$w$所在的層數,而下標對應的是輸出的第三層索引2和輸入的第二層索引4。你也許會問,爲何不是$w_{42}^3$, 而是$w_{24}^3$呢?這主要是爲了便於模型用於矩陣表示運算,若是是$w_{42}^3$而每次進行矩陣運算是$w^Tx+b$,須要進行轉置。將輸出的索引放在前面的話,則線性運算不用轉置,即直接爲$wx+b$。總結下,第$l-1$層的第k個神經元到第$l$層的第j個神經元的線性係數定義爲$w_{jk}^l$。注意,輸入層是沒有$w$參數的。
再來看看偏倚$b$的定義。仍是以這個三層的DNN爲例,第二層的第三個神經元對應的偏倚定義爲$b_3^{2}$。其中,上標2表明所在的層數,下標3表明偏倚所在的神經元的索引。一樣的道理,第三個的第一個神經元的偏倚應該表示爲$b_1^{3}$。一樣的,輸入層是沒有偏倚參數$b$的。
在上一節,咱們已經介紹了DNN各層線性關係係數$w$,偏倚$b$的定義。假設咱們選擇的激活函數是$\sigma(z)$,隱藏層和輸出層的輸出值爲$a$,則對於下圖的三層DNN,利用和感知機同樣的思路,咱們能夠利用上一層的輸出計算下一層的輸出,也就是所謂的DNN前向傳播算法。
對於第二層的的輸出$a_1^2,a_2^2,a_3^2$,咱們有:$$a_1^2=\sigma(z_1^2) = \sigma(w_{11}^2x_1 + w_{12}^2x_2 + w_{13}^2x_3 + b_1^{2})$$$$a_2^2=\sigma(z_2^2) = \sigma(w_{21}^2x_1 + w_{22}^2x_2 + w_{23}^2x_3 + b_2^{2})$$$$a_3^2=\sigma(z_3^2) = \sigma(w_{31}^2x_1 + w_{32}^2x_2 + w_{33}^2x_3 + b_3^{2})$$
對於第三層的的輸出$a_1^3$,咱們有:$$a_1^3=\sigma(z_1^3) = \sigma(w_{11}^3a_1^2 + w_{12}^3a_2^2 + w_{13}^3a_3^2 + b_1^{3})$$
將上面的例子通常化,假設第$l-1$層共有m個神經元,則對於第$l$層的第j個神經元的輸出$a_j^l$,咱們有:$$a_j^l = \sigma(z_j^l) = \sigma(\sum\limits_{k=1}^mw_{jk}^la_k^{l-1} + b_j^l)$$
其中,若是$l=2$,則對於的$a_k^1$即爲輸入層的$x_k$。
從上面能夠看出,使用代數法一個個的表示輸出比較複雜,而若是使用矩陣法則比較的簡潔。假設第$l-1$層共有m個神經元,而第$l$層共有n個神經元,則第$l$層的線性係數$w$組成了一個$n \times m$的矩陣$W^l$, 第$l$層的偏倚$b$組成了一個$n \times 1$的向量$b^l$ , 第$l-1$層的的輸出$a$組成了一個$m \times 1$的向量$a^{l-1}$,第$l$層的的未激活前線性輸出$z$組成了一個$n \times 1$的向量$z^{l}$, 第$l$層的的輸出$a$組成了一個$n \times 1$的向量$a^{l}$。則用矩陣法表示,第l層的輸出爲:$$a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)$$
這個表示方法簡潔漂亮,後面咱們的討論都會基於上面的這個矩陣法表示來。
有了上一節的數學推導,DNN的前向傳播算法也就不難了。所謂的DNN的前向傳播算法也就是利用咱們的若干個權重係數矩陣$W$,偏倚向量$b$來和輸入值向量$x$進行一系列線性運算和激活運算,從輸入層開始,一層層的向後計算,一直到運算到輸出層,獲得輸出結果爲值。
輸入: 總層數L,全部隱藏層和輸出層對應的矩陣$W$,偏倚向量$b$,輸入值向量$x$
輸出:輸出層的輸出$a^L$
1) 初始化$a^1 = x $
2) for $l = 2$ to $L$, 計算:$$a^l = \sigma(z^l) = \sigma(W^la^{l-1} + b^l)$$
最後的結果即爲輸出$a^L$。
單獨看DNN前向傳播算法,彷佛沒有什麼大用處,並且這一大堆的矩陣$W$,偏倚向量$b$對應的參數怎麼得到呢?怎麼獲得最優的矩陣$W$,偏倚向量$b$呢?這個咱們在講DNN的反向傳播算法時再講。而理解反向傳播算法的前提就是理解DNN的模型與前向傳播算法。這也是咱們這一篇先講的緣由。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)
1) Neural Networks and Deep Learning by By Michael Nielsen
2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville