if 1:
from sentence_transformers import SentenceTransformer
encode_kwargs = {'normalize_embeddings': True}
model_embedding = SentenceTransformer(model_name, device="cpu")
data_embedding = model_embedding.encode(data_list,**encode_kwargs)
else: ## 需要安装langchain,不推荐该路子
from langchain.embeddings import HuggingFaceBgeEmbeddings
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model_embedding = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs,
query_instruction=""
)
data_embedding = model_embedding.embed_documents(data_list)
核心知识:
关于normalize_embeddings参数,将其设置为True会对模型生成的嵌入进行归一化处理。归一化嵌入意味着将它们缩放到具有单位范数(长度为1)的尺度。这可以有几个好处:
余弦相似度可解释性: 当嵌入进行归一化时,两个向量之间的余弦相似度等同于它们的点积。这使得余弦相似度更具解释性,因为它的取值范围从-1(完全不相似)到1(完全相似)。
提高训练稳定性: 归一化嵌入可以提高训练的稳定性,特别是在模型对输入特征的尺度敏感的情况下。它可以防止模型过于敏感于大幅度的值。
正则化效果: 归一化充当正则化的一种形式,通过约束嵌入的幅度可以帮助防止过拟合,特别是在训练数据有限的情况下。
在句子嵌入的背景下,将它们归一化可以在使用余弦相似度作为衡量句子或文档相似性的度量时特别有用。它使得余弦相似度分数更一致和可解释,这在自然语言处理任务中通常是可取的。然而,归一化的影响可能会因特定用例而异,因此始终建议进行实验和评估性能。