Keras自动编码器中输入文本数据的正确方法

数据挖掘 Python 深度学习 喀拉斯 文本挖掘 自动编码器
2022-02-19 00:17:17

我有几千个文本文档,我目前正在努力获取单词的潜在特征表示并使用变分自动编码器生成句子。我面临的主要障碍是“如何将如此大的文本向量输入到 VAE 中(或者说甚至在简单的自动编码器中)“。我知道还有其他技术,例如以 LSTM 的形式添加层,但我想保持简单,并保持模型只是 VAE。一种方法是使用 one-hot-encoded 向量或词袋,但是同样,这不是最有效的方法,因为对于 100K 唯一词的词汇表,每个文档将有 100K 输入向量。此外,我们松散了句子结构。但是对于小型数据集,使用它训练自动编码器没有问题输入类型。另一种方法是使用预训练的 Word2Vec 使用词嵌入。这是我一直在尝试做的,可以在此处下载的 python 笔记本使用这种技术。代码太长并且有多个预训练处理步骤,所以我无法将此代码嵌入到我的帖子中。以下是我的问题:

  1. 现在,每个句子(或文档)将有不同数量的单词。因此,每个文档的词嵌入数量将具有不同的长度。不幸的是,keras 要求所有输入的长度相同(如果我是对的)。那么,如何处理这种输入长度不同的情况呢?目前,在 python notebook 的第五块中,可以看到语句data = [x for x in vect if len(x) == 10]. 也就是说,我只考虑正好有 10 个单词的文档来克服这个问题。当然,这是不切实际的。我们可以填充 0 个向量吗?

  2. Keras博客中显示的 VAE 示例使用 MNIST 数据作为示例。因此,他们在最终的重建层中使用了sigmoid 激活因此,“ binary_crossentropy ”作为损失函数(连同 KL 散度)。由于我的输入是词嵌入,在嵌入向量中甚至有负值,我相信我不应该在最终重建层中使用激活作为“ sigmoid ”。是对的吗?。此外,我还在附加代码中将损失更改为“ mean_squared_error ”而不是“ binary_crossentropy ”。

如果从事文本数据的 VAE 和自动编码器工作的人可以就上述问题提供他们的输入,那就太好了。

注意:所附代码是THIS LINK中代码的简化版本

1个回答

这是我对你的问题的看法。

  1. 是的,您可以对向量进行零填充。但是,如果您使用句子作为输入,我强烈建议您使用 LSTM 作为编码器的一部分。LSTM 可以接受可变长度的输入——这就是它的魅力所在!

  2. 损失函数完全取决于你的目标。听起来您正在尝试创建一个序列到序列的 VAE。我会通过在你的输出层上放置一个 softmax 函数来解决这个问题,以生成句子中下一个最可能的单词。所以,我会使用categorical_crossentropy作为损失函数,我会使用softmax而不是sigmoid,因为你是从一组词汇中选择下一个最有可能的词(这不是一个二元问题,而是一个分类问题)。

希望有帮助!