【问题标题】:Why do tensorflow and keras SimpleRNN layers have a default activation of tanh为什么tensorflow和keras SimpleRNN层默认激活tanh
【发布时间】:2016-08-27 11:35:41
【问题描述】:

我想在我正在构建的张量流模型中为我的简单 RNN 使用 relu 激活。它位于深度卷积网络之上。我正在尝试对一系列图像进行分类。我注意到,对于简单的 RNN,keras 和 tensorflow 源代码中的默认激活都是 tanh。是否有一个原因?使用relu有什么问题吗?似乎 relu 对消失的渐变有更好的帮助。

nn = tf.nn.rnn_cell.BasicRNNCell(1024, activation = tf.nn.relu)

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    RNN 可能会遇到梯度爆炸和梯度消失的问题。如果要学习的序列很长,那么这可能是一个非常微妙的平衡,很容易陷入其中一个或另一个。这两个问题都是由求幂引起的——每一层都乘以权重矩阵和激活导数,所以如果矩阵大小或激活导数不是 1.0,就会有爆炸或消失的趋势。

    ReLU 对爆炸梯度问题没有帮助。事实上,它们可能比激活函数更糟糕,因为激活函数在权重很大时自然会受到限制,例如 sigmoid 或 tanh。

    ReLUs do 有助于解决梯度消失问题。然而,LSTM 和 GRU 单元的设计也旨在解决相同的问题(处理从许多时间步之外的潜在弱信号中学习),并且非常有效。

    对于具有短时间序列的简单 RNN,使用 ReLU 激活应该没有问题。为了解决训练时梯度爆炸的可能性,您可以查看梯度裁剪(将允许范围之外的梯度视为该范围的最小值或最大值)。

    【讨论】:

      【解决方案2】:

      我可以看出两个原因:

      1. LSTM(底层 RNN 块)在文献中一直被定义为使用tanh 激活函数。这就是大多数用户对实施的期望。

      2. 如果我没记错的话,tanh 对于循环网络比 relu 效果更好,但我找不到该内存的论文/资源。

      我们鼓励您针对您的特定数据集/问题进行试验,这两种激活函数中的哪一种表现最好。

      【讨论】:

      • 我理解为什么它最适合 LSTM,但我使用的是 SimpleRNN,因为我的序列长度仅为 6。
      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 2017-08-10
      • 2014-08-08
      • 2020-06-19
      • 2021-05-20
      • 2016-06-18
      • 2019-04-25
      • 2019-09-21
      相关资源
      最近更新 更多