在学习resnet时发现一个问题:
在深度神经网络中,如果层数过大,会导致梯度消失、梯度下降的问题。
残差网络中的shortcut可以解决这一问题。
今天先来说清楚梯度消失、梯度下降的原因。
参考文章
为啥有梯度消失、梯度下降?
https://www.zhihu.com/question/290392414/answer/940509039
详解深度学习中的梯度消失、爆炸原因及其解决方法
https://zhuanlan.zhihu.com/p/33006526
先从最基本的单层神经网络入手。
正向传播的公式如下:
a
=
(
x
1
∗
w
1
+
x
2
∗
w
2
)
(1)
a = (x_1*w_1+x_2*w_2) \tag{1}
a=(x1∗w1+x2∗w2)(1)
h
=
s
i
g
m
o
d
(
a
)
(2)
h = sigmod(a) \tag{2}
h=sigmod(a)(2)
其中,
x
1
,
x
2
x_1,x_2
x1,x2 为一个输入样本的两个维度,
w
1
,
w
2
w_1,w_2
w1,w2 为权重,
a
a
a 为线形激活后的值,
h
h
h 为经过非线性激活
s
i
g
n
e
d
(
)
signed()
signed() 后的预期值(在学习过程中往往用
y
^
\hat{y}
y^ 表示)。
为了方便我们省略偏差(bias),并且使用均方差函数作为loss。
l
o
s
s
=
1
2
(
h
−
y
)
2
(3)
loss = \frac{1}{2}(h - y)^2 \tag{3}
loss=21(h−y)2(3)
loss即为损失函数,y对应实际的标签。
下面我们开始一步步求导。
在公式3中对,对h求导。
d
l
o
s
s
d
h
=
h
−
y
(4)
\frac{d_{loss}}{d_h} = h-y \tag{4}
dhdloss=h−y(4)
在公式2中,对a求导。
d
h
d
a
=
a
(
1
−
a
)
(5)
\frac{d_h}{d_a} = a(1-a) \tag{5}
dadh=a(1−a)(5)
顺便提一下,sigmod函数的原始形式。
s
(
x
)
=
1
1
−
e
x
(6)
s(x) = \frac{1}{1-e^x} \tag{6}
s(x)=1−ex1(6)
求导之后。
s
′
(
x
)
=
1
1
−
e
x
(
1
−
1
1
−
e
x
)
(7)
s'(x) = \frac{1}{1-e^x}(1 - \frac{1}{1-e^x}) \tag{7}
s′(x)=1−ex1(1−1−ex1)(7)
在公式1中,对x,w求导比较简单。
d
a
d
w
1
=
x
1
(8)
\frac{d_a}{d_{w1}} = x_1 \tag{8}
dw1da=x1(8)
d
a
d
x
1
=
w
1
(9)
\frac{d_a}{d_{x1}} = w_1 \tag{9}
dx1da=w1(9)
d
a
d
w
2
=
x
2
(10)
\frac{d_a}{d_{w2}} = x_2 \tag{10}
dw2da=x2(10)
d
a
d
x
2
=
w
2
(11)
\frac{d_a}{d_{x2}} = w_2 \tag{11}
dx2da=w2(11)
经过一系列的求导,根据链式,我们得到下面的公式。
d
l
o
s
s
d
w
i
=
d
l
o
s
s
∗
d
h
∗
d
a
d
h
∗
d
a
∗
d
w
i
=
(
h
−
y
)
∗
a
(
1
−
a
)
∗
x
i
(12)
\frac{d_{loss}}{d_{wi}} = \frac{d_{loss}*d_h*d_a}{d_h*d_a*d_{wi}} = (h-y)*a(1-a)*x_i \tag{12}
dwidloss=dh∗da∗dwidloss∗dh∗da=(h−y)∗a(1−a)∗xi(12)
d
l
o
s
s
d
x
I
=
d
l
o
s
s
∗
d
h
∗
d
a
d
h
∗
d
a
∗
d
x
i
=
(
h
−
y
)
∗
a
(
1
−
a
)
∗
w
i
(13)
\frac{d_{loss}}{d_{xI}} = \frac{d_{loss}*d_h*d_a}{d_h*d_a*d_{xi}} = (h-y)*a(1-a)*w_i \tag{13}
dxIdloss=dh∗da∗dxidloss∗dh∗da=(h−y)∗a(1−a)∗wi(13)
根据公式5-7,我们可以得到sigmod函数的求导函数。并且sigmod求导函数的值域在[0,1]之间。关于这个值域问题,我们看下面的图。
图例是sigmod函数求导之后,y关于x的图像。
我们根据公式12、公式13已经找到了当前单层神经网络的梯度。
其中
a
(
1
−
a
)
a(1-a)
a(1−a)能够确定是一个0到1之间的数值。
接着讨论
(
h
−
y
)
∗
w
1
(h-y)*w_1
(h−y)∗w1与
(
h
−
y
)
∗
x
1
(h-y)*x_1
(h−y)∗x1的对梯度的影响即可。
在上述两个式子的作用下,如果每一层的梯度都在0到1之间,那么梯度会变得越来越小,最后出现梯度消失现象。
如果每一层的梯度都大于1,那么梯度会变得越来越大,最后出现梯度爆炸的现象。
原答者认为,梯度消失、爆炸很大程度上取决于权重的初始化有关。根本原因是链式法则运算导致的层层缩放。
在下认为,避免出现梯度消失、梯度爆炸要注意权重的初始化,毕竟余下的
w
1
,
x
1
,
y
w_1,x_1,y
w1,x1,y已是可以确定的条件。