为什么tensorflow和keras SimpleRNN图层默认激活tanh

时间:2016-08-27 11:35:42

标签: tensorflow keras

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

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

2 个答案:

答案 0 :(得分:7)

RNN可能会受到爆炸梯度和消失梯度问题的影响。当要学习的序列很长时,这可能是一个非常微妙的平衡,非常容易地倾向于一个或另一个。这两个问题都是由取幂引起的 - 每一层都乘以权重矩阵和激活的导数,因此如果矩阵幅度或激活导数与1.0不同,则会出现爆炸或消失的趋势。

ReLU无助于爆炸梯度问题。事实上,它们可能比激活函数更糟糕,激活函数在权重较大时自然受限,如sigmoid或tanh。

ReLUs 帮助消除渐变问题。然而,LSTM和GRU单元的设计也旨在解决同样的问题(处理从许多时间步之外的潜在微弱信号中学习),并且非常有效地这样做。

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

答案 1 :(得分:2)

我可以看到两个原因:

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

  2. 如果我没记错,tanh对于经常性网络的效果优于relu,但我无法找到此内存的纸张/资源。

  3. 我们鼓励您尝试自己的特定数据集/问题,这两个激活函数中的哪一个效果最佳。