Tensorflow 中的长短期记忆 (LSTM) RNN

17 Mar 2025 | 5 分钟阅读

长短期记忆 (LSTM) 是一种在深度学习领域中使用的循环神经网络 (RNN) 架构。它由 Sepp HochreiterJurgen schmidhuber 于 1997 年提出。与标准的前馈神经网络不同,LSTM 具有反馈连接。它不仅可以处理单个数据点(例如图像),还可以处理整个数据序列(例如语音或视频)。

例如,LSTM 适用于诸如未分段的、连笔手写识别语音识别等任务。

一个通用的 LSTM 单元由一个单元、一个输入门、一个输出门和一个遗忘门组成。单元在任意时间间隔内记住值,三个门控制信息流入和流出单元。LSTM 非常适合对未知持续时间的给定时间序列进行分类、处理和预测。

长短期记忆 (LSTM) 网络是循环神经网络的修改版本,这使得更容易记住内存中的过去数据。
Long short-term memory RNN in Tensorflow

1. 输入门 - 它发现应该使用输入中的哪个值来修改内存。 Sigmoid 函数决定允许通过的值,为 0 或 1。并且 tanh 函数对通过的值进行加权,决定它们的重要性级别,范围从 -11

Long short-term memory RNN in Tensorflow

2. 遗忘门 - 它发现要从块中丢弃的细节。 一个 sigmoid 函数决定它。 它查看前一个状态 (ht-1) 和内容输入 (Xt),并为单元状态 Ct-1 中的每个数字输出一个介于 0(省略)和 1(保留)之间的数字。

Long short-term memory RNN in Tensorflow

3. 输出门 - 使用块的输入和内存来决定输出。Sigmoid 函数决定允许通过的值,为 0 或 1。并且 tanh 函数决定允许通过的值,为 0,1。tanh 函数对通过的值进行加权,决定它们的重要性级别,范围从 -1 到 1,并乘以 sigmoid 的输出。

Long short-term memory RNN in Tensorflow
Long short-term memory RNN in Tensorflow

它表示一个完整的 RNN 单元,该单元获取序列 xi 的当前输入,并输出当前隐藏状态 hi,将其传递给下一个 RNN 单元以用于我们的输入序列。LSTM 单元内部比传统的 RNN 单元复杂得多,而传统的 RNN 单元只有一个作用于当前状态(ht-1)和输入(xt)的“内部层”。

Long short-term memory RNN in Tensorflow

在上图中,我们看到了一个“展开”的 LSTM 网络,它带有一个嵌入层,一个后续的 LSTM 层和一个 sigmoid 激活函数。我们认识到我们的输入,在这种情况下,电影评论中的单词,是按顺序输入的。

这些单词被输入到一个嵌入查找中。在大多数情况下,当处理文本数据语料库时,词汇量的大小异常大。

这是向量空间中单词的多维、分布式表示。这些嵌入可以使用其他深度学习技术(如 word2vec)来学习,我们可以以端到端的方式训练模型,以在教学时确定嵌入。

然后将这些嵌入输入到我们的 LSTM 层中,其中输出被馈送到 sigmoid 输出层和序列中下一个单词的 LSTM 单元

LSTM 层

我们将建立一个函数来构建 LSTM 层,以动态处理层数和大小。 该服务将获取一个 LSTM 大小列表,该列表可以根据列表的长度指示 LSTM 层的数量(例如,我们的示例将使用一个长度为 2 的列表,其中包含大小 128 和 64,指示一个两层 LSTM 网络,其中第一层大小为 128,第二层具有隐藏层大小 64)。

然后,将 Dropout 封装的 LSTM 列表传递给 TensorFlow MultiRNN 单元以将各层堆叠在一起。

损失函数、优化器和准确度

最后,我们创建函数来定义我们的模型损失函数、优化器和我们的准确度。即使损失和准确度仅基于结果计算,在 TensorFlow 中,一切都是计算图的一部分。

构建图和训练

首先,我们调用我们定义的每个函数来构建网络,并调用一个 TensorFlow 会话来使用小批量在预定义的 epoch 数上训练模型。在每个 epoch 结束时,我们将打印损失、训练准确度和验证准确度,以在训练模型时监视结果。

接下来,我们定义我们的模型超参数,我们将构建一个两层 LSTM 网络,其隐藏层大小分别为 12864

当模型完成训练时,我们使用 TensorFlow 保存器保存模型参数以供以后使用。

Epoch: 1/50 Batch: 303/303 Train Loss: 0.247 Train Accuracy: 0.562 Val Accuracy: 0.578
Epoch: 2/50 Batch: 303/303 Train Loss: 0.245 Train Accuracy: 0.583 Val Accuracy: 0.596
Epoch: 3/50 Batch: 303/303 Train Loss: 0.247 Train Accuracy: 0.597 Val Accuracy: 0.617
Epoch: 4/50 Batch: 303/303 Train Loss: 0.240 Train Accuracy: 0.610 Val Accuracy: 0.627
Epoch: 5/50 Batch: 303/303 Train Loss: 0.238 Train Accuracy: 0.620 Val Accuracy: 0.632
Epoch: 6/50 Batch: 303/303 Train Loss: 0.234 Train Accuracy: 0.632 Val Accuracy: 0.642
Epoch: 7/50 Batch: 303/303 Train Loss: 0.230 Train Accuracy: 0.636 Val Accuracy: 0.648
Epoch: 8/50 Batch: 303/303 Train Loss: 0.227 Train Accuracy: 0.641 Val Accuracy: 0.653
Epoch: 9/50 Batch: 303/303 Train Loss: 0.223 Train Accuracy: 0.646 Val Accuracy: 0.656
Epoch: 10/50 Batch: 303/303 Train Loss: 0.221 Train Accuracy: 0.652 Val Accuracy: 0.659

测试

最后,我们在测试集上检查我们的模型结果,以确保它们与我们在训练期间观察到的结果一致。

测试准确率为 72%。这与我们的验证准确度相符,表明我们捕获了数据在数据分割中的适当分布。

INFO:tensorflow:Restoring parameters from checkpoints/sentiment.ckpt
Test Accuracy: 0.717

下一个主题RNN 的训练