Skip to content

Sbert

问题

记录一次使用Sbert模型出现对句子编码向量不一致的原因。问题复现:当使用以下代码对句子进行编码,得到的向量不一致,有细微差别。

import numpy as np
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("all-mpnet-base-v2")
model.eval()
a = model.encode(["hello","goodbye man"])
b = model.encode(["hello"])
print(np.array_equiv(a, b))
# output: false
print(a[0][:10], b[0][:10])
[-0.06277177  0.05495887  0.05216482  0.08579    -0.08274893 -0.07457298
  0.06855468  0.0183964  -0.08201137 -0.03738482] 
[-0.06277176  0.05495886  0.05216479  0.08578998 -0.08274891 -0.074573
  0.06855468  0.01839639 -0.08201136 -0.03738476]

网上找的解释:当编码多个句子时,所有的文本会使用pad填充到最长文本的长度,这些padding token会略微改变编码向量。https://github.com/UKPLab/sentence-transformers/issues/1356。但是感觉这个解释很牵强,自己又看了一下encode的源码,并没有pad操作。最简单的验证方法是保证最长文本长度一致,但是发现还是不一样。

后面发现把batch_size设置为1,编码出来的向量就是一致的了,看了是这个的问题。问了下GPT,说是浮点数运算顺序不同,结果不同。这个问题先暂时留在这。