我已经使用XLNet嵌入作为服务计算了两个相同句子的向量。但该模型为两个相同的句子生成了不同的向量嵌入,因此余弦相似度不为1,欧几里得距离也不为0。在BERT的情况下,它运行良好。例如如果
vec1 = en.encode(texts=['he is anger'],pooling='reduce_mean')
vec2 = en.encode(texts=['he is anger'],pooling='reduce_mean')
模型(XLNet(说这两个句子不一样。
这是因为模型中的丢弃层。在推理过程中,应该关闭丢弃层,但库中存在错误。这里已经讨论过了,显然还没有解决。
请参阅此处的讨论:https://github.com/amansrivastava17/embedding-as-service/issues/45
同时,正如@Davide Fiocco所建议的,你可以使用HuggingFace的简单方法。请使用forward
、generate
或pipeline
。
作为解决方法,如果您有一些灵活性,那么使用普通的transformers
库怎么样?
结果
from transformers import pipeline
embedder = pipeline("feature-extraction", model="xlnet-base-cased")
embedder("he is anger")
是确定性的。