为什么 LSTM 自编码器使用 'relu' 作为激活函数?

Why the LSTM Autoencoder use 'relu' as its activication function?

我在看博客,作者用了'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函数确实有助于减少梯度消失问题,但并不能彻底解决梯度消失问题。 batch normalization 等方法可以帮助进一步减少梯度消失问题。

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