Python 中用于序列分类的双向 LSTM

2025年6月8日 | 阅读 8 分钟

双向长短期记忆(BiLSTM)网络建立在传统的 LSTM 架构之上,通过向前和向后两个方向处理输入序列。虽然标准的 LSTM 只关注之前的上下文,但 BiLSTM 利用了过去和未来的信息,这对于具有挑战性的基于上下文的任务非常有用。在本文中,我们将探讨 BiLSTM 的工作原理,并利用 TensorFlow 构建一个用于情感分析的模型。

理解双向 LSTM (BiLSTM)

双向 LSTM (BiLSTM) 是标准 LSTM 的一个增强版本,它包含两个独立的 LSTM 层

正向 LSTM:数据按给定顺序处理,从头到尾。

反向 LSTM:数据按相反顺序处理,从尾到头。

然后将两个方向在每个时间步的输出组合起来,形成最终的输出。该模型能够表示来自之前和之后的信息,这使其在处理有序任务时非常有用。

可以使用以下方程找到时间步 t 的值

Bidirectional LSTM for Sequence Classification in Python

其中

  • pₜ: 时间 t 的最终输出向量。
  • pₜᶠ: 来自正向 LSTM 的输出。
  • pₜᵇ: 来自反向 LSTM 的输出。

BiLSTM 的特点和机制

双向长短期记忆 (BiLSTM) 网络通过向前和向后两个方向处理序列数据来增强传统的 LSTM。在这里,我将描述主要组成部分并展示它们是如何协同工作的。

1. LSTM (长短期记忆)

LSTM 是一种特殊的循环神经网络 (RNN),旨在解决标准 RNN 在捕获长期依赖性方面的局限性。它还包含记忆单元以及称为输入门、遗忘门和输出门的门,这些门控制着数据如何通过。由于这种架构,LSTM 能够记住一段时间内需要的信息并去除不必要的信息。

2. 双向处理

与常规 RNN 不同,BiLSTM 对穿过它们的序列进行处理,既向前也向后。它们包含两个 LSTM 层:一个从头到尾处理输入(正向),另一个从尾到头处理输入(反向)。所有层都存储它们的隐藏状态和记忆单元,让网络可以使用任何时刻的输入。

3. 正向传播

在正向 LSTM 中,序列从其开头读到结尾。在每个时间步,LSTM 通过处理新输入和记住其先前状态来更新其隐藏状态和记忆单元。

4. 反向传播

反向 LSTM 从最后一个时间步开始处理,并逐一向回移到第一个时间步。它与正向 LSTM 类似,都会逐步更新其隐藏状态和记忆状态。

5. 连接正向和反向状态

在两个方向的传播之后,正向 LSTM 和反向 LSTM 的隐藏层的信息在每个时间步被组合起来。为了实现这一点,可以连接状态或以其他方式进行转换,以便模型在预测过程中能够利用当前时间步之前和之后的信息。

BiLSTM 的架构

让我们分解一下双向 LSTM (BiLSTM) 架构的关键组成部分

1. 输入序列

它将数据元素序列作为输入,例如句子或字符。通过应用词嵌入,序列中的元素通常表示为向量。

2. 嵌入层

在 BiLSTM 接收数据之前,数据项被转换为嵌入向量。这样,网络可以获得对训练数据中信息的更清晰、更好的总结。

3. Bi-LSTM 层

BiLSTM 是网络设计中的主要关键组成部分。它包含两个独立的 LSTM 层:一个从头到尾(正向)处理输入序列,另一个从尾到头(反向)处理输入序列。所有层都处理独立的工作并使用其参数。

4. 输出组合

在每个时间步,正向 LSTM 和反向 LSTM 的输出(隐藏状态)被组合起来。一种方法是通过连接、求和或使用其他转换来实现。因此,您将获得一个包含两个方向上下文的答案。

在 BiLSTM 层中,输入序列通过同时向前和向后顺序处理。在正向传播中,它使用之前步骤中学到的信息,而在反向传播中,它使用接下来将发生的信息。使用这种方法允许模型记住整个序列的信息并在学习时使用它。

根据不同的问题,BiLSTM 层的输出可以以多种方式使用。如果我们使用文本分类,首先,我们将输出发送到一个全连接层,然后将其通过 softmax 层得到类别概率。在命名实体识别任务的每个阶段,标记的输出可以立即标记每个 token。

可以根据各种需求调整 BiLSTM 架构。可以在 BiLSTM 之上堆叠额外的组件,例如密集层、注意力机制,甚至条件随机场 (CRF),以增强其表示能力和整体性能。

使用 BiLSTM 进行情感分析(TensorFlow)

在本教程中,我们将使用 TensorFlow 中的双向 LSTM 作为我们的层来创建一个情感分析模型。我们的目标是使用 IMDB 电影评论数据集来教会模型如何将评论分类为正面或负面。

步骤 1:导入库

我们首先添加分析所需的库

步骤 2:下载并组织 IMDB 数据

我们从 TensorFlow Datasets (TFDS) 加载 IMDB 数据集,该数据集包含 25,000 条已标记的电影评论。数据集被划分为训练集和测试集。我们组织数据以便在训练期间进行处理。

示例评论和标签

输出

 
Text:
 b"Having seen Men Behind the Sun ... 1 as a treatment of the subject)."
Label: 0

步骤 3:将文本转换为向量

我们使用 TextVectorization 来分割和准备文本数据以进行分析。它使用一个特定的函数将评论转换为一致的数据序列。

步骤 4:定义模型(BiLSTM 架构)

我们设置一个由以下层组成的顺序模型

  • 文本向量化:对您输入的文本进行分词。
  • 嵌入层:然后将数据通过一个将 token 转换为向量的层。
  • 双向 LSTM (64 个单元):捕获两个方向上的序列模式。
  • 双向 LSTM (32 个单元):进一步优化模式学习。
  • 密集层:全连接层,此处使用ReLU
  • 输出层:在网络的末尾,有一个用于输出的神经元的单层。

输出

 
Model: "sequential"
_______________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 text_vectorization (TextVec (None, 100)               0
 torization)
 embedding (Embedding)       (None, 100, 64)           640000
 bidirectional (Bidirectiona (None, 100, 128)          66048
 l)
 bidirectional_1 (Bidirectio (None, 64)                41216
 nal)
 dense (Dense)               (None, 64)                4160
 dense_1 (Dense)             (None, 1)                 65
=================================================================
Total params: 751,489
Trainable params: 751,489
Non-trainable params: 0

步骤 5:训练模型

现在使用我们的训练数据对模型进行五个 epoch 的训练,并在测试数据上对其进行评估。

输出

 
Epoch 1/5
782/782 [==============================] - 120s 140ms/stop - loss: 0.4861 - Accuracy: 0.7445 - val_loss: 0.3884 - val_accuracy: 0.8293

Epoch 2/5
782/782 [==============================] - 110s 130ms/stop - loss: 0.3096 - Accuracy: 0.8717 - val_loss: 0.3902 - val_accuracy: 0.8312

Epoch 3/5
782/782 [==============================] - 109s 129ms/stop - loss: 0.2356 - Accuracy: 0.9081 - val_loss: 0.4263 - val_accuracy: 0.8294

Epoch 4/5
782/782 [==============================] - 108s 128ms/stop - loss: 0.1863 - Accuracy: 0.9305 - val_loss: 0.4721 - val_accuracy: 0.8275

Epoch 5/5
782/782 [==============================] - 110s 131ms/stop - loss: 0.1467 - Accuracy: 0.9473 - val_loss: 0.5348 - val_accuracy: 0.8246

使用双向 LSTM (BiLSTM) 的优缺点

双向 LSTM 通过从开始到结束和从结束到开始两个方向处理输入信息来增强基本 LSTM 网络的功能。即使深度学习方法非常适合序列建模,它们也有一些缺点。

优点

处理时间依赖性

因此,BiLSTM 非常适合自然语言处理,因为单词通常需要参考它们之前和之后的单词才能被理解。

性能提升

由于其良好的上下文处理能力,BiLSTM 在情感分析、机器翻译和语音识别等任务中通常比单向 LSTM 取得更好的结果。

灵活的架构

我们可以通过在其架构中添加卷积层、注意力机制或全连接层来提高模型的性能。

缺点

计算机系统占用更多资源

由于 BiLSTM 对序列进行两次处理(正向和反向),因此它们需要更多的计算和内存,这可能对实时或资源受限的应用造成限制。

需要大量数据

通常,BiLSTM 需要大量标记数据才能准确。如果模型建立在数据不足的基础上,则性能可能会不佳或出现过拟合。

可解释性有限

大多数深度学习研究人员认为 BiLSTM 与其他模型一样是黑箱。由于模型不易理解,因此在健康或金融等需要透明度的领域无法使用这种不透明性。

示例:用于序列分类的双向 LSTM

输出

 
Epoch 1/1 - loss: 0.0967 - Accuracy: 0.9000
Epoch 1/1 - loss: 0.0865 - Accuracy: 1.0000
Epoch 1/1 - loss: 0.0905 - Accuracy: 0.9000

Expected: 0  Predicted: 0  
Expected: 0  Predicted: 0  
Expected: 0  Predicted: 0  
Expected: 0  Predicted: 0  
Expected: 0  Predicted: 0  
Expected: 1  Predicted: 1  
Expected: 1  Predicted: 1  
Expected: 1  Predicted: 1  
Expected: 1  Predicted: 1  
Expected: 1  Predicted: 1

结论

双向 LSTM (BiLSTM) 通过向前和向后两个方向处理输入序列来增强传统的 LSTM,从而能够捕获过去和未来的上下文。因此,它们在进行情感分析、对序列数据进行分类和识别命名实体方面非常有用。由于其架构,复杂的基于序列的应用最能从 RNN 中受益,并且这些 RNN 可以与注意力或密集网络等层一起使用以提高性能。

另一方面,它们会导致性能下降,并使模型更难理解。尽管存在这些缺点,BiLSTM 在深度学习中仍然是有效的工具,主要是因为它们对于处理自然语言处理中的完整序列至关重要。


下一主题编码技术类型