趋近智
将数据转换为有意义的数值向量(即嵌入)是语义搜索的基础。但这些嵌入是如何生成的呢?虽然存在简单方法,但嵌入的质量会显著影响搜索系统的效能。这里介绍一些主要的嵌入模型,重点关注那些对自然语言处理(NLP)带来巨大进步的基于Transformer的方法,它们也是现代语义搜索的中心。
早期方法常依赖词频或共现统计。像TF-IDF(词频-逆文档频率)这样的技术,根据词语在文档中相对于整个语料库的重要性来赋予其权重。虽然对关键词匹配有用,但TF-IDF向量无法有效捕捉语义或词序。
后来,Word2Vec和GloVe等模型出现。这些模型学习嵌入,使得意义相似的词在向量空间中位置更接近。例如,词语“king”(国王)的向量可能靠近“queen”(女王)。这是一大进步,它们根据分布属性(词语出现在相似语境中)捕捉了语义关系。然而,这些模型通常为每个词生成一个单一向量,不考虑其语境。词语“bank”(银行/河岸)在“river bank”(河岸)和“investment bank”(投资银行)中会拥有相同的向量,这限制了它们理解意义细微差别的能力。
Transformer架构的引入标志着自然语言处理的一大进展。主要创新是自注意力机制。这使得模型在处理一个词时,能动态地衡量输入序列中其他词的影响。它能学习哪些词对理解当前词在其特定语境中的意义最为相关。这种捕捉长距离依赖和语境差异的能力,使Transformer在生成丰富、语境感知的嵌入方面表现出强大的能力。
BERT(来自Transformer的双向编码器表示)是一个里程碑式的模型。BERT在大量文本数据(如维基百科和书籍语料库)上进行预训练,学习到语言的深层表示。它的“双向”特性意味着在确定一个词的表示时,它会同时考虑该词之前和之后的文本。
我们如何从BERT中获取嵌入呢?BERT逐个处理输入文本的标记(token)。对于每个标记,它从其最终隐藏层输出一个对应的向量。这些输出向量包含丰富的语境信息。为了获得句子或文档的单一嵌入,一种常见策略是池化(pooling)。这涉及到汇总最后一层的标记嵌入,通常是通过对其取平均(均值池化)或使用BERT用于分类任务的特殊[CLS]标记对应的向量。
尽管功能强大,但如果直接将原始BERT嵌入用于句子间的语义相似度搜索,可能会在计算上要求很高(例如,同时将两个句子输入BERT)。
Sentence-BERT (SBERT) 专门解决了高效语义相似度比较的需求。它修改了BERT架构,并在微调阶段使用专门的训练目标(常使用Siamese或Triplet网络结构)。
SBERT微调的目标是生成句子嵌入,使得意义相似的句子在向量空间中具有接近的向量,理想情况下通过余弦相似度衡量。这意味着你可以独立地为句子A生成一个嵌入,为句子B生成一个嵌入,然后使用简单快速的余弦相似度计算(cos(θ))直接比较这两个向量,以评估它们的语义关联度。这使得SBERT非常适合语义搜索、聚类以及需要快速比较大量句子对的大规模相似度比较任务。
比较BERT的交叉编码器方法(处理句子对)与SBERT方法(生成独立嵌入以快速比较)在句子相似度任务中的表现。
Transformer家族庞大且持续演进。其他值得注意的模型包括:
选择嵌入模型并非一概而论。请考虑以下因素:
transformers、Sentence Transformers和TensorFlow Hub等库轻松获取。通常,最佳方法是始于一个评价良好的预训练模型(例如适用于文本搜索的SBERT变体),如果性能要求允许且您有该任务的标注数据,则可能在您的特定数据集上进一步微调它。
使用Python库通常可以直接获取这些模型。例如,使用sentence-transformers库:
# 伪代码示例
from sentence_transformers import SentenceTransformer
# 加载预训练的SBERT模型
model = SentenceTransformer('all-MiniLM-L6-v2')
sentences = ["This is an example sentence", "Each sentence is converted"]
embeddings = model.encode(sentences)
# 'embeddings' 现在包含一个NumPy数组,其中每一行都是一个向量
print(embeddings.shape)
这份概述提供了嵌入模型演变的一瞥。理解这些选择是将您的原始数据转换为有意义的向量表示的第一步,这是构建高效向量数据库和语义搜索应用所必需的。在接下来的章节中,我们将讨论向量维度如何影响性能,以及在这些模型创建的向量空间中如何衡量相似度。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造