设计时间序列变分自编码器的提示和技巧

数据挖掘 深度学习 喀拉斯 自动编码器
2021-10-08 20:05:54

我是 VAE 的新手,但发现它们非常吸引人。我想知道是否有人可能对如何构建编码器和解码器层与时间序列数据有任何提示或技巧。

假设我的输入是 xR1×1000所以它们有一千个维度。数据是高度非线性的并且相当嘈杂。我有几万x:s。

考虑到这一点,有哪些一般指导方针(因为我找不到任何指导方针,因为 VAE 领域有些特殊且非常新):

  • 我的编码器和解码器网络应该有多深?有什么好的指导方针吗?
  • 应该使用完全连接的密集网络还是堆叠的 conv1Dnets?
  • 什么激活函数是好的选择?
  • 我们能说一下潜在维度的“最佳”维度吗?
  • 就像我想象的其他人一样,我的损失函数是重建项和 KL 散度正则化项的总和。还有什么其他值得考虑的吗?
  • 批量标准化?目前,就我的问题而言,这并没有什么区别。但它应该。是否应该始终使用批处理规范?
  • 在解码器层,在返回原始输入维度之前进行上采样会更好吗?

任何提示或技巧都将受到欢迎。我自然尝试过其中一些,但目前我无法辨别趋势。

2个回答

我可以从更理论的角度说话,但老实说,我在 VAE 方面并没有取得太大的成功。

1) 我的编码器和解码器网络应该有多深?有什么好的指导方针吗?

这完全取决于您的数据集。如果你有高度非线性的数据,那么深度网络应该会做得很好。连续的非线性允许您捕获输入中的高阶相关性,这可能对您的情况有好处。

您知道数据集中真正独立的维度数量吗?你做过类似 PCA(线性自动编码器)的事情吗?这可能会告诉您将瓶颈层的维度定位在哪里,这可能会帮助您确定到达那里的层大小。

2)应该使用完全连接的密集网络还是堆叠的conv1Dnets?

我会说两个都试试。

3)什么激活函数是好的选择?

Hugo Larochelle 曾经说过,你应该始终从 ReLU 开始。看看你是否得到了足够好的结果,因为它们不太容易出现梯度爆炸/消失的问题,这是你将要面对时间序列数据的问题。不过,请记住用小的正值初始化它们,以避免神经元死亡。

[编辑:实际上,梯度消失和爆炸仍然可能是 ReLU 的问题,只是稍微缓解了一点。此外,用小的正值初始化偏差。Andrej Karpathy 在一次演讲中这么说]

4)我们能说一下潜在维度的“最佳”维度吗?

在某些情况下是的,我们可以。“最佳”维度将是导致最高无损压缩的维度。也就是说,在重建时最能压缩输入数据而不会丢失信息的那个。不过,祝你好运找到最佳选择。

5)像我想象的其他人一样,我的损失函数是重建项和 KL 散度正则化项的总和。还有什么其他值得考虑的吗?

您可以合并各种类型的正则化来修改您的损失函数。例如,您可以使用 dropout,或者 L1 或 L2 正则化。

编辑:你也可以考虑一个基于注意力的模型,例如看到这个讨论

6)批量标准化?目前,就我的问题而言,这并没有什么区别。但它应该。是否应该始终使用批处理规范?

“总是”是一个强有力的术语。我会说并非总是如此,但批量标准化应该是一个不错的选择。在你放弃之前再看看你的实现。

7)在解码器层,在返回原始输入维度之前进行上采样会更好吗?

这是默认的表示方式——自动编码器通常显示为从输入到隐藏再到重建的对称构造。我会说尝试不这样做,但我不知道一个是否比另一个更好。

我正在处理的数据面临着一系列非常相似的挑战。到目前为止,我已经发现 1-2 个具有大量节点(大约 50 个)的隐藏层是成功的。

如果我试图增加网络的复杂性,重建错误就会增加。如果您在 VAE 上取得成功,希望得到一些建议。