开发 Sentence-BERT (SBERT) 是为了解决像 BERT 这样的模型的一个关键限制:高效地创建有意义的句子嵌入,用于比较任务。虽然 BERT 擅长理解问题回答或文本分类等任务中的上下文,但它难以生成可以利用余弦距离等相似性度量直接比较的独立句子表示。 例如,BERT 将输入对一起处理(例如,用于相似性检查的两个句子),这迫使开发人员多次运行模型进行成对比较。 在对数千个文档进行聚类或实时推荐系统等场景中,这变得不切实际,因为延迟和计算成本很重要。
第二个问题在于 BERT 如何生成嵌入。 BERT 输出上下文化的令牌向量,但推导单个句子向量通常涉及诸如平均令牌嵌入或使用 [CLS] 令牌的输出之类的解决方法。 这些方法不能始终如一地捕获语义。 例如,平均令牌可能会稀释关键词的重要性,而 [CLS] 令牌本质上并未针对语义任务进行优化。 SBERT 通过使用 Siamese 网络结构微调 BERT 来解决此问题,其中两个相同的 BERT 模型独立处理句子。 在训练期间,它使用诸如三元组损失或对比损失之类的目标来确保相似的句子(例如,“狗在玩耍”和“小狗在跑步”)在嵌入空间中更接近,而不同的句子则被分开。 这创建了为直接比较量身定制的嵌入。
最后,SBERT 实现了实际的可扩展性。 传统的 BERT 需要通过将每个句子对一起输入模型来比较它们,这对于大型数据集而言计算成本很高。 使用 SBERT,可以预先计算嵌入并将其存储一次,从而可以使用简单的向量运算进行相似性搜索。 例如,搜索引擎可以预先计算数百万篇文章的嵌入,并通过将其预先计算的嵌入与数据库进行比较来快速找到用户查询的匹配项。 这将大规模应用程序中的推理时间从数小时减少到毫秒。 通过解决效率、嵌入质量和可扩展性,尽管 BERT 具有基础能力,但 SBERT 仍然成为一个关键工具。