关于BP算法的一点理解
由于最近在撸毕设初次接触机器学习的神经网络部分今天学习了前馈神经网络的部分,仅供自身学习总结用,有不足之处还望指教。
前馈神经网络是一种最简单的神经网络,各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出,并输出给下一层.各层间没有反馈。是目前应用最广泛、发展最迅速的人工神经网络之一。研究从20世纪60年代开始,目前理论研究和实际应用达到了很高的水平。
一、神经网络模型
{ x1 、 x2 、….、 xn }表示1….n个的神经元的输入;
{ wi1 、 wi2 、….、 win }表示每个传输的权重;
当前神经元的值为其相乘求和(看情况加上截距项或偏值项b);
输出为当前神经元的值减去阈值
θ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
的输入加权和,
inputI2
=
x1
*V;
用sigmoid函数作为激活函数,
则
outputI2
=1/(1+
e−inputI2
);
同理可得
I3
相关的值。
第二步:(反向传播)
总误差:Error=(1/2)*
(Target−outputI3)2
(方便求导)
求输出层到隐藏层的权重W的偏导,根据链式求导可得:
∂Error∂W
=
∂Error∂outputI3
∂outputI3∂inputI3
∂inputI3∂W
计算第一项可得:-(target-
outputI3
)
计算第二项可得:
outputI3
*(1-
outputI3
)
计算第三项可得:
outputI2
三项相乘可得:
∂Error∂W
=-(target-
outputI3
)
outputI3
(1-
outputI3
)*
outputI2
令
δ
=-(target-
outputI3
)
outputI3
(1-
outputI3
)
则公式可表示为:
∂Error∂W
=
δ
*
outputI2
更新
W1
=W-
η
*
∂Error∂W
η
为学习效率可以取0.5。
同理可计算别的层。多个输入求和
∑
即可。
四、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 博主伤心的小屁孩 激活函数及其他相关的函数