前向传播和反向传播
以一个简单的神经网络为例子,讲解神经网络前向传播和反向传播的计算。
前向传播
前向传播(Forward Propagation,缩写为FP)是按顺序计算和存储神经网络中每层的结果,从而达到神经网络的运行。
h
1
h_1
h1的计算:
h
1
=
x
1
⋅
w
1
+
x
2
⋅
w
2
h_1=x_1 \cdot w_1+x_2 \cdot w_2
h1=x1⋅w1+x2⋅w2
h
2
h_2
h2的计算:
h
2
=
x
1
⋅
w
3
+
x
2
⋅
w
4
h_2=x_1 \cdot w_3+x_2 \cdot w_4
h2=x1⋅w3+x2⋅w4
y
′
y \prime
y′的计算:
y
′
=
h
1
⋅
w
5
+
h
2
⋅
w
6
y \prime =h_1 \cdot w_5+h_2 \cdot w_6
y′=h1⋅w5+h2⋅w6
为了方便理解,这里并没有加入激活函数和bias偏置值。
反向传播
反向传播(Back propagation,缩写为BP)是通过链式求导来更新神经网络中的权重,从而达到人工神经网络的训练。
简单来说,就是用损失函数对每一网络层的每一个参数求偏导,利用偏导的值来更新权重。
例如更新
W
5
W_5
W5的权值:
先用损失函数对
W
5
W_5
W5求偏导
∂
δ
∂
W
5
=
∂
δ
∂
y
′
∂
y
′
∂
W
5
\frac{\partial \delta}{\partial W_5}=\frac{\partial \delta}{\partial y \prime} \frac{\partial y \prime}{\partial W_5}
∂W5∂δ=∂y′∂δ∂W5∂y′
∂
δ
∂
y
′
=
2
⋅
1
2
(
y
−
y
′
)
⋅
(
−
1
)
\frac{\partial \delta}{\partial y \prime}=2\cdot \frac{1}{2}(y-y \prime) \cdot(-1)
∂y′∂δ=2⋅21(y−y′)⋅(−1)
∂
y
′
∂
W
5
=
h
1
+
0
\frac{\partial y \prime}{\partial W_5} =h_1+0
∂W5∂y′=h1+0
通过带入正向传播计算出来的
y
、
y
′
、
h
1
y、y \prime、h_1
y、y′、h1,即可求出偏导数
∂
δ
∂
W
5
\frac{\partial \delta}{\partial W_5}
∂W5∂δ
通过偏导数对
W
5
W_5
W5的权值进行更新:
w
5
(
u
p
d
a
t
e
)
=
w
5
−
η
⋅
∂
δ
∂
W
5
{w_5}^{(update)}=w_5-\eta \cdot{\frac{\partial \delta}{\partial W_5}}
w5(update)=w5−η⋅∂W5∂δ,其中
η
\eta
η为超参数,可以自行设定。
其它权重更新也是差不多的,只不过求导的次数更多,遵守链式求导法则即可求出,例如损失函数对 W 1 W_1 W1求偏导 ∂ δ ∂ W 1 = ∂ δ ∂ y ′ ∂ y ′ ∂ h 1 ∂ h 1 ∂ W 1 \frac{\partial \delta}{\partial W_1}=\frac{\partial \delta}{\partial y \prime} \frac{\partial y \prime}{\partial h_1} \frac{\partial h_1} {\partial W_1} ∂W1∂δ=∂y′∂δ∂h1∂y′∂W1∂h1
梯度爆炸和梯度消失
介绍
梯度是什么?梯度是一个向量,是一个n元函数f关于n个变量的偏导数,梯度会指向各点处的函数值降低的方向。前面反向传播求权重偏导数的过程其实就是一个在求梯度的过程,神经网络通过梯度下降来找到“最优”的网络参数。
梯度爆炸:随着反向传播,并没有梯度下降,反而梯度增加。
梯度消失:随着反向传播,梯度会越来越小,最终没有变化,但并没有收敛到比较优的解。
产生的原因
本质上是反向传播的链式法则导致激活函数导数的连乘,以及权重初始值过大/小。
前面介绍正向传播和反向传播的时候,为了讲解方便所以公式并没有加入激活函数和bias偏置项,但实际上神经网络常常都会加入激活函数和bias。
引入激活函数是为了引入非线性,让神经网络更好应用到非线性模型中。
引入bias是为了具有更复杂的参数结构,更好的拟合。例如
s
i
g
m
o
i
d
(
w
x
)
sigmoid(wx)
sigmoid(wx),不同权重w的
s
i
g
m
o
i
d
(
w
x
)
sigmoid(wx)
sigmoid(wx)函数形状会改变,但是位置不会改变,而加入了bias后
s
i
g
m
o
i
d
(
w
x
+
b
)
sigmoid(wx+b)
sigmoid(wx+b)函数就可以左右平移。
介绍激活函数和bias的原因,是因为接下来推导需要用到,以及梯度爆炸和梯度消失产生的原因和激活函数有关。
以一个四层神经网络为例子,简单理解一下梯度(偏导数)的推导,从而来理解梯度爆炸和消失产生的原因。
每层神经元的函数为
f
i
f_i
fi,激活函数记为F,递推关系
f
i
+
1
=
F
(
f
i
×
w
i
+
1
+
b
i
+
1
)
f_{i+1}=F(f_i×w_{i+1}+b_{i+1})
fi+1=F(fi×wi+1+bi+1)
既然是为了理解梯度爆炸和消失的原因,那么我们就要找出梯度相关的表达式。
梯度和权重更新的差值有关,也就是权重的偏导数相关
△
w
=
−
η
⋅
∂
δ
∂
W
\triangle w=-\eta \cdot\frac{\partial \delta}{\partial W}
△w=−η⋅∂W∂δ
用
△
W
3
\triangle W_3
△W3的计算化简作为例子。
∂
δ
∂
W
2
=
∂
δ
∂
f
3
∂
f
3
∂
f
2
∂
f
2
∂
W
2
\frac{\partial \delta}{\partial W_2}= \frac{\partial \delta}{\partial f_3} \frac{\partial f_3}{\partial f_2} \frac{\partial f_2}{\partial W_2}
∂W2∂δ=∂f3∂δ∂f2∂f3∂W2∂f2
∂
f
2
∂
W
2
=
∂
F
(
f
1
×
w
2
+
b
2
)
∂
W
2
=
F
′
f
1
\frac{\partial f_2}{\partial W_2}=\frac{\partial F(f_1×w_2+b_2)}{\partial W_2}=F\prime f_1
∂W2∂f2=∂W2∂F(f1×w2+b2)=F′f1
∂
f
i
+
1
∂
f
i
=
∂
F
(
f
i
×
w
i
+
1
+
b
i
+
1
)
∂
f
i
=
F
′
w
i
\frac{\partial f_{i+1}}{\partial f_i}=\frac{\partial F(f_i×w_{i+1}+b_{i+1})}{\partial f_i}=F\prime w_i
∂fi∂fi+1=∂fi∂F(fi×wi+1+bi+1)=F′wi
依次类推,可得
∂
δ
∂
W
2
=
∂
δ
∂
f
3
F
′
w
2
F
′
f
1
\frac{\partial \delta}{\partial W_2}=\frac{\partial \delta}{\partial f_3}F\prime w_2 F\prime f_1
∂W2∂δ=∂f3∂δF′w2F′f1
从
△
W
3
\triangle W_3
△W3的计算化简可以看到,权重更新的插值是一定会和激活函数的导数
F
′
F\prime
F′有关,并且随着权重离输出层越远,表达式中的
∂
f
i
+
1
∂
f
i
=
F
′
w
i
\frac{\partial f_{i+1}}{\partial f_i}=F\prime w_i
∂fi∂fi+1=F′wi就会越多,激活函数的导数
F
′
F\prime
F′连乘就会越多。
当激活函数的导数
F
′
F\prime
F′>1的时候,随着神经网络层数增加,梯度更新就会以指数形式增长,从而梯度爆炸。
当激活函数的导数
F
′
F\prime
F′<1的时候,随着神经网络层数减少,梯度更新就会以指数形式减少,从而梯度消失。
总结起来,梯度爆炸和梯度消失的主要原因就是激活函数选择的不合理和过深的网络层数。
但其实从推到的公式来看的时候,其实也和初始设置权重的值有关,初始化太大会导致梯度爆炸,初始化太小会导致梯度消失。