精华内容
下载资源
问答
  • 解决梯度消失和梯度弥散的方法

    万次阅读 多人点赞 2018-09-01 19:52:59
     梯度弥散的问题很大程度上是来源于激活函数的“饱和”。因为在后向传播的过程中仍然需要计算激活函数的导数,所以一旦卷积核的输出落入函数的饱和区,它的梯度将变得非常小。  梯度弥散。使用反向传播算法传播...

    第一个问题:模型过拟合

     

    1.1 什么是过拟合

     

      所谓过拟合(Overfit),是这样一种现象:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集 上却不能很好的拟合数据。此时我们就叫这个假设出现了overfit的现象。 
       
    这里写图片描述

      如上图所示:过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。

     

    1.2 造成过拟合的原因


      过拟合其中一个可能的成因就是模型的vc维过高,使用了过强的模型复杂度(model complexity)的能力。(参数多并且过训练) 
      还有一个原因是数据中的噪声,造成了如果完全拟合的话,也许与真实情景的偏差更大。 
      最后还有一个原因是数据量有限,这使得模型无法真正了解整个数据的真实分布。 
      权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。

     

     

    1.3 过拟合解决方法


    1.权值衰减 
      在每次迭代过程中以某个小因子降低每个权值,这等效于修改E的定义,加入一个与网络权值的总量相应的惩罚项,此方法的动机是保持权值较小,避免weight decay,从而使学习过程向着复杂决策面的反方向偏。(L2正则化) 
    2.适当的stopping criterion(验证集) 
    3.Cross-validation with some patterns 
      交叉验证方法在可获得额外的数据提供验证集合时工作得很好,但是小训练集合的过度拟合问题更为严重 
      k-fold交叉方法
      把训练样例分成k份,然后进行k次交叉验证过程,每次使用不同的一份作为验证集合,其余k-1份合并作为训练集合.每个样例会在一次实验中被用作验证样例,在k-1次实验中被用作训练样例;每次实验中,使用上面讨论的交叉验证过程来决定在验证集合上取得最佳性能的迭代次数n*,然后计算这些迭代次数的均值,作为最终需要的迭代次数。 
    4.正则化 
      这里有点疑问,正则化是为了防止过拟合还是为了解决过拟合。对部分无用的feature,定义其parameter(p3,p4)非常大,这样会导致训练结果w3,w4非常小,几乎为0,降低模型复杂度。 
      关于正则化具体的解释请移步到博主另一篇博文中: 
    (http://blog.csdn.net/u010402786/article/details/49592239)

     

    第二个问题:数据集不平衡

      不平衡训练集会对结果造成很大的负面影响,而训练集在平衡的情况下,能够达到最好的performance。 
       
    1. 训练数据分布情况对CNN结果产生很大影响; 
    2. 平衡的训练集是最优的,数据越不平衡,准确率越差; 
    3. 如何提升准确率(使用Oversampling)

      相关论文是: 
    《The Impact of Imbalanced Training Data for Convolutional Neural Networks》

    第三个问题:Batchsize的影响

     

    3.1Batch_Size三种情况

     

      Batch_Size(批尺寸)是机器学习中一个重要参数。 
      ①如果数据集比较小,完全可以采用全数据集 ( Full Batch Learning )的形式,这样做至少有 2 个好处:其一,由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。其二,由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 
       ②Batch_Size = 1。这就是在线学习(Online Learning)。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。 
      ③如果网络中采用minibatch SGD算法来优化,所以是一个batch一个batch地将数据输入CNN模型中,然后计算这个batch的所有样本的平均损失,即代价函数是所有样本的平均。而batch_size就是一个batch的所包含的样本数,显然batch_size将影响到模型的优化程度和速度。mini batch只是为了充分利用GPU memory而做出的妥协 
     

    3.2改变Batch_Size的影响


      在合理范围内,增大 Batch_Size 的好处:内存利用率提高了,大矩阵乘法的并行化效率提高。跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。 
      下面是参考文献中博主给出的实验结果: 
      Batch_Size 太小,算法在 200 epoches 内不收敛。 
      随着 Batch_Size 增大,处理相同数据量的速度越快。 
      随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。 
      由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。 
      由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

    3.3 Minibatch简谈

       
      首先说一下采用mini-batch时的权重更新规则。比如mini-batch size设为100,则权重更新的规则为: 
               这里写图片描述 
      也就是将100个样本的梯度求均值,替代online learning方法中单个样本的梯度值: 
                 这里写图片描述 
      当采用mini-batch时,我们可以将一个batch里的所有样本放在一个矩阵里,利用线性代数库来加速梯度的计算,这是工程实现中的一个优化方法。 
      一个大的batch,可以充分利用矩阵、线性代数库来进行计算的加速,batch越小,则加速效果可能越不明显。当然batch也不是越大越好,太大了,权重的更新就会不那么频繁,导致优化过程太漫长。

     

    第四个问题:梯度弥散

     

    4.1 梯度弥散的解释

     

      梯度弥散的问题很大程度上是来源于激活函数的“饱和”。因为在后向传播的过程中仍然需要计算激活函数的导数,所以一旦卷积核的输出落入函数的饱和区,它的梯度将变得非常小。 
    梯度弥散。使用反向传播算法传播梯度的时候,随着传播深度的增加,梯度的幅度会急剧减小,会导致浅层神经元的权重更新非常缓慢,不能有效学习。这样一来,深层模型也就变成了前几层相对固定,只能改变最后几层的浅层模型。 
     

    4.2 如何解决梯度弥散

    1. Relu代替sigmoid

    2. 梯度裁剪

    3. RNN-LSTM

    4.一种新的方法batch normalization,相关论文: 
      《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 
      顾名思义,batch normalization嘛,就是“批规范化”咯。Google在ICML文中描述的非常清晰,即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入,从而保证整个network的capacity。 
      

     

    这里写图片描述 
       
      BN可以应用于网络中任意的activation set。文中还特别指出在CNN中,BN应作用在非线性映射前,即对x=Wu+b做规范化。另外对CNN的“权值共享”策略,BN还有其对应的做法(详见文中3.2节)。 
      那BN到底是什么原理呢?说到底还是为了防止“梯度弥散”。关于梯度弥散,大家都知道一个简单的栗子:。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法。

    参考文献

    1.谈谈深度学习中的 Batch_Size 
    http://blog.csdn.net/ycheng_sjtu/article/details/49804041

    2.正则化方法:L1和L2 regularization、数据集扩增、dropout 
    http://blog.csdn.net/u010402786/article/details/49592239

    3.深度学习中 Batch Normalization为什么效果好? 
    http://www.zhihu.com/question/38102762

    展开全文
  • 1 梯度消失和梯度爆炸产生的原因 https://blog.csdn.net/yhily2008/article/details/80790476 在神经其网络的参数训练过程中,BP(Back Propagation)算法非常重要。BP神经网络工作流程分两步:(1)正向传播输入信号...

    1 梯度消失和梯度爆炸产生的原因

    https://blog.csdn.net/yhily2008/article/details/80790476
    https://zhuanlan.zhihu.com/p/33006526

    在神经其网络的参数训练过程中,BP(Back Propagation)算法非常重要。BP神经网络工作流程分两步:(1)正向传播输入信号,输出分类信息(对于有监督学习而言,基本上都可归属于分类算法);(2)反向传播误差信息,调整网络的权值(通过微调网络参数,让下一轮的输出更加准确)。

    产生梯度消失的根源是:深度神经网络的反向传播
    我们构建深度神经网络是为了拟合由输入到输出的映射关系,
    将损失函数计算的偏差通过梯度反向传播的方式来更新网络的权重,
    拟合从输入到输出映射关系的最优的模型的过程就是为网络节点找到合适的参数的过程。
    最优模型的条件下loss达到最小值。数学中计算函数最小值的方法适用于此,梯度下降法

    以下从两个角度来分析梯度消失和梯度爆炸产生的原因:深层网络和选择了不合适的激活函数

    (1)深层网络的角度

    在这里插入图片描述
    图片来自:https://zhuanlan.zhihu.com/p/33006526
    f 表示每一层的激活函数,那么输出节点可以表示为,fi+1 = f(fi*wi+1) 目标基于梯度下降的方法,按负梯度的方向对权值进行调整。
    权值调整量的表达式为(α表示学习率):
    在这里插入图片描述
    根据链式求导法逐层计算。
    如果△w值大于1,随着网络层数的不断加深,最终梯度将以指数形式增加(梯度爆炸
    如果△w值小于1,随着网络层数的不断加深,最终梯度将以指数形式减少(梯度消失

    总结
    对于深层的神经网络,不同层的学习率是不同的,从后向前调节,开始阶段,学习率较大;传递到输入层阶段,学习率较小。
    梯度消失和梯度爆炸现象产生的根本原因就是梯度反向传播这一训练法则。
    彻底消除梯度消失和梯度爆炸,只有改变深度学习梯度反向传播的算法。

    Hinton提出capsule的原因就是为了彻底抛弃目前基于反向传播的深度学习算法,如果真能大范围普及,那真是一个革命。
    https://zhuanlan.zhihu.com/p/33006526

    提出的解决方法都只是减少梯度消失梯度爆炸现象。

    (2)激活函数

    在深度神经网络中,激活函数的作用是增加网络的非线性关系自,对于复杂的模型,提高网络的泛化能力。

    https://www.cnblogs.com/itmorn/p/11132494.html#ct2

    • 激活函数Sigmoid

    sigmoid激活函数及其导数的表达式的表达式:
    在这里插入图片描述
    Sigmoid函数及其导数的图像:
    在这里插入图片描述
    由函数图像可知,函数梯度不超过0.25,那么随着网络深度的增加,根据上文所述梯度反向传播原理,会出现梯度消失的现象。

    • 激活函数tanh

    tanh激活函数及其导数的表达式的表达式:
    在这里插入图片描述
    tanh函数的图像:
    在这里插入图片描述
    tanh函数导数的图像:
    在这里插入图片描述
    tanh函数导数图像可知,导数的最大值为1,减少梯度消失的效果优于Sigmoid函数。

    2、梯度消失和梯度爆炸的解决方法

    (1)预训练加微调的方法

    此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
    来自https://zhuanlan.zhihu.com/p/33006526

    (2)梯度裁剪和正则(针对梯度爆炸的现象)

    https://blog.csdn.net/y12345678904/article/details/79581550
    梯度裁剪方法是,设置一个阈值,如果梯度超过这个阈值,就将该梯度投射到一个比较小的尺度上。映射的表达式为(其中g表示梯度,θ表示阈值):
    在这里插入图片描述

    良好的权重初始化策略能够缓解梯度爆炸的现象。例如可以使用权重L1正则化、L2正则化。

    (3)Relu系列激活函数

    https://www.cnblogs.com/itmorn/p/11132494.html#ct2

    1. Relu

    Relu激活函数及其导数的表达式:
    在这里插入图片描述
    对应函数图像及其导数的图像:
    在这里插入图片描述
    在这里插入图片描述
    Relu解决梯度消失梯度爆炸现象的原理:如果激活函数的导数等于1,则说明不存在梯度消失、梯度爆炸的现象。每一层网络都具有相同的更新速度。
    从图像可以看出,Relu激活函数的导数,在正数部分恒等于1,所以不会存在梯度消失梯度爆炸的现象。同时,存在的问题就是在负数部分激活函数的导数恒等于0,会使一部分神经元无法激活。

    1. LeakyRelu

    LeakyRelu函数及其导数的表达式:
    在这里插入图片描述
    LeakyRelu函数及其导数对应的图像:
    在这里插入图片描述
    LeakyRelu与Relu相比解决了0区间的影响。由图像可知,LeakyRelu函数的导数在正数部分恒等于1,负数部分等于一个常数,这部分神经元也能够被激活。

    1. eLU

    eLU也是为了解决Relu激活函数负数部分导数恒等于0的问题。
    eLU激活函数的表达式为:
    在这里插入图片描述
    eLU激活函数及其导数的图像:
    在这里插入图片描述

    (4)Batch normalization(批规范化)

    BatchNormalization将每层输出的神经元强制规范化到服从标准正态分布的情况,
    这些规范化后的结果作为激活函数的输入,能够较大概率落在激活函数的敏感区域,即使输入到激活函数的值发生很小的变化,也会导致损失函数具有较大变化,使梯度变大,能够防止梯度消失现象。

    (5)残差网络(ResNet)

    经典的ResNet的shortcut结构图如下图所示:
    在这里插入图片描述
    这些残差边(shortcut)在梯度方向传播的过程中
    在这里插入图片描述
    由于残差边,反向梯度传播过程中又一个1,所以不会产生梯度消失的现象。shortcut机制可以无损的传播梯度,值为1;主干网络的梯度反向传播才会经过有权值的网络层,所以只有所有主干网络的梯度值都为-1,才会产生梯度消失的现象。

    感谢:
    https://www.cnblogs.com/itmorn/p/11132494.html#ct2
    https://zhuanlan.zhihu.com/p/33006526
    https://blog.csdn.net/y12345678904/article/details/79581550

    展开全文
  • 梯度消失与梯度爆炸,梯度弥散

    千次阅读 2018-07-16 09:35:25
    详解机器学习中的梯度消失、爆炸原因及其解决方法机器学习总结(九):梯度消失(vanishing gradient)与梯度爆炸(exploding gradient)问题
    展开全文
  • 梯度弥散和梯度爆炸

    2017-10-03 15:52:25
    bp神经网络中, 梯度会随着反向传播层数的增加而呈指数增长,导致梯度爆炸(膨胀)。 在经过多层的传播后,梯度会趋向于0,导致梯度弥散消失)。
    bp神经网络中,

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


    在经过多层的传播后,梯度会趋向于0,导致梯度弥散(消失)。
    展开全文
  • 之前看过,现在突然想不起,真的是好记性不如烂笔头,希望大家在看的时候能够拿笔和纸跟着...1.RNN梯度弥散和爆炸的原因 经典的RNN结构如下图所示: 假设我们的时间序列只有三段, S0S_0S0​为给定值,神经元没有...
  • 在深度学习领域梯度是个很重要的概念,梯度弥散和梯度爆炸现象(不同激活函数梯度弥散和梯度爆炸的现象不同): 梯度弥散:(以sigmoid为例)我们可以知道当网络层数越深的时候,它的学习速率就越大。通常每增加一...
  • 梯度消失,没法反向传播了,网络就无法训练了。 原因,激活函数的饱和区间,常用的有饱和区间的激活函数,sigmoid,tanh,softmax, 所以中间层尽量不适用这种激活函数,使用Relu系列的解决; 奇异样本引起, 可以使用...
  • 《也来谈谈RNN的梯度消失/爆炸问题 》[Blog post]. Retrieved fromhttps://kexue.fm/archives/7888”,个人认为这是我看到的第一篇讲清楚LSTM解决梯度弥散机制的文章,特此记录,同时感谢大佬@苏剑林! 原文地址:...
  • All you need is a good init. If you can’t find the good init, use Batch Normalization.
  • 梯度弥散与梯度爆炸及其解决方法

    千次阅读 2019-06-01 12:18:41
    梯度弥散梯度消失): 通常神经网络所用的激活函数是sigmoid函数,sigmod函数容易引起梯度弥散。这个函数能将负无穷到正无穷的数映射到01之间,并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))f′(x)=f(x)(1−f...
  • 梯度弥散就是梯度消失,导数为0 1.2 梯度弥散造成的问题 靠近输出层的隐藏层梯度大,参数更新快,所以很快就会收敛; 靠近输入层的隐藏层梯度小,参数更新慢,几乎就初始状态一样,随机分布。 由于神经网络前几层...
  • 梯度弥散与梯度爆炸

    千次阅读 2018-08-28 15:37:59
    问题描述 先来看看问题描述。 当我们使用sigmoid ...结点中的柱状图表示每个神经元参数的更新速率(梯度)大小,有图中可以看出,layer2整体速度都要大于layer1. 我们又取每层layer中参数向量的长度来粗略的估...
  • 1.51.RNN训练难题–梯度弥散与梯度爆炸 1.51.1.梯度弥散与梯度爆炸 1.51.2.详解机器学习中的梯度消失、爆炸原因及其解决方法 1.51.2.1.前言 1.51.2.2.第一部分:为什么要使用梯度更新规则 1.51.2.3.第二部分:梯度...
  • 在时刻, 损失函数为,那么如果我们要训练RNN时, 实际上就是是对求偏导, 并不断调整它们以使得尽可能达到最小(参见反向传播算法与梯度下降算法)。 那么我们得到以下公式: 将上述偏导公式与第三节中的公式...
  • 当存在过多的层次时,就出现了内在本质上的不稳定场景,如梯度消失和梯度爆炸。 一、梯度消失问题 为了弄清楚为何会出现消失的梯度,来看看一个极简单的深度神经网络:每一层都只有一个单一的神经元。下图就是有三层...
  • 加了梯度裁剪,改了损失函数,lr衰减改成指数形式,加载预训练权重,修改权重初始化方式等等全失败,一度怀疑是我代码逻辑哪里写的有问题,检查数遍无果。就在这时随手加了个warmup,卧槽居然不飞了,个人觉得原因是...
  • 梯度弥散、消失梯度问题(Vanishing Gradient Problem) 梯度消失问题的原因   激活函数的梯度非常小的情况下会出现消失梯度问题。在权重乘以这些低梯度时的反向传播过程中,它们往往变得非常小,并且随着网络...
  • 一、前述 ...二、解决梯度弥散和消失方法一,初始化权重使用he_initialization 1、举例 如果我们看逻辑激活函数,当输入比较大,不管正负,将会饱和在0或1,这样梯度就是0,因此当反向传播开始,它几...
  • 一、梯度弥散和爆炸1. 梯度弥散的解释梯度弥散的问题很大程度上是来源于激活函数的“饱和”。因为在后向传播的过程中仍然需要计算激活函数的导数,所以一旦卷积核的输出落入函数的饱和区,它的梯度将变得非常小。 ...
  • 靠近输入的神经元会比靠近输出的神经元的梯度成指数级衰减 ...这种现象就是梯度弥散(vanishing gradient problem)。 而在另一种情况中,前面layer的梯度通过训练变大,而后面layer的梯度指数...
  • 数学原理解释resnet缓解梯度弥散问题前言产生梯度弥散的原因残差结构激活函数缓解梯度弥散总结 前言 本文是一位职场小白在百度实习面试被虐,发现基本的大公司都会问到网络的数学原理解释,之后学习很多的博客。对...
  • 这个比sigmoid要好一些,但是有时还是会产生梯度消失 2.加入BN(Batch Normalization)层  BN层作用: (1)加速收敛 (2)控制过拟合,可以少用或不用Dropout正则 (3)降低网络对初始化权重...
  • 今天打算复习一下RNN方面的基础,本篇博客会分三个部分讲:第一部分讲NN中的梯度弥散问题,第二部分讲RNN中的梯度弥散问题,并引出LSTMGRU,第三部分聊一聊batch normalizationgroup normalization。 关于第一...
  • 1. LSTM避免RNN的梯度消失(gradient vanishing) 2. LSTM避免RNN的梯度爆炸 3. GRU 与 LSTM 比较 1. LSTM避免RNN的梯度消失(gradient vanishing) RNN的本质是在网络内部维护了一个状态 StStS_t,...
  • 1、首先需要明确的是,RNN 中的梯度消失/梯度爆炸普通的 MLP 或者深层 CNN 中梯度消失/梯度爆炸的含义不一样。MLP/CNN 中不同的层有不同的参数,各是各的梯度;而 RNN 中同样的权重在各个时间步共享,最终的梯度 g...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,568
精华内容 627
关键字:

梯度弥散和梯度消失