【问题标题】:LSTM/GRU autoencoder convergencyLSTM/GRU 自动编码器收敛
【发布时间】:2023-08-27 09:31:02
【问题描述】:

目标

尝试在多变量时间序列的数据集上运行 LSTM 自动编码器:
X_train (200, 23, 178) - X_val (100, 23, 178) - X_test (100, 23, 178)

现状

普通的自动编码器比 LSTM AE 的简单架构可以获得更好的结果。

我对如何使用 Repeat Vector 包装层有一些疑问,据我了解,该包装层应该简单地重复次数等于序列长度的最后一个状态LSTM/GRU 单元,用于馈送解码器层的输入形状。

模型架构不会出现任何错误,但结果仍然比简单的 AE 差一个数量级,而我希望它们至少是相同的,因为我使用的架构应该更适合时间问题。

首先,这些结果是否具有可比性?

尽管如此,LSTM-AE 的重建误差看起来一点也不好看。

我的 AE 模型:

Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 178)               31862     
_________________________________________________________________
batch_normalization (BatchNo (None, 178)               712       
_________________________________________________________________
dense_1 (Dense)              (None, 59)                10561     
_________________________________________________________________
dense_2 (Dense)              (None, 178)               10680     
=================================================================
  • 优化器:sgd
  • 损失:mse
  • 密集层的激活函数:relu

我的 LSTM/GRU AE:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 23, 178)           0         
_________________________________________________________________
gru (GRU)                    (None, 59)                42126     
_________________________________________________________________
repeat_vector (RepeatVector) (None, 23, 59)            0         
_________________________________________________________________
gru_1 (GRU)                  (None, 23, 178)           127092    
_________________________________________________________________
time_distributed (TimeDistri (None, 23, 178)           31862     
=================================================================
  • 优化器:sgd
  • 损失:mse
  • gru 层的激活函数:relu

【问题讨论】:

  • 你能在这方面取得进展吗?如果你成功了,我会对你如何提高重建质量感兴趣。
  • 刚刚设法提高了数据质量和样本。没有根据模型复杂性进一步管理任何事情。
  • 有趣——它到底需要什么?例如,新的数据预处理、增加训练样本等。
  • 抱歉耽搁了。是的,我用合成示例增加了训练集

标签: machine-learning lstm recurrent-neural-network autoencoder


【解决方案1】:

您上面的两个模型似乎没有可比性,在有意义的方面。第一个模型试图压缩包含 178 个值的向量。这些向量很可能包含一些冗余信息,因此可以合理地假设您将能够压缩它们。

第二个模型尝试通过单个 GRU 层压缩 23 x 178 向量的序列。这是一项具有大量参数的任务。重复向量简单地获取第一个 GRU 层(编码器)的输出,并将其作为第二个 GRU 层(解码器)的输入。但是然后您获取解码器的单个值。我建议您在第二个 GRU(解码器)中使用 return_sequences=True 而不是 TimeDistributed 层。否则,您是说您期望 23x178 序列由所有具有相同值的元素组成;这必须导致非常高的错误/没有解决方案。

我建议你退后一步。您的目标是找到序列之间的相似性吗?还是能够做出预测?对于相似性任务,自动编码器方法更可取。为了进行预测,我建议您更倾向于将 Dense(1) 层应用于序列步骤的输出的方法。

你的数据集是开放的吗?可用的 ?如果可能的话,我很想试一试。

【讨论】:

  • 感谢您的回复。是的,第二个 GRU 确实 return_sequences 为 True,否则将不适合时间分布层所需的输入。我的目标是建立一个无监督-半监督模型,所以利用标签进行预测不是我的兴趣。出于这个原因,我想构建一个自动编码器模型,它可以捕捉到真正的相似之处和主要特征,并将其工作作为事后异常检测的起点。
  • 如果我理解你的话,你的观点是,与普通的 AE 相比,LSTM AE 确实需要更多的样本来训练并获得更高的性能?但我不认为我在样本数量方面处于如此糟糕的状态,不是吗?数据集是公开的,正如我在删除标签并致力于重建被认为健康的患者之前所说的那样:epileptologie-bonn.de/cms/…
  • 最后的 TimeDistributed() 步骤可能是一个非常严重的问题。您希望 return_sequences=True 从 GRU 步骤代替。 TimeDistributed() 表示您从 GRU 获取单个结果并将其复制 N 次到序列的长度。这必然会导致很多错误。
  • RepeatVector 的定义不是错还是我错了?那么RepeatVector 和TimeDistributed 有什么区别呢?再次感谢您的宝贵时间
  • 我已经按照您所说的进行了尝试,但我仍然有与发布的相同方式的错误输出。为什么 LSTM-AE 与普通的相比应该如此不同是我仍然没有得到的东西。我认为感谢 LSTM 单元,我可以更好地以相同的方式获得时间行为
最近更新 更多