基于对比学习的句子相似度计算算法:Sentence-BERT详解
题目描述
在自然语言处理任务中,快速且准确地计算两个句子之间的语义相似度至关重要,例如在信息检索、重复问题检测或智能客服中。传统方法如BERT虽然能生成高质量的句子表示,但其计算过程(需要将两个句子拼接后输入模型)在需要计算大量句子对的场景下效率极低。Sentence-BERT(SBERT)算法通过改进BERT的孪生/三元组网络结构,结合对比学习目标,旨在生成具有语义意义的固定维度句子嵌入,使句子相似度计算可以通过简单的向量相似度(如余弦相似度)高效完成。
解题过程循序渐进讲解
第一步:问题与动机分析
核心问题:如何高效地得到句子的向量表示,使得向量之间的相似度能够准确反映句子间的语义相似度?
- BERT的直接限制:BERT通过将两个句子用[SEP]分隔后输入,计算它们的交互注意力,虽然效果好,但计算一次相似度就需要一次完整的模型前向传播。对于有n个句子的集合,要计算所有两两相似度需要O(n²)次BERT推理,不可行。
- 传统句子表示方法的不足:对BERT输出层取平均池化或取[CLS]标记的向量作为句子表示,然后计算余弦相似度,效果通常不佳,因为这些表示没有针对相似度任务进行优化。
- 目标定义:设计一个模型,输入单个句子,输出一个固定大小的向量(句子嵌入)。要求是,语义相似的句子在向量空间中距离接近,语义不相似的句子距离远。
第二步:模型架构设计——孪生/三元组网络
SBERT的核心是在预训练的BERT(或RoBERTa等)模型上添加一个池化层,并采用特定的网络结构进行微调。
- 基础编码器:使用一个共享权重的BERT模型作为句子编码器。即两个句子S₁和S₂输入到同一个BERT模型中。
- 池化策略(Pooling Layer):BERT输出每个词元的向量。为了得到一个固定长度的句子向量,SBERT提出了三种池化方法:
- 均值池化(MEAN):计算所有输出词元向量的平均值。最常用。
- 最大池化(MAX):取所有输出词元向量在各个维度上的最大值。
- [CLS]标记向量:直接使用[CLS]标记对应的向量。
- 实践中,均值池化通常表现最好。池化后得到的向量维度与BERT词元向量维度相同(如768维)。
- 微调网络结构:根据不同的训练目标,采用两种结构:
- 分类目标结构:将两个句子的向量u, v与它们的逐元素差值|u-v|拼接起来,形成一个3*dim的向量,然后送入一个可训练的全连接层进行分类(例如,计算相似度得分或进行NLI任务的三分类)。
- 回归/对比学习目标结构:直接计算两个句子向量u和v的余弦相似度,并使用均方误差损失或对比损失进行优化。
第三步:训练目标与损失函数
SBERT的成功很大程度上依赖于其训练目标和高质量的数据。主要有两种训练范式:
-
自然语言推理(NLI)数据集上的训练:
- 使用SNLI和MultiNLI数据集。这些数据集包含句子对(前提,假设),并标注了关系:蕴含(entailment)、矛盾(contradiction)、中立(neutral)。
- 训练目标:采用分类目标结构。将句子对(u, v)的表示及其差值输入softmax分类器,预测三分类标签。
- 损失函数:交叉熵损失。
- 目的:让模型学会区分句子间的细微语义关系。
-
余弦相似度回归训练:
- 使用STS(语义文本相似度)数据集。这些数据集包含句子对和人工标注的相似度分数(如0-5分)。
- 训练目标:采用回归目标结构。直接优化模型输出的句子向量,使其余弦相似度与黄金标签相似度分数一致。
- 损失函数:均方误差损失(MSE)。
- 流程:计算u和v的余弦相似度,与真实相似度标签比较计算MSE。
第四步:推理阶段——高效的相似度计算
模型训练完成后,进入实际应用阶段:
- 句子编码:对于任意新句子,只需通过SBERT模型一次前向传播,即可得到其固定维度的句子嵌入向量。这一步是离线的,可以预先计算并存储。
- 相似度计算:要计算两个句子的语义相似度,只需计算它们对应嵌入向量的余弦相似度(点积后除以模长)。这是一个非常快速的O(d)操作(d为向量维度)。
- 大规模应用:对于包含百万级句子的语料库,可以预先计算所有句子的嵌入,存入向量数据库(如FAISS)。当有新查询句子时,计算其嵌入,然后在向量数据库中进行近似最近邻搜索,在毫秒级内找到最相似的句子。
第五步:关键技术与改进点分析
- 对比学习的本质:SBERT的训练过程本质上是让模型学习一个语义空间,在这个空间中,通过NLI或STS数据提供的正负样本对,拉近正样本对的距离,推远负样本对的距离。这是对比学习的典型应用。
- 与普通BERT池化的区别:未经微调的BERT池化向量质量不高,因为BERT的预训练任务(MLM和NSP)没有直接优化句子级别的表示。SBERT通过下游任务的微调,显式地优化了句子表示。
- 多语言与领域适应:SBERT框架可以轻松扩展到多语言(使用多语言BERT)或特定领域(使用领域数据继续微调)。
- 对称与非对称任务:SBERT最初针对对称语义相似度任务(两个句子可互换)。对于非对称任务(如问答,查询与文档),可以采用双编码器但不共享权重的结构。
总结
Sentence-BERT算法通过将预训练Transformer模型(如BERT)与孪生网络结构、对比学习目标相结合,巧妙地解决了句子级别语义表示学习与高效相似度计算的问题。其核心贡献在于:将昂贵的句子对交互计算(BERT风格)转换为高效的句子独立编码+向量相似度计算模式,极大地提升了语义匹配任务的实用性,成为工业界和学术界句子嵌入的事实标准之一。理解SBERT的关键在于把握其“独立编码”和“对比微调”两个核心设计思想。