Thoughts on Contrastive Learning¶
Contrastive Learning(对比学习)自 SimCLR 提出以来受到广泛应用,也产生了多种变体。SimCLR 中,取 \(N\) 个样本,对每个样本进行两次增广得到 \(2N\) 个样本,通过拉进同一图像的增广、推远不同图像的增广进行训练。其损失函数为
虽然原论文一句度量学习都没提,但是度量学习常用于分类,但对比学习常用于自监督学习。
还有一种写法 InfoNCE
loss:
其中 \(z^a, z^p, z^n\) 分别为锚样本、正样本和负样本。在 SimCLR 中,\(\operatorname{sim}\) 被定义为 cosine similarity。
为啥突然想起总结对比学习是因为 Learning to Retrieve Prompts for In-Context Learning 提出的 Efficient Prompt Retriever (EPR) 方法,它在 retrieve 部分的方法来源于 Facebook Research 的 Dense Passage Retrieval (DPR)。
设数据集为 \(\mathcal{D}\)。在训练阶段,对于每对训练样本 \((x, y)\),使用一个无监督的检索方法 \(\bar{\mathcal{E}} = R_u((x, y), \mathcal{D})\)。得到的 \(\overline{\mathcal{E}}=\left\{\bar{e}_1, \cdots, \overline{e_L}\right\}\),使用一个打分网络对每个样本进行打分,如
DPR 的正样本可以使用 QA 对中的 Answer,或者从一个段落集合(比如维基百科段落)通过 Answer 找到;DPR 的负样本可以通过采样,也可以通过 in-batch negatives(其实就是 SimCLR);EPR 的取法比较复杂,首先得到打分前 \(k\) 高和后 \(k\) 低的样本集合 \(\mathcal{E}_{\mathrm{pos}}\) 和 \(\mathcal{E}_{\mathrm{neg}}\)。利用这些样本,训练两个网络输入编码器 \(E_X(\cdot)\) 和提示编码器 \(E_P(\cdot)\)。训练样本表示为
的形式,其中 \(e_i^+\) 为正样本,\(e_i^-\) 为负样本。正样本从 \(\mathcal{E}_\mathrm{pos}^{(i)}\) 中抽取,负样本由
- 一个从 \(\mathcal{E}_\mathrm{neg}^{(i)}\) 中抽取的 hard negative
- \(B-1\) 个从同 mini-batch 中其它样本的 \(\mathcal{E}_\mathrm{pos}\) 中抽取(每个集合抽一个)
- \(B-1\) 个从同 mini-batch 中其它样本的 \(\mathcal{E}_\mathrm{neg}\) 中抽取(每个集合抽一个)
。设相似性函数
其中 \(E_X\) 和 \(E_P\) 是两个不同的 encoder
。计算对比学习 loss