梯度爆炸与梯度消失的原因以及解决方法,局部极小值问题以及学习率问题(对SGD的改进)

本文深入探讨了深度学习中遇到的梯度爆炸与梯度消失问题,分析了其数学原理,并提出了解决方案,包括逐层预训练、ReLU激活函数、深度残差学习和归一初始化。同时,文章讨论了局部极小值和学习率问题,介绍了不同的优化算法,如梯度下降、随机梯度下降和Adam,强调了选择合适优化算法的重要性。
摘要由CSDN通过智能技术生成

  1. 梯度爆炸与梯度消失的原因:

简单地说,根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都小于1的话(w_{ij}y_{i}'<1.0 ),那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导会趋于0(\lim_{n\to\infty}0.99^n=0 )。下面是数学推导推导。

假设网络输出层中的第k 个神经元输出为y_{k}(t),而要学习的目标为d_{k}(t) 。这里的t 表示时序,与输入无关,可以理解为网络的第t 层。



若采用平方误差作为损失函数,第k 个输出神经元对应的损失为 L=\frac{1}{2}(d_{k}(t)-y_{k}(t))^{2}

将损失L 对输出y_{k}(t)求偏导 \vartheta_{k}(t)=\frac{\partial{L}}{\partial{y_{k}(t)}}=y_{k}'(t)(d_{k}(t)-y_{k}(t))

根据链式法则,我们知道,第t-1 层的梯度可以根据第t 层的梯度求出来

\vartheta_{i}(t-1)=y_{i}'(t-1)\sum_{j}w_{ij}\vartheta_{j}(t)

这里用i 表示第t-1 层的第i 个神经元,j 表示第t 层的第j 个神经元。

进一步,第t-q 层的梯度可以由第t-q+1 层的梯度计算出来

\vartheta_{i}(t-q)=y_{i}'(t-q)\sum_{j}w_{ij}\vartheta_{j}(t-q+1)

这实际上是一个递归嵌套的式子,如果我们对\vartheta_{j}(t-q+1) 做进一步展开,可以得到式子

\vartheta_{i}(t-q)=y_{i}'(t-q)\sum_{j}w_{ij}[y_{j}'(t-q+1)\sum_{k}w_{jk}\vartheta_{k}(t-q+2))]

最终,可以一直展开到第t 层。

把所有的加法都移到最外层,可以得到

\vartheta_{i}(t-q)=\sum_{l_{t-q+1}=1}^{n}\cdot\cdot\cdot\sum_{l_{t}=1}^{n}\prod_{m=0}^{q}w_{l_{m}l_{m-1}}\vartheta_{lm}(t-m)

l_{t-q+1} 表示的是第t-q+1 层中神经元的下标(即第t-q+1 层第l_{t-q+1} 个神经元),l_{t} 表示第t 层的下标。m=0 对应输出层,m=q 对应第t-q 层。实际上展开式就是从网络的第t 层到t-q 层,每一层都取出一个神经元来进行排列组合的结果。这个式子并不准确,因为m=0 时实际是损失L 对输出层的偏导,即

\vartheta_{k}(t)=y_{k}'(t)(d_{k}(t)-y_{k}(t))

并没有应用权重w_{l_{m}l_{m-1}},把它修正一下

\vartheta_{i}(t-q)=\sum_{l_{t-q+1}=1}^{n}\cdot\cdot\cdot\sum_{l_{t}=1}^{n}\prod_{m=1}^{q}w_{l_{m}l_{m-1}}y_{lm}'(t-m)\cdot\vartheta_{k}(t)

这样,我们就得到了第t-q 层和第t 层的梯度之间的关系

\frac{\vartheta_{i}(t-q)}{\vartheta_{k}(t)}=\sum_{l_{t-q+1}=1}^{n}\cdot\cdot\cdot\sum_{l_{t}=1}^{n}\prod_{m=1}^{q}w_{l_{m}l_{m-1}}y_{lm}'(t-m)

在上面的式子中,由于加法项正负号之间可能互相抵消。因此,比值的量级主要受最后的乘法项影响。如果对于所有的m

|w_{l_{m}l_{m-1}}y_{lm}'(t-m)|>1.0

则梯度会随着反向传播层数的增加而呈指数增长,导致梯度爆炸。

如果对于所有的m

|w_{l_{m}l_{m-1}}y_{lm}'(t-m)|<1.0

则在经过多层的传播后,梯度会趋向于0,导致梯度消失。

2. 解决方法:

以sigmoid函数为例子,sigmoid函数使得输出在[0,1]之间。

事实上x到了一定大小,经过sigmoid函数的输出范围就很小了,参考下图

如果输入很大,其对应的斜率就很小,我们知道,其斜率(梯度)在反向传播中是权值学习速率。在深度网络中,如果网络的激活输出很大,其梯度就很小,学习速率就很慢。假设每层学习梯度都小于0.25,网络有n层,因为链式求导(第一层偏移量的梯度=激活层斜率1x权值1x激活层斜率2x…激活层斜率(n-1)x权值(n-1)x激活层斜率n)的原因,第一层的梯度小于0.25的n次方,所以学习速率就慢,对于最后一层只需对自身求导1次,梯度就大,学习速率就快。这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。

梯度消失的影响:

(1)浅层基本不学习,后面几层一直在学习,失去深度的意义。

(2)无法收敛。

如何解决:

1)第一个阶段就是逐层预训练方法,为了解决深层神经网络的训练问题,一种有效的手段是采取无监督逐层训练(unsupervised layer-wise training)。其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这被称之为预训练pre-training);在预训练完成后,再对整个网络进行微调fine-tunning)训练。在使用无监督训练时,首先训练第一层,这是关于训练样本的RBM模型,可按标准的RBM进行训练;然后,将第一层预训练号的隐节点视为第二层的输入节点,对第二层进行预训练;各层预训练完成后,再利用BP算法对整个网络进行训练。虽然也解决了一些问题,但并没有特别火。事实上,

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值