复习一下BP
主要整理了两篇博客,通过一个实际的例子来讲解优化思路,很方便理解BP算法的传播流程。两篇博客见文章末尾
1.什么是神经网络
神经网络又称为人工神经网络(Artificial Neural Network , ANN),是指一系列受生物学和神经科学启发,而构造的数学模型。下图便是一个简单的神经元模型
神经元是形成神经网络的基本单元,如上图示,激活函数决定了该神经元是否有输出值,所以激活函数在此数学模型中至关重要。因其位置的特殊性,需要有以下特点:
- 连续可导
- 函数及其导数尽可能简单,可提高网络计算效率
- 值域要在合适的区间内。
综上,目前常使用的激活函数有如下几个:Sigmoid函数,ReLU函数,Swish函数,GELU函数,Maxout单元等。
神经元结构,只是神经网络的基础单元。而神经网络的组建则需要许多神经元进行协同传输。常用的网络结构有如下三种:前馈网络,记忆网络,和图网络。
2.神经元传播原理
输入数据: i 1 = 0.05 , i 2 = 0.10 输出数据(对图像来说可以理解我们给的label):o 1 = 0.01 , o 2 = 0.99 初始权重: w 1 = 0.15 , w 2 = 0.20 , w 3 = 0.25 , w 4 = 0.30 , w 5 = 0.40 , w 6 = 0.45 , w 7 = 0.50 , w 8 = 0.55 \begin{aligned}&\text { 输入数据: } i_{1}=0.05, i_{2}=0.10\\&\text { 输出数据(对图像来说可以理解我们给的label):o }_{1}=0.01, o_{2}=0.99\\&\text { 初始权重: } w_{1}=0.15, w_{2}=0.20, w_{3}=0.25, w_{4}=0.30, w_{5}=0.40, w_{6}=0.45, w_{7}=0.50, w_{8}=0.55\end{aligned} 输入数据: i1=0.05,i2=0.10 输出数据(对图像来说可以理解我们给的label):o 1=0.01,o2=0.99 初始权重: w1=0.15,w2=0.20,w3=0.25,w4=0.30,w5=0.40,w6=0.45,w7=0.50,w8=0.55
那么向前传播的路径为:输入层,隐藏层,输出层。以此顺序计算每个神经元的加权和,直到输出。
n
e
t
h
1
=
w
1
∗
i
1
+
w
2
∗
i
2
+
b
1
∗
1
net
h
1
=
0.15
∗
0.05
+
0.2
∗
0.1
+
0.35
∗
1
=
0.3775
\begin{array}{c}n e t_{h 1}=w_{1} * i_{1}+w_{2} * i_{2}+b_{1} * 1 \\\text { net }_{h 1}=0.15 * 0.05+0.2 * 0.1+0.35 * 1=0.3775\end{array}
neth1=w1∗i1+w2∗i2+b1∗1 net h1=0.15∗0.05+0.2∗0.1+0.35∗1=0.3775
此时,神经元
h
1
h_{1}
h1开始通过激活函数处理数据 ,并进行输出。我们这里用sigmoid函数。
out
h
1
=
1
1
+
e
−
n
e
t
h
1
=
1
1
+
e
−
0.3775
=
0.593269992
\text { out }_{h 1}=\frac{1}{1+e^{-n e t_{h 1}}}=\frac{1}{1+e^{-0.3775}}=0.593269992
out h1=1+e−neth11=1+e−0.37751=0.593269992
同理,神经元 h 2 h_2 h2的输出 o u t h 2 out_{h2} outh2 也可以计算出来。 o u t h 2 = 0.596884378 out_{h2} = 0.596884378 outh2=0.596884378
下面是从隐藏层到输出层 ,与上面计算类似,也是各个值乘以权重,计算得到。
net o 1 = w 5 ∗ out h 1 + w 6 ∗ out h 2 + b 2 ∗ 1 = 1.105905967 out o 1 = 1 1 + e − n e t o 1 = 0.75136507 \begin{array}{c}\text { net }_{o 1}=w_{5} * \text { out }_{h 1}+w_{6} * \text { out }_{h 2}+b_{2} * 1=1.105905967 \\\text { out }_{o 1}=\frac{1}{1+e^{-n e t_{o 1}}}=0.75136507\end{array} net o1=w5∗ out h1+w6∗ out h2+b2∗1=1.105905967 out o1=1+e−neto11=0.75136507
同理,可以计算出 o u t o 2 = 0.772928465 out_{o2} = 0.772928465 outo2=0.772928465
到这一步,我们的前向传播结束了,我们得到了输出值 [0.75136507,0.772928465]
然而这与实际值[0.01,0.99]相差甚远,所以就需要重新想办法更新权值,重新计算输出。(所以神经网络的训练过程,也就是在不断更新权值的过程)
3.如何更新权值
这时我们就用到了BP(Error Back Propagation Training 误差反向传播)算法,从本质上讲,BP算法就是以网络误差平方为目标函数、采用梯度下降法来计算目标函数的最小值。
步骤如下:
3.1、计算总误差:
E
total
=
∑
1
2
(
target
−
output
)
2
E_{\text {total }}=\sum \frac{1}{2}(\text { target }-\text { output })^{2}
Etotal =∑21( target − output )2
因为有两个输出,所以需要计算一下
o
u
t
o
1
out_{o1}
outo1 ,
o
u
t
o
2
out_{o2}
outo2这两个输出的误差和。
E
o
1
=
1
2
(
target
01
−
out
o
1
)
2
=
1
2
(
0.01
−
0.75136507
)
2
=
0.274811083
E
o
2
=
0.023560026
E
total
=
E
o
1
+
E
o
2
=
0.274811083
+
0.023560026
=
0.298371109
\begin{array}{c}E_{o 1}=\frac{1}{2}\left(\operatorname{target}_{01}-\text { out }_{o 1}\right)^{2}=\frac{1}{2}(0.01-0.75136507)^{2}=0.274811083 \\E_{o 2}=0.023560026 \\E_{\text {total }}=E_{o 1}+E_{o 2}=0.274811083+0.023560026=0.298371109\end{array}
Eo1=21(target01− out o1)2=21(0.01−0.75136507)2=0.274811083Eo2=0.023560026Etotal =Eo1+Eo2=0.274811083+0.023560026=0.298371109
3.2、误差出来了,那么权重对误差到底产生了多少影响呢?这个时候就需要权重对误差求导了。以权重 w 5 w_5 w5为例:
配合下图理解为什么这样写链式求导
3.3、下面分别对各个因子求导
计算 φ E total φ out o 1 \frac{\varphi E_{\text {total }}}{\varphi \text { out }_{o 1}} φ out o1φEtotal :
计算
φ
out
o
1
φ
net
o
1
\frac{\varphi \text { out }_ {{o1 }}}{\varphi \text { net }_{o1}}
φ net o1φ out o1:
计算
φ
net
o
1
φ
w
5
\frac{\varphi \text { net }_ {{o1 }}}{\varphi \text { w }_{5}}
φ w 5φ net o1:
上面三个计算结果相乘:
\cfrac{\varphi E_{total}}{\varphi w_5} = 0.74136507 0.1868156020.593269992
样我们就计算出来整体误差相对于其中一个权重偏导数了,这里面仍需要灌输一个概念:数学只是一个度量,只是表示某种相关关系或者程度的一个度量,其实公式并没有什么实际意义。其所有意义只是人为赋予的某种规律下的总结。
我们设学习速率为 0.5 ,则有新的值
同理,使用同样的方式,可以更新其他权重值。
然后把新的权重值带入,重新计算,用这种方法不断迭代。直到得出满意权重。
4.输入层---->隐含层的权值更新:
方法其实与上面说的差不多,但是有个地方需要变一下,在上文计算总误差对w5的偏导时,是从out(o1)---->net(o1)---->w5,但是在隐含层之间的权值更新时,是out(h1)---->net(h1)---->w1,而out(h1)会接受E(o1)和E(o2)两个地方传来的误差,所以这个地方两个都要计算。
5.如何确定中间层的隐藏节点个数?
在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐含层节点个数不确定,那么应该设置为多少才合适呢?实际上,隐含层节点个数的多少对神经网络的性能是有影响的,有一个经验公式可以确定隐含层节点数目,如下:
h = m + n + a h=\sqrt{m+n}+a h=m+n+a
其中,h 位隐含层节点数,m 为输入层节点数目,n为输出层节点数目。a为1~10之间的调节常数。
以上便是神经网络的反向传播原理。