摘要: 本文對多層感知器和反向傳播進(jìn)行入門級的介紹。 人工神經(jīng)網(wǎng)絡(luò)是一種計(jì)算模型,啟發(fā)自人類大腦處理信息的生物神經(jīng)網(wǎng)絡(luò)。
人工神經(jīng)網(wǎng)絡(luò)是一種計(jì)算模型,啟發(fā)自人類大腦處理信息的生物神經(jīng)網(wǎng)絡(luò)。人工神經(jīng)網(wǎng)絡(luò)在語音識別、計(jì)算機(jī)視覺和文本處理領(lǐng)域取得了一系列突破,讓機(jī)器學(xué)習(xí)研究和產(chǎn)業(yè)感到了興奮。在本篇博文中,我們將試圖理解一種稱為「多層感知器(Multi Layer Perceptron)」的特定的人工神經(jīng)網(wǎng)絡(luò)。
?
單個神經(jīng)元
神經(jīng)網(wǎng)絡(luò)中計(jì)算的基本單元是神經(jīng)元,一般稱作「節(jié)點(diǎn)」(node)或者「單元」(unit)。節(jié)點(diǎn)從其他節(jié)點(diǎn)接收輸入,或者從外部源接收輸入,然后計(jì)算輸出。每個輸入都輔有「權(quán)重」(weight,即 w),權(quán)重取決于其他輸入的相對重要性。節(jié)點(diǎn)將函數(shù) f(定義如下)應(yīng)用到加權(quán)后的輸入總和,如圖 1 所示:
圖 1:單個神經(jīng)元
此網(wǎng)絡(luò)接受 X1 和 X2 的數(shù)值輸入,其權(quán)重分別為 w1 和 w2。另外,還有配有權(quán)重 b(稱為「偏置(bias)」)的輸入 1。我們之后會詳細(xì)介紹「偏置」的作用。
神經(jīng)元的輸出 Y 如圖 1 所示進(jìn)行計(jì)算。函數(shù) f 是非線性的,叫做激活函數(shù)。激活函數(shù)的作用是將非線性引入神經(jīng)元的輸出。因?yàn)榇蠖鄶?shù)現(xiàn)實(shí)世界的數(shù)據(jù)都是非線性的,我們希望神經(jīng)元能夠?qū)W習(xí)非線性的函數(shù)表示,所以這種應(yīng)用至關(guān)重要。
每個(非線性)激活函數(shù)都接收一個數(shù)字,并進(jìn)行特定、固定的數(shù)學(xué)計(jì)算 [2]。在實(shí)踐中,可能會碰到幾種激活函數(shù):
Sigmoid(S 型激活函數(shù)):輸入一個實(shí)值,輸出一個 0 至 1 間的值 σ(x) = 1 / (1 + exp(?x))
tanh(雙曲正切函數(shù)):輸入一個實(shí)值,輸出一個 [-1,1] 間的值 tanh(x) = 2σ(2x) ? 1
ReLU:ReLU 代表修正線性單元。輸出一個實(shí)值,并設(shè)定 0 的閾值(函數(shù)會將負(fù)值變?yōu)榱悖ゝ(x) = max(0, x)
下圖 [2] 表示了上述的激活函數(shù)
圖 2:不同的激活函數(shù)。
偏置的重要性:偏置的主要功能是為每一個節(jié)點(diǎn)提供可訓(xùn)練的常量值(在節(jié)點(diǎn)接收的正常輸入以外)。神經(jīng)元中偏置的作用,詳見這個鏈接:
前饋神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)是最先發(fā)明也是最簡單的人工神經(jīng)網(wǎng)絡(luò) [3]。它包含了安排在多個層中的多個神經(jīng)元(節(jié)點(diǎn))。相鄰層的節(jié)點(diǎn)有連接或者邊(edge)。所有的連接都配有權(quán)重。
圖 3 是一個前饋神經(jīng)網(wǎng)絡(luò)的例子。
圖 3: 一個前饋神經(jīng)網(wǎng)絡(luò)的例子
一個前饋神經(jīng)網(wǎng)絡(luò)可以包含三種節(jié)點(diǎn):
1. 輸入節(jié)點(diǎn)(Input Nodes):輸入節(jié)點(diǎn)從外部世界提供信息,總稱為「輸入層」。在輸入節(jié)點(diǎn)中,不進(jìn)行任何的計(jì)算——僅向隱藏節(jié)點(diǎn)傳遞信息。
2. 隱藏節(jié)點(diǎn)(Hidden Nodes):隱藏節(jié)點(diǎn)和外部世界沒有直接聯(lián)系(由此得名)。這些節(jié)點(diǎn)進(jìn)行計(jì)算,并將信息從輸入節(jié)點(diǎn)傳遞到輸出節(jié)點(diǎn)。隱藏節(jié)點(diǎn)總稱為「隱藏層」。盡管一個前饋神經(jīng)網(wǎng)絡(luò)只有一個輸入層和一個輸出層,但網(wǎng)絡(luò)里可以沒有也可以有多個隱藏層。
3. 輸出節(jié)點(diǎn)(Output Nodes):輸出節(jié)點(diǎn)總稱為「輸出層」,負(fù)責(zé)計(jì)算,并從網(wǎng)絡(luò)向外部世界傳遞信息。
在前饋網(wǎng)絡(luò)中,信息只單向移動——從輸入層開始前向移動,然后通過隱藏層(如果有的話),再到輸出層。在網(wǎng)絡(luò)中沒有循環(huán)或回路 [3](前饋神經(jīng)網(wǎng)絡(luò)的這個屬性和遞歸神經(jīng)網(wǎng)絡(luò)不同,后者的節(jié)點(diǎn)連接構(gòu)成循環(huán))。
下面是兩個前饋神經(jīng)網(wǎng)絡(luò)的例子:
1. 單層感知器——這是最簡單的前饋神經(jīng)網(wǎng)絡(luò),不包含任何隱藏層。你可以在 [4] [5] [6] [7] 中了解更多關(guān)于單層感知器的知識。
2. 多層感知器——多層感知器有至少一個隱藏層。我們在下面會只討論多層感知器,因?yàn)樵诂F(xiàn)在的實(shí)際應(yīng)用中,它們比單層感知器要更有用。
多層感知器
多層感知器(Multi Layer Perceptron,即 MLP)包括至少一個隱藏層(除了一個輸入層和一個輸出層以外)。單層感知器只能學(xué)習(xí)線性函數(shù),而多層感知器也可以學(xué)習(xí)非線性函數(shù)。
圖 4:有一個隱藏層的多層感知器
圖 4 表示了含有一個隱藏層的多層感知器。注意,所有的連接都有權(quán)重,但在圖中只標(biāo)記了三個權(quán)重(w0,,w1,w2)。
輸入層:輸入層有三個節(jié)點(diǎn)。偏置節(jié)點(diǎn)值為 1。其他兩個節(jié)點(diǎn)從 X1 和 X2 取外部輸入(皆為根據(jù)輸入數(shù)據(jù)集取的數(shù)字值)。和上文討論的一樣,在輸入層不進(jìn)行任何計(jì)算,所以輸入層節(jié)點(diǎn)的輸出是 1、X1 和 X2 三個值被傳入隱藏層。
隱藏層:隱藏層也有三個節(jié)點(diǎn),偏置節(jié)點(diǎn)輸出為 1。隱藏層其他兩個節(jié)點(diǎn)的輸出取決于輸入層的輸出(1,X1,X2)以及連接(邊界)所附的權(quán)重。圖 4 顯示了隱藏層(高亮)中一個輸出的計(jì)算。其他隱藏節(jié)點(diǎn)的輸出計(jì)算同理。需留意 *f *指代激活函數(shù)。這些輸出被傳入輸出層的節(jié)點(diǎn)。
輸出層:輸出層有兩個節(jié)點(diǎn),從隱藏層接收輸入,并執(zhí)行類似高亮出的隱藏層的計(jì)算。這些作為計(jì)算結(jié)果的計(jì)算值(Y1 和 Y2)就是多層感知器的輸出。
給出一系列特征 X = (x1, x2, ...) 和目標(biāo) Y,一個多層感知器可以以分類或者回歸為目的,學(xué)習(xí)到特征和目標(biāo)之間的關(guān)系。
為了更好的理解多層感知器,我們舉一個例子。假設(shè)我們有這樣一個學(xué)生分?jǐn)?shù)數(shù)據(jù)集:
兩個輸入欄表示了學(xué)生學(xué)習(xí)的時間和期中考試的分?jǐn)?shù)。最終結(jié)果欄可以有兩種值,1 或者 0,來表示學(xué)生是否通過的期末考試。例如,我們可以看到,如果學(xué)生學(xué)習(xí)了 35 個小時并在期中獲得了 67 分,他 / 她就會通過期末考試。
現(xiàn)在我們假設(shè)我們想預(yù)測一個學(xué)習(xí)了 25 個小時并在期中考試中獲得 70 分的學(xué)生是否能夠通過期末考試。
這是一個二元分類問題,多層感知器可以從給定的樣本(訓(xùn)練數(shù)據(jù))進(jìn)行學(xué)習(xí),并且根據(jù)給出的新的數(shù)據(jù)點(diǎn),進(jìn)行準(zhǔn)確的預(yù)測。在下面我們可以看到一個多層感知器如何學(xué)習(xí)這種關(guān)系。
訓(xùn)練我們的多層感知器:反向傳播算法
反向傳播誤差,通常縮寫為「BackProp」,是幾種訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)的方法之一。這是一種監(jiān)督學(xué)習(xí)方法,即通過標(biāo)記的訓(xùn)練數(shù)據(jù)來學(xué)習(xí)(有監(jiān)督者來引導(dǎo)學(xué)習(xí))。
簡單說來,BackProp 就像「從錯誤中學(xué)習(xí)」。監(jiān)督者在人工神經(jīng)網(wǎng)絡(luò)犯錯誤時進(jìn)行糾正。
一個人工神經(jīng)網(wǎng)絡(luò)包含多層的節(jié)點(diǎn);輸入層,中間隱藏層和輸出層。相鄰層節(jié)點(diǎn)的連接都有配有「權(quán)重」。學(xué)習(xí)的目的是為這些邊緣分配正確的權(quán)重。通過輸入向量,這些權(quán)重可以決定輸出向量。
在監(jiān)督學(xué)習(xí)中,訓(xùn)練集是已標(biāo)注的。這意味著對于一些給定的輸入,我們知道期望 / 期待的輸出(標(biāo)注)。
反向傳播算法:最初,所有的邊權(quán)重(edge weight)都是隨機(jī)分配的。對于所有訓(xùn)練數(shù)據(jù)集中的輸入,人工神經(jīng)網(wǎng)絡(luò)都被激活,并且觀察其輸出。這些輸出會和我們已知的、期望的輸出進(jìn)行比較,誤差會「傳播」回上一層。該誤差會被標(biāo)注,權(quán)重也會被相應(yīng)的「調(diào)整」。該流程重復(fù),直到輸出誤差低于制定的標(biāo)準(zhǔn)。
上述算法結(jié)束后,我們就得到了一個學(xué)習(xí)過的人工神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)被認(rèn)為是可以接受「新」輸入的。該人工神經(jīng)網(wǎng)絡(luò)可以說從幾個樣本(標(biāo)注數(shù)據(jù))和其錯誤(誤差傳播)中得到了學(xué)習(xí)。
現(xiàn)在我們知道了反向傳播的原理,我們回到上面的學(xué)生分?jǐn)?shù)數(shù)據(jù)集。
圖 5:多層感知器的前向傳播
圖 5 中的多層感知器(修改自 Sebastian Raschka 漂亮的反向傳播算法圖解:https://github.com/rasbt/python-machine-learning-book/blob/master/faq/visual-backpropagation.md)的輸入層有兩個節(jié)點(diǎn)(除了偏置節(jié)點(diǎn)以外),兩個節(jié)點(diǎn)分別接收「學(xué)習(xí)小時數(shù)」和「期中考試分?jǐn)?shù)」。感知器也有一個包含兩個節(jié)點(diǎn)的隱藏層(除了偏置節(jié)點(diǎn)以外)。輸出層也有兩個節(jié)點(diǎn)——上面一個節(jié)點(diǎn)輸出「通過」的概率,下面一個節(jié)點(diǎn)輸出「不通過」的概率。
在分類任務(wù)中,我們通常在感知器的輸出層中使用 Softmax 函數(shù)作為激活函數(shù),以保證輸出的是概率并且相加等于 1。Softmax 函數(shù)接收一個隨機(jī)實(shí)值的分?jǐn)?shù)向量,轉(zhuǎn)化成多個介于 0 和 1 之間、并且總和為 1 的多個向量值。所以,在這個例子中:
概率(Pass)+概率(Fail)=1
第一步:前向傳播
網(wǎng)絡(luò)中所有的權(quán)重都是隨機(jī)分配的。我們現(xiàn)在考慮圖 5 中標(biāo)注 V 的隱藏層節(jié)點(diǎn)。假設(shè)從輸入連接到這些節(jié)點(diǎn)的權(quán)重分別為 w1、w2 和 w3(如圖所示)。
神經(jīng)網(wǎng)絡(luò)會將第一個訓(xùn)練樣本作為輸入(我們已知在輸入為 35 和 67 的情況下,通過的概率為 1)。
網(wǎng)絡(luò)的輸入=[35, 67]
期望的網(wǎng)絡(luò)輸出(目標(biāo))=[1, 0]
涉及到的節(jié)點(diǎn)的輸出 V 可以按如下方式計(jì)算(*f* 是類似 Sigmoid 的激活函數(shù)):
V = f(1*w1 + 35*w2 + 67*w3)
同樣,隱藏層的其他節(jié)點(diǎn)的輸出也可以計(jì)算。隱藏層兩個節(jié)點(diǎn)的輸出,是輸出層兩個節(jié)點(diǎn)的輸入。這讓我們可以計(jì)算輸出層兩個輸出的概率值。
假設(shè)輸出層兩個節(jié)點(diǎn)的輸出概率分別為 0.4 和 0.6(因?yàn)闄?quán)重隨機(jī),輸出也會隨機(jī))。我們可以看到計(jì)算后的概率(0.4 和 0.6)距離期望概率非常遠(yuǎn)(1 和 0),所以圖 5 中的網(wǎng)絡(luò)被視為有「錯誤輸出」。
第二步:反向傳播和權(quán)重更新
我們計(jì)算輸出節(jié)點(diǎn)的總誤差,并將這些誤差用反向傳播算法傳播回網(wǎng)絡(luò),以計(jì)算梯度。接下來,我們使用類似梯度下降之類的算法來「調(diào)整」網(wǎng)絡(luò)中的所有權(quán)重,目的是減少輸出層的誤差。圖 6 展示了這一過程(暫時忽略圖中的數(shù)學(xué)等式)。
假設(shè)附給節(jié)點(diǎn)的新權(quán)重分別是 w4,w5 和 w6(在反向傳播和權(quán)重調(diào)整之后)。
圖 6:多層感知器中的反向傳播和權(quán)重更新步驟
如果我們現(xiàn)在再次向網(wǎng)絡(luò)輸入同樣的樣本,網(wǎng)絡(luò)應(yīng)該比之前有更好的表現(xiàn),因?yàn)闉榱俗钚』`差,已經(jīng)調(diào)整了權(quán)重。如圖 7 所示,和之前的 [0.6, -0.4] 相比,輸出節(jié)點(diǎn)的誤差已經(jīng)減少到了 [0.2, -0.2]。這意味著我們的網(wǎng)絡(luò)已經(jīng)學(xué)習(xí)了如何正確對第一個訓(xùn)練樣本進(jìn)行分類。
圖 7:在同樣的輸入下,多層感知器網(wǎng)絡(luò)有更好的表現(xiàn)
用我們數(shù)據(jù)集中的其他訓(xùn)練樣本來重復(fù)這一過程。這樣,我們的網(wǎng)絡(luò)就可以被視為學(xué)習(xí)了這些例子。
現(xiàn)在,如果我們想預(yù)測一個學(xué)習(xí)了 25 個小時、期中考試 70 分的學(xué)生是否能通過期末考試,我們可以通過前向傳播步驟來計(jì)算 Pass 和 Fail 的輸出概率。
我回避了數(shù)學(xué)公式和類似「梯度下降(Gradient Descent)」之類概念的解釋,而是培養(yǎng)了一種對于算法的直覺。對于反向傳播算法更加注重?cái)?shù)學(xué)方面討論,請參加此鏈接: ~vlsi/AI/backp_t_en/backprop.html
多層感知器的 3D 可視化
Adam Harley 創(chuàng)造了一個多層感知器的 3D 可視化(~aharley/vis/fc/),并已經(jīng)開始使用 MNIST 數(shù)據(jù)庫手寫的數(shù)字進(jìn)行訓(xùn)練。
此網(wǎng)絡(luò)從一個 28 x 28 的手寫數(shù)字圖像接受 784 個數(shù)字像素值作為輸入(在輸入層有對應(yīng)的 784 個節(jié)點(diǎn))。網(wǎng)絡(luò)的第一個隱藏層有 300 個節(jié)點(diǎn),第二個隱藏層有 100 個節(jié)點(diǎn),輸出層有 10 個節(jié)點(diǎn)(對應(yīng) 10 個數(shù)字)[15]。
雖然這個網(wǎng)絡(luò)跟我們剛才討論的相比大了很多(使用了更多的隱藏層和節(jié)點(diǎn)),所有前向傳播和反向傳播步驟的計(jì)算(對于每個節(jié)點(diǎn)而言)方式都是一樣的。
圖 8 顯示了輸入數(shù)字為「5」的時候的網(wǎng)絡(luò)
圖 8:輸入為「5」時的視覺化的網(wǎng)絡(luò)
輸出值比其它節(jié)點(diǎn)高的節(jié)點(diǎn),用更亮的顏色表示。在輸入層,更亮的節(jié)點(diǎn)代表接受的數(shù)字像素值更高。注意,在輸出層,亮色的節(jié)點(diǎn)是如何代表數(shù)字 5 的(代表輸出概率為 1,其他 9 個節(jié)點(diǎn)的輸出概率為 0)。這意味著多層感知器對輸入數(shù)字進(jìn)行了正確的分類。我非常推薦對這個可視化進(jìn)行探究,觀察不同節(jié)點(diǎn)之間的聯(lián)系。
結(jié)論
在這篇文章中,我跳過了部分概念的重要細(xì)節(jié),以促進(jìn)理解。為了全面理解多層感知器,我推薦閱讀斯坦福神經(jīng)網(wǎng)絡(luò)教程的第一、第二、第三和案例研究部分。如果有任何問題或者建議,請?jiān)谙路皆u論告訴我。
評論
查看更多