SimCSE
利用Dropout机制实现无监督对比学习,让AI模型理解句子语义相似度的简单而强大的方案
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
利用Dropout机制实现无监督对比学习,让AI模型理解句子语义相似度的简单而强大的方案
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你是一家电商平台的算法工程师,想要根据用户的评论文本,自动识别出用户对商品的满意度。传统的关键词匹配方法早已力不从心——"这个手机屏幕很大"和"这个手机屏幕很小"都包含"屏幕"和"大/小"这样的词,但情感倾向完全相反。如果AI能理解"屏幕大"和"屏幕小"在语义上的差异,你的问题就迎刃而解了。
这正是**句子嵌入(Sentence Embedding)**技术的用武之地。2021年,普林斯顿大学NLP研究组(Tianyu Gao、Xingcheng Yao、Danqi Chen)发布了一个名为SimCSE的模型,其核心论文发表在NLP顶会EMNLP 2021上,并获得了广泛关注。与传统方法不同,SimCSE用一种极其巧妙的方式解决了"如何让相似句子在向量空间中靠近"这个核心问题:它让同一个句子通过两次前向传播,由于Dropout的随机失活机制不同,会产生两个略有不同的向量表示——这本身就是一对天然的正样本。这个看似"作弊"的技巧,却在7个语义文本相似度(STS)任务上刷新了当时的SOTA。

图1:SimCSE模型架构图,左侧为无监督版本,右侧为有监督版本
SimCSE的全称是Simple Contrastive Learning of Sentence Embeddings(简单的句子嵌入对比学习),其核心思想源自对比学习(Contrastive Learning)。对比学习的核心思想用一句话概括就是:让相似的样本在向量空间中靠近,让不相似的样本远离。
无监督SimCSE的创新之处在于"Dropout as Noise"(将Dropout视为噪声)。标准的Transformer模型在训练时会使用Dropout机制随机关闭部分神经元。在SimCSE中,同一个句子被输入模型两次——两次使用相同的文本,但由于Dropout的随机性,两次前向传播会产生两个不同的向量表示。这两个向量天然构成了一对正样本(positive pair),而训练批次中的其他句子向量则构成负样本(negative pairs)。模型的任务就是让正样本对的相似度尽可能高,负样本之间的相似度尽可能低。
有监督SimCSE则更进一步,它利用自然语言推理(NLI)数据集的标注数据。与无监督版本相比,有监督版本使用标注好的entailment(蕴含)关系对作为正样本,使用contradiction(矛盾)关系对作为硬负样本(hard negatives,即那些看起来很像但实际语义相反的样本)。这使得模型能够更精准地捕捉语义边界。
SimCSE并非从零训练一个全新的模型,而是站在巨人肩膀上的典范。它的技术栈建立在两个强大的预训练语言模型之上:
| 基础模型 | 特点 | SimCSE适用场景 |
|---|---|---|
| BERT | 双向Transformer,掩码语言模型预训练 | 通用语义相似度任务 |
| RoBERTa | BERT的强力版本,更多数据更长训练 | 高精度语义任务 |
核心架构组件包括:
cls(使用[CLS]token)、avg(所有token隐状态的平均)、avg_top2(最后两层隐状态的平均)、cls_before_pooler。实验表明,avg_top2在多数任务上表现最好。SimCSE为用户提供了极其友好的使用方式,既可以通过pip一行命令安装预训练模型,也可以完全自己训练。
方式一:直接使用预训练模型(推荐)
# 安装
pip install simcse
# 代码使用
from simcse import SimCSE
model = SimCSE("princeton-nlp/simcse-bert-base-uncased")
# 编码句子
embeddings = model.encode(["A woman is reading.", "A man is playing guitar."])
# 计算余弦相似度
similarity = model.similarity("A woman is reading.", "A man is playing guitar.")
方式二:训练自己的模型
# 无监督训练示例
bash run_unsup_example.sh
# 有监督训练示例
bash run_sup_example.sh
Gradio交互式Demo:项目自带了一个Gradio Web界面(demo/gradiodemo.py),用户可以在浏览器中输入任意两个句子,实时查看SimCSE计算的语义相似度得分。

图2:SimCSE Gradio Demo运行效果,支持句子对相似度实时计算
SimCSE在8个标准语义任务上进行了广泛评测,包括:
在STS任务上,SimCSE-bert-base-uncased(无监督版本)实现了81.6%的Spearman相关性得分,而有监督版本进一步提升至82.4%。这一成绩大幅超越了此前BERT-flow、BERT-whitening等方法。
SimCSE并非完美无缺,学术界和社区也提出了一些质疑和改进方向:
SimCSE的"Dropout as Noise"思想简洁而深刻,它证明了在对比学习中,数据增强不一定要依赖复杂的数据变换库——标准的Dropout机制本身就足够了。这一洞察影响了后续大量研究,包括SimCSE的后续改进工作以及多语言句子嵌入的研究。
SimCSE也催生了sentence-transformers库的发展(由HuggingFace团队维护),该库将SimCSE等先进的句子嵌入方法封装为易用的API,成为NLP工程师处理语义相似度任务的标准工具之一。据HuggingFace统计,SimCSE相关的预训练模型累计下载量已达数百万次。
如果你想深入理解句子嵌入的技术本质,或者需要在产品中集成语义相似度功能,SimCSE仍然是一个值得研究和参考的经典工作。