可变自动编码器(VAE)本身就是一个非常笨拙的概念。毫不奇怪,大多数文章,评论和教程都侧重于理论和体系结构,但是大多数也未能解决数据缩放的问题。在尝试VAE时,我遇到了一个(对我来说)令人惊讶的读取标志,即将数据缩放为VAE的方式非常重要,我无法理解。
要可视化描述以下问题,请在此处访问笔记本:https://github.com/mobias17/VAE-Input-Scaling/blob/master/VAE%20Input%20Scaling.ipynb
让我们假设目标是通过VAE重建正弦波(例如声波)。当我通过模型输入标准化数据时,它只能近似介于-1和1之间的值。显然,快速的答案是将数据标准化。尽管如此,这仍然导致以下问题:
1)VAE只能近似于-1和1之间的值是什么原因? (是高斯重新参数化,梯度消失了吗?)
2)有没有办法克服这个边界(模型更改)?
3)为VAE缩放数据的最佳实践是什么?数据是否应该通过std dev进行标准化?
答案 0 :(得分:0)
可变自动编码器可以近似任何范围内的值。这里的问题在于该特定模型的体系结构。
此VAE的解码器使用keras.layers.LSTM作为最后一层。 This layer's default activation function is tanh,和tanh函数输出(-1,1)范围内的值。这就是为什么模型无法生成超出该范围的值的原因。
但是,如果我们将激活函数更改为线性替换,则
decoder_mean = LSTM(input_dim, return_sequences=True)
使用
decoder_mean = LSTM(input_dim, return_sequences=True, activation=None)
VAE现在可以近似数据了。这是我训练100个时期后得到的结果。
通常的建议是通过缩放数据或选择更具表现力的函数,确保尝试近似的数据位于用于近似的函数的范围内。