©PaperWeekly 原创 · 作者 | 海晨威
研究方向 | 自然语言处理
2020 年的 Moco 和 SimCLR 等,掀起了对比学习在 CV 领域的热潮,2021 年的 SimCSE,则让 NLP 也乘上了对比学习的东风。下面就尝试用 QA 的形式挖掘其中一些细节知识点,去更好地理解对比学习和 SimCSE。
如何去理解对比学习,它和度量学习的差别是什么?
对比学习中一般选择一个 batch 中的所有其他样本作为负例,那如果负例中有很相似的样本怎么办?
infoNCE loss 如何去理解,和 CE loss有什么区别?
对比学习的 infoNCE loss 中的温度常数的作用是什么?
SimCSE 中的 dropout mask 指的是什么,dropout rate 的大小影响的是什么?
SimCSE 无监督模式下的具体实现流程是怎样的,标签生成和 loss 计算如何实现?
如何去理解对比学习,它和度量学习的差别是什么?
对比学习的思想是去拉近相似的样本,推开不相似的样本,而目标是要从样本中学习到一个好的语义表示空间。
论文 [1] 给出的 “Alignment and Uniformity on the Hypersphere”,就是一个非常好的去理解对比学习的角度。
好的对比学习系统应该具备两个属性:Alignment和Uniformity(参考上图)。
所谓“Alignment”,指的是相似的例子,也就是正例,映射到单位超球面后,应该有接近的特征,也即是说,在超球面上距离比较近;
所谓“Uniformity”,指的是系统应该倾向在特征里保留尽可能多的信息,这等价于使得映射到单位超球面的特征,尽可能均匀地分布在球面上,分布得越均匀,意味着保留的信息越充分。分布均匀意味着两两有差异,也意味着各自保有独有信息,这代表信息保留充分(参考自 [2])。
度量学习和对比学习的思想是一样的,都是去拉近相似的样本,推开不相似的样本。但是对比学习是无监督或者自监督学习方法,而度量学习一般为有监督学习方法。而且对比学习在 loss 设计时,为单正例多负例的形式,因为是无监督,数据是充足的,也就可以找到无穷的负例,但如何构造有效正例才是重点。
而度量学习多为二元组或三元组的形式,如常见的 Triplet 形式(anchor,positive,negative),Hard Negative 的挖掘对最终效果有较大的影响。
对比学习中一般选择一个 batch 中的所有其他样本作为负例,那如果负例中有很相似的样本怎么办?
在无监督无标注的情况下,这样的伪负例,其实是不可避免的,首先可以想到的方式是去扩大语料库,去加大 batch size,以降低 batch 训练中采样到伪负例的概率,减少它的影响。
另外,神经网络是有一定容错能力的,像伪标签方法就是一个很好的印证,但前提是错误标签数据或伪负例占较小的比例。
PS:也确有人考虑研究过这个问题,可以参考论文 [3][4]。
infoNCE loss 如何去理解,和 CE loss 有什么区别?
infoNCE loss 全称 info Noise Contrastive Estimation loss,对于一个 batch 中的样本 i,它的 loss 为:
要注意的是,log 里面的分母叠加项是包括了分子项的。分子是正例对的相似度,分母是正例对+所有负例对的相似度,最小化 infoNCE loss,就是去最大化分子的同时最小化分母,也就是最大化正例对的相似度,最小化负例对的相似度。
上面公式直接看可能没那么清晰,可以把负号放进去,分子分母倒过来化简一下就会很明了了。
CE loss,Cross Entropy loss,在输入 p 是 softmax 的输出时:
在分类场景下,真实标签 y 一般为 one-hot 的形式,因此,CE loss 可以简化成(i 位置对应标签 1):
看的出来,info NCE loss 和在一定条件下简化后的 CE loss 是非常相似的,但有一个区别要注意的是:
infoNCE loss 中的 K 是 batch 的大小,是可变的,是第 i 个样本要和 batch 中的每个样本计算相似度,而 batch 里的每一个样本都会如此计算,因此上面公式只是样本 i 的 loss。
CE loss 中的 K 是分类类别数的大小,任务确定时是不变的