楼主: 时光永痕
1000 0

[数据挖掘新闻] 自我监督的对比损失和监督的对比损失的详细研究 [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)四级

12%

威望
0
论坛币
26 个
通用积分
49.8622
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
317 小时
注册时间
2020-7-21
最后登录
2024-5-13

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
自我监督的对比损失和监督的对比损失的详细研究
upervised对比学习论文声称有关监督学习和交叉熵损失VS更好的影像表现和分类任务的监督对比损失一个大问题。让我们深入研究本文的内容。
自我监督的对比损失
?莱姆实际上接近1倍%的改善图像净数据set1。
自我监督的对比损失
从结构上讲,它是一个非常简单的网络分辨率为50的头,它的头尺寸为128。如果需要,还可以添加更多层。
自我监督的对比损失
本文的架构和培训过程
代码self.encoder = resnet50()self.head = nn.Linear(2048,128)def forward(self,x):
壮举= self.encoder(x)
#normalize 128向量是必需的
壮举= F.normalize(self.head(feat),dim = 1)
返回壮举
如图所示,培训分两个阶段进行。
使用对比损失训练(两种变体)
冻结学习到的表示,然后使用softmax损失学习线性层上的分类器。(摘自论文)
以上是很容易解释的。
大号OSS,本文的主要风味理解自我监督对比损失和监督的对比损失。
自我监督的对比损失
从上图1在SCL(监督性对比损失)中可以看出,猫与任何非猫都被对比。这意味着所有的猫都属于同一个标签,并且作为正对工作,而其他非猫则为负。这与三元组数据以及三元组丢失2的工作原理非常相似。
万一您感到困惑,每只猫的图像也会每次都被放大,因此即使是一张猫的图像,我们也会有很多猫。
L oss用于监督对比损失的功能,尽管它看起来很怪异,但实际上非常简单。
图片发布
有监督的对比损失
稍后我们将看到一些代码,但首先是一个非常简单的解释。每个z是经过标准化的128维向量。
意思是|| z || = 1
如果要对u和v两个向量进行归一化,只是要从线性代数重申事实,则意味着uv = cos(u和v之间的角度)
这意味着如果两个归一化向量相同,则它们之间的点积= 1
#尝试使用以下代码说服您将numpy自我导入为np
v = np.random.randn(128)
v = v / np.linalg.norm(v)
打印(np.dot(v,v))
打印(np.linalg.norm(v))
?他损失函数是与每个图像具有一个增强的假设,在分批N个图像创建批量大小= 2 * N
阅读论文部分“泛化为任意数量的正数”1
? umerator EXP(Z我.Z ?)/ tau蛋白是在一个批次中的所有猫的表示。取z i的点积(即第i个图像表示的128个暗淡矢量)与所有第j个第128个暗淡矢量相加,以使它们的标签相同并且i!= j。
图片发布
分子
分母是我第猫形象点缀着一切,只要其不一样的猫形象。取z i和z k的点,使i!= k表示除其本身以外的所有图像都点有该点。
图片发布
分母
?F inally,我们采取了数概率和2 * N-1总而言之批处理总体猫图片,除了本身和鸿沟
图片发布
单只猫形象的损失
牛逼的所有图像损失otal损失总和
图片发布
总体损耗
?颂歌让我们理解了上面使用一些代码火炬。
假设我们的批次大小为4,然后看看如何计算单个批次的损失。
对于4的批量大小,您输入到网络的输入将是8x3x224x224,在这里我拍摄的是图像的宽度和高度224。
之所以使用8 = 4X2,是因为我们总是对每个图像有一个对比度,因此需要相应地编写一个数据加载器。
超级对比资源将为您输出8×128的尺寸,可将其正确分割以计算批次损失。
#batch_size
bs = 4
? umerator代码使计算这部分
图片发布
分子
温度= 0.07 anchor_feature =对比度_feature#注意,我们不做exp它们的原因如下
anchor_dot_contrast = torch.div(
    torch.matmul(anchor_feature,对比度_feature.T),
    温度)
图片发布
根据纸张温度= 0.07
一个nchor点对比在你迷茫的情况下,我们的功能形状是8×128,让我们一3×128矩阵和的转置和点他们,看到下面的图片,如果你能想象。
图片发布
anchor_feature和对比度_feature = anchor_feature.T
anchor_feature = 3×128对比度_feature = 128×3结果为3×3,如下所示
图片发布
结果
如果您发现所有对角线元素本身都是点,那么我们接下来就不要去掉它们。
在inear代数中,如果u和v是两个向量,则当u = v时uv是最大。因此,如果在每一行中取最大值anchor_dot_contrast并求反,则所有对角线将变为0。
让我们将尺寸从128减小到2,以更好地看到这一点以及批处理大小为1。
#resnet输出仅提醒您,我没有进行标准化,但是根据纸张,您需要对炬管功能使用标准化外观。#bs 1和dim 2表示2 * 1x2
特征=火炬.randn(2,2)温度= 0.07
相反的特征=特征
anchor_feature =对比特征
anchor_dot_contrast = torch.div(
    torch.matmul(anchor_feature,对比度_feature.T),
    温度)
print('anchor_dot_contrast = \ n {}'。format(anchor_dot_contrast))logits_max,_ = torch.max(anchor_dot_contrast,dim = 1,keepdim = True)
print('logits_max = {}'。format(logits_max))
logits = anchor_dot_contrast-logits_max.detach()
print('logits = {}'。format(logits))#输出查看对角线anchor_dot_contrast =
张量([[128.8697,-12.0467],
        [-12.0467,50.5816]])
logits_max =张量([[128.8697],
        [50.5816]])
logits =张量([[0.0000,-140.9164],
        [-62.6283,0.0000]])
我问。人工创建标签并创建用于对比计算的适当蒙版。这段代码有点棘手,因此请仔细检查输出。
bs = 4
打印('批量大小',bs)
温度= 0.07
标签= torch.randint(4,(1
打印('标签',标签)
mask = torch.eq(labels,labels.T).float()
print('mask = \ n {}'。format(logits_mask))#对它进行硬编码,以便更容易理解其功能。shape [1]
相反计数= 2
anchor_count =对比度计数mask = mask.repeat(anchor_count,contrast_count)#遮罩自对比度案例
logits_mask = torch.scatter(
    torch.ones_like(mask),
    1,
    torch.arange(bs * anchor_count).view(-1,1),
    0

掩码=掩码* logits_mask
print('mask * logits_mask = \ n {}'。format(mask))
让我们了解输出。
批次大小4
标签张量([[ 3,0,2,3 ]])#上面的意思是在这批4的Periculer中,我们得到了3
#基本上批处理大小X对比计数XC x宽度X高度->检查上面是否混淆了遮罩=
张量([[0.,1.,1.,1.,1.,1.,1.,1.],
        [1.,0.,1.,1.,1.,1.,1.,1.],
        [1.,1.,0.,1.,1.,1.,1.,1.],
        [1.,1.,1.,0.,1.,1.,1.,1.],
        [1.,1.,1.,1.,0.,1.,1.,1.],现在很容易理解自我监督的对比损失,这比这更简单。
        [1.,1.,1.,1.,1.,0.,1.,1.],
        [1.,1.,1.,1.,1.,1.,0.,1.],
        [1.,1.,1.,1.,1.,1.,0.]])#这非常重要,因此我们创建了mask = mask * logits_mask,它告诉我们第0个图像表示是应该与之对比的图像。#所以我们的标签是标签张量([[3,0,2,3]])
#我重命名它们以更好地了解张量([[3_1,0_1,2_1,3_2]])
#因此,在3_0处将与其自身的增强进行对比,后者在第一行的位置5(索引= 4)和位置8(索引= 7)处被标记为零的位置
请参阅下面的图片,以更好地了解mask * logits_mask =
张量([[0.,0.,0.,1.,1.,0.,0.,1.],
        [0.,0.,0.,0.,0.,1.,0.,0.],
        [0.,0.,0.,0.,0.,0.,1.,0.],
        [1.,0.,0.,0.,1.,0.,0.,1.],
        [1.,0.,0.,1.,0.,0.,0.,1.],
        [0.,1.,0.,0.,0.,0.,0.,0.],
        [0.,0.,1.,0.,0.,0.,0.,0.],
        [1.,0.,0.,1.,1.,0.,0.,0.]])
自我监督的对比损失
第一行如何标记3张第一张图像将与其他图像进行对比
一个nchor点相反,如果你从上面下面记住。
logits = anchor_dot_contrast — logits_max.detach()
再次亏损
图片发布
单只猫形象的损失
数学回顾
自我监督的对比损失
记录a / b
自我监督的对比损失
推导
我们已经有第一部分的点积除以tau作为logit。
上式的第二部分等于torch.log(exp_logits.sum(1,keepdim = True)) exp_logits = torch.exp(logits)* logits_mask
log_prob = logits-torch.log(exp_logits.sum(1,keepdim = True))#计算对数似然比的正平均值
mean_log_prob_pos =(掩码* log_prob).sum(1)/ mask.sum(1)#丢失
损失=-mean_log_prob_pos损失= loss.view(anchor_count,4).mean()
print('19。loss {}'。format(loss))
我认为这是有监督的对比损失。我认为现在很容易理解自我监督的对比损失,这比这更简单。
甲ccording到纸张上,更contrast_count使得更好的模型,该模型是不言自明的。需要修改损失函数以获得2个以上的对比度计数,希望您可以在上述说明的帮助下尝试一下。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:自我监督 CONTRAST feature forward Scatter

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-21 01:23