Advertisement

《Contrastive Learning with Hard Negative Samples》阅读笔记

阅读量:

《Contrastive Learning with Hard Negative Samples》阅读笔记

1 动机和思路

对比学习在无监督表征学习领域的潜力无需多言,已经有非常多的例子证明其效果,目前比较多的针对对比学习的改进包括损失函数、抽样策略、数据增强方法等多方面,但是针对负对的研究相对而言更少一些,一般在构造正负对时,大部分模型都简单的把单张图像及其增强副本作为正对,其余样本均视为负对。这一策略可能会导致的问题是模型把相距很远的样本分得很开,而距离较近的负样本对之间可能比较难被区分。

基于此,本文构造了一个难负对的思想,主要目的在于,把离样本点距离很近但是又确实不属于同一类的样本作为负样本,加大了负样本的难度,从而使得类与类之间分的更开,来提升对比学习模型的表现。

2 方法

2.1 难负样本选取原则

好的难负样本有两点原则:1)与原始样本的标签不同;2)与原始样本尽量相似。

这一点就与之前的对比学习有比较明显的差异了,因为对比学习一般来说并不使用监督信息,因此除了锚点之外的其他样本,不管标签如何,都被认为是负对,所以问题的一个关键在于“用无监督的方法筛出不属于同一个标签的样本 ”。不仅如此,这里还有一个冲突的地方,既要与锚点尽可能相似,又得不属于同一类,这对于一个无监督模型来说是有难度的,因此本文在实际实现过程中进行了一个权衡,假如对样本的难度要求不是那么高的时候,就只满足原则1,而忽略原则2 。同时,这种方法应该尽量不增加额外的训练成本

2.2 具体方法

本文的重点在于如何进行难负样本采样,首先作者给出难负样本的采样分布函数:

即难负样本分布以与正类类别不同为条件的概率分布,q_β(x^-)是正负样本点积乘以系数β之后的指数项再乘以单纯的负样本采样分布,β控制采样的难易程度,值越大,代表样本越难。点积越大,q_β(x^-)就越大,表示这个样本更容易被采样,结合原则2,即尽量采样困难负样本。

但是这里没有解决原则1的问题,对于无监督方法,我们仍然不知道该怎么确定采样到的负样本与锚点的标签是不是一致的,这里作者用PU-learning的思想,把负样本分布q_β(x^-)拆成来自同标签分布q_β^+(x^-)与来自不同标签分布q_β^-(x^-)的两个部分:

这里对于来自q_β^+(x^-)的样本同样施以原则2,即为:

所以满足原则1和原则2的难负样本分布就可以写为:

上式的第一项就是常规的负样本分布,第二项作者提到可以使用语义保留转换去估计这一分布,传统无监督对比学习做的就是这件事儿。

所以原始对比损失:

就可以改写为只使用难负样本的情况:

分母第二项大括号里头的第一项就是之前的总负样本,第二项就是和锚点相似度很高的来自同一类的负样本。所以只需要求出分母中的两个均值,这个损失就算是给出来了。

计算这两项均值的方法,作者用的是蒙特卡洛重要性采样:

式子右边分母的Z_βZ_β^+是两个配分函数,可以用均值近似:

作者提出,在pytorch框架下,这个操作只需要额外两行代码九就能搞定,不需要做另外的操作。

3 实验

作者以SimCLR为Baseline在几个数据集上进行了实验,给出了对应的实验效果:

发现使用这种难负样本机制有所改善。

第二点是作者把训练好的,模型用到下游分类任务中,给出分类精度:

在部分数据集上比baseline有所提升。

但是这个β值并不是越大越好的,过大可能也存在问题:

可以发现,在β设置得较大的时候,模型的质量甚至会下降。

4 总结

实际上这个工作非常简单,思路就是在传统对比学习的基础之上,根据锚点与其负对计算出来的所有点积的大小来加权,使得与正对相似性高的负对的权重更大,相似性低的权重更小,从而来诱导编码器更加准确地进行区分,而它说的负对要来自于不同标签的样本,在无监督框架下并没有很好地体现,这部分主要是用了别人的工作,而不是他的原创,看代码可以发现,在这个地方实际上就是给锚点和其负对的点积减去了其正对的点积乘以认为设定的负样本中包含正样本的概率进行去正样本的近似,代码可以说是非常简洁,改动不大,有兴趣地话可以参考其官方pytorch代码:https://github.com/joshr17/HCL

全部评论 (0)

还没有任何评论哟~