Contrastive Learning
最近看了两篇关于对比学习(Contrastive Learning)的论文,觉得思路挺有意思,所以总结一下。
对比学习
不知道大家有没有小时候抽读课文的回忆,当读到不认识读字时,我们就会猜他的发音。猜的时候呢,通常就是先看看他的组成部分里有没有认识的,如果有,则读认识的部分的发音,即读半边
, 如果拆开的部分不是独立的字,那我们就会联想一下有哪些字跟他有共同的部分,然后那些字都是如何发音的。即便到了现在,遇到不认识的字,我依然会使用这种方法去读
. 而这背后的原理其实就是我们认为,该字(样本x)与其相似的字(距离更近的样本)具有相同的发音(label)。这样一个没有经过多少学习的模型
却在很多时候都是奏效的。
而对比学习与这有着相似的含义:我们在学习表示的时候,不需要完完全全的学习样本的细节,只需要让样本相对其正样本的得分远远大于其相对负样本的得分即可:
$$
s(f(x), f(x^+)) >> s(f(x),f(x^-))
$$
其中 $f$是映射函数,也是我们的主要学习任务,$s$是一个打分函数,用来衡量样本之间的距离,最常用的如点积。
以上就是一个对比学习的框架,而要使用对比学习,核心问题只有两个:
- 如何定义目标函数,上面提到的点积就是一种比较简单通用的方式,此外,还可以用triple-loss等。
- 如何构造正负样本,正负样本的构造,合理的正负样本,才能让学到的表示更好的作用在下游任务上。
此外,如果熟悉Word2Vec的同学也会发现,其实负采样也在对比学习的范畴中,即在使用负采样训练Word2Vec 时,我们的优化目标是让正样本对之间的概率尽可能的大,而其与负样本之间的概率尽可能小,也即拉近正样本对之间的距离。其中定义的目标函数使用的是点积,而正样本的构造是通过窗口大小来选取,负样本的构造即负采样。
对比学习的自监督学习
目前学习表示的主流是自监督学习,那为了引入对比学习,我们就需要构造样本的正负样本,其中可以将所有非自己的样本都认为是负样本,需要拉远,那如何构造正样本呢?答案是data augmentation(数据增强)。在CV 中通常用旋转、裁剪等