關於BP演算法的一點理解

TinnCHEN發表於2018-04-09

關於BP演算法的一點理解

由於最近在擼畢設初次接觸機器學習的神經網路部分今天學習了前饋神經網路的部分,僅供自身學習總結用,有不足之處還望指教。

前饋神經網路是一種最簡單的神經網路,各神經元分層排列。每個神經元只與前一層的神經元相連。接收前一層的輸出,並輸出給下一層.各層間沒有反饋。是目前應用最廣泛、發展最迅速的人工神經網路之一。研究從20世紀60年代開始,目前理論研究和實際應用達到了很高的水平。

一、神經網路模型

這裡寫圖片描述

{x1

x_1
x2
x_2
、….、xn
x_n
}表示1….n個的神經元的輸入;

{wi1

w_{i1}
wi2
w_{i2}
、….、win
w_{in}
}表示每個傳輸的權重;

當前神經元的值為其相乘求和(看情況加上截距項或偏值項b);
輸出為當前神經元的值減去閾值θi

\theta_i

為了解決單層神經網路無法進行異或運算我們加了隱含層。
若繼續增加隱藏層,可以解決更多的分類問題。
但是加大了運算難度。

二、啟用函式

也叫激勵函式,表示神經元內部的反應機制,決定網路的處理能力,在數學上做非線性變換。

啟用函式通常有如下一些性質:

非線性: 當啟用函式是線性的時候,一個兩層的神經網路就可以逼近基本上所有的函式了。但是,如果啟用函式是恆等啟用函式的時候(即),就不滿足這個性質了,而且如果MLP使用的是恆等啟用函式,那麼其實整個網路跟單層神經網路是等價的。
可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。
: 當啟用函式滿足這個性質的時候,如果引數的初始化是random的很小的值,那麼神經網路的訓練將會很高效;如果不滿足這個性質,那麼就需要很用心的去設定初始值。
輸出值的範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate。
常用的啟用函式有:
1、0-1階躍,Sgn符號函式;
2、Sigmoid:Logistics-Sigmoid邏輯迴歸、Tanh-Sigmoid雙曲正切;
3、ReLu、Leaky ReLu、PReLU 或者Maxout;
4、SoftMax,用作多分類。

三、BP演算法

解決了兩層神經網路所需要的複雜計算量問題。
利用前項傳導公式,計算第n層(輸出層)輸出值。
預測值y要跟我們的標籤值進行比對,將誤差反饋回去,減小誤差和,運用梯度下降等方法進行調整。
通過一層一層的往回傳遞調整每一層權值。

BP網路採用了反向傳播學習演算法,具體如下圖:
這裡寫圖片描述
為方便理解我們以單一一條(以第一條為例)來談:
第一步:
計算神經元I2

I_2
的輸入加權和,inputI2
input_{I2}
=x1
x_1
*V;
用sigmoid函式作為啟用函式,
outputI2
output_{I2}
=1/(1+einputI2
e^{-input_{I2}}
);
同理可得I3
I_3
相關的值。
第二步:(反向傳播)
總誤差:Error=(1/2)*(TargetoutputI3)2
(Target-output_{I3})^2
(方便求導)
求輸出層到隱藏層的權重W的偏導,根據鏈式求導可得:
ErrorW
\frac{\partial{Error}}{\partial{W}}
=ErroroutputI3
\frac{\partial{Error}}{\partial{output_{I3}}}
outputI3inputI3
\frac{\partial{output_{I3}}}{\partial{input_{I3}}}
inputI3W
\frac{\partial{input_{I3}}}{\partial{W}}

計算第一項可得:-(target-outputI3
output_{I3}

計算第二項可得:outputI3
output_{I3}
*(1-outputI3
output_{I3}

計算第三項可得:outputI2
output_{I2}

三項相乘可得:ErrorW
\frac{\partial{Error}}{\partial{W}}
=-(target-outputI3
output_{I3}
outputI3
output_{I3}
(1-outputI3
output_{I3}
)*outputI2
output_{I2}

δ
\delta
=-(target-outputI3
output_{I3}
outputI3
output_{I3}
(1-outputI3
output_{I3}

則公式可表示為:ErrorW
\frac{\partial{Error}}{\partial{W}}
=δ
\delta
*outputI2
output_{I2}

更新W1
W_1
=W-η
\eta
*ErrorW
\frac{\partial{Error}}{\partial{W}}

η
\eta
為學習效率可以取0.5。
同理可計算別的層。多個輸入求和
\sum
即可。

四、BP演算法存在的問題

(1)訓練優化存在區域性最優解,也就是過擬合,無法得到全域性最優解。
(2)梯度消失問題,輸入值可能造成無效。多個隱含層時,在鏈式求導中結果越來越小,簡單的訓練幾次可能就得到一個看似準確的結果,即使只有一些隨機值,但梯度已經為0。

參考文章

[1]https://blog.csdn.net/zhaomengszu/article/details/77834845博主這孩子誰懂哈 大白話講解BP演算法
[2]https://blog.csdn.net/sinat_35512245/article/details/55224524博主qinjianhuang 機器學習之深入理解神經網路理論基礎、BP演算法及其Python實現
[3]https://blog.csdn.net/u013146742/article/details/51986575RELU 博主傷心的小屁孩 啟用函式及其他相關的函式

相關文章