一文了解神經網絡的基本原理

這是簡單介紹神經網絡的知識,並介紹一種特別的神經網絡--多層感知器(Multi Layer Perceptron,MLP)node

翻譯自 ujjwalkarn.me/2016/08/09/…python

這篇文章並不涉及到對數學公式的推導,只是簡單介紹了神經網絡的結構和基本原理。git


1. 神經元

神經元(neuron)是神經網絡的基本計算單元,也被稱做節點(node)或者單元(unit)。它能夠接受來自其餘神經元的輸入或者是外部的數據,而後計算一個輸出。每一個輸入值都有一個權重(weight),權重的大小取決於這個輸入相比於其餘輸入值的重要性。而後在神經元上執行一個特定的函數 f, 定義以下圖所示,這個函數會該神經元的全部輸入值以及其權重進行一個操做。github

由上圖能夠看到,除了權重外,還有一個輸入值是1的偏置值bias。這裏的函數f就是一個被稱爲激活函數的非線性函數。它的目的是給神經元的輸出引入非線性。由於在現實世界中的數據都是非線性的,所以咱們但願神經元均可以學習到這些非線性的表示。算法

下面是一些比較常見的激活函數:微信

  • Sigmoid: 輸出範圍是[0,1]
\sigma(x) =\frac{1}{1+e^{-x}}
  • tanh: 輸出範圍是[-1,1]
tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2\sigma(2x)-1
  • ReLU:
f(x) = max(0,x)

下面給出上述激活函數的圖像:網絡

這裏須要簡單說下偏置值bias的做用,它能夠提供給每一個神經元一個可訓練的常量值。具體能夠看下Stackoverflow上的這個回答函數

2. 前向神經網絡

前向神經網絡是第一個也是最簡單的一種人工神經網絡了。下面給出一個前向神經網絡的簡單例子示意圖。學習

如上圖所示,這個神經網絡分爲3個網絡層,分別是輸入層,隱藏層和輸出層,每一個網絡層都包含有多個神經元,每一個神經元都會跟相鄰的前一個層的神經元有鏈接,這些鏈接其實也是該神經元的輸入。根據神經元所在層的不一樣,前向神經網絡的神經元也分爲三種,分別爲:測試

  1. 輸入神經元:位於輸入層,主要是傳遞來自外界的信息進入神經網絡中,好比圖片信息,文本信息等,這些神經元不須要執行任何計算,只是做爲傳遞信息,或者說是數據進入隱藏層。
  2. 隱藏神經元:位於隱藏層,隱藏層的神經元不與外界有直接的鏈接,它都是經過前面的輸入層和後面的輸出層與外界有間接的聯繫,所以稱之爲隱藏層,上圖只是有1個網絡層,但實際上隱藏層的數量是能夠有不少的,遠多於1個,固然也能夠沒有,那就是隻有輸入層和輸出層的狀況了。隱藏層的神經元會執行計算,將輸入層的輸入信息經過計算進行轉換,而後輸出到輸出層。
  3. 輸出神經元:位於輸出層,輸出神經元就是未來自隱藏層的信息輸出到外界中,也就是輸出最終的結果,如分類結果等。

前向網絡中,信息是從輸入層傳遞到輸出層,只有前向這一個方向,沒有反向傳播,也不會循環(不一樣於RNN,它的神經元間的鏈接造成了一個循環)。

下面是兩個前向神經網絡的例子:

  1. 單層感知器——最簡單的前向神經網絡,而且不含任何隱藏層。
  2. 多層感知器——擁有1個或多個隱藏層。

3. 多層感知器(MLP)

單層感知器只有輸入層和輸出層,因此只能學習線性函數,而多層感知器擁有1個或多個隱藏層,所以也就能夠學習非線性函數了。下面是擁有一個隱藏層的MLP的例子示意圖:

上圖顯示該MLP有兩個輸入值X1X2,隱藏層有兩個神經元,而後有兩個輸出值Y1Y2。圖中還展現了其中一個隱藏層神經元的計算:

f(summation) = f(w_0 * 1 + w_1 * X1 + w_2 * X2)

4. 反向傳播算法

MLP要可以得到更好的結果,單單經過前向傳播計算是不夠的,神經網絡除了前向傳播計算,還有反向傳播算法,經過反向傳播來更新權值,從而得到更好的訓練結果。下面給出來自this Quora answer by Hemanth Kumar對反向傳播的解釋:

反向傳播偏差,也被簡稱爲反向傳播,是用於訓練神經網絡的方法之一,它是一個有監督學習方法,也就是說它是從訓練數據的標籤來進行學習,即至關於有一個監督者負責指導它的學習。

簡單來講,反向傳播是**「從錯誤中進行學習」**,監督者會在神經網絡出錯的時候修正它。

學習的目的主要是爲了給隱藏層的每一個節點的鏈接的權重分配一個正確的數值。當給定一個輸入向量,這些權重能夠決定輸出的向量。

在監督學習中,訓練集是有標籤的,這意味着,對於給定的一些輸入,咱們是能夠知道一些指望的輸出值,也就是標籤是什麼的。

反向傳播算法:

在初始階段,全部權重都是隨機分配的。對於訓練集的每一個輸入值,通過神經網絡的前向計算後,獲得的輸出值將會與指望的輸出進行比較,而後獲得的偏差會傳回給前面的網絡層。這個偏差會被記下,而後權重會進行相應的調整。這個過程會不斷重複,知道輸出的偏差低於一個設定好的閾值。

當上述算法結束,咱們就會獲得一個訓練好的網絡,能夠應用於一些新的輸入數據。

下圖展現了一個MLP的反向傳播過程:

圖中展現的是一個給定的例子的訓練數據,訓練數據以下:

學習時間 中期考試成績 期末考試結果
35 67 1(Pass)
12 75 0(Fail)
16 89 1(Pass)
45 56 1(Pass)
10 90 0(Fail)

要預測的例子以下:

學習時間 中期考試成績 期末考試結果
25 70

這個例子中輸入數據,或者說輸入的特徵是學習時間和中期考試成績,輸出結果是期末考試結果,而且是用0和1表示,即這是一個二分類問題。

上圖展現的就是MLP是一個擁有1個隱藏層的例子,輸入層有 3 個節點,其中 1 個是數值爲 1,也就是它與節點的鏈接上的數值表示的是偏置值,另外兩個節點傳遞的就是兩個輸入數據;隱藏層中,除了表示偏置值節點外,有兩個節點,而輸出層也是有兩個輸出節點,上面的節點表示經過(Pass)的機率,而下面的節點表示不經過(Fail)的機率。

在分類任務中,咱們一般使用 Softmax function 做爲輸出層的激活函數,這是爲了保證輸出值是機率值,而且輸出值的和是1。Softmax函數會將輸入的一個包含任意實數的向量變成一個包含範圍在0到1的數值的向量。所以,在這裏的例子中,有 Probability(Pass) + Probability(Fail) = 1

Step 1: 前向傳播

這裏將上圖中標記爲V的隱藏層的節點拿出來介紹下前向傳播的過程。假設其鏈接的節點上的權重分別是 w1,w2,w3

網絡首先接受第一個訓練輸入,也就是輸入35和67,而且指望的輸出值是1,也就是經過的結果。

  • 網絡的輸入 = [35, 67]
  • 網絡的指望輸出 = [1, 0]

在節點V上執行的計算爲:

V = f(1 * w1 + 35 * w2 + 67 * w3)

其餘節點的計算也相似這個。最終在輸出層的兩個節點將分別獲得兩個機率值,假設分別是 0.4 和 0.6(由於權重是隨機分配的,因此輸出值也是隨機的)。很明顯,這兩個數值不符合指望的數值,所以上圖中左上角也說明這是一個錯誤的輸出。

Step 2: 反向傳播和權重更新

下圖展現了反向傳播和權重更新的過程:

這裏會計算輸出節點的偏差,而後使用反向傳播計算梯度,並將偏差傳回前面的網絡層,進行權重的更新。這裏權重的更新使用一種優化方法,好比梯度降低算法,目的是減少輸出層的偏差值。

這裏假設通過權重更新,節點V的鏈接上的權重更新爲新的權重 w4,w5,w6

而後繼續仍是剛纔的輸入,此時因爲通過反向傳播,權重是在向着減少偏差的方向下調整的,因此應該有一個更好的輸出結果,以下圖所示,此時輸出層的偏差變成[0.2, -0.2],相比於以前的[0.6, -0.4],這意味着網絡已經學習到正確分類第一個訓練數據了。

接下來就能夠對整個訓練集重複上述過程,而後就能夠獲得一個訓練好的神經網絡。此時,須要對測試例子進行輸出,則只須要傳遞測試數據,並執行前向傳播,就能夠獲得輸出結果。

5. 小結

這裏簡單介紹了神經網絡,以及MLP的網絡結構,介紹了前向傳播和反向傳播的實現過程,不過忽略了詳細的數學實現公式。

參考:

  1. this Quora answer by Hemanth Kumar
  2. stackoverflow.com/questions/2…
  3. excellent visual explanation of the backpropagation algorithm

歡迎關注個人微信公衆號--算法猿的成長,或者掃描下方的二維碼,你們一塊兒交流,學習和進步!

相關文章
相關標籤/搜索