我可以从更理论的角度说话,但老实说,我在 VAE 方面并没有取得太大的成功。
1) 我的编码器和解码器网络应该有多深?有什么好的指导方针吗?
这完全取决于您的数据集。如果你有高度非线性的数据,那么深度网络应该会做得很好。连续的非线性允许您捕获输入中的高阶相关性,这可能对您的情况有好处。
您知道数据集中真正独立的维度数量吗?你做过类似 PCA(线性自动编码器)的事情吗?这可能会告诉您将瓶颈层的维度定位在哪里,这可能会帮助您确定到达那里的层大小。
2)应该使用完全连接的密集网络还是堆叠的conv1Dnets?
我会说两个都试试。
3)什么激活函数是好的选择?
Hugo Larochelle 曾经说过,你应该始终从 ReLU 开始。看看你是否得到了足够好的结果,因为它们不太容易出现梯度爆炸/消失的问题,这是你将要面对时间序列数据的问题。不过,请记住用小的正值初始化它们,以避免神经元死亡。
[编辑:实际上,梯度消失和爆炸仍然可能是 ReLU 的问题,只是稍微缓解了一点。此外,用小的正值初始化偏差。Andrej Karpathy 在一次演讲中这么说]
4)我们能说一下潜在维度的“最佳”维度吗?
在某些情况下是的,我们可以。“最佳”维度将是导致最高无损压缩的维度。也就是说,在重建时最能压缩输入数据而不会丢失信息的那个。不过,祝你好运找到最佳选择。
5)像我想象的其他人一样,我的损失函数是重建项和 KL 散度正则化项的总和。还有什么其他值得考虑的吗?
您可以合并各种类型的正则化来修改您的损失函数。例如,您可以使用 dropout,或者 L1 或 L2 正则化。
编辑:你也可以考虑一个基于注意力的模型,例如看到这个讨论。
6)批量标准化?目前,就我的问题而言,这并没有什么区别。但它应该。是否应该始终使用批处理规范?
“总是”是一个强有力的术语。我会说并非总是如此,但批量标准化应该是一个不错的选择。在你放弃之前再看看你的实现。
7)在解码器层,在返回原始输入维度之前进行上采样会更好吗?
这是默认的表示方式——自动编码器通常显示为从输入到隐藏再到重建的对称构造。我会说尝试不这样做,但我不知道一个是否比另一个更好。