RNN 中的 LSTM 单元简介

发布日期:2026-07-05 03:59:04   来源 : 杭州电子商务研究院    浏览量 :18
杭州电子商务研究院 发布日期:2026-07-05 03:59:04  
18

介绍

上一指南介绍了如何使用 Keras API 执行 MLP 和简单的 RNN(循环神经网络)模型。在本指南中,您将在此基础上学习在比特币历史数据集上实现 RNN 模型的变体 LSTM ,追踪 60 天的趋势以预测第 61 天的价格。

为了更准确地预测趋势,该模型依赖于更长的时间步长。当使用反向传播算法训练模型时,会出现梯度消失(信息衰减)的问题,并且模型很难在其内存中存储长的时间步长。在本指南中,您将了解 RNN 中的 LSTM 单元以及它们如何解决此问题。

在实现代码之前,让我们先熟悉一下 LSTM 术语。

长短期记忆

LSTM(长短期记忆的缩写)主要解决反向传播中的梯度消失问题。LSTM 使用门控机制来控制记忆过程。LSTM 中的信息可以通过打开和关闭的门来存储、写入或读取。这些门以模拟格式存储记忆,通过 0-1 之间的 S 形函数实现元素级乘法。模拟本质上是可微分的,适用于反向传播。

让我们看一下 LSTM 的架构。

双曲函数

图片来源:Irfan Danish

Tanh 是一种非线性激活函数。它调节流经网络的值,将值保持在 -1 和 1 之间。为了避免信息衰减,需要一个二阶导数可以存活更长时间的函数。可能存在某些值变得非常大的情况,从而进一步导致值变得微不足道。您可以看到值 5 是如何由于该函数而保持在边界之间的。

乙状结肠

Sigmoid 属于非线性激活函数家族。它包含在门中。与 tanh 不同,sigmoid 将值保持在 0 到 1 之间。它帮助网络更新忘记数据。如果乘法结果为 0,则认为信息被遗忘。同样,如果值为 1,则信息保留。

这将帮助网络了解哪些数据可以被遗忘以及哪些数据值得保留。

图片来源:Irfan Danish

让我们进一步了解这些门。LSTM 单元中有三个不同的门:遗忘门、输入门和输出门。

注意:所有 LSTM 单元的图像均从来源修改而来

忘记门

遗忘门决定哪些信息需要注意,哪些可以忽略。当前输入 X(t) 和隐藏状态 h(t-1) 的信息通过 S 型函数传递。S 型函数生成 0 到 1 之间的值。它判断旧输出的部分是否必要(通过使输出更接近 1)。f(t) 的这个值稍后将被单元用于逐点乘法。

输入门

输入门执行以下操作来更新细胞状态。

首先,将当前状态 X(t) 和先前的隐藏状态 h(t-1) 传入第二个 sigmoid 函数。值在 0(重要)和 1(不重要)之间变换。

接下来,隐藏状态和当前状态的相同信息将通过 tanh 函数。为了调节网络,tanh 运算符将创建一个向量 (C~(t) ),其中包含 -1 和 1 之间的所有可能值。激活函数生成的输出值已准备好进行逐点乘法。

细胞状态

网络拥有来自遗忘门和输入门的足够信息。下一步是决定并将新状态的信息存储在单元状态中。前一个单元状态 C(t-1) 与遗忘向量 f(t) 相乘。如果结果为 0,则单元状态中的值将被删除。接下来,网络获取输入向量 i(t) 的输出值并执行逐点加法,从而更新单元状态,为网络提供新的单元状态 C(t)。

输出门

输出门决定下一个隐藏状态的值。此状态包含有关先前输入的信息。

首先,将当前状态和先前隐藏状态的值传入第三个 S 型函数。然后,将从单元状态生成的新单元状态传入 tanh 函数。这两个输出逐点相乘。根据最终值,网络决定隐藏状态应携带哪些信息。此隐藏状态用于预测。

最后,新的细胞状态和新的隐藏状态被延续到下一个时间步骤。

总而言之,遗忘门决定需要先前步骤中的哪些相关信息。输入门决定可以从当前步骤添加哪些相关信息,输出门确定下一个隐藏状态。

让我们实现代码。

代码实现

注意: *在构建 LSTM 模型之前,请参考上一个教程中导入重要库和数据预处理的代码。*

从 Keras Layers API 中导入了诸如LSTM层、正则化层dropout和核心层density等重要类。

在第一层中,输入为 50 个单位,return_sequence保持为true,因为它将返回维度为 50 的向量序列。由于下一层的 return_sequence 为False,因此它将返回维度为 100 的单个向量。

      from sklearn.metrics import mean_absolute_error
from keras.models import Sequential
from keras.layers import Dense, LSTM, Dropout

modell = Sequential()
modell.add(LSTM(50, return_sequences=True, input_shape=(x_train.shape[1],1)))
modell.add(Dropout(0.2))
modell.add(LSTM(100, return_sequences=False))
modell.add(Dropout(0.2))
modell.add(Dense(1))

modell.compile(loss="mean_squared_error",optimizer="rmsprop")

modell.fit(x_train,y_train,epochs= 50,batch_size=64)
    

现在已经准备好测试数据以供预测。

      inputs=data[len(data)-len(close_test)-timestep:]
inputs=inputs.values.reshape(-1,1)
inputs=scaler.transform(inputs)
    
      x_test=[]
for i in range(timestep,inputs.shape[0]):
    x_test.append(inputs[i-timestep:i,0])
x_test=np.array(x_test)
x_test=x_test.reshape(x_test.shape[0],x_test.shape[1],1)
    

让我们将该模型应用于测试数据。

      predicted_data=modell.predict(x_test)
predicted_data=scaler.inverse_transform(predicted_data)
    
      data_test=np.array(close_test)
data_test=data_test.reshape(len(data_test),1)
    

預測時間。

      plt.figure(figsize=(8,4), dpi=80, facecolor='w', edgecolor='k')
plt.plot(data_test,color="r",label="true-result")
plt.plot(predicted_data,color="g",label="predicted-result")
plt.legend()
plt.title("LSTM")
plt.xlabel("Time(60 days)")
plt.ylabel("Close Values")
plt.grid(True)
plt.show()
    

结论

LSTM 优于 SimpleRNN 和 MLP!

结果是可以接受的,因为真实结果和预测结果几乎一致。在处理顺序数据时,RNN 是一个不错的选择,但它们存在短期记忆问题。引入门控机制可以调节 RNN 中的信息流并缓解该问题。

我建议更改超参数的值或使用不同的优化器集(例如 Adam、SDG 等)编译模型,以查看图中的变化。您还可以增加 LSTM 网络中的层数并检查结果。您可以随意将此模型与任何其他数据集一起使用。

本指南简要介绍了 LSTM 中涉及的门控技术,并使用 Keras API 实现了该模型。现在您已经了解了 LSTM 的工作原理,下一篇指南将介绍门控循环单元 (GRU),这是 LSTM 的修改版本,使用更少的参数和输出状态。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据