作者|Samrat Saha 编译|VK 来源|Towards Datas Science
Supervised Contrastive Learning这篇论文在有监督学习、交叉熵损失与有监督对比损失之间进行了大量的讨论,以更好地实现图像表示和分类任务。让我们深入了解一下这篇论文的内容。
论文指出可以在image net数据集有1%的改进。
就架构而言,它是一个非常简单的网络resnet 50,具有128维的头部。如果你想,你也可以多加几层。
Code
self.encoder = resnet50()
self.head = nn.Linear(2048, 128)
def forward(self, x):
feat = self.encoder(x)
#需要对128向量进行标准化
feat = F.normalize(self.head(feat), dim=1)
return feat
如图所示,训练分两个阶段进行。
使用对比损失的训练集(两种变化)
冻结参数,然后使用softmax损失在线性层上学习分类器。(来自论文的做法)
以上是不言自明的。
本文的主要内容是了解自监督的对比损失和监督的对比损失。
从上面的SCL(监督对比损失)图中可以看出,猫与任何非猫进行对比。这意味着所有的猫都属于同一个标签,都是正数对,任何非猫都是负的。这与三元组数据以及triplet loss的工作原理非常相似。
每一张猫的图片都会被放大,所以即使是从一张猫的图片中,我们也会有很多猫。
监督对比损失的损失函数,虽然看起来很可怕,但其实很简单。
稍后我们将看到一些代码,但首先是非常简单的解释。每个z是标准化的128维向量。
也就是说||z||=1
重申一下线性代数中的事实,如果u和v两个向量正规化,意味着u.v=cos(u和v之间的夹角)
这意味着如果两个标准化向量相同,它们之间的点乘=1
#尝试理解下面的代码
import numpy as np
v = np.random.randn(128)
v = v/np.linalg.norm(v)
print(np.dot(v,v))
print(np.linalg.norm(