首先讓咱們先回想起在以前博客(數據挖掘入門系列教程(七點五)之神經網絡介紹)中介紹的神經網絡:爲了解決M-P模型中沒法處理XOR等簡單的非線性可分的問題時,咱們提出了多層感知機,在輸入層和輸出層中間添加一層隱含層,這樣該網絡就能以任意精度逼近任意複雜度的連續函數。html
而後在數據挖掘入門系列教程(八)之使用神經網絡(基於pybrain)識別數字手寫集MNIST博客中,咱們使用相似上圖的神經網絡結構對MINIST數據集進行了訓練,最後在epochs = 100
的條件下,F1 socre達到了約\(86\%\)。算法
這個時候咱們想想,若是咱們將中間的隱含層由一層變爲多層,以下圖所示:網絡
那麼該網絡就變成了深度神經網絡(DNN),也能夠稱之爲多層感知機(Multi-Layer perceptron,MLP)。函數
下面將對這個網絡進行介紹以及公式推導。學習
在上面的圖中,咱們能夠很容易的觀察到,在DNN中,層與層之間是全鏈接的,也就是如同感知機同樣,第\(i\)層的任意一個神經元與第\(i+1\)層的任意一個神經元都有鏈接。儘管這個網絡看起來很龐大複雜,可是若是咱們只看某一小部分,實際上它的原理與感知機很相似。優化
如同感知機,咱們能夠很簡單的知道:ui
對於\(LayerL_2\)的輸出,可知:spa
對於\(w\)的參數上標下標解釋,如下圖爲例:.net
對於\(w_{24}^3\),上標3表明\(w\)所在的層數,下標2對應的是第三層的索引2,下標4對應的是第二層的索引4。至於爲何標記爲\(w_{24}^3\)而不是\(w_{42}^3\),咱們能夠從矩陣計算的角度進行考慮:3d
在下圖中,爲了獲得\(a\),咱們能夠直接使用\(a = Wx\),也可以使用\(a = W^Tx\)這種形式,可是對於第二種形式,咱們須要使用轉置,這樣會加大計算量,所以咱們採用第一種形式。
對於\(LayerL_3\)的輸出,可知:
假設咱們在\(l-1\)層一共有\(m\)個神經元,對於第\(l\)層第\(j\)個神經元的輸出\(a_j^l\),有:
若是咱們採用矩陣的方式進行表示,則第\(l\)層的輸出爲:
所以,咱們能夠對DNN的前向傳播算法進行推導,從輸入到輸出有:
輸入: 總層數\(L\),全部隱藏層和輸出層對應的矩陣\(W\),偏倚向量\(b\),輸入值向量\(x\)
輸出:輸出層的輸出\(a^L\)
1) 初始化\(a^1 = x\)
2) for \(l=2\) to \(L\),計算:
\[\begin{equation}a^{l}=\sigma\left(z^{l}\right)=\sigma\left(W^{l} a^{l-1}+b^{l}\right)\end{equation} \]最後結果的輸出即爲\(a^L\)
以上即是DNN的前向傳播算法,實際上挺簡單的,就是一層一層向下遞歸。
在數據挖掘入門系列教程(七點五)之神經網絡介紹中,咱們提到過BP算法,並進行過詳細的數學公式的推導。BP算法的目的就是爲了尋找合適的\(W,b\)使得損失函數\(Loss\)達到某一個比較小的值(極小值)。
在DNN中,損失函數優化極值求解的過程最多見的通常是經過梯度降低法來一步步迭代完成的,固然也有其餘的方法。而在這裏,咱們將使用梯度降低法對DNN中的反向傳播算法進行必定的數學公式推導。圖片和部分過程參考了Youtube:反向傳播算法,可是對其中的某一些圖片進行了修改。
在左邊的圖片中,是一個比較複雜的DNN網絡,咱們針對該DNN網絡進行簡化,將其當作每一層只有一個神經元的網絡,如右圖所示
此時咱們還能夠將問題進行簡化,若是咱們只看簡化模型的最後面兩個神經元,則有:
\(y\)表明指望值,\(C_o\)表明損失函數\(\mathrm{C_0}=\operatorname{Loss}=\left(a^{(L)}-y\right)^{2}\),\(\sigma\)表明激活函數,好比說Relu,sigmoid,具體的表達式在圖中,我就不寫出來了。
在下圖所示,當\(w^{(L)}\)發生微小的改變(\(\partial w^{(L)}\))時,會經過一連串的反應使得\(C_0\)發生微小的改變:相似蝴蝶扇動翅膀同樣,響應流程以下\(\partial w^{(L)} \longrightarrow z^{(L)} \longrightarrow a^{(L)} \longrightarrow C_0\)。
此時咱們對\(C_0\)求其\(W^L\)的偏導,則獲得了下式:
咱們分別求各自偏導的結果:
綜上,結果爲:
同理咱們可得:
這時候,咱們能夠稍微將問題複雜化一點,考慮多個神經元以下圖所示,那麼此時全部的變量\(W,x,b,z,a,y\)也就變成了一個矩陣:
求導結果以下(這裏咱們使得Loss爲\(J(W, b, x, y)=\frac{1}{2}\left\|a^{L}-y\right\|_{2}^{2}\)表示,表明Loss與\(W, b, x, y\)有關):
注意上式中有一個符號\(\odot\),它表明Hadamard積, 對於兩個維度相同的向量 \(A\left(a_{1}, a_{2}, \ldots a_{n}\right)^T 和 B\left(b_{1}, b_{2}, \ldots b_{n}\right)^{T},\) 則 \(A \odot B=\) \(\left(a_{1} b_{1}, a_{2} b_{2}, \ldots a_{n} b_{n}\right)^{T}\)。怎麼理解這個變量呢?從一個不怎麼嚴謹的角度進行理解:
假設第\(L-1\)層有\(i\)個神經元,第\(L\)層有\(j\)個神經元(如上圖所示),那麼毋庸置疑,\(\partial W\)爲一個\(j \times i\)的矩陣(由於\(W\)爲一個\(j \times i\)的矩陣,至於爲何,前面前向傳播中已經提到了)。\(A \odot B\)則是一個\(j \times 1\)的矩陣,而後與\(\left(a^{L-1}\right)^{T}\)*(它是一個$1 \times i \(的矩陣)*相乘,最後結果則爲一個\)j \times i$的矩陣。
在求導的結果\(\frac{\partial J(W, b, x, y)}{\partial W^{L}} 和 \frac{\partial J(W, b, x, y)}{\partial b^{L}}\)有公共部分,也就是\(\frac{\partial J(W, b, x, y)}{\partial z^{L}}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right)\),表明輸出層的梯度,所以咱們令:
根據前向傳播算法,對於與第\(l\)層的\(W^l 和 b^l\)的梯度有以下結論:
所以問題就變成了如何求得任意一層\(l\)的\(\delta^{l}\),假設咱們一共有\(L\)層,則對於\(\delta^{L}\)咱們仍是可以直接進行求解\(\delta^{L}=\left(a^{L}-y\right) \odot \sigma^{\prime}\left(z^{L}\right)\),那麼咱們如何對\(L-1\)層進行求解呢?
設第\(l+1\)層的\(\delta^{l+1}\)已知,則對\(\delta^{l}\)的求解以下:
也就是說,求解關鍵點又到了\((\frac{\partial z^{l+1}}{\partial z^{l}})^T\)的求解,根據前向傳播算法:
所以,有:
綜上可得:
所以當咱們能夠獲得任意一層的\(\delta^{l}\)時,咱們也就能夠對任意的\(W^l和b^l\)進行求解。
下面算法流程是copy深度神經網絡(DNN)反向傳播算法(BP)的,由於他寫的比我好多了,我就直接用他的了。
如今咱們總結下DNN反向傳播算法的過程。因爲梯度降低法有批量(Batch),小批量(mini-Batch),隨機三個變種, 爲了簡化描述, 這裏咱們以最基本的批量梯度降低法爲例來描述反向傳播算法。實際上在業界使用最多的是mini-Batch的 梯度降低法。不過區別又僅在於迭代時訓練樣本的選擇而已。
輸入: 總層數\(L\), 以及各隱藏層與輸出層的神經元個數, 激活函數, 損失函數, 選代步長 \(\alpha\),最大迭代次數\(MAX\)與中止迭代閾值\(\epsilon\), 輸入的\(m\)個訓練樣本 \(\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right), \ldots,\left(x_{m}, y_{m}\right)\right\}\)。
輸出: 各隱藏層與輸出層的線性關係係數矩陣 \(W\) 和偏倚向量\(b\)
初始化各隱藏層與輸出層的線性關係係數矩陣\(W\)和偏倚向量\(b\)的值爲一個隨機值。
for iter to 1 to MAX:
2.1 for \(i=1\) to \(m\) :
a. 將DNN輸入 \(a^{1}\) 設置爲 \(x_{i}\)
b. for \(l=2\) to \(L,\) 進行前向傳播算法計算 \(a^{i, l}=\sigma\left(z^{i, l}\right)=\sigma\left(W^{l} a^{i, l-1}+b^{l}\right)\)
c. 經過損失函數計算輸出層的 \(\delta^{i, L}\)
d. for \(l=\) L-1 to 2 , 進行反向傳播算法計算 \(\delta^{i, l}=\left(W^{l+1}\right)^{T} \delta^{i, l+1} \odot \sigma^{\prime}\left(z^{i, l}\right)\)
2.2 for \(l=2\) to \(\mathrm{L},\) 更新第\(l\)層的 \(W^{l}, b^{l}:\)
2-3. 若是全部\(W,b\)的變化值都小於中止迭代閾值 \(\epsilon,\) 則跳出迭代循環到步驟3。
這一篇博客主要是介紹瞭如下內容:
原本是想在這一章博客中將CNN也介紹一下,可是想了想,可能仍是分開介紹比較好。所以我將會在下一篇博客中主要會對CNN進行介紹以及部分推導。