在線性分類器中,使用公式
:對(duì)圖像進(jìn)行分類,神經(jīng)網(wǎng)絡(luò)則使用另外一種公式:,這里只是兩層的網(wǎng)絡(luò)結(jié)構(gòu),參數(shù)W1和W2在反向傳播過(guò)程中,通過(guò)鏈?zhǔn)椒▌t得到。上圖1中,左邊是人腦的神經(jīng)元結(jié)構(gòu),右邊是神經(jīng)網(wǎng)絡(luò)數(shù)學(xué)模型。
其中,生物神經(jīng)元:從樹(shù)突(dendrites)獲取輸入信號(hào),然后沿著它唯一的軸突(axon)產(chǎn)生輸出信號(hào);軸突在其末端逐漸分枝,通過(guò)突觸(synapses)和其他神經(jīng)元的樹(shù)突相連。
神經(jīng)網(wǎng)絡(luò)模型:信號(hào) x0 沿著軸突傳播,將基于突觸的強(qiáng)度(如w0),與其他神經(jīng)元的樹(shù)突進(jìn)行交互(比如w0x0)。其中,突觸的強(qiáng)度(即權(quán)重w)是可以學(xué)習(xí)的,并且控制著一個(gè)神經(jīng)元對(duì)另一神經(jīng)元的影響強(qiáng)度和影響方向(正權(quán)重使其興奮,負(fù)權(quán)重使其抑制)。在圖1右邊的基本模型中,多個(gè)信號(hào)在細(xì)胞體(cell body)中相加,如果累加和大于某個(gè)閾值,那么使得該神經(jīng)元被激活,軸突輸出一個(gè)峰值信號(hào)。
- class Neuron(object):
- # ...
- def forward(self, inputs):
- """ assume inputs and weights are 1-D numpy arrays and bias is a number """
- cell_body_sum = np.sum(inputs * self.weights) + self.bias
- firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid activation function
- return firing_rate
(1)sigmoid函數(shù):
上圖2中,左邊是Sigmoid函數(shù),它將輸入范圍壓縮為[0,1]。右邊是tanh函數(shù),它將輸入范圍壓縮為[-1,1]。
現(xiàn)在sigmoid函數(shù)已經(jīng)很少使用了,因?yàn)?strong>sigmoid存在兩個(gè)主要缺點(diǎn):
(1)sigmoid函數(shù)飽和會(huì)使得梯度消失。當(dāng)神經(jīng)元的激活狀態(tài)在接近于0或1時(shí)會(huì)產(chǎn)生飽和,此處的梯度幾乎為0,而在反向傳播中需要將這個(gè)(局部)梯度與整個(gè)損失函數(shù)關(guān)于該門(mén)單元輸出的梯度相乘。所以如果這個(gè)局部梯度非常小的話,相乘的結(jié)果會(huì)接近于0。另外為了防止飽和現(xiàn)象,需要對(duì)權(quán)重矩陣的初始化特別注意。例如,當(dāng)初始權(quán)重過(guò)大時(shí),此時(shí)大多數(shù)神經(jīng)元將會(huì)飽和,導(dǎo)致整個(gè)網(wǎng)絡(luò)幾乎不會(huì)學(xué)習(xí)了。
(2)sigmoid函數(shù)的輸出不是以0為中心。神經(jīng)元得到的數(shù)據(jù)不以0為中心,會(huì)影響梯度下降的計(jì)算。如果輸入神經(jīng)元的數(shù)據(jù)總是正數(shù)(比如在
對(duì)比之下,tanh函數(shù)也存在飽和現(xiàn)象,當(dāng)時(shí)其輸出是以0為中心的;
(3)ReLU函數(shù):
(4)Leaky ReLU函數(shù):
(5)Maxout函數(shù):
上圖2左面是ReLU函數(shù)曲線,右邊是ReLU函數(shù)相比于tanh函數(shù)在收斂性上的優(yōu)勢(shì)(Krizhevsky 等的論文指出ReLU收斂性能是tan的6倍),這是ReLU函數(shù)的優(yōu)點(diǎn),還有就是計(jì)算效率高,因?yàn)樗慌c0作比較。但是,ReLU函數(shù)也存在明顯的缺點(diǎn):當(dāng)一個(gè)很大的梯度流過(guò)ReLU神經(jīng)元時(shí),可能會(huì)導(dǎo)致神經(jīng)元無(wú)法被其他數(shù)據(jù)點(diǎn)再次激活,此時(shí)流過(guò)這個(gè)神經(jīng)元的梯度都將會(huì)變成0,從而導(dǎo)致數(shù)據(jù)多樣化的丟失。例如當(dāng)學(xué)習(xí)率設(shè)置的過(guò)高后,可能會(huì)使得網(wǎng)絡(luò)中40%的神經(jīng)元死掉。
Leaky ReLU是一種為解決“ReLU死亡”問(wèn)題的嘗試:當(dāng)x<0時(shí),ReLU函數(shù)值為0,而Leaky ReLU給出一個(gè)很小的負(fù)數(shù)梯度值(如0.01)。有些論文指出這個(gè)函數(shù)的表現(xiàn)不錯(cuò),但是效果不是很穩(wěn)定。何凱明等人在2015年發(fā)布的論文Delving Deep into Rectifiers中介紹了一種新方法:PReLU,該方法把負(fù)值區(qū)間上的斜率作為每個(gè)神經(jīng)元的一個(gè)參數(shù),然而該函數(shù)在面對(duì)不同任務(wù)時(shí)是否都取得有益性方面(即一致性)沒(méi)有清晰的說(shuō)明。
Maxout函數(shù)是對(duì)ReLU和leaky ReLU函數(shù)的一般化歸納,ReLU和Leaky ReLU函數(shù)可以看作是Maxout函數(shù)的特例(當(dāng)w1=0,b1=0時(shí),就是ReLU)。這樣Maxout神經(jīng)元就只得到ReLU的優(yōu)點(diǎn),而摒棄了缺點(diǎn),但是參數(shù)數(shù)量上卻增加了。
- # 一個(gè)3層神經(jīng)網(wǎng)絡(luò)的前向傳播:
- f = lambda x: 1.0/(1.0 + np.exp(-x)) # 激活函數(shù)(用的sigmoid)
- x = np.random.randn(3, 1) # 含3個(gè)數(shù)字的隨機(jī)輸入向量(3x1)
- h1 = f(np.dot(W1, x) + b1) # 計(jì)算第一個(gè)隱層的激活數(shù)據(jù)(4x1)
- h2 = f(np.dot(W2, h1) + b2) # 計(jì)算第二個(gè)隱層的激活數(shù)據(jù)(4x1)
- out = np.dot(W3, h2) + b3 # 神經(jīng)元輸出(1x1)
代碼中的 x 并不一定是一個(gè)單獨(dú)的列向量,也可以是一個(gè)批量的訓(xùn)練數(shù)據(jù)(每個(gè)輸入樣本作為x的一列),所有樣本可以并行計(jì)算。例如,在二維平面上的二分類問(wèn)題, 鏈接的網(wǎng)頁(yè)是該問(wèn)題的demo。分別訓(xùn)練3個(gè)不同的神經(jīng)網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)都只有一個(gè)隱層,但是每層的神經(jīng)元數(shù)目不同。下圖3是課程給出的不同數(shù)量神經(jīng)元對(duì)應(yīng)的分類結(jié)果:
當(dāng)神經(jīng)網(wǎng)絡(luò)有更多的神經(jīng)元時(shí),可以表達(dá)更復(fù)雜的函數(shù),但不足是可能造成對(duì)訓(xùn)練數(shù)據(jù)的過(guò)擬合。相反地,神經(jīng)網(wǎng)絡(luò)神經(jīng)元數(shù)量太小會(huì)增加梯度下降的訓(xùn)練難度,另外最終的損失值可能展現(xiàn)出多變性。所以,在過(guò)擬合和泛化能力之間需要一個(gè)平衡,以及需要使用防止過(guò)擬合的方法以便可以運(yùn)用多神經(jīng)元結(jié)構(gòu)。課中提到了正則化的方法,估計(jì)后面還會(huì)展開(kāi)吧,留意一下。
參考:
http://cs231n.github.io/neural-networks-1/
https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit
https://zhuanlan.zhihu.com/p/21513367?refer=intelligentunit
聯(lián)系客服