【问题标题】:Do convolutional neural networks suffer from the vanishing gradient?卷积神经网络是否受到梯度消失的影响?
【发布时间】:2015-05-11 07:04:40
【问题描述】:

我想我在某处读到过,卷积神经网络不会像层数增加的标准 sigmoid 神经网络那样遭受梯度消失问题的困扰。但我一直无法找到“为什么”。

它真的没有问题还是我错了,它取决于激活函数? [我一直在使用 Rectified Linear Units,所以我从未测试过用于卷积神经网络的 Sigmoid Units]

【问题讨论】:

    标签: machine-learning neural-network classification conv-neural-network


    【解决方案1】:

    卷积神经网络(如标准 sigmoid 神经网络)确实存在梯度消失问题。克服梯度消失问题的最推荐方法是:

    • 分层预训练
    • 激活函数的选择

    您可能会看到最先进的计算机视觉问题深度神经网络(如ImageNet 获胜者)使用卷积层作为其网络的前几层,但这不是关键用于解决消失梯度。关键通常是逐层贪婪地训练网络。使用卷积层当然还有其他几个重要的好处。尤其是在输入尺寸很大(图像的像素)的视觉问题中,建议在第一层使用卷积层,因为它们的参数比全连接层少,而且最终不会有数十亿个参数第一层(这将使您的网络容易过度拟合)。

    然而,一些任务已经证明(如this paper)使用整流线性单元可以缓解梯度消失的问题(与传统的 sigmoid 函数相反)。

    【讨论】:

    • 是的,我在其他地方读到整流线性单元不受梯度消失问题的影响。我知道自动编码器和 Boltzmann 机器是以贪婪的分层方式进行训练的。对卷积神经网络做过同样的事情吗?
    • ReLU 并没有完全摆脱梯度消失的问题,但它们的问题较少。也可以在卷积网络上执行贪婪的逐层预训练。当您将层连接到输出时,它可能像自动编码器一样是无监督的或有监督的。我相信他们在这篇论文中进行了监督预训练:cs.toronto.edu/~fritz/absps/imagenet.pdf
    • 我再次阅读了这篇论文(在我的最后一条评论中)。尚不清楚他们是否使用了贪婪的逐层预训练。他们只是说预训练。目前我没有其他关于卷积网络分层训练的参考资料,但可以这样做。
    • @Roy 这是excellent explanation 说明为什么其他激活函数(例如 sigmoid 函数)会导致梯度消失的原因。里面有恰到好处的数学,可以让你理解真正的原因。
    【解决方案2】:

    最近的进展减轻了深度神经网络中梯度消失的影响。贡献的进步包括:

    1. 使用 GPU 训练深度神经网络
    2. 使用更好的激活函数。 (此时整流线性单元 (ReLU) 似乎效果最好。)

    有了这些进步,即使没有分层预训练,也可以训练深度神经网络。

    来源: http://devblogs.nvidia.com/parallelforall/deep-learning-nutshell-history-training/

    【讨论】:

    • 这与问题无关:“使用 GPU 训练深度神经网络”
    • 如果您使用 GPU 训练 CNN,那么您将受到梯度消失的影响较小。希望它清楚
    • 其实,我认为更恰当的说法是,通过使用 GPU,您可以使用较小的学习率(计算时间不会成为问题),并且以某种方式降低消失的风险.
    • @BsHe 这比 dnth 说的更有意义
    【解决方案3】:

    我们不使用 Sigmoid 和 Tanh 作为激活函数,这会导致梯度消失问题。现在我们大多使用基于 RELU 的激活函数来训练深度神经网络模型,以避免这种复杂性并提高准确性。

    这是因为如果 RELU 激活的梯度或斜率超过 0,则为 1。Sigmoid 导数的最大斜率为 0.25,这意味着在反向传播期间,您将梯度与小于 1 的值相乘,如果你有越来越多的层,你将它与小于 1 的值相乘,使梯度越来越小。 RELU 激活通过梯度斜率为 1 来解决这个问题,因此在反向传播期间,没有递回的梯度逐渐变得越来越小。但相反,它们保持不变,这就是 RELU 解决梯度消失问题的方法。

    关于 RELU 需要注意的一点是,如果您的值小于 0,则该神经元已死亡,并且传回的梯度为 0,这意味着在反向传播期间,如果您有 0 个梯度被传回小于 0 的值。

    另一种方法是 Leaky RELU,它为小于 0 的值提供一些梯度。

    【讨论】:

      【解决方案4】:

      第一个答案是从 2015 年开始,有点年代。

      今天,CNN 通常也使用 batchnorm - 虽然存在一些争论为什么这会有所帮助:发明者提到协变量转换:https://arxiv.org/abs/1502.03167 还有其他理论,例如平滑损失景观:https://arxiv.org/abs/1805.11604

      无论哪种方式,它都是一种有助于显着处理与 CNN 相关的梯度消失/爆炸问题的方法。在 CNN 中,您还可以应用链式法则来获得梯度。即第一层的更新与N个数字的乘积成正比,其中N是输入的个数。与最后一层的更新相比,这个数字很可能相对较大或较小。这可以通过查看随机变量乘积的方差来看出,该乘积随着更多变量的乘积而快速增长:https://stats.stackexchange.com/questions/52646/variance-of-product-of-multiple-random-variables

      对于具有长输入序列的循环网络,即。长度为 L,情况通常比 CNN 更糟糕,因为那里的产品由 L 个数字组成。通常,RNN 中的序列长度 L 远大于 CNN 中的层数 N。

      【讨论】:

        猜你喜欢
        • 2017-11-25
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 2020-01-21
        • 2019-04-03
        • 2017-07-31
        • 2015-04-09
        相关资源
        最近更新 更多