梯度弥散

在深度神经网络中经常听说梯度弥散,下面就介绍一下,并搜集了当时的科学家是怎样避免的

梯度弥散问题

梯度下降法(以及相关的L-BFGS算法等)在使用随机初始化权重的深度网络上效果不好的技术原因是:梯度会变得非常小。具体而言,当使用反向传播方法计算导数的时候,随着网络的深度的增加,反向传播的梯度(从输出层到网络的最初几层)的幅度值会急剧地减小。结果就造成了整体的损失函数相对于最初几层的权重的导数非常小。这样,当使用梯度下降法的时候,最初几层的权重变化非常缓慢,以至于它们不能够从样本中进行有效的学习。这种问题通常被称为“梯度的弥散”.

与梯度弥散问题紧密相关的问题是:当神经网络中的最后几层含有足够数量神经元的时候,可能单独这几层就足以对有标签数据进行建模,而不用最初几层的帮助。因此,对所有层都使用随机初始化的方法训练得到的整个网络的性能将会与训练得到的浅层网络(仅由深度网络的最后几层组成的浅层网络)的性能相似。

梯度弥散一直是困扰着深度神经网络的发展,那么如何解决梯度弥散问题呢?多伦多大学的Geoff Hinton提出了设想:受限玻尔兹曼机(RBM),即一类具有两层结构的、对称链接无自反馈的随机神经网络模型, 层与层之间是全连接,层内无链接 ,从而形成一个二分图。


RBM是一种有效的特征提取方法,常用于初始化前馈神经网络,可明显提高泛化能力。而由多个RBM结构堆叠而成的深度信念网络能提取出更好更抽象的特征,从而用来分类。


    最后,再为大家总结描述一下RBM算法的过程:

a) 正向过程,对每个可见层的输入,都要结合了一个单边的权重和一个可见层的偏置,按隐藏层的条件概率公式计算出结果传到隐藏层,有些节点可能会被激活,有的则可能不会被激活;

b)在反向过程中,对每个激活的隐藏层节点,也结合了一个单边的权重和一个隐藏层的偏置,按可见层的条件概率公式重构可见层输入;

c) 在可见层,将重构输入与原始输入进行比较,早期是用KL散度方法进行两个概率分布差异度量,现在也引入了效率更高的CD散度来进行度量。根据比较结果,更新权值和偏置。

重复步骤a)到步骤c),直至重构的输入与原始输入的尽可能的接近。


根据RBM产生的DBM(deep Boltzmann Machine),DBN(deep Belief Nets),CAE(covolutional Auto-Encode),DAE(denoise Auto-Encode ),SAE(Stacked Auto-Encode)等都是利用的是逐层贪婪的训练方法,
在一隐含层训练稳定时在向下一层进行训练学习达到稳定,依次类推,是一种堆叠的模式(stacked)。


Deep Neural Networks的问题:

  • 以前机器学习的数据量不是很大(标记数据更少),而DNN待学习的参数非常的多(Andrew Ng在Google搞的那个有1.15billion个参数),这样就会出现严重的过拟合现象;这也是DNN之前没有像现在这样火的原因之一(难以训练,计算复杂度高等也是原因)。
  • 层数多了以后,梯度下降的优化过程就变成非凸优化,比较容易陷入局部极值;(关于凸优化,非凸优化的区别可以参考http://hi.baidu.com/tuenmei/item/beedffa6714dce228819d329)
  • 层数多以后,会出现梯度弥散(diffusion of gradients)的现象:梯度下降法(以及相关的L-BFGS算法等)在使用随机初始化权重的深度网络上效果不好的技术原因是:梯度会变得非常小。具体而言,当使用反向传播方法计算导数的时候,随着网络的深度的增加,反向传播的梯度(从输出层到网络的最初几层)的幅度值会急剧地减小。结果就造成了整体的损失函数相对于最初几层的权重的导数非常小。这样,当使用梯度下降法的时候,最初几层的权重变化非常缓慢,以至于它们不能够从样本中进行有效的学习。这种问题通常被称为“梯度的弥散”(http://ufldl.stanford.edu/wiki/index.php/深度网络概览)
针对以上问题,一些学者提出了可行的解法:
  • 利用未标记的数据,提出自编码器(Auto Encoder,包括Forward Neural Networks,Restricted Boltzmann Machine),采用逐层学习的方式(layer-wise的pretraining);
  • 减少参数,提出CNN (Convolution Neural Networks)。
对于浅层的网络来说一般是对梯度弥散不敏感,但是当网络的层数增加到一定时候就会是一种限制,极其明显。

针对梯度弥散如何去更好的解决也仅限于Hinton的RBM的那种设计。

以下是在知乎上看到的

dnn 从名字上你就可以看出来,是深度神经网络,类比于浅层神经网络,它的训练方法也是BP,没有引入无监督的预训练。隐层的激活函数使用了 ReLU,改善了“梯度弥散”,通过正则化+dropout 改善了过拟合的现象,在输出层 是softmax 作为激活函数。目标函数是交叉熵。
他是一个 有监督的判别模型。
stacked denoised autoencoder (SDA)深度学习结构,和DBN类似 使用 无监督的网络“堆叠”起来的,他有分层预训练来寻找更好的参数,最后使用BP来微调网络。比dnn利用各种算法来初始化权值矩阵,从经验上来看是有帮助的。但是缺点也很明显,每层的贪婪学习权值矩阵,也带来了过长的训练时间。在大量的数据面前 dnn(relu)的效果已经不差于预训练的深度学习结构了。最终DBN也是看成是“生成模型”。
CNN 也没有pre-train过程,训练算法也是用BP。 因为加入卷积 可以更好的处理2D数据,例如图像和语音。并且目前看来 相比其它网络有更好的表现。dnn/dbn/sda 等都是处理1D的数据。

CNN解决梯度弥散是使用的权值共享的策略。

补充:

今天再看RNN 时遇到一个关于梯度爆炸的概念

和梯度弥散的问题相反,这时候梯度会在 BP 的时候发生指数级地增长。也就是说,遇到了梯度爆炸的问题。



  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值