为什么 LSTM 自动编码器使用"relu"作为其激活功能?



我在看博客,作者用"relu"而不是"tanh",为什么? https://towardsdatascience.com/step-by-step-understanding-lstm-autoencoder-layers-ffab055b6352

lstm_autoencoder = Sequential()
# Encoder
lstm_autoencoder.add(LSTM(timesteps, activation='relu', input_shape=(timesteps, n_features), 
return_sequences=True))
lstm_autoencoder.add(LSTM(16, activation='relu', return_sequences=True))
lstm_autoencoder.add(LSTM(1, activation='relu'))
lstm_autoencoder.add(RepeatVector(timesteps))
# Decoder
lstm_autoencoder.add(LSTM(timesteps, activation='relu', return_sequences=True))
lstm_autoencoder.add(LSTM(16, activation='relu', return_sequences=True))
lstm_autoencoder.add(TimeDistributed(Dense(n_features)))

首先,ReLU 函数不是万能的激活函数。具体来说,它仍然受到梯度爆炸问题的困扰,因为它在正域中是无界的。这意味着,这个问题仍然存在于更深层次的LSTM网络中。大多数LSTM网络变得非常深,因此它们很有可能遇到爆炸梯度问题。当在每个时间步使用相同的权重矩阵时,RNN 也具有爆炸梯度。有一些方法,如梯度裁剪,可以帮助减少RNN中的这个问题。但是,ReLU函数本身并不能解决梯度爆炸问题。

ReLU函数确实有助于减少梯度消失问题,但不能完全解决梯度消失问题。批量归一化等方法可以帮助进一步减少梯度消失问题。

现在,回答您关于使用 ReLU 函数代替 tanh 函数的问题。据我所知,对于这个特定的门,ReLU和tanh激活函数本身应该没有太大区别。它们都没有完全解决LSTM网络中梯度消失/爆炸的问题。有关 LSTM 如何减少梯度消失和爆炸问题的更多信息,请参阅这篇文章。

相关内容

  • 没有找到相关文章

最新更新