轉載自http://www.cnblogs.com/qw12/p/6294430.html
1. 神經元模型
神經元是神經網絡中最基本的結構,也可以說是神經網絡的基本單元,它的設計靈感完全來源於生物學上神經元的信息傳播機制。我們學過生物的同學都知道,神經元有兩種狀態:興奮和抑制。一般情況下,大多數的神經元是處於抑制狀態,但是一旦某個神經元收到刺激,導致它的電位超過一個閾值,那么這個神經元就會被激活,處於“興奮”狀態,進而向其他的神經元傳播化學物質(其實就是信息)。
下圖為生物學上的神經元結構示意圖:
1943年,McCulloch和Pitts將上圖的神經元結構用一種簡單的模型進行了表示,構成了一種人工神經元模型,也就是我們現在經常用到的“M-P神經元模型”,如下圖所示:
從上圖M-P神經元模型可以看出,神經元的輸出
其中θ為我們之前提到的神經元的激活閾值,函數f也被稱為是激活函數。如上圖所示,函數f(·)可以用一個階躍方程表示,大於閾值激活;否則則抑制。但是這樣有點太粗暴,因為階躍函數不光滑,不連續,不可導,因此我們更常用的方法是用sigmoid函數來表示函數函數f(·)。
sigmoid函數的表達式和分布圖如下所示:

1969年Minsky在《感知機》中指出感知機只能用於線性可分的模式分類問題和一階謂詞邏輯問題,不能用於線性不可分的模式分類問題和高階謂詞邏輯問題。
多層感知機模型理論上有求解線性不可分的能力,但是當時並沒有有效的訓練方法。
2. ReLU激活函數
結合生物神經元,采用任一非線性激活函數,都能使單層感知機具有求解線性不可分的能力。
以下摘自Physcal的博文ReLu(Rectified Linear Units)激活函數。
傳統神經網絡中最常用的兩個激活函數,Sigmoid系(Logistic-Sigmoid、Tanh-Sigmoid)被視為神經網絡的核心所在。
從數學上來看,非線性的Sigmoid函數對中央區的信號增益較大,對兩側區的信號增益小,在信號的特征空間映射上,有很好的效果。
從神經科學上來看,中央區酷似神經元的興奮態,兩側區酷似神經元的抑制態,因而在神經網絡學習方面,可以將重點特征推向中央區,將非重點特征推向兩側區。
2001年,神經科學家Dayan、Abott從生物學角度,模擬出了腦神經元接受信號更精確的激活模型,該模型如左圖所示:
這個模型對比Sigmoid系主要變化有三點:①單側抑制 ②相對寬闊的興奮邊界 ③稀疏激活性(重點,可以看到紅框里前端狀態完全沒有激活)
同年,Charles Dugas等人在做正數回歸預測論文中偶然使用了Softplus函數,Softplus函數是Logistic-Sigmoid函數原函數。
Softplus(x)=log(1+ex)
按照論文的說法,一開始想要使用一個指數函數(天然正數)作為激活函數來回歸,但是到后期梯度實在太大,難以訓練,於是加了一個log來減緩上升趨勢。
加了1是為了保證非負性。同年,Charles Dugas等人在NIPS會議論文中又調侃了一句,Softplus可以看作是強制非負校正函數max(0,x)平滑版本。
偶然的是,同是2001年,ML領域的Softplus/Rectifier激活函數與神經科學領域的提出腦神經元激活頻率函數有神似的地方,這促成了新的激活函數的研究。
生物神經的稀疏激活性
在神經科學方面,除了新的激活頻率函數之外,神經科學家還發現了神經元的稀疏激活性。
還是2001年,Attwell等人基於大腦能量消耗的觀察學習上,推測神經元編碼工作方式具有稀疏性和分布性。
2003年Lennie等人估測大腦同時被激活的神經元只有1~4%,進一步表明神經元工作的稀疏性。
從信號方面來看,即神經元同時只對輸入信號的少部分選擇性響應,大量信號被刻意的屏蔽了,這樣可以提高學習的精度,更好更快地提取稀疏特征。
從這個角度來看,在經驗規則的初始化W之后,傳統的Sigmoid系函數同時近乎有一半的神經元被激活,這不符合神經科學的研究,而且會給深度網絡訓練帶來巨大問題。
Softplus照顧到了新模型的前兩點,卻沒有稀疏激活性。因而,校正函數max(0,x)成了近似符合該模型的最大贏家。
人類中樞神經系統中約含1000億個神經元;人眼有約1.2億個視桿細胞,600萬~700萬的視錐細胞 。
幾乎所有的神經元都是相互聯系在一起,組成一個復雜的網絡。
如果沒有激活機制,信號的傳遞和網絡訓練將消耗巨大。ReLU激活函數使得神經元低於閾值時處於沉默狀態。
ReLU相對於Sigmoid一方面大大降低運算(生物運算也有成本);另一方面在輸入信號較強時,仍然能夠保留信號之間的差別。
3. ReLu的反向傳播
以下為《Notes on Convolutional Neural Networks》中的輸出層反向傳播公式。
下面函數是針對已經經過ReLU運算后求ReLU的導數。
def relu_prime(self,z): z[z>0]=1 return z
ReLU是在BP算法之后廣泛使用的,假設沒有BP算法,我們仍然可以根據生物神經網絡推測權值的更新方式。
假設有以下網絡,由於輸出層第一個值為0,相當於w的左側並未激活。
計算誤差時用 f'(uL)*(yn-tn) 相當於不更新左側權值。( f'(uL) = [0,1] )
如下可見,添加一個ReLu激活函數,就能使感知機對XOR類問題收斂。
# coding:utf-8 import numpy as np def relu(z): return np.maximum(z, 0.0) def percepT(x, y, iter): # 感知機原始形式 n = np.shape(x)[1] m = len(x) theta = np.ones(n) alpha = 0.02 for it in range(iter): l = 0 print it for k in range(m): a=relu(x[k].dot(theta.T)) if (a) * y[k] < 0: l = 1 theta+=alpha *(y[k]-a)*x[k] if l == 0: break return theta N=3 a=range(2**N) x=[bin(i)[2:].zfill(N) for i in a] data=np.array([[int(i) for i in j ]for j in x]) y=np.array([i[0]*i[2] for i in data]) y[y==0]=-1 theta = percepT(data, np.array(y), 100) print theta # [-0.01272316 -0.1729134 -0.01583692] for i,j in zip(data,np.array(y)): print relu(i.dot(theta.T))* j>=0 """ True True True True True True True True """