【深度学习6】对比学习(Contrastive Learning)入门

主要内容:

1. 何为对比

2. 如何构造正负样本

3. 对比学习loss

4. 对比学习loss代码

1. 何为对比

「对比学习」属于无监督学习的一种,即给一堆数据,没有标签,自己学习出一种特征表示。

我们知道的无监督方法有聚类(迭代地更新聚类中心,让属于同一类的样本更近,不同类的样本更远),自编码器(输入x->特征隐层编码->解码恢复出x',让x'和x接近),那对比学习又是怎么个操作,怎么构建loss反向传播呢?

【深度学习6】对比学习(Contrastive Learning)入门_第1张图片

对比学习,关键是「对比」,根据聚类和自编码器的思想,对比应该也是有A和B更近,A和C更远这种比较性的思想的。所以关键在于如何拿到B和C。(其实聚类也算是一种对比)

【深度学习6】对比学习(Contrastive Learning)入门_第2张图片

何为对比?

2. 如何构造正负样本

深度学习时代万物皆可创造,没有数据也能造出来数据,最简单的构造样本的方式是这样的:

先来看B,B和A是更近的样本,学名叫“正样本”,怎么造B?只要跟A很像就行了呀,这不就是数据增强吗?拿图片来说,图片旋转、剪切等增加方式都可以往上堆了。文本也有很多增强方式,比如回译(英文-翻译成中文-再翻译回英文),相似词替换等等。

【深度学习6】对比学习(Contrastive Learning)入门_第3张图片

图像正样本构造方法(来自文献[1])

C是和A不像的样本,学名叫“负样本”,最简单粗暴直接的方式就是其他样本都是负样本,因为其他样本和它长的不一样。

3. 对比学习loss

那loss函数其实和聚类思想一样了,A的特征和正样本的距离近,和其他样本的距离远。训练的时候一般会用两个encoder(如ResNet)分别对样本A和它的正负样本提取特征,再分布映射到新的表示空间(比如采用MLP层),在这个空间里根据对比loss训练模型参数。

【深度学习6】对比学习(Contrastive Learning)入门_第4张图片

end-to-end对比学习方式[2]

对比学习常用loss——InfoNCE [2]

其中q就是我们的样本A的特征,k+是正样本,k_i是其他样本。

具体使用的时候,最直接最简单粗暴的训练方式是:以采用一种数据扩增为例,一个batch为N的训练样本,通过数据扩增,变成了2N个样本,其中有1个正样本,2N-2个负样本。

常用的loss:

NT-Xent loss,全称为Normalized Temperature-scaled Cross Entropy Loss

来自[1]simCLR

一个batch 有N 个样本,两条分支就有2N个samples。对于一个anchor样本i,除了对应的augmented image和自己,其余2N-2个都是负样本。分子是正样本之间的相似度,分母是负样本之间相似度。

最终的Loss是每个batch里所有样本对的loss和求平均。

代码实现:

对比损失的PyTorch实现详解_Adenialzz的博客-CSDN博客_对比损失

对比学习Python实现_Reacubeth的博客-CSDN博客_python 对比学习

你可能感兴趣的:(DeepLearn,学习笔记,深度学习,学习,聚类)