当我尝试使用SimpleRNN与LSTM时,我发现SimpleRNN训练的ETA为30分钟,而LSTM的ETA为20秒。但是SimpleRNN的运算应该比LSTM少。是什么导致了如此巨大的差异?我使用SimpleRNN是错误的吗?
import tensorflow as tf
SEQUENCE_LENGTH = 80
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(num_words = 2000)
x_train = tf.keras.preprocessing.sequence.pad_sequences(x_train, maxlen=SEQUENCE_LENGTH)
x_test = tf.keras.preprocessing.sequence.pad_sequences(x_test, maxlen=SEQUENCE_LENGTH)
model = tf.keras.models.Sequential([
tf.keras.layers.Embedding(2000, 128),
tf.keras.layers.SimpleRNN(8),
# tf.keras.layers.LSTM(8),
tf.keras.layers.Dense(1, activation="sigmoid"),
])
model.compile(
loss="binary_crossentropy",
optimizer="adam",
metrics=["accuracy"],
)
model.fit(x_train, y_train, batch_size=32, epochs=1)
1条答案
按热度按时间ppcbkaq51#
简单RNN:-输入(xt)和前一个输出(ht-1)的简单乘法,通过
Tanh
激活函数传递。不存在门。递归神经网络(RNN)具有递归连接,其中输出被传输回RNN神经元,而不是仅将其传递到下一个节点。RNN模型中的每个节点都充当一个记忆单元,持续进行计算和操作。RNN会记住整个时间段内的每一条信息。RNN在循环层中有反馈回路。这使它们能够在“记忆”中保持信息。但是,可能难以训练标准RNN来解决需要学习长期时间依赖性的问题。这是因为损失函数的梯度随时间呈指数衰减(称为消失梯度问题)。
**LSTM:-**LSTM通过引入新的门(例如输入(i)和遗忘(f)门)来处理消失和爆炸梯度问题,这些门允许对更新和调节LSTM网络中的单元状态的梯度流进行更好的控制,并且使得能够更好地保持“长范围依赖性”。
LSTM通过忽略网络中无用的数据/信息来处理梯度消失。如果其他输入(句子前面的单词)没有有价值的数据,LSTM将忘记该数据,并产生结果“削减预算。
它包含4个由sigmoid函数(σ)或tanh函数激活的网络,每个网络都有自己不同的参数集。
请检查此link以更好地理解此内容。