
感知機和神經(jīng)網(wǎng)絡(luò)
感知機
鑒于感知機和神經(jīng)網(wǎng)絡(luò)的相似性,我們從感知機的角度來出發(fā),先來看看感知機的結(jié)構(gòu)是什么樣的
我們對照感知機的公式
可以發(fā)現(xiàn),從輸入層到輸出層,其實就是感知機的函數(shù)模型,當(dāng)然了,這個
到
的權(quán)重就是
,或者是直接把
看出是一個偏置項
(當(dāng)然,
本身就是偏置項),因此我們就將感知機模型轉(zhuǎn)化成了這樣的網(wǎng)絡(luò)結(jié)構(gòu),而這樣的網(wǎng)絡(luò)結(jié)構(gòu),其實也就是沒有隱藏層的神經(jīng)網(wǎng)絡(luò),待會我們再介紹,現(xiàn)在先來看一下感知機是如何解決邏輯問題的
因為是一個符號函數(shù),它對于小于0的
都會輸出為-1,并且我們做邏輯問題的輸入和輸出都是0 or 1,所以我們將其進行簡單的修改,讓其對小于0的
輸出都為0,于是得到如下:
與此同時,對于的問題,我們將
統(tǒng)一設(shè)定為+1,其傳入下一層的權(quán)重為
,此時,我們便可以開始著手解決邏輯“與”,“或”,“非”的問題了
- 對于邏輯“與”問題,我們可以令
,此時我們
,這里我們借用吳恩達老師的表格,如下所示:
邏輯“與”的實現(xiàn) - 對于邏輯“或”問題,我們可以令
,此時我們
,于是得到如下:
邏輯“或”的實現(xiàn) - 對于邏輯“非”問題,我們可以令
,此時我們
而對于異或問題,按書上介紹所說,感知機是不能解決以異或問題為代表的非線性可分問題的,所以我們先來看一下什么是異或問題
異或問題與多層感知機(MLP)
異或問題形式化成數(shù)學(xué)公式是,即
取值相同時為0,取值不同時為1。而異或問題實際上是一個非線性可分問題,即不存在一條曲面可以將數(shù)據(jù)集正確的劃分,如下圖所示:

我們可以看出,對于圖上的4個點(0,0),(1,0),(0,1),(1,1),感知機是不可能生成一條直線可以將其正確劃分的,但是我們是否可以發(fā)現(xiàn),因為異或問題形式化公式是這樣的,我們完全可以將其拆成一個個子問題來解決,比如令
,此時
,而
中,我們又可以將
視為一個整體,
中的
也是,所以我們可以發(fā)現(xiàn),其實要實現(xiàn)異或問題,也就是多用幾個感知機的問題,即先用感知機生成
和
,然后再用感知機生成
和
,最后再用感知機生成
,這樣,我們就解決了異或問題,如下圖所示

圖上沒有標出權(quán)重,不然就太亂了,大致是這樣的過程,從輸入層,
是輸入值,每個值都會用一條有權(quán)重的邊指向下一層的點,其中,權(quán)重值是不一樣的,比如我們要實現(xiàn)
,假設(shè)
就是
,則從
射來的邊的權(quán)重就分別為10,-20,0,以此類推,
就是
,
就是
,
就是
,到了第二個隱含層,
就是
,
就是
,最終,我們會在輸出層
中得到異或問題的答案。(注意:這里的異或問題解決的方法比西瓜書上稍微復(fù)雜了一點,但我覺得這樣的解決方案似乎更貼近之前感知機在邏輯“與”,“或”,“非”上的解決,所以就自己畫了個圖)
多層前饋神經(jīng)網(wǎng)絡(luò)
此時,我們應(yīng)該能夠直觀地了解到多層感知機( Multi-layer Perceptron)的效果,而多層感知機其實也就是我們的神經(jīng)網(wǎng)絡(luò),在西瓜書中它有一個確切的定義,即每層神經(jīng)元與下一層神經(jīng)元全互連,神經(jīng)元之間不存在同層鏈接,也不存在跨層鏈接,這樣的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)通常稱為“多層前饋神經(jīng)網(wǎng)絡(luò)”。這里我們還必須補充一下相關(guān)概念的知識點:
- 神經(jīng)元指的是每一層中的單個結(jié)點;
- 除了輸入層和輸出層外,中間的層稱為隱含層,而擁有不同數(shù)目隱含層的神經(jīng)網(wǎng)絡(luò)稱呼也不一樣,如下圖所示,單個隱含層的稱為單隱層前饋網(wǎng)絡(luò),兩個隱含層的稱為雙隱層前饋網(wǎng)絡(luò);
- 前一層的神經(jīng)元和后一層的神經(jīng)元鏈接邊的權(quán)重稱為連接權(quán)
- 每一層的最上面都會有一個
or
,這個稱之為偏置項,不是神經(jīng)元,這個偏置項不會接收前一層任何神經(jīng)元傳入的值,但自己會發(fā)出數(shù)值給下一層神經(jīng)元
摘自西瓜書
另外,如果對多層感知機還是沒有一個直觀認識的話,那么我們可以用下圖感受一下
摘自sklearn官方文檔
基于反向傳播(BP)算法的神經(jīng)網(wǎng)絡(luò)
基于以上,我們了解了多層感知機的由來和一點點神經(jīng)網(wǎng)絡(luò)的雛形,下邊我們來介紹一下神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)中著名的BP(error Backpagation)算法,即反向傳播算法(也稱誤差逆?zhèn)鞑ニ惴ǎA硗?,這個算法的工作是先根據(jù)一個樣本點進行前向傳播,尋找到該樣本點的輸出函數(shù)和預(yù)測值,然后進行反向傳播,利用代價函數(shù)計算每一層的神經(jīng)元的誤差值,進而更新每個邊的連接權(quán)和閾值,重新進行下一個樣本點的前向傳播,一直讓目標朝著代價函數(shù)最小化的方向前進,直到找到迭代次數(shù)達到上限or代價函數(shù)降低的某一個設(shè)定的最小值以下結(jié)束
前向傳播
在之前多層感知機的介紹中,我們了解到了多層感知機的工作機能,其大致過程就是從輸入層開始,一層層地通過隱含層的計算,最終到達輸出層輸出預(yù)測值,而這個過程就是前向傳播的整個流程,但是,以上我們講解的都過于粗糙,所以,接下來我們需要從下圖仔細講解整個前向傳播的過程:
- 首先,我們給出一個樣本點
,
有d個特征,我們將其排列對齊,作為輸入層的數(shù)值
- 然后經(jīng)過初始化后的連接權(quán)可以計算出下一層神經(jīng)元的輸入數(shù)值,比如下圖中的
,就是隱含層中第h個隱層神經(jīng)元(暫時稱這個神經(jīng)元為
)的輸入,其中
是
到
的連接權(quán)
- 計算出
的輸入值后,因為每個神經(jīng)元都有一個閾值,所以我們需要先輸入值
減去閾值
,然后利用激活函數(shù)(activation function),計算出
神經(jīng)元的輸出值
,即
,而這個
就是激活函數(shù),只是在多層感知機中,激活函數(shù)使用的是符號函數(shù)
,而在BP算法中,我們需要引入凸函數(shù)的性質(zhì),
函數(shù)并不具備這樣的性質(zhì),所以我們使用sigmoid函數(shù)來替代
- 計算出所有隱含層的輸出值后,我們通過
,計算出每一個
的輸入值,然后在用
的激活函數(shù)從而得到
的輸出值
- 注意:這里的輸出層有多個
是因為它作為多類別輸出所造成的,比如根據(jù)吳恩達老師所說,我們假設(shè)輸出層有三個 ,每個
代表一類,其中
得到輸出為
,則該
應(yīng)該是輸出第三類,同樣的,如果最終輸出是
,則該
應(yīng)該是輸出第二類
- 疑問:如果輸出是
呢?我覺得這就需要和實際數(shù)據(jù)集的輸出類別個數(shù)決定了,如果類別過多了,那么就可以將其用二進制的方式表示其類別,而
表示的就是第四類
摘自西瓜書
- 注意:這里的輸出層有多個
反向傳播
正如一開始所說,反向傳播是利用代價函數(shù)計算每一層神經(jīng)元的誤差值,從而更新參數(shù),那么我們就需要看一下,到底有哪些參數(shù)是需要更新的,并且是如何更新的。當(dāng)然,我們必須先有損失函數(shù)才可以,這里我們先假設(shè)代價函數(shù)是用均方誤差來計算
- 注意:這里的1/2是為了后續(xù)的計算方便,且代價函數(shù)也沒有考慮正則化項
整個神經(jīng)網(wǎng)絡(luò)有哪些參數(shù)需要更新:
-
:隱層到輸出層的連接權(quán)
-
:輸出層第
個神經(jīng)元的閾值
-
:輸入層第
個神經(jīng)元與隱層第
個神經(jīng)元之間的連接權(quán)
-
:隱層第
個神經(jīng)元的閾值
現(xiàn)在,我們以隱層到輸出層的連接權(quán)為例,基于梯度下降的方法進行推導(dǎo)
- 參數(shù)
的更新式如下
- 其中,假設(shè)給定學(xué)習(xí)率
,有
- 現(xiàn)在,為例計算上面的整個
,我們根據(jù)求導(dǎo)的鏈式法則將式子進行如下分解
1.其中,是輸出層中第
個神經(jīng)元的輸入值;
是輸出層中第
個神經(jīng)元的輸出值
2.因為,所以我們得到
3.又因為激活函數(shù)sigmoid的一個性質(zhì)為,所以,我們可以令
,于是得到
- 現(xiàn)在,為例計算上面的整個
- 因此,基于以上的推導(dǎo),我們可以得到
類似地,我們可以得到其他參數(shù)的更新式
- 其中
BP算法偽代碼

算法實現(xiàn)需要注意的要點
下面都是一些在算法實現(xiàn)需要注意的地方,目前自己都還沒有做實驗,所以都只是理論上理解下來的,所以整理在下面
參數(shù)的隨機初始化
根據(jù)吳恩達老師在視頻中所說,如果一開始我們假設(shè)所有參數(shù)為0,那么這樣的參數(shù)初始化方法雖然對邏輯斯蒂回歸行得通,但是對于神經(jīng)網(wǎng)絡(luò)來說是行不通的。因為如果我們令所有的初始參數(shù)為0(或全部參數(shù)都為一樣的值),那么這就意味著第二層的所有神經(jīng)元都會有相同的值,(注意:因為吳恩達在視頻中沒有講到神經(jīng)元的閾值,所以這里的所有參數(shù)指的是上一層到下一層的連接權(quán),而神經(jīng)元得到的相同值是指上一層經(jīng)過連接權(quán)輸入給下一層神經(jīng)元的輸入值),如下所示:
- 設(shè)輸入層的神經(jīng)元為
,偏置項為
,隱含層的神經(jīng)元為
,其中
連接到
的連接權(quán)為
,而
連接到
的連接權(quán)為
,偏置項
連接到
的連接權(quán)為
-
的輸入值為
的輸入值為
- 因為所有參數(shù)都是一樣的,即
,所以我們可以發(fā)現(xiàn)最終
這樣的結(jié)果對于接下來的訓(xùn)練是沒有意義的,因此我們需要隨機初始化參數(shù),一般是讓初始參數(shù)為正負
之間的隨機值
激活函數(shù)的選擇
在整個神經(jīng)網(wǎng)絡(luò)中有兩種激活函數(shù),一種是用于隱含層上的激活函數(shù),一種是用于輸出層上的激活函數(shù),這兩層神經(jīng)元的激活函數(shù)的選擇是有一些些不同的,比如:
- 隱含層上的激活函數(shù)選擇
- tanh函數(shù)(Hyperbolic Tangent),即雙曲正切函數(shù),公式如下
- 注:sklearn官方文檔上的說明是tanh函數(shù),而有些博客上表示也可以使用sogmoid函數(shù),但似乎更多的人認為盡量不要用sigmoid函數(shù),因為目前已經(jīng)有了更好的函數(shù)Relu
- tanh函數(shù)(Hyperbolic Tangent),即雙曲正切函數(shù),公式如下
- 輸出層上的激活函數(shù)選擇
- 二分類問題:sigmoid函數(shù)
- 多分類問題:softmax函數(shù)
- 注:sigmoid函數(shù)是softmax函數(shù)的一種特殊情況,sigmoid是將一個real
value映射到(0,1)的區(qū)間(or(-1,1)的區(qū)間),由此做二分類,而
softmax是將一個K維的real value向量的每一個元素進行映射,然后將返回
的結(jié)果經(jīng)過歸一化處理得到一個向量,向量中的每個元素代表的是屬于某個類的可能性,而在輸出的時候,這個結(jié)果會輸出向量中可能性最大的那個,如,其中
是(0,1)上的常數(shù)最終我們返回
對應(yīng)的類別
- 注:sigmoid函數(shù)是softmax函數(shù)的一種特殊情況,sigmoid是將一個real
- 在回歸問題的解決上,sklearn的官方文檔似乎表達的就一句話,摘錄如下;但是,我也不大理解這是啥意思,感覺像是在說可以讓f(x)=x,但是有些博客上說這樣的線性函數(shù)會讓神經(jīng)網(wǎng)絡(luò)在非線性回歸中的魅力無法發(fā)揮,emmmm,我也不太懂,以后再補吧
In regression, the output remains as f(x) ; therefore, output
activation function is just the identity function.
另外,我們在使用反向傳播更新參數(shù)權(quán)重時,計算過程中會涉及到激活函數(shù)的求導(dǎo)計算,所以激活函數(shù)的選擇將會影響收斂速度,并且,使用sigmoid函數(shù)的過程本身就會有一定的問題,問題如下:
- 容易出現(xiàn)梯度消失
- 函數(shù)輸出不是zero-centered
- 冪運算相對比較耗時
為什么會出現(xiàn)上面的問題,我們先看一下sigmoid函數(shù)的圖像

左邊是函數(shù)本身,右邊是sigmoid函數(shù)的導(dǎo)函數(shù)圖像,基于此,我們可以發(fā)現(xiàn)sigmoid導(dǎo)函數(shù)的最大值只有0.25,也就是說我們的神經(jīng)網(wǎng)絡(luò)如果隱含層比較多的話,那么梯度的數(shù)值會每經(jīng)過一層下降四分之一,經(jīng)過10層就只能為原先的1/1048576,這就是梯度消失的主要原因;對于為什么是函數(shù)輸出不是zero-centered會造成梯度下降很慢,這個原因知乎上一些答主說是在斯坦福CS231n深度視覺識別課程視頻第六集第9分鐘左右,這里貼出鏈接,以后再補(傳送門)
至于為什么冪運算比較耗時,其實這是sigmoid函數(shù)自身的問題,可以很明顯的看到
因此,我們的另一種選擇是ReLU函數(shù),也是目前來說用的最多的激活函數(shù),詳細的介紹都在下面的鏈接博客里,我們可以通過一張圖來直觀的感受以下速度
圖中實線是ReLu函數(shù),虛線是sigmoid函數(shù),sigmoid函數(shù)需要35輪迭代才下降到0.25的程度,對于ReLU僅僅需要5輪,可見速度之快
損失函數(shù)的選擇
根據(jù)sklearn官方文檔所說,對于分類問題,我們使用的是交叉熵(Cross-Entropy)代價函數(shù),對于回歸問題,則是使用均方誤差損失函數(shù)。在上面的參數(shù)更新的梯度推導(dǎo)中,我們假設(shè)的是均方誤差作為損失函數(shù),而事實上,如果是分類問題的話,使用交叉熵代價函數(shù)得到的效果會更好,梯度下降的速度會更快
- 注1:這里并沒有解釋為何回歸問題用均方誤差,分類問題交叉熵則更好,目前還沒找到更好的補充資料,待以后補上吧
- 注2:交叉熵代價函數(shù)的公式是:
帶有正則項的交叉熵代價函數(shù)可參考吳恩達視頻上的公式:
- 其中,這兩個式子里,
和
都是表示單個神經(jīng)元的輸出值,
是預(yù)測值,
表示的是每一層中排除掉偏置項的連接權(quán)
- 其中,這兩個式子里,
至于為什么交叉熵要比均方誤差更好,簡單說來是因為交叉熵有一個特性,它會在模型誤差較大的時候梯度下降得更快,誤差較小的時候梯度下降得更慢,而具體的我們可以參考如下的博客,寫得極為詳細! (傳送門)
實際使用中的其他一些小技巧
關(guān)于數(shù)據(jù)預(yù)處理方面,因為多層感知機對特征放縮(feature scaling)是十分敏感的,因此我們在進行數(shù)據(jù)預(yù)處理時必須先對數(shù)據(jù)集進行特征放縮,如下所示
關(guān)于收斂速度方面,我們以上所討論的激活函數(shù)的選擇和損失函數(shù)的選擇,它們的目的都是為了加快收斂速度,但以上都是基于梯度下降的前提來去進行的,其實根據(jù)資料所說,我們甚至還有更多的選擇,比如sklearn官方文檔上給出了一些在實際應(yīng)用中的建議,如下
- 對于小規(guī)模的數(shù)據(jù)集,使用L-BFGS算法可以收斂得更快
- 對于規(guī)模相對大一些的數(shù)據(jù),Adam算法是更好的選擇,并且收斂更快
- 另外一種情況,如果學(xué)習(xí)率參數(shù)被調(diào)整的很好,那么SGD則是相對上面的算法最好的選擇
參考資料:
【1】《機器學(xué)習(xí)》周志華
【2】《機器學(xué)習(xí)視頻》吳恩達
【3】Neural network models (supervised)
【4】 神經(jīng)網(wǎng)絡(luò)中的激活函數(shù)的作用和選擇
【5】交叉熵代價函數(shù)(cross-entropy cost function)
【6】理解交叉熵損失(Cross-Entropy)
【7】交叉熵代價函數(shù)(作用及公式推導(dǎo))




