这里写目录标题
- 什么是对比学习
- 计算机视觉中的对比学习
- 对比学习在NLP中的应用
什么是对比学习
对比学习是在没有标签的前提下学习样本之间的是否相似,其实和二分类比较相似,判断两个图像是不是属于同一个类别。换句话来说就是把相近的分布推得更近,不相近的分布推得更远。对比学习是自监督学习的一种。自监督学习有着自己给没有标签添加标签的能力,置信度最高的标签将会成为下一轮的GT从而来监督模型训练。在对比学习中就是给让模型根据特征的相似程度来将输入标记成正样本或者是负样本。他和半监督和无监督有着明显的不同,这里需要稍微注意一下。
计算机视觉中的对比学习
简单来说,对比学习的目的是为了从原数据中提取出更加高质量和细致的特征,然后去做下游任务。对比学习可以刺激模型从数据中提取更多更细的特征。首先要做的是生成正样本和负样本。我们输入进去的图像我们叫做anchor, 这里的正样本就是通过输入数据进行增强得到的图像。负样本可以是任意其他在数据集中的图像。虽然视觉上经过增强的图像和原来输入的图像已经有了明显的区别,但是图像本身的信息是没有发生改变的。 将经过增强的图像输入进encoder中得到一个低纬度的向量,这个encoder可以是transformer或者是resnet等。将获得的特征经过mlp映射之后,比较两者之间的相似度即可。 为什么要用mlp映射之后在比较呢? 添加mlp是为了让特征更具有针对性,更加适合某一个特定的任务。从encoder中提取出来的特征往往泛化能力更好,但是针对性会相对差一些。因为需要通过比较来学习图像之间的相似和不同,对比学习对负样本以及batch size 相对比较敏感,如果学习的时候负样本很少,或者没有,会使得模型崩塌,偏离学习目标。如果batch size较少,则每一个batch的对比次数较少,会不太容易收敛。这里所说的负样本指出输入意外的所有样本。 例如如果一个batch 中有512个样本,每一个就会发成511次比较。
对比学习的学习objective,有很多不同的藐视,但是最基本的是Max margin Contrastive Loss。这个损失就是最大化不同样本之间的距离,最小化相同样本之间距离。
还有一个常见的损失叫做Triplet Loss,本质上和上述的损失原理差不多,不同在于上述损失没有将anchor考虑进来,Triplet Loss考虑进来了。 Triplet Loss 表示为:
从上述可以看出,对比学习中,负样本的重要性,但是早期也有模型声称可以不使用负样本进行对比学习。这个模型叫BYOL,前面的结构都差不多。和之前不同的是,这个模型不在比较输出两个向量的相似度了,然后将一个值看成预测值,一个看作GT,将这个任务变成了有点像回归任务,让这两个值之间的loss最小。 具体示意图:
根据后续的一些研究发现,这种方式之所以能行,是因为在映射的时候使用了batch normalization。因为BN它考虑的是整个batch里所有的样本,如果Batch够大的话,在计算的时候,也考虑进了负样本的均值和方差。所以让学习的效果很好。虽然表面上看来确实没有使用负样本,但是在后续计算的时候也考虑了负样本。
对比学习在NLP中的应用
NLP中的不相同的句子可能会表示一样的意思,同样的句子可能会表示不同的意思。 SIMCSE提供了一个简单的思想,那就是添加dropout. 因为dropout会随机的惩罚模型,也就是会随机的扔掉一些特征。 从另一个角度思考也就是,dropout 提供了一个集成模型(因为每一次dropout之后,模型的参数都会发生改变)。那么同一个句子就会产生不同的输出,但是归根揭底,不同的输出表示的确实同一句话的意思。那么我们就可以把通过dropout输出的看作是anchor的正样本。负样本和之前视觉中的定义差不多。