LSTM 自动编码器

2025年2月28日 | 阅读 12 分钟

LSTM 自编码器是一种自编码器(Autoencoder),它实现了编码器-解码器(Encoder-Decoder)LSTM 结构,专为处理序列数据而设计。模型训练完成后,其编码器部分可用于编码和/或压缩序列数据,这些数据可用于数据可视化,或作为监督学习模型的特征向量。

在本文中,我将解释什么是 LSTM 自编码器,以及如何将其用于您的项目,并提供一个使用 Keras 的 Python 示例。

什么是自编码器?

自编码器是一种神经网络,它被训练用来紧凑地表示其输入数据。

虽然自编码器采用监督学习的方法,但它被归类为一种无监督学习系统,有时也称为自监督学习。该模型的主要目标是找到输入数据的特征并再现它。

例如

X = model.predict(X)

自编码器的结构很简单,但通过设置一个狭窄的中间层(瓶颈层)有意地加以限制;这将迫使算法为数据开发一种紧凑的编码以进行重构。

基于此,研究人员提出了不同类型的自编码器,其用途各不相同。也许最知名的应用是在特征提取方面。训练完成后,可以移除重构部分,只保留编码器直到瓶颈部分。瓶颈层的输出是一个固定长度的向量,代表了压缩后的输入。

这个压缩向量随后可以用作大多数监督学习算法和数据可视化技术中的首选特征向量,或者作为大多数常见降维方法的输入。

序列数据的挑战

序列预测问题具有挑战性,在某种程度上是因为序列输入的长度可能是任意的。

这是一个问题,因为大多数学习算法,特别是人工神经网络,在处理大小相同的输入向量时效果最好。

第二个挑战是观测值的时间顺序,这在试图确定序列数据中的哪些特征可能有助于输入到监督学习算法中时,总是一个复杂因素。有时,这需要领域知识或信号处理专业知识,所有这些都可能超出了设计者的能力范围。

最后,大多数基于序列的预测建模任务还有一个额外的约束,即输出也必须是序列形式。这类问题被称为 seq2seq(序列到序列)预测问题。

编码器-解码器 LSTM 模型

循环神经网络,特别是 LSTM 网络,用于处理序列输入数据。

它们可以识别时间序列排序中的时间结构,并使用内部记忆来保存较长序列中的信息。

基本上,LSTM 网络可以开发为包含基于编码器的架构或编码器-解码器架构,从而能够处理可变长度的输入序列以及可变长度的输出序列。

这种架构在解决语音识别和文本翻译等序列预测问题中发挥了重要作用。

在这种设置中,编码器 LSTM 接收并处理输入序列的每一步。一旦处理完整个输入,编码器的隐藏状态就将变量捕获到一个固定大小的向量中。然后将此向量输入解码器,解码器将生成输出序列的每一步。

什么是 LSTM 自编码器?

LSTM 自编码器是自编码器的一种,适用于序列数据,并使用编码器-解码器 LSTM 创建。

对于给定的序列数据集,编码器-解码器 LSTM 旨在读取此序列并对其进行编码,然后再解码相同的序列。模型的性能取决于输出与输入到模型的数据序列的接近程度。

一旦模型达到期望的重构精度水平,剩下的就只有编码器了。然后,该编码器可用于将输入序列映射到由 V 表示的固定维度向量中。

这些压缩向量有多种用途,例如在其他监督学习(SL)模型(如经过监督训练的神经网络)中使用。

LSTM 自编码器的早期应用

LSTM 自编码器的早期应用之一已成功用于图像处理。

一项早期使用 LSTM 自编码器的工作是 Nitish Srivastava 在 2015 年发表的另一篇论文,题为《使用 LSTM 进行视频表示的无监督学习》。该论文将编码器-解码器 LSTM 模型推广到视频数据。

LSTM 自编码器被应用于重构和预测视频帧序列,将这些问题表述为无监督学习。模型的输入是向量序列(图像块/特征);编码器 LSTM 读取序列,解码器 LSTM 输出目标序列。

关于他们的方法还有一个特别之处,即模型以相反的顺序重构目标序列。这一架构决策旨在使优化更容易,并允许模型利用短期依赖关系来更快地学习。

作者还探讨了两种训练解码器的方法:一种版本中,采样取决于解码器产生的最终输出;另一种版本中则没有这样的条件限制。

他们还测试了一个更深层次的自编码器模型,其中编码器和解码器组合成一个单一的编码器,除了序列中的下一帧,他们还训练第一个解码器从序列中生成重构的帧。这被称为所谓的复合模型。

换句话说,这些模型基于不同的范式进行评估;它被编码器用于初始化一个分类器。令人惊讶的是,作者并没有将编码器的输出应用于分类,而是用编码器的权重预加载了一个独立的 LSTM 分类器,这使得实现稍微复杂一些。

在他们的实验中,他们发现不依赖解码器条件的复合模型是最佳模型。

此后,LSTM 自编码器已应用于文本、音频数据和序列分析。

如何使用 Keras 创建 LSTM 自编码器?

在 Keras 中构建 LSTM 自编码器的最简单方法是设计一个编码器-解码器 LSTM 模型,并训练它重现输入序列。

为了帮助更清楚地说明这一点,让我们来看一个例子。

重构长短期记忆自编码器

最简单的 LSTM 自编码器会记住输入序列,并将其反馈到输出层。

为了演示,我们将使用一个包含一个样本、九个时间步和一个特征的数据集。

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

我们首先将序列分解为必要的格式,形状为 [样本数, 时间步数, 特征数]。

如何在 Keras 中实现 LSTM 自编码器

在 Keras 中构建 LSTM 自编码器时,我们将采用编码器-解码器 LSTM 架构,该架构旨在重构输入时间序列。完整的代码实现如下。

示例:重构 LSTM 自编码器

对于这部分,我们使用一个包含九个时间帧和一个特征的序列。

代码

输出

 
[0.10398503 0.20047213 0.29905337 0.3989646  0.4994707  0.60005534
 0.70039135 0.80031013 0.8997728 ]   

然而,尽管可能存在非常小的四舍五入误差,输出序列与作为输入的序列非常相似。在此实现中,我们已经能够在 Keras 中拉取和评估基础 LSTM 自编码器的训练。

说明

下面的代码示例展示了如何使用 Keras 中的 LSTM 自编码器进行序列重构。到目前为止一切顺利;输入序列只是一个简单的数值数组 [0.1, 0.2, ..., 0.9]。它需要通过转换为 [样本数, 时间步数, 特征数] 格式(LSTM 可以处理的格式)来进行扩展。

自编码器架构

自编码器分为两个部分

→ 编码器

→ 解码器

在这里,输入序列通过一个包含 100 个单元的 LSTM 层进行压缩(编码器部分),并使用 RepeatVector 来确保固定长度的内部表示在所有时间步中传递。另一方面,为了获得活动序列,在解码器中使用了另一个 LSTM 层,其中 return_sequences=True,所以这次它会给我们大约十个时间步作为输入,然后我们再次重构序列。序列中单个步骤的预测由 TimeDistributed(Dense(1)) 层完成。

模型使用 Adam 优化器和均方误差(MSE)损失作为监督误差进行编译。这里的情况涉及将模型训练总共 300 个周期,然后使用训练好的模型来预测(即重构)输入序列。最后,使用 plot_model 绘制架构图。

要点

输入序列被重塑为 [样本数, 时间步数, 特征数] 的维度,符合预期。

该模型有两个 LSTM 层,并使用一个 RepeatVector 层来确保输出形状正确。

最后,模型能够生成预期的输出,即一个由人工序列组成的序列,该序列与给定的初始序列非常相似。

预测 LSTM 自编码器

因此,在这个版本的 LSTM 自编码器中,我们对其进行更改,使其输出序列中的下一个内容,而不是提供的内容。在我们的例子中,模型将按如下方式预测序列:

[0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

这意味着输入序列将有九个时间步,而输出序列将有八个时间步。

示例:下一步预测

代码

输出

 
[0.1657285  0.28903174 0.40304852 0.5096578  0.6104322  0.70671254
 0.7997272  0.8904342 ]   

因此,尽管可能存在小的四舍五入误差,但该模型在预测序列中的后续步骤方面表现出色。

说明

在这种情况下,编写了一个 Keras 中的预测 LSTM 自编码器。代码接收九个时间步并预测序列中的下一步。必要的步骤包括重塑输入序列,删除第一个时间步,并准备相应的输出序列。LSTM 自编码器是一个由两个 LSTM 层混合而成的模型,并添加了一个 RepeatVector 来管理时间序列的可变性。此外,在用均方误差(MSE)损失函数定义模型后,模型经过训练以预测每个给定输入的未来时间,由于轻微的误差,它会产生带有错误舍入数字的稳定、正确的预测。

关键点

输入: 包含九个时间步的序列。

输出: 包含八个时间步的序列,试图猜测时间步中的下一个序列标记。

模型相应地转换输入和输出序列。

复合 LSTM 自编码器

代码

输出

 
[array([[[0.10736275],
[0.20335874],
[0.30020815],
[0.3983948 ],
[0.4985725 ],
[0.5998295 ],
[0.700336 ,
[0.8001949 ],
[0.89984304]]], dtype=float32),
 
array([[[0.16298929],
[0.28785267],
[0.4030449 ],
[0.5104638 ],
[0.61162543],
[0.70776784],
[0.79992455],
[0.8889787 ]]], dtype=float32)]   

我们可以设计一个复合 LSTM 自编码器,其中我们有一个编码器和两个用于重构和预测的独立解码器。

使用 Keras 的函数式 API,可以创建这种多输出模型。

代码解释

使用 Keras 的复合 LSTM 自编码器 Decoder1 和 decoder2 是两个解码器,并且只有一个共同的编码器。第一个解码器用于重构输入序列的开头并预测接下来的内容;第二个解码器用于预测后续输出。输入序列被重塑为预期的形状,并移动一个时间步作为输出(其中 t+1 等于下一个时间步)。

在编码器中,使用了一个带有 ReLU 激活函数的 100 个单元的 LSTM 层。两个解码器都有一个 RepeatVector 层来重复编码后的输出,然后是另一个 LSTM 层来处理序列。每个解码器都以一个目标映射结束。对每个最后一层的预测都是 TimeDistributed 的,这意味着它首先独立地应用于每个时间步。

模型使用 Adam 优化器和 MSE 损失进行编译,在这种情况下,在输入和输出序列上进行 300 个周期的训练。一旦瓶颈层在输入数据上训练完成,我们就可以用它来进行预测,即重构输入并创建未来的样本。

第一个数组重构原始序列,而第二个数组预测序列中的下一个内容。

独立的 LSTM 编码器

一旦自编码器被训练好,无论它将用于重构、预测还是任何其他任务,解码器都可以被移除,只留下编码器作为一个完全独立的模型。这个独立且自由的编码器可以将输入序列转换为固定长度的编码向量。

这个命令行的目标是创建一个新模型,该模型具有与第一个模型完全相同的输入,但直接从编码器的最后一层(即 RepeatVector 层之前)输出。

代码

输出

 
(1, 100)
[[0.04481171 0.07703428 0.10880483 0.         0.         0.10668793
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.         0.08313284
  0.         0.         0.         0.         0.04048467 0.11415987
  0.         0.         0.03888144 0.00014874 0.         0.1273036
  0.03946561 0.         0.         0.01511323 0.         0.
  0.         0.         0.10414305 0.0502435  0.07228468 0.12038494
  0.00630742 0.0533107  0.         0.         0.         0.
  0.         0.         0.0867817  0.         0.         0.
  0.         0.         0.         0.01180864 0.02193986 0.10299674
  0.         0.08759579 0.         0.         0.         0.08523217
  0.         0.         0.         0.         0.         0.
  0.         0.07963004 0.         0.         0.         0.
  0.         0.         0.         0.03482794 0.         0.11900833
  0.         0.06373172 0.08516104 0.         0.         0.
  0.         0.         0.09511168 0.         0.         0.06361476
  0.06178539 0.         0.         0.        ]]   

说明

此示例说明了如何从自编码器模型构建独立的 LSTM 编码器。最初,输入序列被重塑以符合模型的预期格式。编码器由两个 LSTM 层组成,其中第一个编码序列,而第二个通过 RepeatVector 再次对其进行编码。

一旦自编码器训练完成,解码器就被移除,只使用编码器部分作为一个独立的模型。它将接收序列并输出一个 100 维的向量。这个代表输入序列编码输出的文档可以作为一种压缩形式使用,它只提取了最重要的部分。

结论

自编码器 LSTM 是一种为时间序列数据开发的神经网络,通常采用编码器-解码器结构,包含长短期记忆(LSTM)层。编码器首先将输入序列转换为固定大小的向量,然后解码器试图使这个向量与输入序列匹配。该模型专门为预测序列和错误查找任务而设计。学习后,编码器可用于获取特征向量以进行进一步训练,直到系统可以轻松处理某些特征以减少变量数量。文本、音乐和图像数据处理是该层最常见的应用,Keras 是首选平台。