基于对比学习的句子表示学习算法:SimCSE详解
字数 2253 2025-11-29 15:55:43
基于对比学习的句子表示学习算法:SimCSE详解
题目描述
句子表示学习旨在将句子映射为低维稠密向量,使其蕴含语义信息。SimCSE(Simple Contrastive Learning of Sentence Embeddings)是一种简单却高效的对比学习算法,它通过构造正负例样本,拉近语义相近句子的向量距离,推远不相关句子的向量距离,从而学习高质量的句子表示。该算法无需复杂结构,仅需标准Transformer编码器(如BERT)和对比损失函数即可实现优异性能。
解题过程循序渐进讲解
1. 问题定义与核心思想
- 目标:学习一个映射函数 \(f(\cdot)\),将句子 \(s\) 转换为向量 \(\mathbf{h} = f(s)\),使得语义相似的句子向量间余弦相似度高。
- 核心思想:利用对比学习框架,通过数据增强构造正例对(语义相同的句子)和负例对(语义不同的句子),优化向量空间分布。
- SimCSE的创新:正例仅通过对同一句子应用两次不同的随机掩码(Dropout)生成,负例来自同一批次内的其他句子,极大简化了数据增强流程。
2. 正负例构造方法
- 正例构造:
对输入句子 \(s\) 两次输入编码器 \(f(\cdot)\)(如BERT),由于Transformer的Dropout机制在每次前向传播时随机关闭部分神经元,两次输出向量 \(\mathbf{h}_i\) 和 \(\mathbf{h}_i^+\) 会略有差异,但语义一致。公式化表示为:
\[ \mathbf{h}_i = f(s_i), \quad \mathbf{h}_i^+ = f(s_i) \]
这里 \(\mathbf{h}_i\) 和 \(\mathbf{h}_i^+\) 因Dropout的随机性成为天然的正例对。
- 负例构造:
在同一训练批次中,其他句子的向量自然作为负例。若批次大小为 \(N\),则对于样本 \(i\),其负例集合为 \(\{\mathbf{h}_j\}_{j \neq i}\)。
3. 对比损失函数设计
- 目标:使正例对相似度远高于负例对。采用InfoNCE损失函数:
\[ \mathcal{L}_i = -\log \frac{e^{\text{sim}(\mathbf{h}_i, \mathbf{h}_i^+) / \tau}}{\sum_{j=1}^N e^{\text{sim}(\mathbf{h}_i, \mathbf{h}_j) / \tau}} \]
其中:
- \(\text{sim}(\mathbf{h}_i, \mathbf{h}_j) = \frac{\mathbf{h}_i^\top \mathbf{h}_j}{\|\mathbf{h}_i\| \cdot \|\mathbf{h}_j\|}\) 为余弦相似度;
- \(\tau\) 是温度超参数,控制相似度分布的平滑度(通常设为0.05);
- 分母包含正例和所有负例,优化后使 \(\mathbf{h}_i\) 与 \(\mathbf{h}_i^+\) 相似度最大化,与 \(\mathbf{h}_j (j \neq i)\) 相似度最小化。
4. 训练流程详解
- 输入:无监督SimCSE直接使用无标注文本(如维基百科句子);有监督SimCSE利用自然语言推理(NLI)数据集中的蕴含句对作为正例。
- 步骤:
- 从语料中采样一个批次 \(N\) 个句子 \(\{s_1, s_2, ..., s_N\}\)。
- 对每个句子 \(s_i\),通过编码器两次前向传播得到 \(\mathbf{h}_i\) 和 \(\mathbf{h}_i^+\)。
- 计算所有句子的相似度矩阵,对角线元素为正例相似度,非对角线为负例相似度。
- 对每个样本 \(i\) 计算 \(\mathcal{L}_i\),批次损失为 \(\frac{1}{N} \sum_{i=1}^N \mathcal{L}_i\)。
- 反向传播更新编码器参数。
5. 关键技术与优化细节
- Dropout的作用:
- 作为隐式数据增强,避免模型学习到琐碎特征(如单词重叠)。
- 实验表明Dropout概率设为0.1时效果最优。
- 向量归一化:
- 对输出向量 \(\mathbf{h}\) 进行L2归一化,避免向量模长影响相似度计算。
- 难负例挖掘:
- 由于负例来自同一批次,批次越大,负例多样性越强,模型泛化能力越好(通常批次大小设为512或更大)。
6. 与传统方法的对比
- 相比BERT原生句向量:直接取BERT的[CLS] token向量或词向量平均会因各向异性问题(向量分布不均匀)导致性能差,SimCSE通过对比学习改善分布。
- 相比其他对比学习方法:
- 如BERT-flow通过流模型校正分布,计算复杂;SimCSE仅需标准训练流程,更高效。
- 如数据增强需额外生成回译或删除词,SimCSE仅依赖Dropout,无需外部资源。
7. 应用场景
- 语义相似度计算:直接计算句子向量的余弦相似度。
- 信息检索:将查询和文档编码为向量后检索。
- 聚类与分类:作为下游任务的输入特征。
通过上述步骤,SimCSE以简单机制解决了句子表示的各向异性问题,成为对比学习在NLP中的经典应用。