BP神经网络
BP神经网络学习笔记——祺祐
数学原理部分 https://blog.csdn.net/zhongkejingwang/article/details/44514073
还学习了{张慧. 基于BP神经网络的船舶航行倾覆风险评估[D].大连海事大学,2018.}
总结并思考
什么是BP神经网络
BP 神经网络(Back Propagation Neural Network),即反向传播神经网络,是人工神经网络的一种,是一种按照误差逆向传播算法训练的多层前馈神经网络。简而言之,BP 算法就是采用梯度下降法来计算网络误差平方的最小值。
BP网络的数学原理
此示意图介绍的是含有单一隐藏层的BP神经网络,实际BP神经网络的隐藏层,可以是单层的也可以是多层的。\(x_1、x_2、...x_n\)是输入数据,\(\overline { y } _ { j }\)是输出层产生的。
正向传播
与权重\(w_{ij}^1\)计算得到\(s_j^1\)(其中\(j\)是输出层第\(j\)个节点的输出):
\[s _ { j } ^ { 1 } = \sum _ { i = 1 } ^ { m } x _ { i } \cdot w _ { i j } ^ { 1 } \]再将\(s_j^1\)作为隐藏层的输入,结合权重\(w_{ij}^2\)和激活函数\(\theta(\cdot)\)计算得到\(s_j^2\):
\[s _ { j } ^ { 2 } = \sum _ { j = 0 } ^ { n } \theta ( s _ { j } ^ { 1 } ) \cdot w _ { ij } ^ { 2 } \]其中激活函数\(\theta(\cdot)\),一般使用s型函数(即sigmoid函数)
- log-sigmoid:
- tan-sigmoid:
逆向传播
正向传播的计算结果与实际值具有一定差距,因而需要使用误差来纠正权重,再通过一次次的迭代使结果更加接近真实值。先得到输出层\(\delta\)然后将输出层\(\delta\)根据连接权重往隐层传输。
所有输出层都会产生一个误差\(\Delta e\) , 为使函数连续可导 , 这里最小化方根差,定义损失函数\(L(e)\):
\[L ( e ) = \frac { 1 } { 2 } S S E = \frac { 1 } {k } \sum _ { j = 1 } ^ { k } e _ { j } ^ { 2 } = \frac { 1 } { k} \sum _ { j = 1 } ^ { k } ( \overline { y } _ { j } - y _ { j } ) ^ { 2 } \]\(e_j\)——输出层产生的误差
\[\frac { \partial L } { \partial w _ { i j } ^ { 1 } } = \frac { \partial L } { \partial s _ { j } ^ { 1 } } \cdot \frac { \partial s _ { j } ^ { 1 } } { \partial w _ { i j } ^ { 1 } } \]梯度下降法
曲面上方向导数的最大值的方向代表梯度的方向,因此我们在做梯度下降的时候,应该是沿着梯度的反方向进行权重的更新,可以有效的找到全局的最优解。
\[\begin{eqnarray*} L(e)降低\Rightarrow e减小\Rightarrow &\underline{梯度减小并趋向最低值}& \Rightarrow 权重w_{ij}更新\\ &\downarrow&\\ &步长,学习率(系数)& \end{eqnarray*} \]
由于
\[s _ { j } ^ { 1 } = \sum _ { i = 1 } ^ { m } x _ { i } \cdot w _ { i j } ^ { 1 } \]所以
\[\frac { \partial s _ { j } ^ { 1 } } { \partial w _ { i j } ^ { 1 } } = x _ { i } \]带入式(6)得:
\[\frac { \partial L } { \partial w _ { i j } ^ { 1 } } = x _ { i } \cdot \frac { \partial L } { \partial s _ { j } ^ { 1 } } \]再求\(\frac { \partial L } { \partial s _ { j } ^ { 1 } }\):
\[\frac { \partial L } { \partial s _ { j } ^ { 1 } } = \sum _ { i = 1 } ^ { k } \frac { \partial L } { \partial s _ { i } ^ { 2 } } \cdot \frac { \partial s _ { i } ^ { 2 } } { \partial s _ { j } ^ { 1 } } \]由于
\[s _ { i } ^ { 2 } = \sum _ { j = 0 } ^ { n } \theta ( s _ { j } ^ { 1 } ) \cdot w _ { j i } ^ { 2 } \]所以
\[\frac { \partial s _ { i } ^ { 2 } } { \partial s _ { j } ^ { 1 } } = \frac { \partial s _ { i } ^ { 2 } } { \partial \theta ( s _ { j } ^ { 1 } ) } \cdot \frac { \partial \theta ( s _ { j } ^ { 1 } ) } { \partial s _ { j } ^ { 1 } } = w _ { j i } ^ { 2 } \cdot \theta ^ { \prime } ( s _ { j } ^ { 1 } ) \]带入式(10)得:
\[\frac { \partial L } { \partial s _ { j } ^ { 1 } } = \sum _ { i = 1 } ^ { k } \frac { \partial L } { \partial s _ { i } ^ { 2 } } \cdot w _ { j i } ^ { 2 } \cdot \theta ^ { \prime } ( s _ { j } ^ { 1 } ) = \theta ^ { \prime } ( s _ { j } ^ { 1 } ) \cdot \sum _ { i = 1 } ^ { k } \frac { \partial L } { \partial s _ { i } ^ { 2 } } \cdot w _ { j i } ^ { 2 } \]令
\[\delta _ { i } ^ { l } = \frac { \partial L } { \partial s _ { i } ^ { l } } \]则隐藏层\(\delta\):
\[\delta _ { j } ^ { 1 } = \theta ^ { \prime } ( s _ { j } ^ { 1 } ) \cdot \sum _ { i = 1 } ^ { k } \delta _ { i } ^ { 2 } \cdot w _ { j i } ^ { 2 } \]输出层\(\delta\):
\[\begin{eqnarray*} \delta _ { i } ^ { 2 }= \frac { \partial L } { \partial s _ { i } ^ { 2 } } &=& \frac { \partial \sum _ { j = 1 } ^ { k } \frac { 1 } { 2 } ( \overline { y } _ { j } - y _ { j } ) ^ { 2 } } { \partial s _ { i } ^ { 2 } } \\ &=& ( \overline { y } _ { i } - y _ { i } ) \cdot \frac { \partial\overline { y } _ { i } } { \partial s _ { i } ^ { 2 } } \\ & =& e _ { i } \cdot \frac { \partial \overline { y } _ { i } } { \partial s _ { i } ^ { 2 } } \\ & =& e _ { i } \cdot \theta ^ { \prime } ( s _ { i } ^ { 2 } ) \\ \end{eqnarray*} \]反向传播之后我们得到了\(\delta\),现在可以得到权重的梯度了
第一层梯度(输入和隐藏)
\[\frac { \partial L } { \partial w _ { i j } ^ { 1 } } = x _ { i } \cdot \delta _ { j } ^ { 1 } \]第二层梯度(隐藏和输出)
\[\frac { \partial L } { \partial w _ { i j } ^ { 2 } } = \frac { \partial L } { \partial s _ { j } ^ { 2 } } \cdot \frac { \partial s _ { j } ^ { 2 } } { \partial w _ { i j } ^ { 2 } } = \delta _ { j } ^ { 2 } \cdot \theta ( s _ { i } ^ { 1 } ) \]每个权重的梯度都等于与其相连的前一层节点的输出乘以与其相连的后一层的反向传播的输出。
权重更新
得到梯度后,可根据以下公式更新权重:
\[\Delta w _ { i j } ^ { 2 } = - \eta \frac { \partial L } { \partial w _ { i j } ^ { 2 } } = -\eta \cdot x _ { i } \cdot \delta _ { j } ^ { 1 }\\ w _ {ij} ^ { 2 } ( N + 1 ) = w _ { i j } ^ { 2 } ( N ) - \eta \cdot x _ { i } \cdot \delta _ { j } ^ { 1 } \]\(\eta\)——学习率,步长。代表权值改变速度。
至此,我们通过梯度下降法更新了一次权重,也就意味着我们能够进行一次又一次的迭代循环,得到我们想要的结果。
误差分析
循环的迭代将以误差达到我们所接受的范围进行终止。
全局误差:
\[E=\frac{1}{2S}\sum_{p=1}^{S} \sum_{j=1}^{K}(\overline{y_j}(p)-y_j(p)) \]BP神经网络的难点
-
理解数学原理
BP神经网络作为全连接的神经网络,其数学原理主要是用的是高等数学的偏导数,导数等知识,并不难理解,并且在GitHub中油不少此类代码,MATLAB中也可以直接使用命令实现神经网络的构建。
-
大量数据的采集
BP神经网络的预测结果真实性需要大量数据为保障。但对于工程实际问题,越复杂、越难以实现的项目数据恰恰越少。所以对于复杂项目,没有数据的支撑,还不如使用公式推导,模糊综合等方式。
例如,如果想对海上钻井平台的风险性进行评估预测。世界上一共有多少艘?能够拿到的数据又有多少组?误差会有多大?
-
真实值的计算
我们知道,预测值是通过不断更新的权重乘以输出值,在经过激活函数最后进行输出。而最后进行误差计算的时候,实际值又如何获得?这是我在处理笔记时的一点疑惑。
实际值是在收集数据的时候整理出来的,还是用海上钻井平台的风险性举例:
预测得到的结果是风险对应的值,实际值也是风险对应的值,如果我能得到实际值,那为什么还要预测呢?
对于例子中的东西,我目前了解到的解决办法是专家打分,模糊评价等方法进行真实值的得出。也就是说,真实值不一定是实际的,也可能是贴近实际的一个值,但通过迭代数据的离散可以判断训练结果是否在贴近实际情况。