1 簡介
在線性分類一節中,在給出圖像的狀況下,是使用$s=W x$來計算不一樣視覺類別的評分,其中$W$是一個矩陣,$x$是一個輸入列向量,它包含了圖像的所有像素數據。python
在使用數據庫CIFAR-10的案例中,$x$是一個$[3072 \times 1]$的列向量,$W$是一個$[10 \times 3072]$的矩陣,因此輸出的評分是一個包含10個分類評分的向量。算法
神經網絡算法則不一樣,它的計算公式是$s=W_{2} \max \left(0, W_{1} x\right)$。數據庫
其中$W_{1}$的含義是這樣的:舉個例子來講,它能夠是一個[100x3072]的矩陣,其做用是將圖像轉化爲一個100維的過渡向量。數組
函數$\max (0,-)$是非線性的,它會做用到每一個元素。這個非線性函數有多種選擇。網絡
矩陣$W_{2}$的尺寸是[10x100],所以將獲得10個數字,這10個數字能夠解釋爲是分類的評分。函數
注意非線性函數在計算上是相當重要的,若是略去這一步,那麼兩個矩陣將會合二爲一,對於分類的評分計算將從新變成關於輸入的線性函數。學習
參數$W_{1}, W_{2}$將經過隨機梯度降低來學習到,他們的梯度在反向傳播過程當中,經過鏈式法則來求導計算得出。spa
一個三層的神經網絡能夠類比地看作$s=W_{3} \max \left(0, W_{2} \max \left(0, W_{1} x\right)\right)$。code
2 單個神經元建模
神經網絡算法領域最初是被對生物神經系統建模這一目標啓發。下面圖表的左邊展現了一個生物學的神經元,右邊展現了一個經常使用的數學模型。blog
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612170709528-1039864985.png" width="440" align=center />
一個神經元前向傳播的實例代碼以下:
class Neuron(object): # ... def forward(inputs): """ 假設輸入和權重是1-D的numpy數組,誤差是一個數字 """ cell_body_sum = np.sum(inputs * self.weights) + self.bias firing_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid激活函數 return firing_rate
注意:這種對於生物神經元的數學建模是很是粗糙的。
3 經常使用激活函數
3.1 Sigmoid與Tanh
Sigmoid與Tanh非線性函數圖像以下所示:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612171939309-401906057.png" width="440" align=center />
3.1.1 Sigmoid
sigmoid非線性函數的數學公式是$\sigma(x)=1 /\left(1+e^{-x}\right)$,它輸入實數值並將其「擠壓」到0到1範圍內。更具體地說,很大的負數變成0,很大的正數變成1。
然而如今sigmoid函數實際不多使用了,這是由於它有兩個主要缺點:
- sigmoid神經元有一個很差的特性,就是當神經元的激活在接近0或1處時會飽和:在這些區域,梯度幾乎爲0。
- sigmoid函數的輸出不是零中心的,這一狀況將影響梯度降低的運做。
3.1.2 Tanh
tanh非線性函數將實數值壓縮到[-1,1]之間。和sigmoid神經元同樣,它也存在飽和問題,可是和sigmoid神經元不一樣的是,它的輸出是零中心的。
注意tanh神經元是一個簡單放大的sigmoid神經元,具體說來就是:$\tanh (x)=2 \sigma(2 x)-1$。
3.2 ReLU與Leaky ReLU
3.2.1 ReLU
下圖中左邊是ReLU(校訂線性單元:Rectified Linear Unit)激活函數,當x=0時函數值爲0。當x>0函數的斜率爲1。右邊是從 Krizhevsky等的論文中截取的圖表,指明使用ReLU比使用tanh的收斂快6倍。
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612172313070-1281869077.png" width="440" align=center />
在近些年ReLU變得很是流行。它的函數公式是$f(x)=\max (0, x)$。
ReLU的優勢:
- 相較於sigmoid和tanh函數,ReLU對於隨機梯度降低的收斂有巨大的加速做用。
- sigmoid和tanh神經元含有指數運算等耗費計算資源的操做,而ReLU能夠簡單地經過對一個矩陣進行閾值計算獲得。
ReLU的缺點:
在訓練的時候,ReLU單元比較脆弱而且可能「死掉」。
舉例來講,當一個很大的梯度流過ReLU的神經元的時候,可能會致使梯度更新到一種特別的狀態,在這種狀態下神經元將沒法被其餘任何數據點再次激活。若是這種狀況發生,那麼今後因此流過這個神經元的梯度將都變成0。也就是說,這個ReLU單元在訓練中將不可逆轉的死亡,由於這致使了數據多樣化的丟失。
例如,若是學習率設置得過高,可能會發現網絡中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被激活)。經過合理設置學習率,這種狀況的發生機率會下降。
3.2.2 Leaky ReLU
Leaky ReLU是爲解決「ReLU死亡」問題的嘗試。
ReLU中當x<0時,函數值爲0。而Leaky ReLU則是給出一個很小的負數梯度值,好比0.01。因此其函數公式爲$f(x)=1(x<0)(\alpha x)+1(x>=0)(x)$。其中$\alpha$是一個小的常量。
3.3 Maxout
一些其餘類型的單元被提了出來,它們對於權重和數據的內積結果再也不使用$f\left(w^{T} x+b\right)$函數形式。
一個相關的流行選擇是Maxout神經元。Maxout是對ReLU和leaky ReLU的通常化概括,它的函數是:$\max \left(w_{1}^{T} x+b_{1}, w_{2}^{T} x+b_{2}\right)$。ReLU和Leaky ReLU都是這個公式的特殊狀況(好比ReLU就是當$w_{1}, b_{1}=0$的時候)。
這樣Maxout神經元就擁有ReLU單元的全部優勢(線性操做和不飽和),而沒有它的缺點(死亡的ReLU單元)。
然而和ReLU對比,它每一個神經元的參數數量增長了一倍,這就致使總體參數的數量激增。
4 神經網絡結構
4.1 概述
神經網絡被建模成神經元的集合,神經元之間以無環圖的形式進行鏈接。也就是說,一些神經元的輸出是另外一些神經元的輸入。在網絡中是不容許循環的,由於這樣會致使前向傳播的無限循環。
對於普通神經網絡,最普通的層的類型是全鏈接層(fully-connected layer)。全鏈接層中的神經元與其先後兩層的神經元是徹底成對鏈接的,可是在同一個全鏈接層內的神經元之間沒有鏈接。
下面是兩個神經網絡的圖例,都使用的全鏈接層:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612174511500-1707309660.png" width="440" align=center />
左邊是一個2層神經網絡,隱層由4個神經元(也可稱爲單元(unit))組成,輸出層由2個神經元組成,輸入層是3個神經元。
右邊是一個3層神經網絡,兩個含4個神經元的隱層。
有如下幾點須要補充:
(1)當咱們說N層神經網絡的時候,咱們沒有把輸入層算入。 (2)和神經網絡中其餘層不一樣,輸出層的神經元通常是不會有激活函數的 (3)用來度量神經網絡的尺寸的標準主要有兩個:一個是神經元的個數,另外一個是參數的個數,用上面圖示的兩個網絡舉例:
第一個網絡有4+2=6個神經元(輸入層不算),[3x4]+[4x2]=20個權重,還有4+2=6個偏置,共26個可學習的參數。
第二個網絡有4+4+1=9個神經元,[3x4]+[4x4]+[4x1]=32個權重,4+4+1=9個偏置,共41個可學習的參數。
(4)含有一個隱層的神經網絡就能近似任何連續函數。
既然一個隱層就能近似任何函數,那爲何還要構建更多層來將網絡作得更深?答案是:雖然一個2層網絡在數學理論上能完美地近似全部連續函數,但在實際操做中效果相對較差。
在實踐中3層的神經網絡會比2層的表現好,然而繼續加深(作到4,5,6層)不多有太大幫助。卷積神經網絡的狀況卻不一樣,在卷積神經網絡中,對於一個良好的識別系統來講,深度是一個極端重要的因素(好比數十(以10爲量級)個可學習的層)。
4.2 如何設置層的數量和尺寸
在面對一個具體問題的時候該肯定網絡結構呢?究竟是不用隱層呢?仍是一個隱層?兩個隱層或更多?每一個層的尺寸該多大?
首先,要知道當咱們增長層的數量和尺寸時,網絡的容量上升了。即神經元們能夠合做表達許多複雜函數,因此表達函數的空間增長。
例如,若是有一個在二維平面上的二分類問題。咱們能夠訓練3個不一樣的神經網絡,每一個網絡都只有一個隱層,可是每層的神經元數目不一樣:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612175748671-146248055.png" width="440" align=center />
對於上圖,更大的神經網絡能夠表達更復雜的函數。數據是用不一樣顏色的圓點表示他們的不一樣類別,決策邊界是由訓練過的神經網絡作出的。
然而對於「有更多神經元的神經網絡能夠表達更復雜的函數」這個現象來講。這既是優點也是不足,優點是能夠分類更復雜的數據,不足是可能形成對訓練數據的過擬合。
看起來若是數據不是足夠複雜,則彷佛小一點的網絡更好,由於能夠防止過擬合。然而並不是如此,防止神經網絡的過擬合有不少方法(L2正則化,dropout和輸入噪音等)。在實踐中,使用這些方法來控制過擬合比減小網絡神經元數目要好得多。
不要減小網絡神經元數目的主要緣由在於小網絡更難使用梯度降低等局部方法來進行訓練。
雖然小型網絡的損失函數的局部極小值更少,也比較容易收斂到這些局部極小值,可是這些最小值通常都不好,損失值很高。相反,大網絡擁有更多的局部極小值,但就實際損失值來看,這些局部極小值表現更好,損失更小。
在實際中,你將發現若是訓練的是一個小網絡,那麼最終的損失值將展示出多變性:某些狀況下運氣好會收斂到一個好的地方,某些狀況下就收斂到一個很差的極值。
從另外一方面來講,若是你訓練一個大的網絡,你將發現許多不一樣的解決方法,可是最終損失值的差別將會小不少。這就是說,全部的解決辦法都差很少,並且對於隨機初始化參數好壞的依賴也會小不少。
最後拿正則化來講,其強度是控制神經網絡過擬合的好方法。看下圖結果:
<img src="https://img2018.cnblogs.com/blog/1414369/201906/1414369-20190612180724453-684123878.png" width="440" align=center />
上圖中每一個神經網絡都有20個隱層神經元,可是隨着正則化強度增長,它的決策邊界變得更加平滑。