Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

磐創AI發表於2018-11-20

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述目錄:

  • 神經網路前言

  • 神經網路

    • 感知機模型

    • 多層神經網路

  • 啟用函式

    • Logistic函式

    • Tanh函式

    • ReLu函式

  • 損失函式和輸出單元

    • 損失函式的選擇

      • 均方誤差損失函式

      • 交叉熵損失函式

      • 輸出單元的選擇

    • 線性單元

      • Sigmoid單元

      • Softmax單元

  • 參考文獻

一.神經網路前言

從本章起,我們將正式開始介紹神經網路模型,以及學習如何使用TensorFlow實現深度學習演算法。人工神經網路(簡稱神經網路)在一定程度上受到了生物學的啟發,期望通過一定的拓撲結構來模擬生物的神經系統,是一種主要的連線主義模型(人工智慧三大主義:符號主義、連線主義和行為主義)。本章我們將從最簡單的神經網路模型感知器模型開始介紹,首先了解一下感知器模型(單層神經網路)能夠解決什麼樣的問題,以及它所存在的侷限性。為了克服單層神經網路的侷限性,我們必須擴充到多層神經網路,圍繞多層神經網路我們會進一步介紹啟用函式以及反向傳播演算法等。本章的內容是深度學習的基礎,對於理解後續章節的內容非常重要。

深度學習的概念是從人工神經網路的研究中發展而來的,早期的感知器模型只能解決簡單的線性分類問題,後來發現通過增加網路的層數可以解決類似於“異或問題”的線性不可分問題,這種多層的神經網路又被稱為多層感知器。對於多層感知器,我們使用BP演算法進行模型的訓練[1],但是我們發現BP演算法有著收斂速度慢,以及容易陷入區域性最優等缺點,導致BP演算法無法很好的訓練多層感知器。另外,當時使用的啟用函式也存在著梯度消失的問題,這使得人工神經網路的發展幾乎陷入了停滯狀態。為了讓多層神經網路能夠訓練,學者們探索了很多的改進方案,直到2006年Hinton等人基於深度置信網路(DBN)提出了非監督貪心逐層訓練演算法,才讓這一問題的解決有了希望,而深度學習的浪潮也由此掀起。

本章內容主要包括五個部分,第一部分我們介紹一下神經網路的基本結構,從基本的感知器模型到多層的神經網路結構;第二部分介紹神經網路中常用的啟用函式;第三部分介紹損失函式和輸出單元的選擇;第四部分介紹神經網路模型中的一個重要的基礎知識——反向傳播演算法;最後我們使用TensorFlow搭建一個簡單的多層神經網路,實現mnist手寫數字的識別。

二、神經網路

1. 感知機模型

感知器(Perceptron)是一種最簡單的人工神經網路,也可以稱之為單層神經網路,如圖1所示。感知器是由Frank Rosenblatt在1957年提出來的,它的結構很簡單,輸入是一個實數值的向量,輸出只有兩個值:1或-1,是一種兩類線性分類模型。

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖1 感知器模型

如圖3-1所示,感知器對於輸入的向量先進行了一個加權求和的操作,得到一箇中間值,假設該值為,則有:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式1

接著再經過一個啟用函式得到最終的輸出,該啟用函式是一個符號函式:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式2

公式1中的可以看做是一個閾值(我們通常稱之為偏置項),當輸入向量的加權和大於該閾值時(兩者之和)感知器的輸出為1,否則輸出為-1。

2. 多層神經網路

感知器只能解決線性可分的問題,以邏輯運算為例:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖2 邏輯運算

感知器可以解決邏輯“與”和邏輯“或”的問題,但是無法解決“異或”問題,因為“異或”運算的結果無法使用一條直線來劃分。為了解決線性不可分的問題,我們需要引入多層神經網路,理論上,多層神經網路可以擬合任意的函式(本書配套的GitHub專案中有相關資料供參考)。

與單層神經網路相比,多層神經網路除了有輸入層和輸出層以外,還至少需要有一個隱藏層,如圖3所示是含有一個隱藏層的兩層神經網路:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖3 兩層神經網路

為了更直觀的比較一下單層神經網路和多層神經網路的差別,我們利用TensorFlow PlayGround來演示兩個例子。TensorFlowPlayGround是Google推出的一個深度學習的視覺化的演示平臺:http://playground.tensorflow.org/

我們首先看一個線性可分的例子,如圖4所示。圖的右側是資料視覺化後的效果,資料是能夠用一條直線劃分的。從圖中可以看到,我們使用了一個單層神經網路,輸入層有兩個神經元,輸出層只有一個神經元,並且使用了線性函式作為啟用函式。

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖4 TensorFlowPlayGround示例:線性可分的資料

我們點選開始訓練的按鈕,最終的分類結果如圖5所示:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖5 TensorFlowplayground示例:線性可分的資料

在上面的例子裡我們使用單層神經網路解決了一個線性可分的二分類問題,接下來我們再看一個線性不可分的例子,如圖6所示:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖6  TensorFlow playground示例:線性不可分的資料

在這個例子裡,我們使用了一組線性不可分的資料。為了對這組資料進行分類,我們使用了一個含有一層隱藏層的神經網路,隱藏層有四個神經元,並且使用了一個非線性的啟用函式ReLU。要想對線性不可分的資料進行分類,我們必須引入非線性的因素,即非線性的啟用函式,在下一小節裡,我們會再介紹一些常用的啟用函式。

最終的分類結果如圖7所示。

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖7 TensorFlowplayground示例:線性不可分的資料

感興趣的讀者可以嘗試使用線性的啟用函式,看會是什麼樣的效果,還可以嘗試其它的資料,試著增加網路的層數和神經元的個數,看看分別對模型的效果會產生什麼樣的影響。

三.啟用函式

為了解決非線性的分類或迴歸問題,我們的啟用函式必須是非線性的函式,另外我們使用基於梯度的方式來訓練模型,因此啟用函式也必須是連續可導的。

1. Logistic函式

Logistic函式(又稱為sigmoid函式)的數學表示式和函式影像如圖8所示:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖8 Logistic函式表示式及函式影像

Logistic函式在定義域上單調遞增,值域為,越靠近兩端,函式值的變化越平緩。因為Logistic函式簡單易用,以前的神經網路經常使用它作為啟用函式,但是由於Logistic函式存在一些缺點,使得現在的神經網路已經很少使用它作為啟用函式了。它的缺點之一是容易飽和,從函式影像可以看到,Logistic函式只在座標原點附近有很明顯的梯度變化,其兩端的函式變化非常平緩,這會導致我們在使用反向傳播演算法更新引數的時候出現梯度消失的問題,並且隨著網路層數的增加問題會越嚴重。

2. Tanh函式

Tanh函式(雙曲正切啟用函式)的數學表示式和函式影像如圖9所示:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖9 Tanh函式表示式及函式影像

Tanh函式很像是Logistic函式的放大版,其值域為。在實際的使用中,Tanh函式要優於Logistic函式,但是Tanh函式也同樣面臨著在其大部分定義域內都飽和的問題。

3. ReLu函式

ReLU函式(又稱修正線性單元或整流線性單元)是目前最受歡迎,也是使用最多的啟用函式,其數學表示式和函式影像如圖10所示:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖10 ReLU函式表示式及函式影像

ReLU啟用函式的收斂速度相較於Logistic函式和Tanh函式要快很多,ReLU函式在軸左側的值恆為零,這使得網路具有一定的稀疏性,從而減小引數之間的依存關係,緩解過擬合的問題,並且ReLU函式在軸右側的部分導數是一個常數值1,因此其不存在梯度消失的問題。但是ReLU函式也有一些缺點,例如ReLU的強制稀疏處理雖然可以緩解過擬合問題,但是也可能產生特徵遮蔽過多,導致模型無法學習到有效特徵的問題。

除了上面介紹的三種啟用函式以外,還有很多其它的啟用函式,包括一些對ReLU啟用函式的改進版本等,但在實際的使用中,目前依然是ReLU啟用函式的效果更好。現階段啟用函式也是一個很活躍的研究方向,感興趣的讀者可以去查詢更多的資料,包括本書GitHub專案中給出的一些參考資料等。

四.損失函式和輸出單元

損失函式(LossFunction)又稱為代價函式(Cost Function),它是神經網路設計中的一個重要部分。損失函式用來表徵模型的預測值與真實類標之間的誤差,深度學習模型的訓練就是使用基於梯度的方法最小化損失函式的過程。損失函式的選擇與輸出單元的選擇也有著密切的關係。

1. 損失函式的選擇

1.1 均方誤差損失函式

均方誤差(MeanSquared Error,MSE)是一個較為常用的損失函式,我們用預測值和實際值之間的距離(即誤差)來衡量模型的好壞,為了保證一致性,我們通常使用距離的平方。在深度學習演算法中,我們使用基於梯度的方式來訓練引數,每次將一個批次的資料輸入到模型中,並得到這批資料的預測結果,再利用這批預測結果和實際值之間的距離更新網路的引數。均方誤差損失函式將這一批資料的誤差的期望作為最終的誤差值,均方誤差的公式如下:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式3

                   

上式中為樣本資料的實際值,為模型的預測值。為了簡化計算,我們一般會在均方誤差的基礎上乘以,作為最終的損失函式:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式4

1.2交叉熵損失函式

交叉熵(Cross Entropy)損失函式使用訓練資料的真實類標與模型預測值之間的交叉熵作為損失函式,相較於均方誤差損失函式其更受歡迎。假設我們使用均方誤差這類二次函式作為代價函式,更新神經網路引數的時候,誤差項中會包含啟用函式的偏導。在前面介紹啟用函式的時候我們有介紹,Logistic等啟用函式很容易飽和,這會使得引數的更新緩慢,甚至無法更新。交叉熵損失函式求導不會引入啟用函式的導數,因此可以很好地避免這一問題,交叉熵的定義如下:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式5

上式中為樣本資料的真實分佈,為模型預測結果的分佈。以二分類問題為例,交叉熵損失函式的形式如下:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式6

上式中為真實值,為預測值。對於多分類問題,我們對每一個類別的預測結果計算交叉熵後求和即可。

2. 輸出單元的選擇

2.1 線性單元

線性輸出單元常用於迴歸問題,當輸出層採用線性單元時,收到上一層的輸出後,輸出層輸出一個向量。線性單元的一個優勢是其不存在飽和的問題,因此很適合採用基於梯度的優化演算法。

2.2 Sigmoid單元

Sigmoid輸出單元常用於二分類問題,Sigmoid單元是線上性單元的基礎上,增加了一個閾值來限制其有效概率,使其被約束在區間之中,線性輸出單元的定義為:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式7

上式中是Sigmoid函式的符號表示,其數學表示式在3.2.1節中有介紹。

2.3 Softmax單元

Softmax輸出單元適用於多分類問題,可以將其看作是Sigmoid函式的擴充套件。對於Sigmoid輸出單元的輸出,我們可以認為其值為模型預測樣本為某一類的概率,而Softmax則需要輸出多個值,輸出值的個數對應分類問題的類別數。Softmax函式的形式如下:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式8

我們以一個簡單的圖示來解釋Softmax函式的作用,如圖3-11所示。原始輸出層的輸出為,增加了Softmax層後,最終的輸出為:

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式9


Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式10


Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

式11

上式中的值可以看做是分類器預測的結果,值的大小代表分類器認為該樣本屬於該類別的概率,Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

Tensorflow系列專題(四):神經網路篇之前饋神經網路綜述

圖11  Softmax輸出單元

需要注意的是,Softmax層的輸入和輸出的維度是一樣的,如果不一致,可以通過在Softmax層的前面新增一層全連線層來解決問題。

接下來將介紹第四部分:神經網路模型中的一個重要的基礎知識——反向傳播演算法;與第五部分:使用TensorFlow搭建一個簡單的多層神經網路,實現mnist手寫數字的識別。

五.參考文獻

1.《Parallel Distributed processing》. Rumelhart & McCelland .1986

原文連結:https://mp.weixin.qq.com/s/hYxM9VAW_9j6jOEWycY8Rg

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555081/viewspace-2220801/,如需轉載,請註明出處,否則將追究法律責任。

相關文章