人工智能之從零理解人工神經網絡

人工智能之從零理解人工神經網絡

人工智能並非是一個新型的詞彙,從十九世紀五十年代開始,人們就開始探索爲機器賦予類似人的智能能力。限於當時的基礎數學理論不夠完善,人工智能的發展並不順利。直到九十年代發展出了基於統計學的數學工具,人工智能纔得到飛速的發展。

人工智能既是爲機器增加人的智能能力,最直觀的想法是研究人腦的運行機制,之後構建出一套網絡系統來模擬人腦的工作原理來進行訓練和工作。人工神經網絡即時基於這一想法而發展出來的,本篇博客是筆者瞭解人工智能過程中的對人工神經網絡部分的理解與感悟,分享與大家共同進步,有偏差之處敬請指正。

1-關於人工神經網絡

神經網絡是生物學上的一個概念,在人類大腦中數百億個神經元協作產生了人類智能,人腦中大約有860億個神經元。每個神經元大約連接1000個其他神經元。巨量的神經元構成了非常複雜的神經網絡系統,每個神經元通過電化學信息作爲輸入,當電信號超出觸發條件的電壓閾值時,此神經元即會被激活,被激活的神經元又會將信號傳遞給其所連接的其他神經元。可能誰也無法說清楚如此複雜的信號傳遞是如何產生人類智慧的,但我們可以模擬這一過程來嘗試構建機器的人工智能。關於生物學上神經網絡是人類大腦學的核心研究領域,下圖簡單演示了人腦神經元的信號傳遞。

人工神經網絡是ML的一種方法,受生物神經元的啓發,我們可以通過編程來構建一套人工神經網絡系統,通過定義神經元的輸入輸出,觸發條件等來模擬生物神經元的信號傳遞流程。目前通過人工神經網絡訓練的模型已經可以在諸多領域進行應用,如人臉識別、語音識別、自動駕駛、機器人遊戲等。

一個人工神經網絡由以下核心部分需要關注:

  • 感知器(神經元)
  • 連接和權重
  • 傳播函數
  • 組織結構

後面,我們將對這些核心部分進行深入的討論,並提供簡單的訓練案例來幫助大家理解整個網絡的工作流程,其中會使用到一些簡單的高等數學中的知識。

2-感知器

在人工神經網絡中,充當神經元結構組件有一個更加確切的名字:感知器。感知器結構簡單,是對生物神經細胞的最小抽象。感知器在數學模型上的抽象如下圖所示:

這個感知器模型非常簡單,它接收3個輸入,通過∑函數來運算,最終輸出結果。W1,W2,W3是每個輸入對應的權重,∑函數的運算規則是將輸入乘以權重後進行求和。在某些資料中,你可能會看到此公式被寫爲輸入向量與權重轉置向量的點積,其實是一樣的,標準的公式如下:

這類感知器最終的運算方式是線性的,因此也被稱爲線性感知器。在神經網絡中,感知器的輸入是由初始輸入或上一層的輸出來決定的,我們要做的其實就是找到確定的權重,ML的Learning過程其實也是找到合適權重的過程。

與感知器相關的還有一個重要的概念是偏置,我們前面提到過,一個生物神經元是否激活是要看化學電信號的電壓是否達到某一閾值,要判斷某一感知器是否被激活,實際上的公式應該改寫如下:

其中,b是當前感知器被激活的閾值,我們將公式整理後,可以將閾值b放到左邊,並將其作爲一個輸入始終爲-1的參數,通過這樣的整理後,最終需要確定的數據都被統一爲權重值。

3-多層感知器

現在我們瞭解了單個感知器的工作原理,一個神經網絡其實就是由非常多個感知器按照一定的層次排布構成的。如下圖:

圖中所示有兩層感知器,第一層有3個感知器,每個感知器有兩個輸入,第二層有1個感知器,接收上一層的輸入來處理後將結果輸出。在整個神經網絡中,每一層可以有任意多個感知器,感知器的個數會決定權重向量的維度(也就是這一層所需要確定的權重的個數),我們可以用X表示輸入的數據向量組,W來表示輸入連接到下一層的權重向量組,則下一層的結果即爲:

當我們將下一層每個感知器的結果都計算完成後,即可將其作爲新的輸入向量來向下層傳遞,直到獲取最終結果。

注*:上面的公式默認將閾值算在了輸入中。

4-激活函數

多層感知器只是對單個的感知器進行了組合,雖然我們已經可以根據輸入計算出這種神經網絡的輸出,但這種結果的意義並不大,我們需要爲每個感知器的輸出結果增加一些非線性的激活邏輯才能更好的擬合生物神經元的特性。

激活函數是對感知器的輸出做激活運算,簡單來說,即是我們需要定義一個激活函數,對每一層感知器的輸出多做一步函數運算後再作爲結果傳遞到下一層。常用的激活函數有3種:

  • 階躍函數
  • Sigmoid函數
  • ReLU函數

階躍函數的定義如下:

圖形如下:

其特性是當輸入小於0時,輸出爲0,輸入大於等於0時,輸出爲1。

Sigmoid函數的定義如下:

這個函數的圖像如下:

sigmoid函數的特性是當輸入接近負無窮時,值向0逼近,當輸入接近正無窮時,值向1逼近。

ReLU函數的定義如下:

f(x) = max(0, x)

此函數比較好理解,當輸入小於0時,輸出始終是0,輸入大於0時,輸出等於輸入。

在實際應用中,我們更多的會使用sigmoid函數做爲激活函數,sigmoid有一個非常好的特性,即它是連續光滑的,連續和光滑的函數在數學上有着非常好的性質,這說明其可以很方便的進行求導。

引入了激活函數後,神經網絡模型可以抽象成如下圖所示:

其中,φ是sigmoid函數。

理論上,兩層的感知器可以擬合出所有的連續函數,三層及以上的感知器可以擬合出所有函數。

5-從一個簡單的示例看人工神經網絡的計算過程

前面,我們介紹了人工神經網絡的基本工作流程。現在我們可以通過一個例子來看具體的計算過程。

首先,假設我們已經訓練好了一個模型,此模型的功能是進行邏輯與運算。當然我們知道,邏輯與運算的規則非常簡單,其有兩個輸入,每個輸入的值爲0或者1,當輸入都爲1時結果才爲1,任一輸入爲0時結果就爲0。與運算的所有輸入與輸出的可能列表如下:

- 1 0

1 1 0

0 0 0

忘記我們已知的這個計算規則,我們的目的是通過ML,讓計算機自己通過模型來預測出正確的結果。我們要使用的神經網絡有兩層,結構如下:

由於模型是訓練好的,所需要的權重參數都是已知的。其中第一層的權重向量爲:

W1 = [

-3.9 -3.9 -5.4

4.4 4.4 6.2

-4.7 -4.7 -6.6

]

假設我們輸入的兩個值分別爲1和1,加上偏置-1,則輸入向量爲:

X1 = [1 1 -1]

進行點乘後,得到的中間結果爲:

r1 = -3.9 * 1 + -3.9 * 1 + 5.4 * 1 = -2.4

r2 = 4.4 + 4.4 - 6.2 = 2.6

r3 = -4.7 - 4.7 + 6.6 = -2.8

因此第一層運算後的中間向量爲:

R1 = [-2.4 2.6 -2.8]

將R1向量進行sigmoid運算,結果爲:

X2 = [0.083 0.93 0.057]

向量X2即爲第2層的輸入向量,加上偏置輸入,最終的第二層的輸入爲:

X2 = [0.083 0.93 0.057 -1]

第2層的權重向量爲:

W2 = [-8.09 7.24 -7.49 -2.88]

進行點乘運算,第二層的中間結果爲:

R2 = 0.66 + 6.73 - 0.42 + 2.88 = 九.8六

將九.8六進行sigmoid運算,結果爲0.9999,非常接近1。

同樣,如果我們將最初的輸入修改爲:

X1 = [0 1 -1]

則:

r1 = -3.9 * 0 + -3.9 * 1 + 5.4 * 1 = 1.5

r2 = 0 + 4.4 - 6.2 = -1.8

r3 = 0 - 4.7 + 6.6 = 1.9

R1 = [1.5 -1.8 1.9]

X2 = [0.817 0.14 0.85999 -1]

R2 = -8.09*0.817 + 7.24*0.14 - 7.49*0.85999 + 2.88 = 九.8六

對九.8六進行sigmoid運算後,結果爲0.00005,此模型的預測是符合預期的。

我們這裏舉的是一個比較簡單的例子,因爲輸出只有0和1。如果我們要預測的場景有多個輸出,例如預測某個點位於直角座標系中的哪個象限中,則可以輸出4個值,分別表示此點落在對應象限的概率。

6-訓練過程

上面示例中,我們假定使用的模型是已經訓練好的,那麼如果我們尚未確定所需要的權重參數時,需要怎麼做呢?需要試!我們可以先隨意的選取一組權重組合,之後正向的執行一遍計算過程,最終計算獲取到的結果與真實結果間的誤差,通過將誤差反向傳播來優化更新整個網絡的權重向量。爲了方便演示這一過程,我們可以將神經網絡模型再優化的簡單些,如下圖所示:

假設此神經網絡的作用是擬合取反運算符的功能,即輸入爲0時輸出1,輸入爲1時輸出0。現在第一層的權重和第二層的權重我們都不知曉。隨機取一組權重組合,例如:

W1 = [

1 1

1 1

]

W2 = [1 1 1]

現在設輸入爲0,運算過程爲:

X1 = [0 -1]

R1 = [-1 -1]

X2 = [0.731 0.731 -1]

R2 = 0.462

X2 = 0.61

最終計算的結果爲0.61,我們預期的結果應該爲1,與正確輸出相比誤差很多,誤差我們一般使用如下公式來描述:

其中的連加符號是用來將多個輸出的誤差進行相加,本例中只有一個輸出,我們可以將其忽略。公式中的1/2是一個小技巧,對方差除以2不會對結果產生大的影響,但是可以使後續的求導結果更加簡化。

如果我們帶入計算此次誤差,結果爲:0.39。這個誤差值是很大的,我們需要分析出每個權重參數對此誤差產生的影響,然後儘量降低此影響。

首先,最終的結果實際上是由一層層的結果經過線性計算加上觸發函數而得到的,因此本質上我們可以用複合函數來表示最終的結果與輸出間的關係。以本場景爲例,第二層函數我們可以表示爲φ(f(x2)),第一層函數可以表示爲x2=φ(g(x)),帶入後的完整函數爲φ(f(φ(g(x)))),即:

target = φ(f(φ(g(x))))

因此,我們要計算每個權重對誤差的影響,找到梯度的反方向進行優化即可,其實只需要使用誤差函數對指定權重變量求偏導。

梯度的定位爲變化率最大的方向,導數本身描述的就是變量的變化導致結果變化的變化速度,因此我們根據其導數進行調整即可最快的優化參數。

下面,我們以W2向量中的第1個權重爲例來進行優化,公式如下:

其中out爲最後一部分輸出函數,即sigmod函數,net爲最後一層的邏輯函數,其與w1有關,分別計算這些值:

通過上面的複合函數求導運算,我們可以計算出最終的誤差關於w1權重的偏導值,仔細觀察,其實此偏導值的工作可以簡化爲:

可以看到,其中只有outx11是上一層對應此乘以此權重值的結果,其他參數都只與最終結果或本層的輸出有關。我們將這部分提爲一個新的變量,將誤差關於某個權重的偏導簡化爲:

現在我們已經計算出了關於誤差w1權重的梯度,現在向其反方向進行調整即可,我們採用0.5的Learning率,更新權重參數如下:

w_1 = w1 - 0.5 * - (0.0678) = 1.0339

同理對同層的w2進行更新也是一樣的邏輯。更新完第2層的權重後,我們還需要繼續向上一層傳遞,更新第一層的權重。這裏我們不再演示計算。

W2向量對應的修改爲:

W2 = [1.0339 1.0339 1]

再次輸入爲0,運算過程爲:

X1 = [0 -1]

R1 = [-1 -1]

X2 = [0.731 0.731 -1]

R2 = 0.731*1.0339+0.731*1.0339-1

X2 = 0.625

誤差爲0.375,減少了一點點。同理去更新其他權重,直到達到滿意的效果爲止。

上面演示的計算過程爲稱爲反向傳播算法,在人工神經網絡中,ML的整體邏輯即是不斷的進行權重的更新,更新過程爲進行一次預測(首次全部用隨機的權重),之後通過反向傳播算法來逐層逐個的使用誤差函數對權重進行求導,使用求導結果來進行權重的更新,更新這裏實際上是使用了梯度下降算法,後面會在詳細討論這個算法。更新權重後,再次進行正向的預測,之後用新的誤差來反向傳播在此更新,直到預測正確的概率達到我們的預期位置。本例演示的是一個比較簡單的神經網絡,當感知器較多和輸出較多時,反向傳播計算起來會非常麻煩。

7-關於梯度下降算法

在前面網絡訓練部分的介紹中,我們最終推導出一個關於誤差的函數,對於每層感知器來說,我們是通過複合函數以及鏈式法則來其中權重參數求偏導的。我們直到,偏導數的意義是反應函數值與某個變量變化的關係,當誤差爲整數時,我們需要儘量讓其降低,因此需要計算此點的梯度後,向梯度的反方向進行變化。權重的更新方式可以表示爲:

W` = W - α * L

其中L爲梯度,乘以的α被稱爲Learning率,即用來控制誤差下降的速度。Learning率並非越大越好,過大的Learning率可以產生過沖,但是過低的Learning率會使訓練的收斂過程很慢。誤差關於權重的函數是一個多維的函數,多維本身很難理解,但是將其類比在三維平面上就比較好理解了。例如下圖所示:

此三維空間中的平面中有凹有凸,當我們隨機取一組權重參數時,誤差函數可能落在平面上的任意一點,我們需要找到此處的梯度方向然後進行下降,Learning率小會使的每次迭代所優化的步長都很小,很難快速到達最終的低點,Learning率過大又可能越過了低點,導致每次迭代效果來回震盪。

因此要使整個神經網絡的訓練效率提高,對Learning率的選擇是非常重要的。如何指定Learning率,也有一些成熟的算法,下圖演示了各種算法中迭代輪數與誤差函數的收斂速度的關係:

批量梯度下降法是比較原始的梯度下降形式,在一次迭代中使用所有樣本來進行梯度的更新。梯度使用每個樣本梯度的平均值。

隨機梯度下降法是指每次迭代時,都使用一個樣本來進行權重參數的優化。

小批量梯度下降法是批量梯度下降法與隨機梯度下降法的折中,使用一個以上而又不是全部的訓練樣本來進行參數優化。

動量隨機梯度下降法是對隨機梯度下降法的簡單優化,其使用上一步的梯度與當前梯度的加權平均值來進行參數優化,避免過早的穩定,可以加快下降的速度。

PRrop法會忽略梯度的震盪,直接觀察梯度的符號,如果與上一步的相當,則放大爲1.2倍,如果與上一步相反,則縮小爲0.5倍。簡單理解,如果步長未越過最小值,則繼續增大步長,如果越過了最小值,則減少步長。

Adam是一種自適應的時刻估計方法,較爲複雜,但其收斂很快。

8-結語

最後,關於爲何人工神經網絡理論上可以模擬任何的線性與非線性函數,應該是有數學上的嚴格證明,對於擬合過程和原理,很難說的清楚。我們更關心的是如何運用相關理論和技術,開發出有強大智能的應用。本文中介紹的模型預測過程涉及的計算和訓練過程中參數的優化方法,看上去很繁瑣,其實都非常容易使用編程的方式實現,並且有許多成熟的神經網絡庫可以直接使用,這些後續在的文章再討論。希望本文能帶給你一些收穫,歡迎私信指點~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章