如何修复这些消失的渐变?

数据挖掘 深度学习 神经网络 张量流 nlp 卷积神经网络
2021-09-22 00:37:02

我正在尝试为 Twitter 情感分类训练一个深度网络。它由嵌入层 (word2vec)、RNN (GRU) 层、2 个卷积层和 2 个密集层组成。对所有激活函数使用 ReLU。

我刚刚开始使用 tensorboard 并注意到我的卷积层权重似乎有非常小的梯度(见图)

在此处输入图像描述

我相信我的梯度消失了,因为 CNN 滤波器权重的分布似乎没有改变,而且梯度相对于权重非常小(见图)。[注意:图中显示的是第 1 层,但第 2 层看起来非常相似]

我的问题是:

1)我是否正确解释了我确实有梯度消失的图,因此我的卷积层没有学习?这是否意味着它们目前基本上一文不值?

2)我能做些什么来纠正这种情况?

谢谢!

2018 年 3 月 13 日更新

几点评论:

1)我已经尝试了只有 1 层而没有层的网络(RNN--> FC),并且拥有 2 个 kayers 确实可以从经验上提高性能。

2)我已经尝试过 Xavier 初始化,但它并没有做太多(之前的默认初始化平均值 0.1 非常接近 Xander 值)

3)通过快速数学,梯度似乎在 1e-5 的数量级上发生变化,而权重本身在 1e-1 的数量级上。因此,在每次迭代中,权重都会变化 1e-5/1e-1*100% = ~.01%。这是可以预料的吗?在我们认为它们已经收敛/认为这些变化在它们不改变结果的意义上是无用的之前,权重变化的阈值是多少?

4个回答

为了解决梯度消失的问题,您可以使用Xavier Initilization另外,tensorflow中Xavier Initialization的实现可以按照这个线程来完成。

您也可以尝试使用Batch Norm图层。它标准化前一层的输出,防止梯度太小 - 请参阅此处的详细说明

编辑:绝对先尝试 Xavier 初始化,正如其他回答者所说。

在其他情况下,您必须手动增加渐变...

梯度意味着损失函数的变化率。如果您的损失函数相对于某些权重没有太大变化,那么更改这些权重不会改变您的损失函数。

权重只是确定前一层的线性组合的类型。如果改变线性组合时损失没有改变,那么你需要放大增加或减少线性组合的效果。所以你想要的是,每当权重增加时,你希望线性组合增加更多,而每当权重减少时,你希望线性组合减少更多。

假设您将权重乘以常数k然后,如果您增加该权重,则线性组合将增加更多,如果您减少权重,则线性组合将减少更多。因此,将权重乘以常数k > 1一定会增加改变权重对线性组合的影响。

如果您将所有权重乘以常数k,那么这与将整个线性组合乘以k相同。所以你想在用你的激活函数压缩它之前将线性组合乘以k 。

您的新激活函数将是这样的:

激活 = ReLU( 线性组合 x k )

或者

  • 激活 = 0 x (线性组合 x k ),如果线性组合 <= 0

  • 激活 = 1 x (线性组合 x k ),如果线性组合 > 0

与常规 ReLU 相比,即:

  • 激活 = 0 x 线性组合,如果线性组合 <= 0

  • 激活 = 1 x 线性组合,如果线性组合 > 0

因此,您可以看到,无论是哪种情况,您都希望将 ReLU 激活乘以k具体来说,您希望将 ReLU 激活乘以k > 1

实际上,这会增加 ReLU 函数右侧的斜率。

激活函数

你用的是什么激活函数?

深度网络中梯度消失问题最常见的解决方案是使用不存在此问题的激活函数,即 ReLU 而不是 sigmoid 或 tanh 激活。