BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
我們知道單層感知機(jī)(perceptron)的局限性:它無法解決異或(XOR)問題,或者其它線性不可分問題。
考慮下圖的數(shù)據(jù)集的分類問題。這是一個(gè)線性不可分的問題,顯然單個(gè)單層感知機(jī)無法將其正確分類赂韵。
但是我們可以通過組合三個(gè)單層感知機(jī),來解決這個(gè)問題:
其中三個(gè)單層感知機(jī)可分別為:
需要注意的是挠蛉,可以正確分類的感知機(jī)組合的選擇不唯一祭示。
從上述例子,我們可以看到:通過堆疊多個(gè)單層感知機(jī)碌秸,可以解決該線性不可分問題绍移。這啟發(fā)我們用一種新的更復(fù)雜的框架——神經(jīng)網(wǎng)絡(luò)(neural network)——來建模。它包括輸入層讥电、隱含層和輸出層三部分蹂窖。在一個(gè)神經(jīng)網(wǎng)絡(luò)中,輸入層和輸出層的層數(shù)僅為恩敌,但維度可以為任意維瞬测,即輸入
、輸出
分別既可以為標(biāo)量(scaler)、又可以為向量(vector)月趟,甚至是二維矩陣(matrix)或高維數(shù)組(array)灯蝴。在本章,我們僅考慮神經(jīng)網(wǎng)絡(luò)的輸入孝宗、輸出為向量穷躁,神經(jīng)元結(jié)點(diǎn)的輸入、輸出為標(biāo)量的情形因妇。神經(jīng)網(wǎng)絡(luò)的隱含層卻可以有多層(假設(shè)層數(shù)至少為
)问潭。在每一個(gè)隱含層或輸出層,輸入該層的元素
首先進(jìn)行仿射變換
婚被,再通過激活函數(shù)映射后輸出
狡忙。這個(gè)過程與人的神經(jīng)細(xì)胞在傳遞神經(jīng)信號(hào)的過程極為相似,故也常將每一層的每個(gè)仿射變換址芯、激活函數(shù)的組合稱為一個(gè)神經(jīng)元灾茁。
仿射變換和激活函數(shù)映射在圖中分別用符號(hào)和
表示。如果僅從數(shù)學(xué)函數(shù)的角度看待神經(jīng)網(wǎng)絡(luò)谷炸,則可將其看做一個(gè)計(jì)算圖北专,不同的變量結(jié)點(diǎn)(variable node)通過計(jì)算結(jié)點(diǎn)(operator node)發(fā)生相互作用,這也是Tensorflow的基本框架旬陡。
以下我們通過前文的例子來理解上述定義逗余。
解決異或問題的多個(gè)單層感知機(jī)模型可以看做是一個(gè)具有一個(gè)隱含層的神經(jīng)網(wǎng)絡(luò),其中激活函數(shù)為階躍函數(shù)季惩,即
顯然單層感知機(jī)無法對(duì)回歸問題建模,因?yàn)樗妮敵鲋荒転?或1腻格。為了改進(jìn)這個(gè)缺陷画拾,我們可以將激活函數(shù)替換為其他線性或非線性函數(shù)。常用的激活函數(shù)有:
激活函數(shù) | 表達(dá)式 | 圖像 |
---|---|---|
sigmoid函數(shù) | sigmoid.png
|
|
tanh函數(shù) | tanh.png
|
|
ReLU函數(shù)(Rectified Linear Unit) | relu.png
|
因此菜职,現(xiàn)在我們就有了一般的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)——層級(jí)結(jié)構(gòu)——每一層由多個(gè)結(jié)點(diǎn)組成青抛,相鄰層的結(jié)點(diǎn)相互全連接。輸入層結(jié)點(diǎn)可視為將輸入的標(biāo)量通過恒等函數(shù)變換輸出酬核,隱含層和輸出層則將輸入的標(biāo)量做仿射變換蜜另、激活函數(shù)變換后輸出。
通過這樣的神經(jīng)元結(jié)構(gòu)嫡意,我們能較好地理解神經(jīng)網(wǎng)絡(luò)模型举瑰,但在后續(xù)的網(wǎng)絡(luò)權(quán)值更新過程中,計(jì)算圖框架會(huì)更加適用蔬螟。
損失函數(shù)和代價(jià)函數(shù)
同樣的網(wǎng)絡(luò)結(jié)構(gòu)此迅,搭配不同的仿射變換或激活函數(shù),都能得到不同的模型。因此耸序,我們自然會(huì)問:如何評(píng)價(jià)一個(gè)神經(jīng)網(wǎng)絡(luò)模型的效果呢忍些?
首先,對(duì)一個(gè)給定的輸入向量和真實(shí)的輸出向量
坎怪,我們定義模型的損失函數(shù)(loss function)來衡量模型對(duì)
的預(yù)測(cè)值
與
的差異罢坝,這里我們假設(shè)神經(jīng)網(wǎng)絡(luò)模型的映射為
。常用的損失函數(shù)如下:
損失函數(shù) | 表達(dá)式 | 應(yīng)用場(chǎng)景 |
---|---|---|
平方損失(square loss)函數(shù) | 線性回歸模型 | |
合頁損失(hinge loss)函數(shù) | 支持向量機(jī)模型(SVM) | |
0-1損失(0-1 loss)函數(shù) | 用于理論分析及準(zhǔn)確度的定義 | |
交叉熵?fù)p失(cross entropy loss)函數(shù) |
|
二分類或多分類問題 |
指數(shù)損失(exponential loss)函數(shù) | Adaboost模型 |
其次搅窿,對(duì)于一個(gè)模型嘁酿,我們更關(guān)心的是其在某個(gè)數(shù)據(jù)集上的表現(xiàn)而不僅局限于某個(gè)樣本,因此戈钢,我們也定義了代價(jià)函數(shù)(cost function)痹仙,來衡量模型在某個(gè)分布上的表現(xiàn):
其中是在數(shù)據(jù)集
的真實(shí)分布上求期望。在實(shí)際應(yīng)用中殉了,由于我們可能并不知道數(shù)據(jù)的真實(shí)分布开仰,故常用數(shù)據(jù)集中每個(gè)樣本點(diǎn)在特定損失函數(shù)下的損失平均值作為代價(jià)函數(shù),例如均方誤差(mean squared error)薪铜,此時(shí)有
對(duì)于神經(jīng)網(wǎng)絡(luò)這樣的參數(shù)模型众弓,通常我們不僅考慮代價(jià)函數(shù)在數(shù)據(jù)集上的值,同時(shí)也考慮模型參數(shù)的復(fù)雜程度隔箍。因此我們希望模型優(yōu)化的目標(biāo)函數(shù)(objective function)定義為:
其中是正則項(xiàng)(regularization)谓娃,它有助于防止過擬合。目標(biāo)函數(shù)就是我們?cè)趯?shí)際求解神經(jīng)網(wǎng)絡(luò)參數(shù)用的準(zhǔn)則蜒滩,好的參數(shù)可以在訓(xùn)練集滨达、測(cè)試集上都有較低的目標(biāo)函數(shù)值。
需要注意的是俯艰,代價(jià)函數(shù)和目標(biāo)函數(shù)在某些語境下并不區(qū)分捡遍,此時(shí)代價(jià)函數(shù)本身便包含正則項(xiàng)。
反向傳播算法
在前面的章節(jié)竹握,我們已經(jīng)有了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)與模型的評(píng)價(jià)標(biāo)準(zhǔn)画株,接下來,我們要考慮的是:給定數(shù)據(jù)集和神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)啦辐,我們應(yīng)該怎樣讓網(wǎng)絡(luò)從數(shù)據(jù)中學(xué)習(xí)谓传、更新參數(shù)?
在數(shù)值計(jì)算中芹关,我們常用梯度下降法來求取一個(gè)函數(shù)的局部極小值续挟,在神經(jīng)網(wǎng)絡(luò)中,我們可以將其推廣侥衬,利用鏈?zhǔn)椒▌t將誤差從后往前傳播庸推,并利用梯度下降法更新相鄰兩層間的權(quán)重常侦,最小化誤差。
在圖中贬媒,我們用表示神經(jīng)網(wǎng)絡(luò)中第
層第
個(gè)神經(jīng)元的輸入值(其中第
層表示輸入層)聋亡,同時(shí)也是第
層,用
表示第
層第
個(gè)神經(jīng)元對(duì)第
層第
個(gè)神經(jīng)元貢獻(xiàn)的權(quán)重际乘,用
表示第
層與與第
層仿射變換的偏移量坡倔,用
表示第
層第
個(gè)神經(jīng)元的輸出值,
為第
層神經(jīng)元的個(gè)數(shù)脖含。我們也可以用向量和矩陣的形式將每個(gè)神經(jīng)元結(jié)點(diǎn)表示為:
其中
而是分別作用在向量
的每一個(gè)分量上(element-wise)养葵。
以上圖中的三層網(wǎng)絡(luò)為例征堪,這個(gè)網(wǎng)絡(luò)的輸出層只有一個(gè)神經(jīng)元,假設(shè)我們已經(jīng)計(jì)算出該結(jié)點(diǎn)仿射變換輸出的誤差关拒,其下標(biāo)表示第
層第
個(gè)神經(jīng)元佃蚜。讀者也可以選擇每個(gè)結(jié)點(diǎn)輸出值的誤差進(jìn)行反向傳播更新參數(shù),但是選擇仿射變換后的誤差更加方便理解與計(jì)算着绊,因此我們按照該約定進(jìn)行反向傳播算法的介紹谐算。
- 更新隱含層與輸出層之間的參數(shù)。
注意到誤差與損失函數(shù)的關(guān)系:
其中表示逐元素相乘(element-wise multiplication / Hadamard product)归露。我們希望更新參數(shù)
和
洲脂,首先根據(jù)鏈?zhǔn)椒▌t有
因此有
類似地,
因此由梯度下降法剧包,我們可以用以下公式更新該神經(jīng)網(wǎng)絡(luò)中輸出層之前的參數(shù):
其中為人工設(shè)定的學(xué)習(xí)率恐锦,用于調(diào)整權(quán)重更新的步長(zhǎng)。
需要注意的是疆液,在實(shí)際數(shù)值計(jì)算中踩蔚,需要先求解相應(yīng)的偏導(dǎo)函數(shù),再將和
對(duì)應(yīng)的具體數(shù)值代入得到對(duì)應(yīng)的偏導(dǎo)數(shù)值枚粘。
- 誤差反向傳播。
我們希望計(jì)算出網(wǎng)絡(luò)隱含層每個(gè)結(jié)點(diǎn)的誤差飘蚯,同樣地根據(jù)鏈?zhǔn)椒▌t計(jì)算偏導(dǎo)
其中
在上述計(jì)算中涉及向量的求導(dǎo)運(yùn)算馍迄,具體的公式可以查閱Matrix Cookbook。
- 更新輸入層與隱含層之間的參數(shù)局骤。
有了隱含層的輸出誤差后攀圈,我們可以重復(fù)第一步的工作,利用梯度下降法再次更新誤差峦甩。首先從每一個(gè)分量入手赘来,
因此我們有
類似地现喳,
我們可以用以下公式更新該神經(jīng)網(wǎng)絡(luò)中輸出層之前的參數(shù):
對(duì)于上述例子,至此我們已經(jīng)完成了對(duì)一個(gè)訓(xùn)練樣本上權(quán)重的一次更新幌缝。
對(duì)于更加一般的情況灸促,假設(shè)我們有第層的輸出結(jié)點(diǎn)誤差向量
,我們可以計(jì)算相應(yīng)的梯度
其中相鄰層誤差的關(guān)系滿足
在實(shí)際訓(xùn)練過程中浴栽,逐個(gè)訓(xùn)練樣本更新權(quán)重的效率太低,而且不利于算法的收斂轿偎,因此在深度學(xué)習(xí)中常使用批次方法(mini-batch)典鸡,權(quán)重每次更新只考慮某一小批次的訓(xùn)練樣本,這時(shí)相應(yīng)的更新方向即為各個(gè)樣本更新方向的平均坏晦。
完整的反向傳播算法在以下算法中給出萝玷,該算法給出了訓(xùn)練一個(gè)多層簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的一般流程。