如何对两个句子进行双重编码以显示相似度分数

数据挖掘 神经网络 深度学习 词嵌入 搜索 向量空间模型
2022-03-06 02:35:22

我一直在尝试掌握谷歌语义体验的概念。通过使用它,我打算实现一个语义查询工具。

使用通用句子编码器,我可以首先对所有句子进行预编码并将它们放入数据库中。当用户想要进行查询时,输入也会被转换为 512 维向量,我们将通过比较余弦相似度对整个数据库进行顺序搜索(选择相似度最高的向量)。但这非常慢......

幸运的是,在他们的语义体验页面上,他们写道:

Universal Sentence Encoder 模型与我们在 Talk to Books 和 Semantris 中使用的非常相似,尽管这些应用程序使用双编码器方法来最大化响应相关性,而 Universal Sentence Encoder 是返回嵌入的单个编码器对于输入,而不是输入对上的分数。


他们用于将句子转换为嵌入向量的一种更简单的方法是DAN(深度平均神经网络)

据我了解,句子被分割成单词,然后转换成向量(word2vec),然后我们得到所有向量的平均值。平均值最终传递给一个或多个隐藏前馈层,最终输出具有 softmax 激活函数并具有 512 个神经元的层。

但是,如何创建双编码器?我是否使用两个不同的神经网络?或者输出是否只包含一个输出相似性的神经元?

谢谢!

附言

如果这里提到了任何无知的内容,我深表歉意,我对将低维空间投影到 512 维向量空间的概念感到非常困惑。

2个回答

但是,如何创建双编码器?我是否使用两个不同的神经网络?或者输出是否只包含一个输出相似性的神经元?

您不需要为它创建两个不同的神经网络(或两个不同的编码器)。每当您遇到对称片段问题时,例如在您的情况下,它的两个句子相似度,您应该使用相同的编码器对两个句子进行编码,然后使用余弦相似度。(也可以是两张脸的相似性——这正是 FaceNet 的预期使用方式。)

我们将通过比较余弦相似度(选择最高相似度向量)对整个数据库执行顺序搜索。但这非常慢......

你是对的,我假设你会使用 for/while 循环来计算相似度。在计算一个句子与数千或数百万数据库的向量相似度时,您应该使用像 BLAS 这样的高性能库,它可以在亚秒内完成相同的计算。

三年前,Facebook 推出了一个名为 FAISS 的更快的矩阵库。这会大大降低你的速度。

如果您有大量训练数据(例如 SNLI 或 multiNLI 数据集可用于训练),您应该研究 Siamese Networks 或左右前馈网络。

否则,您应该使用一种潜在语义分析形式来压缩您的向量以获得更快的搜索集,然后在整个数据集的这个子集上执行完整的余弦相似度。