我有几千个文本文档,我目前正在努力获取单词的潜在特征表示并使用变分自动编码器生成句子。我面临的主要障碍是“如何将如此大的文本向量输入到 VAE 中(或者说甚至在简单的自动编码器中)“。我知道还有其他技术,例如以 LSTM 的形式添加层,但我想保持简单,并保持模型只是 VAE。一种方法是使用 one-hot-encoded 向量或词袋,但是同样,这不是最有效的方法,因为对于 100K 唯一词的词汇表,每个文档将有 100K 输入向量。此外,我们松散了句子结构。但是对于小型数据集,使用它训练自动编码器没有问题输入类型。另一种方法是使用预训练的 Word2Vec 使用词嵌入。这是我一直在尝试做的,可以在此处下载的 python 笔记本使用这种技术。代码太长并且有多个预训练处理步骤,所以我无法将此代码嵌入到我的帖子中。以下是我的问题:
现在,每个句子(或文档)将有不同数量的单词。因此,每个文档的词嵌入数量将具有不同的长度。不幸的是,keras 要求所有输入的长度相同(如果我是对的)。那么,如何处理这种输入长度不同的情况呢?目前,在 python notebook 的第五块中,可以看到语句
data = [x for x in vect if len(x) == 10]
. 也就是说,我只考虑正好有 10 个单词的文档来克服这个问题。当然,这是不切实际的。我们可以填充 0 个向量吗?Keras博客中显示的 VAE 示例使用 MNIST 数据作为示例。因此,他们在最终的重建层中使用了sigmoid 激活;因此,“ binary_crossentropy ”作为损失函数(连同 KL 散度)。由于我的输入是词嵌入,在嵌入向量中甚至有负值,我相信我不应该在最终重建层中使用激活作为“ sigmoid ”。是对的吗?。此外,我还在附加代码中将损失更改为“ mean_squared_error ”而不是“ binary_crossentropy ”。
如果从事文本数据的 VAE 和自动编码器工作的人可以就上述问题提供他们的输入,那就太好了。
注意:所附代码是THIS LINK中代码的简化版本