对比学习——CLIP
clip本身也是对比学习。
大模型需要大数据,大数据标签怎么办?标注代价太大
你是我的正样本呢?还是我的负样本?没有标签,只做正负例的判断
常见的SimCLR
打死也不自己标注数据,无监督
对比学习中,bs 要非常大,原论文中 bs=8192(1个样本与另外8191个样本互为负样本)
注意:做的不是分类任务,对比学习仅需要分别两个样本是不是同一个东西。
图片:SimCLR
文本:SimCSE
文本的正样本不好做。 通过 dropout 来做正样本。 align表示同类之间的距离。(49408 每个字都是49408中的一个数,类似用256表示图像一样)
图像有数据增强,不用 dropout 了。
CLIP-文本和图像进行结合。
VIT
输入size,(4,3,256,256) ,为了序列化输入进 transformer 中,利用 patch 进行分块。patch_size=32。
(4,3,256,256) -> b c (h p1) (w p2) -> 4,3, 8 32 8 32 # 256/32=8
-> b (h w) (p1 p2 c) -> 4 64 3072 # 32*32*3=3072
4是 batchsize 是不变的。64是图像所划分的小块,相当于64个 token。
3072是每个小块的向量维度。
+ pos_emb 位置编码
经过transformer 特征提取后,得到 out # 4,64,512(64个位置)
to_cls_tokens(out) 求全局特征,cls_to_tokens=4,1,512
最终得到 4,65,512。。。走几个全连接, 得到260,128。
CLIP
zero shot 指没有在数据集训练过进行测试
从自然语言去学习图像特征的方法,利用自然语言的监督信号训练视觉模型,
linear-probe,一旦预训练的模型训练好了, 我们把它冻住,整个 backbone 骨干网络就不改变了,只是从这个 model 里抽特征,训练最后一层分类头,做分类任务。
在 CLIP 中相当于,同一张图片,图像数据增强后,第一个图片 经过 VIT 进行特征提取,返回特征 query 160,128;第二个图片 经过 VIT 进行特征提取,返回特征 key 160,128
在batch=4的情况下,怎么算既有正样本又有负样本呢?
4个图片,分别是猫、狗、猪、鸭。key1,query1是猫通过图像增强得到的2个图片;key2,query2是狗通过图像增强得到2个图片。
key1,query1是互为正样本;
key2,query2是互为正样本;
(key1,key2) 、 (key1,query2) 都是负样本
但不知道通过 nt_xent_loss 是如何实现的
VIT里会更细致,具体到每个块(腿、眼睛)像不像。
260=4*65(全局特征1+64个位置特征?是叫位置特征吗?)
得到520*520的矩阵,代表每一个小块和其余小块的关系。不能考虑自己,去掉对角线,得到520*519。
temperature 温度系数,扩大 softmax 的差异。
正样本的标签是自动生成的。总长520。259配对0。
labels如下,518-259+1=260
loss=F.cross_entropy(logits, labels, reduction='sum')
loss/=n # n=520,求平均损失
logits # 520,519
labels # 259,260
CLIP
文本模型内部做完形填空,mask language model。-> enc_text
图像模型内容做 simCLR 利用vit做对比学习。-> enc_image
enc_text与enc_image再做对比学习
text_embeds=enc_text[;,0] # 0是'CLS',全局特征,4,512
images_embeds=enc_image[;,0] # 4,512,我理解应该是4,65,512求均值得到4,512
# t - sequence dimension along text tokens
# i - sequence dimension along image tokens
text_to_iamge = einsum('t d, i d - > t i', text_latentes, image_latentes) * temp
# text_latentes 4,512
# image_latentes 4,512
# text_to_iamge 4,4 # 4个文本和4个图像之间的关系
image_to_text = rearrange(text_to_image, '... t i -> ... i t')
# text_to_iamge 4,4 # 4个图像和4个文本之间的关系
QA
对比学习和孪生网络的区别
孪生网络要共享权重参数,公用一个网络结构;
但是对比学习两个模型可以一点都不一样,不用共享参数;
对比学习、自监督学习(Bert):都不需要标签
Q:两只不同的猫遇到了,不就是负样本,不就错了吗?
A:因为做的不是分类任务,对比学习是在看谁是我,谁不是我。
对比学习主要是在提取特征,为其他任务提供 backbone。
正样本都是数据增强得到的,对比学习是在学习提特征的能力
basemodel 都是基于分类任务做的,是否会限制住 model 的能力呢?对比学习就不会限制 。
Transformer 取代RNN\CNN 进入大模型时代
self attention 模块:核心内容是为输入向量的每个单词学习一个权重。通过给定一个任务相关的查询向量 query,计算 query和各个key 的相似性或者相关性得到注意力分布,即得到每个key 对应 value 的权重系数,然后对 value 进行加权求和得到最终的 attention 数值。
需要对 Q 和 K 进行点乘并除以维度的平方根,对所有向量的结果进行 softmax 处理,获得向量之间的关系。
【对比学习有多火?文本聚类都被刷爆了!通俗易懂的讲解让我直接悟了啊!】 https://www.bilibili.com/video/BV1iR4y1R7dH/?share_source=copy_web&vd_source=694333d73ad23f4f70f7df5508d4f30a
https://www.bilibili.com/video/BV1iR4y1R7dH/?spm_id_from=333.337.search-card.all.click&vd_source=dc27cbd311ff3ca278726381630036f0
对比学习、自监督学习(Bert):都不需要标签