继上一次讲到adaline神经网络之后,想必大家对于神经元权值的调整过程有了一个基本的认知,没看到的小伙伴可以到这里看看“传送门”,这次我们介绍一种类似于adaline算法的神经网络,它采用三层神经网络,原理上与adaline算法类似,它就是大名鼎鼎的BP神经网络(back propagation),但是又有些许不同,我们来具体了解一下它。
———————————————————————
1基本结构
1.1单个神经元结构
单个神经元结构与adaline基本相同:
输入: x 1 , x 2 ⋅ ⋅ ⋅ , x n x_1,x_2\cdot \cdot \cdot ,x_n x1,x2⋅⋅⋅,xn
输出: y y y
输入与输出的关系: y = ( x 1 ∗ w 1 + x 2 ∗ w 2 + ⋅ ⋅ ⋅ + x n ∗ w n ) + b y=\left( x_1*w_1+x_2*w_2+\cdot \cdot \cdot +x_n*w_n \right) +b y=(x1∗w1+x2∗w2+⋅⋅⋅+xn∗wn)+b
输入用矩阵表示: X = [ x 1 , x 2 ⋅ ⋅ ⋅ , x n ] T X=\left[ x_1,x_2\cdot \cdot \cdot ,x_n \right] ^T X=[x1,x2⋅⋅⋅,xn]T
权重用矩阵表示: W = [ w 1 , w 2 , ⋅ ⋅ ⋅ , w n ] W=\left[ w_1,w_2,\cdot \cdot \cdot ,w_n \right] W=[w1,w2,⋅⋅⋅,wn]
那么输出可表示为: y = W X + b y=WX+b y=WX+b
更一般的,令阈值信号:
w
0
=
1
,
x
0
=
b
w_0=1,x_0=b
w0=1,x0=b
那么输入和权重可表示为:
X
=
[
x
0
,
x
1
,
x
2
⋅
⋅
⋅
,
x
n
]
T
,
W
=
[
w
0
,
w
1
,
w
2
,
⋅
⋅
⋅
,
w
n
]
X=\left[ x_0,x_1,x_2\cdot \cdot \cdot ,x_n \right] ^T,W=\left[ w_0,w_1,w_2,\cdot \cdot \cdot ,w_n \right]
X=[x0,x1,x2⋅⋅⋅,xn]T,W=[w0,w1,w2,⋅⋅⋅,wn]
那么输出信号:
y
=
W
X
y=WX
y=WX
1.2激活函数
对于上式的加权求和得到的结果,相比于我们最终结果的要求明显是远远不够的,因此引入激活函数赋予结果一些其他特性,以下是激活函数需要满足的条件:
- 非线性:即导数非常数,映入非线性因素,使得线性不可分问题可分
- 几乎处处可导,调整权值得梯度下降算法需要计算导数,因此要求该函数可微分
- 非饱和性:饱和是指当自变量变大时因变量几乎不变,这样会导致系统迭代速度变慢Sigmoid函数是一种饱和性函数,可以利用交叉熵函数作为损失函数弥补这一缺陷
- 单调性:导数符合不变,这样系统迭代更加稳定,易于收敛
- 输出范围有限:这样也能提高系统稳定性
我们这里用到的是Sigmoid函数:
y = 1 e − x + 1 y=\frac{1}{e^{-x}+1} y=e−x+11
容易得到S函数的导数:
y ′ = y ( 1 − y ) y'=y\left( 1-y \right) y′=y(1−y)
图像:
1.3传播过程
以下是一个三层网络结构,分别为输入层、隐藏层、输出层:
正向传播:输入i1,i2,然后一层层传播,直到输出结果
反向传播:根据结果与期望计算损失函数,然后调整w和b,完成一次反向传播
当完成一次正反向传播,也就完成了一次迭代,反复迭代直到误差越来越小,训练完成
2算法推导
2.1初始化参数
输入参数
i
1
,
i
2
i_1,i_2
i1,i2与期望输出
o
1
,
o
2
o_1,o_2
o1,o2都是已知训练数据
权重与偏置值
w
,
b
w,b
w,b都随机初始化为大于0小于1的数
2.2正向传播
输入层—>隐藏层:
- 计算
h
1
h_1
h1的输入加权和:
I N h 1 = w 0 ∗ i 0 + w 1 ∗ i 1 + w 2 ∗ i 2 ( w 0 = 1 , i 0 = b ) IN_{h_1}=w_0*i_0+w_1*i_1+w_2*i_2\left( w_0=1,i_0=b \right) INh1=w0∗i0+w1∗i1+w2∗i2(w0=1,i0=b) - 计算
h
1
h_1
h1的输出结果:
O U T h 1 = 1 e − I N h 1 + 1 OUT_{h_1}=\frac{1}{e^{-IN_{h_1}}+1} OUTh1=e−INh1+11 - 同理计算 h 2 h_2 h2
隐藏层—>输出层:
-
计算 o 1 o_1 o1的输入加权和:
I N o 1 = w 0 ∗ i 0 + w 5 ∗ O U T h 1 + w 6 ∗ O U T h 2 IN_{o_1}=w_0*i_0+w_5*OUT_{h_1}+w_6*OUT_{h_2} INo1=w0∗i0+w5∗OUTh1+w6∗OUTh2 -
计算 o 1 o_1 o1的输出结果:
O U T o 1 = 1 e − I N o 1 + 1 OUT_{o_1}=\frac{1}{e^{-IN_{o_1}}+1} OUTo1=e−INo1+11 -
同理计算 o 2 o_2 o2
正向传播结束
2.3反向传播
- 损失计算
为了方便计算我们,重点放在理论推导,我们采用最简单的损失计算函数:
E t o t a l = E O U T o 1 + E O U T o 2 E_{total}=E_{OUT_{o1}}+E_{OUT_{o2}} Etotal=EOUTo1+EOUTo2
其中
E O U T o 1 = 1 2 ∗ ( o 1 − O U T o 1 ) 2 E_{OUT_{o1}}=\frac{1}{2}*\left( o_1-OUT_{o_1} \right) ^2 EOUTo1=21∗(o1−OUTo1)2
E O U T o 1 E_{OUT_{o1}} EOUTo1同理 - 权重更新
我们采用链式求导法则计算复合函数的导数
隐藏层—>输出层
∂
E
t
o
t
a
l
∂
w
5
=
∂
E
t
o
t
a
l
∂
O
U
T
o
1
∂
O
U
T
o
1
∂
I
N
o
1
∂
I
N
o
1
∂
w
5
\frac{\partial E_{total}}{\partial w_5}=\frac{\partial E_{total}}{\partial OUT_{o_1}}\frac{\partial OUT_{o_1}}{\partial IN_{o_1}}\frac{\partial IN_{o_1}}{\partial w_5}
∂w5∂Etotal=∂OUTo1∂Etotal∂INo1∂OUTo1∂w5∂INo1
=
−
(
o
1
−
O
U
T
o
1
)
⋅
O
U
T
o
1
⋅
(
1
−
O
U
T
o
1
)
⋅
O
U
T
h
1
=-\left( o_1-OUT_{o_1} \right) \cdot OUT_{o_1}\cdot \left( 1-OUT_{o_1} \right) \cdot OUT_{h_1}
=−(o1−OUTo1)⋅OUTo1⋅(1−OUTo1)⋅OUTh1
=
σ
o
1
⋅
O
U
T
h
1
=\sigma o_1\cdot OUT_{h_1}
=σo1⋅OUTh1
其中
σ
o
1
=
−
(
o
1
−
O
U
T
o
1
)
⋅
O
U
T
o
1
⋅
(
1
−
O
U
T
o
1
)
\sigma o_1=-\left( o_1-OUT_{o_1} \right) \cdot OUT_{o_1}\cdot \left( 1-OUT_{o_1} \right)
σo1=−(o1−OUTo1)⋅OUTo1⋅(1−OUTo1)
设学习率为
α
\alpha
α
w
5
+
=
w
5
−
α
⋅
∂
E
t
o
t
a
l
∂
w
5
w_{5}^{+}=w_5-\alpha \cdot \frac{\partial E_{total}}{\partial w_5}
w5+=w5−α⋅∂w5∂Etotal
同层其他参数同理
输入层—>隐藏层
∂
E
t
o
t
a
l
∂
w
1
=
∂
E
t
o
t
a
l
∂
O
U
T
h
1
∂
O
U
T
h
1
∂
I
N
h
1
∂
I
N
h
1
∂
w
1
\frac{\partial E_{total}}{\partial w_1}=\frac{\partial E_{total}}{\partial OUT_{h_1}}\frac{\partial OUT_{h_1}}{\partial IN_{h_1}}\frac{\partial IN_{h_1}}{\partial w_1}
∂w1∂Etotal=∂OUTh1∂Etotal∂INh1∂OUTh1∂w1∂INh1
=
σ
h
1
⋅
i
1
=\sigma _{h_1}\cdot i_1
=σh1⋅i1
w
1
+
=
w
1
−
α
⋅
∂
E
t
o
t
a
l
∂
w
1
w_{1}^{+}=w_1-\alpha \cdot \frac{\partial E_{total}}{\partial w_1}
w1+=w1−α⋅∂w1∂Etotal
同层其他参数同理
2.4总结
至此完成一次完整迭代,下一次笔记将会给出代码实践过程,请持续关注