人工神經網絡相比傳統的線性回歸和邏輯回歸,在模擬非線性模型上會有更好的效果,用于分類和回歸均可。
一、神經元(感知器)
圖片來自吳恩達機器學習入門
一個神經元包括幾個輸入結點(圖中的,
,
等)和一個輸出結點,每個輸入結點連接到輸出結點都要有一個權重(
,很多材料也用
來表示),用來模擬輸入結點和輸出結點之間的連接強度。訓練一個神經元模型,就是持續調整連接強度,直到能擬合模型。
神經元模型里會在輸出結點對這幾個輸入結點進行加權求和(一般會有一個偏置因子,這個原因后面寫),然后得到一個結果
,用
的值來判斷所處的分類。
一般來說,為了擬合非線性模型,除了簡單的用加權求和以外,還應該套用一個函數在加權求和上,這個函數叫做激活函數。如果把輸入特征和權重都看作向量,那么求和就是兩個向量的內積,在這個外面再套用一個激活函數,輸出結果。
展開來看就是
就是激活函數。
常見的激活函數種類
以下內容摘自https://zhuanlan.zhihu.com/p/29633019
sigmoid
優點:有較好的解釋性
缺點:
1.Sigmoid函數飽和使梯度消失。sigmoid神經元有一個不好的特性,就是當神經元的激活在接近0或1處時會飽和:在這些區域,梯度幾乎為0。
2.輸出不是零中心的,這一情況將影響梯度下降的運作,因為如果輸入神經元的數據總是正數,那么關于w的梯度在反向傳播的過程中,將會要么全部是正數,要么全部是負數,這樣梯度下降權重更新時出現z字型的下降。這樣收斂會變得異常的慢。(這也是為什么要一直保持為數據的0中心化)—–但這個問題比較小。
3.exp()在深度神經網絡時候相比其他運算就比較慢
Tanh非線性函數
優點:
1.它的輸出是零中心的。因此,在實際操作中,tanh非線性函數比sigmoid非線性函數更受歡迎。
缺點:
1.和Sigmoid函數一樣,飽和使梯度消失。計算慢.
ReLU
優點:
1.ReLU對于隨機梯度下降的收斂有巨大的加速作用( Krizhevsky 等的論文alexnet指出有6倍之多)。據稱這是由它的線性,非飽和的公式導致的;
2.注意:現在大部分的DNN用的激活函數就是ReLu
缺點:
1.當x是小于0的時候,那么從此所以流過這個神經元的梯度將都變成0;這個時候這個ReLU單元在訓練中將死亡(也就是參數無法更新),這也導致了數據多樣化的丟失(因為數據一旦使得梯度為0,也就說明這些數據已不起作用)。
Leaky ReLU
優點:
1.非飽和的公式;
2.Leaky ReLU是為解決“ReLU死亡”問題的嘗試
缺點:
1.有些研究者的論文指出這個激活函數表現很不錯,但是其效果并不是很穩定
Kaiming He等人在2015年發布的論文Delving Deep into Rectifiers中介紹了一種新方法PReLU,把負區間上的斜率當做每個神經元中的一個參數。然而該激活函數在在不同任務中均有益處的一致性并沒有特別清晰。
Maxout
Maxout是對ReLU和leaky ReLU的一般化歸納
優點:
1.擁有ReLU單元的所有優點(線性操作和不飽和),而沒有它的缺點(死亡的ReLU單元)
缺點 :
1.每個神經元的參數數量增加了一倍,這就導致整體參數的數量激增。難訓練,容易過擬合
二、人工神經網絡
一些神經元組合在一起就是神經網絡(我是這么理解的),實際上人工神經網絡可以分為三層,輸入層,輸出層和隱藏層。
輸入層:最開始的一層,用來輸入樣本特征值。
輸出層:最后一層,用來輸出結果,判斷分類。
隱藏層:其他的層次都叫隱藏層,可以有多個層級。
以這幅圖為例,輸入層就是(偏置因子),,,,隱藏層是。輸出層則是最終得到的。計算方式如下圖(圖里可能沒有,但是公式里有):
其中把看成矩陣,則下標按照線性代數定義,是行和列的坐標,而上標則代表了從第j層到第j+1層的權重值。(這里面的實際上和是一個意思,因為輸入層輸入的就是特征值,而代表的是第2層的第1個結點值)
不管是在輸入層-隱藏層,還是隱藏層-輸出層,只要是結點相連的地方都有一個權重。
每一層的結點僅和下一層的結點相連,叫做前饋神經網絡,同一層結點可以相連或某層結點可以連接到前面如何一層的結點的叫做遞歸神經網絡。
權重調整原理
通常來說,有監督學習都是試圖讓誤差最小,來衡量參數的變化,這里可以采用MSE來作為代價函數:
把2替換為n就是MSE的式子,代表實際標簽值,
代表根據給定權重算出來的y。
當是線性函數的時候,該函數表示為一個凸函數,如果有兩個變量的話,就是一個三維碗狀函數,用梯度下降法可以求解最小值,梯度下降法的求解為:
其中是學習率,式子的意思就是對
對每一個參數
求偏導數,乘以學習率之后,用
減掉這個值,得到這一次迭代的參數,輪番迭代之后得到局部最小值(凸優化中,局部最小就是全局最小),按照這個方法計算,權值會沿著使總體誤差項減小的方向增加。
但是實際上神經網絡大部分函數都不是線性的,因此也就不是凸函數,這樣的話使用梯度下降法就會出現局部最優的問題,從而得不到最優解,并且對于隱藏節點來說,
因此有一種反向傳播算法(back-propagation,BP)可以用來調整權重,從而得到最優解。
三、BP神經網絡
從名字就可以看出,BP神經網絡就是用了反向傳播算法得出參數的神經網絡,這個算法的每一次迭代包括兩個階段,前向階段和后向階段:
前向階段就是用前一次迭代的權值計算網絡中每一個結點的輸出值,先計算j層輸出,然后用j層計算j+1層。
后向階段則是從相反的方向更新權重,先更新j+1層,再更新j層。這種方法可以用j+1層的結點誤差來估算j層的結點誤差。
還是吳恩達老師的圖,圖中代表第l層,j結點的誤差,則
其中代表的是第3層到第4層的權重矩陣,
代表第四層的誤差矩陣,
代表激活函數,
,也就是該層的結點值。圖中藍筆代表當激活函數是sigmoid的時候的計算公式。
上述式子的推導過程,看到一個筆記記的非常明白:https://zhuanlan.zhihu.com/p/58068618
反向傳播的計算方式如下:
首先明確這個步驟中的代價函數(圖中的
即為通常來說的
)。
1.設,其中
代表層數,
訓練集中的第i個樣本,
代表第i個樣本的第j個特征。
2.計算完前向傳播之后,會得到輸出層的值,用這個值和標簽值比較,得到輸出層的誤差。
3.用剛才提到的公式,依次求出
4.用公式累加得到
的值
5.計算梯度函數:
6.得到的就是代價函數關于的偏導數。 有了偏導數,根據權重的更新方式可以得到
可以得到迭代的Θ值。
事實上式子中的代表的是權重需要改變的程度大小。反向傳播,實際上就是用 上一層節點的誤差值 * 權重,得到下一層的誤差值。和正向傳播是類似的。
在第一次進行計算的時候,對于權重要進行隨機初始化,不要設置為都是0,會導致邏輯單元不發生變化。(不存在隱藏層時,可以初始化為0)。最好初始化為一個較小的數,可以考慮采用np.random.randn(1,1)生成正態分布。
梯度檢驗
為了保證實施反向傳播的過程是正確的,需要引入梯度檢驗。
梯度檢驗的原理就是在函數上有一點θ,可以取θ-ε和θ+ε這兩個點的值,他們兩點之間的斜率就接近于這一點的導數(二維的情況,推廣到向量的道理是類似的)。
實際計算過程中,用反向傳播計算導數,然后用梯度檢驗驗證,如果非常接近(只有幾位小數不同)那么證明反向傳播的計算是正確的,然后用計算出來的導數進行下一次迭代。
多分類
上面說到的都是二元分類的情況,如果是多分類的情況,可以把輸出結果向量化:
如果有k個分類,則分為k個輸出結點,對應不同的輸出結點用向量不同位置上的1來表示,其他的均為0。
這樣的話,保證了每一個輸出結點實際上還是二元的,但是可以根據4個輸出結點的不同結果組成來判斷分類。
簡單了解了一下神經網絡,看的還是不太明白,先寫在這里。有機會再調整。在Python中通常用Keras來實現,但是sklearn中也是有這個類的,只不過因為不支持GPU性能有些問題,小規模數據也可以采用。