CLIP 对比学习 源码理解快速学习

最快的学习方法,理清思路,找视频讲解,看源码逻辑:
CLIP 源码讲解 唐宇

输入: 图像-文本成对配对的数据
训练模型的过程(自己理解):

怎么做的?:利用数据内部特征,相似与不相似,学习到能够同时表示图像和文本的潜在特征(相当于把图像和文本在同一个潜在空间里进行特征学习和表示)

为什么能学到呢?:相当于我已知这个图像跟这个文本是配对的,是相似的,或者说这两个东西是一个意思,然后把这两个当成正样本,计算正样本的相似度要越大越好,即学习到的图像和文本的潜在特征表示进行运算后得到的相似度要越大越好,所以反向约束表示图像和文本的特征要能够彼此互通,图像的特征向量能够跟文本的特征向量在语义上能够互相认识彼此,从而认出彼此是相似的。

对比损失函数:
对比损失函数
si,i :正样本相似度
si,k:负样本相似度
优化方向:分母的负样本相似度越小越好,小到0可忽略不计,这时正样本上下抵消为1,log1=0,loss为0.
τ是一个神秘的参数,大部分论文都默认采用较小的值来进行自监督对比学习(例如0.05)

注意一下细节!!:分母上要有个x和正样本的相似度,分母上的除了自己本身外的所有样本,自己跟1个正样本和其余所有负样本的相似度。

  • 对比损失是一个具备困难负样本自发现性质的损失函数,这一性质对于学习高质量的自监督表示是至关重要的。关注困难样本的作用是:对于那些已经远离的负样本,不需要让其继续远离,而主要聚焦在如何使没有远离的负样本远离,从而使得表示空间更均匀(Uniformity)
  • τ的作用是调节模型困难样本的关注程度:τ 越小,模型越关注于将那些与本样本最相似的负样本分开

累加是相当于i要跟多个非i的剩余负样本计算,比如有5-5的图像文本对,1-1为正样本,1跟2~5都为负样本,都要计算相似度,所以要累加。

模型能力(用训练好的模型进行推理):

  1. 给一个模型没见过的图像,和几个没见过的文本,能够判断图像跟哪个文本是更加配对的~ 具有泛化能力,相当于我模型已经能够编码图像和文本并且让图像和文本能够互相认识彼此。
  2. 给一个模型没见过的文本,和几个没见过的图像,能够判断文本跟哪个图像更加配对,同理。

对应CLIP源代码实现细节: (图略有些糊)

  1. 计算图像和文本的表示向量
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

enc_text经过编码后维度为(4,257,512),有4条文本,256个token级的特征和1个全局特征加一起为257。
enc_imge 经过视觉编码后维度为(4,46,152),

这里区分了一下是细粒度对比学习还是简单的对比学习(一个文本一个向量表示)
在这里插入图片描述
在这里插入图片描述

如果是简单的对比学习,就取cls_token作为整个句子的文本嵌入向量。此时text_embs维度为(4,152), 同理,图像也取全局的一个token作为整个图像的嵌入向量表示,image_embeds也为(4,512)

  1. 计算对比损失
    2.1. 计算相似度(具体有两种情况,但最终都是一样,计算图像和文本相似度)
    在这里插入图片描述
    在这里插入图片描述
    2.2 按照损失公式的运算计算对比损失(exp,log等操作)
    exp 运算
    在这里插入图片描述

计算分子(正样本相似度), 需要用matrix_diag 标记区分
在这里插入图片描述

matrix_diag 对角矩阵(矩阵斜线上都为true(表示正样本),其余为false ,(表示负样本))
在这里插入图片描述

计算分母(负样本相似度)t.masked_fill(pos_mask,0) 把斜对角线上设置为0(正样本),其余设置为1
在这里插入图片描述

最终计算contrastive loss,loss计算加上 -log
在这里插入图片描述

取平均作为最终的loss
在这里插入图片描述

SimCLR 内部成对正样本计算:

这里补充一下对比损失(contrastive loss)与交叉熵损失(cross-entropy)的关系【本质可以看做一样,所以下面的计算是直接按交叉熵简化直接算的】:对比损失可以视作添加了变换不确定性(温度系数)的非参数分类损失。假设我们忽略温度系数,对比损失(contrastive loss)就是交叉熵损失(cross-entropy)。 唯一的区别是,在cross entropy loss里,k指代的是数据集里类别的数量,而在对比学习InfoNCE loss里,这个k指的是负样本的数量。
在这里插入图片描述在这里插入图片描述

上式分母中的sum是在1个正样本和k个负样本上做的,从0到k,所以共k+1个样本,也就是字典里所有的key。恺明大佬在MoCo里提到,InfoNCE loss其实就是一个cross entropy loss,做的是一个k+1类的分类任务,目的就是想把这q个图片分到这k+1个类。

**加粗样式**

关于交叉熵里的label,继续补充细节:
前面说到了,对比学习的损失可以看成交叉熵损失,即解决一个多分类问题,相当于把第q个样本分到k+1个类里去,即label为一个多分类的label(每个样本的ground truth标签),大小为batch_size,mask用于标记是否为正样本对,当两个样本i,j的label相等时,mask_{i,j}=1。
在这里插入图片描述

补充:对比学习前再经过几个MLP层进行特征提取
在这里插入图片描述

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值