【DL筆記4】神經網路詳解,正向傳播和反向傳播

weixin_34236497發表於2018-08-02

好久沒寫了,之前是每週都會寫一兩篇,前段時候回家陪爸媽旅遊了 ̄▽ ̄,這段時候又在學習keras並復現一些模型,所以一直沒寫。今天8月第一天,趕緊寫一篇,免得手生了。
之前的筆記:
【DL筆記1】Logistic迴歸:最基礎的神經網路
【DL筆記2】神經網路程式設計原則&Logistic Regression的演算法解析
【DL筆記3】一步步親手用python實現Logistic Regression
主要講了Logistic regression的內容,裡面涉及到很多基本概念,是學習神經網路的基礎。下面我們由Logistic regression升級到神經網路,首先我們看看“淺層神經網路(Shallow Neural Network)”

一、什麼是神經網路

我們這裡講解的神經網路,就是在Logistic regression的基礎上增加了一個或幾個隱層(hidden layer),下面展示的是一個最最最簡單的神經網路,只有兩層:

5118838-5e0e3f3302d6d8cf.png
兩層神經網路

需要注意的是,上面的圖是“兩層”,而不是三層或者四層,輸入和輸出不算層!
這裡,我們先規定一下記號(Notation)

  • z是x和w、b線性運算的結果,z=wx+b;
  • a是z的啟用值;
  • 下標的1,2,3,4代表該層的第i個神經元(unit);
  • 上標的[1],[2]等代表當前是第幾層
  • y^代表模型的輸出,y才是真實值,也就是標籤

另外,有一點經常搞混:

  • 上圖中的x1,x2,x3,x4不是代表4個樣本!
    是一個樣本的四個特徵(4個維度的值)!
    你如果有m個樣本,代表要把上圖的過程重複m次:
    5118838-562288e747348f98.png

神經網路的“兩個傳播”:

  • 前向傳播(Forward Propagation)
    前向傳播就是從input,經過一層層的layer,不斷計算每一層的z和a,最後得到輸出y^ 的過程,計算出了y^,就可以根據它和真實值y的差別來計算損失(loss)。
  • 反向傳播(Backward Propagation)
    反向傳播就是根據損失函式L(y^,y)來反方向地計算每一層的z、a、w、b的偏導數(梯度),從而更新引數。
    5118838-e7f5f61e3aff398a.png
    前向傳播和反向傳播

每經過一次前向傳播和反向傳播之後,引數就更新一次,然後用新的引數再次迴圈上面的過程。這就是神經網路訓練的整個過程。

二、前向傳播

如果用for迴圈一個樣本一個樣本的計算,顯然太慢,看過我的前幾個筆記的朋友應該知道,我們是使用Vectorization,把m個樣本壓縮成一個向量X來計算,同樣的把z、a都進行向量化處理得到Z、A,這樣就可以對m的樣本同時進行表示和計算了。(不熟悉的朋友可以看這裡:傳送門

這樣,我們用公式在表示一下我們的兩層神經網路的前向傳播過程:
Layer 1:
Z[1] = W[1]·X + b[1]
A[1] = σ(Z[1])
Layer 2:
Z[2] = W[2]·A[1] + b[2]
A[2] = σ(Z[2])

而我們知道,X其實就是A[0],所以不難看出:
每一層的計算都是一樣的:
Layer i:
Z[i] = W[i]·A[i-1] + b[i]
A[i] = σ(Z[i])
(注:σ是sigmoid函式)
因此,其實不管我們神經網路有幾層,都是將上面過程的重複。

對於損失函式,就跟Logistic regression中的一樣,使用“交叉熵(cross-entropy)”,公式就是

  • 二分類問題:
    L(y^,y) = -[y·log(y^ )+(1-y)·log(1-y^ )]
  • 多分類問題:
    L=-Σy(j)·y^(j)

這個是每個樣本的loss,我們一般還要計算整個樣本集的loss,也稱為cost,用J表示,J就是L的平均:
J(W,b) = 1/m·ΣL(y^(i),y(i))

上面的求Z、A、L、J的過程就是正向傳播。

三、反向傳播

反向傳播說白了根據根據J的公式對W和b求偏導,也就是求梯度。因為我們需要用梯度下降法來對引數進行更新,而更新就需要梯度。
但是,根據求偏導的鏈式法則我們知道,第l層的引數的梯度,需要通過l+1層的梯度來求得,因此我們求導的過程是“反向”的,這也就是為什麼叫“反向傳播”。

具體求導的過程,這裡就不贅述了,有興趣的可以自己推導,雖然我覺得多數人看到這種東西都不想推導了。。。(主要還是我懶的打公式了T_T")

而且,像各種深度學習框架TensorFlow、Keras,它們都是只需要我們自己構建正向傳播過程反向傳播的過程是自動完成的,所以大家也確實不用操這個心。

進行了反向傳播之後,我們就可以根據每一層的引數的梯度來更新引數了,更新了之後,重複正向、反向傳播的過程,就可以不斷訓練學習更好的引數了。

四、深層神經網路(Deep Neural Network)

前面的講解都是拿一個兩層的很淺的神經網路為例的。
深層神經網路也沒什麼神祕,就是多了幾個/幾十個/上百個hidden layers罷了。
可以用一個簡單的示意圖表示:


5118838-4774eb3b6c161c47.png
深層神經網路

注意,在深層神經網路中,我們在中間層使用了“ReLU”啟用函式,而不是sigmoid函式了,只有在最後的輸出層才使用了sigmoid函式,這是因為ReLU函式在求梯度的時候更快,還可以一定程度上防止梯度消失現象因此在深層的網路中常常採用。關於啟用函式的問題,可以參閱:
【DL筆記】神經網路中的啟用(Activation)函式及其對比

關於深層神經網路,我們有必要再詳細的觀察一下它的結構,尤其是每一層的各個變數的維度,畢竟我們在搭建模型的時候,維度至關重要。

5118838-c6ae206db3eb7611.png
深層神經網路

我們設:
總共有m個樣本,問題為二分類問題(即y為0,1);
網路總共有L層,當前層為l層(l=1,2,...,L);
第l層的單元數為n[l]
那麼下面引數或變數的維度為:

  • W[l]:(n[l],n[l-1])(該層的單元數,上層的單元數)
  • b[l]:(n[l],1)
  • z[l]:(n[l],1)
  • Z[l]:(n[l],m)
  • a[l]:(n[l],1)
  • A[l]:(n[l],m)
  • X:(n[0],m)
  • Y:(1,m)

可能有人問,為什麼W和b的維度裡面沒有m
因為W和b對每個樣本都是一樣的,所有樣本採用同一套引數(W,b)
而Z和A就不一樣了,雖然計算時的引數一樣,但是樣本不一樣的話,計算結果也不一樣,所以維度中有m。

深度神經網路的正向傳播、反向傳播和前面寫的2層的神經網路類似,就是多了幾層,然後中間的啟用函式由sigmoid變為ReLU了。

That's it!以上就是神經網路的詳細介紹了。
接下來的文章會介紹神經網路的調參、正則化、優化等等問題,以及TensorFlow的使用,並用TF框架搭建一個神經網路
往期文章:
歡迎關注我的專欄:
DeepLearning.ai學習筆記
和我一起一步步學習深度學習。
專欄其他文章:
【DL筆記1】Logistic迴歸:最基礎的神經網路
【DL筆記2】神經網路程式設計原則&Logistic Regression的演算法解析
【DL筆記3】一步步親手用python實現Logistic Regression
【DL筆記】神經網路引數初始化的學問
【DL筆記】神經網路中的優化演算法

相關文章