1. 何为对比
2. 如何构造正负样本
3. 对比学习loss
(相关资料图)
4. 对比学习loss代码
1. 何为对比「对比学习」属于无监督学习的一种,即给一堆数据,没有标签,自己学习出一种特征表示。
我们知道的无监督方法有聚类(迭代地更新聚类中心,让属于同一类的样本更近,不同类的样本更远),自编码器(输入x->特征隐层编码->解码恢复出x",让x"和x接近),那对比学习又是怎么个操作,怎么构建loss反向传播呢?
对比学习,关键是「对比」,根据聚类和自编码器的思想,对比应该也是有A和B更近,A和C更远这种比较性的思想的。所以关键在于如何拿到B和C。(其实聚类也算是一种对比)
何为对比?
2. 如何构造正负样本深度学习时代万物皆可创造,没有数据也能造出来数据,最简单的构造样本的方式是这样的:
先来看B,B和A是更近的样本,学名叫“正样本”,怎么造B?只要跟A很像就行了呀,这不就是数据增强吗?拿图片来说,图片旋转、剪切等增加方式都可以往上堆了。文本也有很多增强方式,比如回译(英文-翻译成中文-再翻译回英文),相似词替换等等。
图像正样本构造方法(来自文献[1])
C是和A不像的样本,学名叫“负样本”,最简单粗暴直接的方式就是其他样本都是负样本,因为其他样本和它长的不一样。
3. 对比学习loss那loss函数其实和聚类思想一样了,A的特征和正样本的距离近,和其他样本的距离远。训练的时候一般会用两个encoder(如ResNet)分别对样本A和它的正负样本提取特征,再分布映射到新的表示空间(比如采用MLP层),在这个空间里根据对比loss训练模型参数。
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 对比学习
标签: