我只是知识的搬运工
1.为什么使用梯度下降来优化神经网络参数?
反向传播(用于优化神网参数):根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。
采取反向传播的原因:首先,深层网络由许多线性层和非线性层堆叠而来,每一层非线性层都可以视为是一个非线性函数(非线性来自于非线性激活函数),因此整个深度网络可以视为是一个复合的非线性多元函数。
我们最终的目的是希望这个非线性函数很好的完成输入到输出之间的映射,也就是找到让损失函数取得极小值。所以最终的问题就变成了一个寻找函数最小值的问题,在数学上,很自然的就会想到使用梯度下降来解决。
2.梯度消失、爆炸会带来哪些影响
举个例子,对于一个含有三层隐藏层的简单神经网络来说,当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。
3.产生的原因
以最简单的网络结构为例,加入有三个隐藏层,每层的神经元个数都是1,且对应的非线性函数为y_i = \sigma(z_i)=\sigma(w_i x_i + b_i)(其中 \sigma 为某个激活函数)如下图:
现在假设我们需要更新参数 ,那么我们就要求出损失函数对参数 的导数,根据链式法则,可以写成下面这样:
而对于激活函数,之前一直使用Sigmoid函数,其函数图像成一个S型,如下所示,它会将正无穷到负无穷的数映射到0~1之间:
当我们对Sigmoid函数求导时,得到其结果如下:
由此可以得到它Sigmoid函数图像,呈现一个驼峰状(很像高斯函数),从求导结果可以看出,Sigmoid导数的取值范围在0~0.25之间,而我们初始化的网络权值通常都小于1,因此,当层数增多时,小于0的值不断相乘,最后就导致梯度消失的情况出现。同理,梯度爆炸的问题也就很明显了,就是当权值过大时,导致 ,最后大于1的值不断相乘,就会产生梯度爆炸。
Sigmoid函数求导图像
4.解决办法
4.1 换用Relu、LeakyRelu、Elu等激活函数
4.2 BatchNormalization
4.3 ResNet残差结构
等
参考这里:https://www.jianshu.com/p/3f35e555d5ba