《TensorFlow2.0》前饋神經網路和 BP 演算法

桃子醬K發表於2020-12-08

導讀:什麼是人工神經網路?人工神經網路有哪些分支?什麼是前饋神經網路?神經網路如何使用反向傳播?如何用keras搭建一個前饋神經網路架構?通過本篇文章,我們來解決以上問題。在閱讀本篇文章之前,希望你已經瞭解感知器,SVM,成本函式,梯度優化。

一、人工神經網路

1、人工神經網路主要分為兩種型別:

  • 前饋人工神經網路?(Feedforward neural networks)?,是最常用的神經網路型別?,一般定義為有向無環圖?訊號,只能沿著最終輸入的那個方向傳播。
  • ?另一種型別是反饋人工神經網路(?feedback neural networks?),也叫做遞迴神經網路,後面有一章專門介紹遞迴神經網路,本文只介紹前饋人工神經網路

2、深度學習(Deep Learning)和神經網路(Neural Network):

    Deep learning本身算是machine learning的一個分支,簡單可以理解為neural network的發展。
    這裡的neural network指的是傳統神經網路,neural network曾經是ML領域特別火熱的一個方向,但由於本身的一些缺點(過擬合,訓練慢等),所以中間20多年時間,神經網路很少被關注。
    那段時間基本是SVM和boosting演算法,後來Hinton和其他人一起提出了一個實際可行的deep learning框架,於是我們現在可以站在巨人的肩膀上。
    DL採用了神經網路相似的分層結構,但用了不同的訓練機制,傳統神經網路使用BP機制,DL整體上是一個layer-wise的訓練機制。之所以這樣做,是因為BP機制對於一個7層以上的network,殘差傳播到最前面的層已經變得太小,出現所謂的gradient diffusion(梯度擴散)。
    本篇文章介紹的前饋神經網路,屬於傳統神經網路,之所以寫這遍文章,是想更深入的瞭解神經網路,及對keras使用的熟悉。對後面幾篇介紹DL的文章,能更好的理解。

3、XOR

讓我們深入研究XOR異或(線性不可分函式)來感受一下人工神經網路的強大:
在這裡插入圖片描述

?AND是兩個輸入均為1,結果才為1
?OR是兩個 輸入至少有1個1,結果即為1?
XOR與它們不同?,XOR是當兩個輸入中有且僅有1個1,結果才為1?我們 

下面是XOR?、OR、?NAND和AND四種函式,有兩個輸入A和B時的輸出真值表?,從這個表我們可以檢驗OR、?NAND和AND組合函式的輸出,?與同樣輸入的XOR輸出相同:

ABA AND BA NAND BA OR BA XOR BA OR BA NAND B(A OR B) AND (A NAND B)
000100010
010111111
100111111
111010100

神經網路實現XOR:我們不使用單個感知器來表示XOR,?而將建立一個具有多人工神經元的人工神經網路?。每個神經元都近似一個線性函式?,每個樣本的特徵表述都被輸入到兩個神經元?,一個NAND神經元和一個OR神經元,?這些神經元的輸出將連線到第三個AND神經元上?,測試XOR的條件是否為真?。

二、BP演算法

1、多層感知器(MLP)

為了闡明反向傳播的定義,讓我們考慮一個與全連線的多層 MLP 相關聯的特定圖。多層感知器?(multilayer perceptron)?MLP?是最流行的人工神經網路之一,?它的名稱不太恰當?,多層感知器並非指單個帶有多個層次的感知器,?而是指可以是感知器的人工神經元組成的多個層次?。MPL的層次結構是一個有向無環圖?。通常?,每一層都全連線到下一層?,某一層上的每個人工神經元的輸出成為下一層若干人工神經元的輸入,?MLP至少有三層人工神經元?。

2、反向傳播演算法(BP)

反向傳播?BP?演算法經常用來連線優化演算法求解成本函式最小化問題,?比如梯度下降法,?這個演算法名稱是反向(?back)?和傳播?(propagation)?的合成詞?。是指誤差在網路層的流向,?理論上?反向傳播可以用於訓練具有任意層?、任意數量隱藏單元的前饋人工神經網路?,但是計算能力的實際限制會約束反向傳播的能力?。

三、神經網路設計

1、人工神經網路的三個組成部分?:

  • 第一個組成部分是架構?(architecture)??或稱為拓撲結構( ?topology),??描述神經元的層次與連線神經元的結構?;
  • 第二個組成部分是神經網路使用的激勵函式;
  • 第三個組成部分是找出最優權重值的學習演算法?。

2、keras實現全連線的前饋神經網路:

form tensorflow.keras.utils import plot_model
from tensorflow.keras import Model
from tensorflow.keras import layers

input_img1 = layers.Input(shape=(256,256,3))
input_img2 = layers .Input(shape=(256,256,3))

# 融合層 x = 3inp1+4inp2+5
input1 = layers.add([input_img1, input_img2])
第一層隱藏層
tower_1 = layers.Dense(10, activation='softmax')(input1)
tower_2 = layers.Dense(10, activation='softmax')(input1)
tower_3 = layers.Dense(10, activation='softmax')(input1)

# 融合層
input2 = layers.add([tower_1,tower_2,tower_3])
# 第二層隱藏層
tower_4 = layers.Dense(10, activation='softmax')(input2)
tower_5 = layers.Dense(10, activation='softmax')(input2)
tower_6 = layers.Dense(10, activation='softmax')(input2)
# 融合層
input3 = layers.add([tower_4,tower_5,tower_6])
# 輸出層
output1 = layers.Dense(10, activation='softmax')(input3)
output2 = layers.Dense(10, activation='relu')(input3)

# 構建模型
model = Model(inputs=[input_img1, input_img2], outputs=[output1, output2])

# 展示模型架構
plot_model(model, 'multi_input_and_output_model.png', show_shapes=True)

keras搭建的模型架構,可以看出和上面BP演算法中的計算圖一樣
在這裡插入圖片描述

相關文章