卷积神经网络是否存在梯度消失问题?

Do convolutional neural networks suffer from the vanishing gradient?

我想我在某处读到,卷积神经网络不会像层数增加的标准 sigmoid 神经网络那样遭受梯度消失问题。但是我没能找到 'why'.

是真的没有问题还是我错了取决于激活函数? [我一直在使用Rectified Linear Units,所以我从来没有测试过Sigmoid Units for Convolutional Neural Networks]

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

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

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

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

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

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

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

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

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

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

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

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

第一个答案是 2015 年的,有点老了。

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

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

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