基于自监督学习的对比学习(Contrastive Learning)算法详解
题目描述
对比学习是一种自监督学习方法,核心思想是通过构造相似样本(正例)和不相似样本(负例),训练模型学习数据中的本质特征。在自然语言处理中,对比学习常用于提升文本表示的区分能力,例如通过对比同一句子在不同增强下的表示(正例)与其他句子的表示(负例),使模型更关注语义内容而非表面特征。典型应用包括SimCSE(Simple Contrastive Learning of Sentence Embeddings)等。
解题过程
1. 问题定义与目标
目标:学习一个文本编码器 \(f_\theta\),将输入文本 \(x\) 映射为低维向量表示 \(h = f_\theta(x)\),使得语义相似的文本在向量空间中距离更近,不相似的文本距离更远。
挑战:无监督条件下如何定义“相似”与“不相似”?如何构造有效的正负例?
2. 对比学习的基本原理
对比学习的核心是优化对比损失函数(如InfoNCE损失),其形式化定义如下:
\[\mathcal{L} = -\log \frac{\exp(\text{sim}(h_i, h_j^+) / \tau)}{\sum_{k=1}^N \exp(\text{sim}(h_i, h_k) / \tau)} \]
其中:
- \(h_i\) 是锚点样本的表示;
- \(h_j^+\) 是正例样本的表示;
- \(h_k\) 包括正例和负例的表示;
- \(\text{sim}(\cdot)\) 是相似度函数(如余弦相似度);
- \(\tau\) 是温度超参数,控制分布的尖锐程度。
关键步骤:
- 正例构造:对同一文本施加不同增强(如回译、掩码、dropout),生成两个变体作为正例对。
- 负例构造:同一批次中其他文本的表示作为负例(隐式负例)。
3. 具体实现:以SimCSE为例
SimCSE通过简单的Dropout机制构造正例,无需额外数据增强:
- 无监督SimCSE:
- 同一句子两次输入编码器,由于Dropout的随机性,得到两个略有差异的表示作为正例对。
- 同一批次中其他句子的表示作为负例。
- 有监督SimCSE:
- 利用自然语言推理(NLI)数据集中的蕴含关系(entailment)作为正例,矛盾关系(contradiction)作为硬负例。
训练步骤:
- 输入批次文本 \(\{x_i\}_{i=1}^N\)。
- 对每个 \(x_i\) 两次通过编码器(如BERT),得到 \(h_i^{(1)}\) 和 \(h_i^{(2)}\)。
- 计算损失:
\[\mathcal{L}_i = -\log \frac{\exp(\text{sim}(h_i^{(1)}, h_i^{(2)}) / \tau)}{\sum_{j=1}^N \exp(\text{sim}(h_i^{(1)}, h_j^{(2)}) / \tau)} \]
- 反向传播更新编码器参数 \(\theta\)。
4. 关键技术细节
- 温度参数 \(\tau\):较小值(如0.05)会放大相似度差异,使模型更关注困难负例。
- 负例数量:批次越大,负例越多,对比任务越困难,但效果通常更好(需显存优化技术如梯度累积)。
- 编码器选择:BERT、RoBERTa等预训练模型作为基础编码器,可快速收敛。
- 相似度度量:余弦相似度比点积更稳定,避免向量模长影响。
5. 评估与应用
- 评估任务:文本语义相似度(STS-B)、语义检索(MRPC)等。
- 应用场景:
- 提升少样本学习中的表示质量;
- 增强检索式对话系统、推荐系统的语义匹配能力。
总结
对比学习通过简单而有效的正负例构造策略,使模型学会区分语义相似性。其核心在于利用数据本身的结构(如增强不变性、标注关系)构建监督信号,显著提升了文本表示的鲁棒性和判别力。