下的多个内文本同时读出
赞
踩
论文地址:CLIP论文地址
代码地址:CLIP代码地址
目录
原理:传统的分类模型需要先验的定义固定的类别,然后经过CNN提取特征,经过softmax进行分类
Defect: 想加入新的一类需要重新定义这个类别的标签,并重新训练模型
原理:对比学习&相似度训练
如人脸识别,模型的数据集两种:
(1)一对一对同样的人的两张人脸一起训练,提取特征之后计算特征向量之间的余弦相似度,相似度高的认为是同一张人脸,从而达到人脸识别的效果。
(2)三张图片一起训练,即两张一样的人脸外加一张其他人脸,使得一样的人脸相似度高,不一样的人脸相似度低。
简介:CLIP是利用文本信息训练一个可以实现zero-shot的视觉模型。被称为多模态大模型,零样本学习方法。最大的贡献在于打破了固定类别标签范式。CLIP在训练的过程中,将句子和图片匹配,然后在推理过程中找到与之最接近的模板句子。CLIP模型在训练过程中,用到了4亿组图像文本对,涵盖了自然界中的大部分场景。
网络结构:CLIP的网络结构主要包含Text Encoder和Image Encoder两个模块,分别提取文本和图像特征,然后基于比对学习让模型学习到文本-图像的匹配关系。
CLIP使用大规模数据(4亿文本-图像对)进行训练,基于海量数据,CLIP模型可以学习到更多通用的视觉语义信息,给下游任务提高帮助。具体步骤如下:
(1)输入的文本和图像分别经过各自的Encoder处理成特征向量;
(2)构建关系矩阵。形如图1左边的矩阵,图1左边的矩阵中的每一个元素都是每一个图像特征向量和其他文本特征向量的余弦相似度。该矩阵中主对角线的元素都是匹配的(图像和文本特征完全对应),其他地方的元素并不匹配。
(3)主对角线的余弦相似度尽可能的最大,其他地方的余弦相似度尽可能的最小。
图1:CLIP网络结构图
原理:CLIP采用对比学习。对比学习是一种学习相似性度量的方法,它的核心思想是通过将同一组数据中的不同样本对进行比较,来学习它们之间的相似度或差异度。
在CLIP模型中,对比学习被用来训练模型学习视觉和语言的相互关系。具体来说,CLIP模型将图像和文本映射到同一表示空间,并通过对比不同图像和文本对之间的相似性和差异性进行训练,从而学习到具有良好泛化能力的特征表示。如果是预测一个图像所对应的文本,需要逐字逐句的去预测,非常复杂,效率较低,因为一张图像可能有多种文本描述,如果是使用对比学习的方法,预测一个图像和一个文本是否配对,那任务就简单很多。将预测性目标函数换成对比性目标函数,训练效率提高了四倍。
训练:CLIP在训练过程中,取一个batch_size的图像文本对,图像经过Image Encode, 文本经过Text Encoder,然后在向量之间计算余弦相似度,结果就如图2所示,对象线上的元素分别是一一对应的。那么文本编码和图像编码之间的相似度的也该是最高的,即在对比学习中,对角线上的元素即为正样本,其余非对角线元素为负样本。因此这个模型经过训练后,能实现的最终理想目标就是一组图像文本对,图像经过Image Encoder编码和文本经过Text Encoder的编码应该是一摸一样的。
图2:CLIP对比预训练图
预训练网络的输入是文字与图片的配对,每一张图片都配有一小句解释性的文字。将文字和图片分别通过一个编码器,得到向量表示。这里的文本编码器就是 Transformer;而图片编码器既可以是 Resnet,也可以是 Vision transformer。
输入输出: 普通有分类标签的监督学习的模型,输入的是已知的图片,不用再输入标签,自行分类,其实标签是已经在了,这是全包围的。CLIP输入的可以是外来没有训练过的图片,输入这个图片对应的文字到文字库里面,然后也可以正确分类。
为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WebImageText,如果按照文本的单词量,它和训练GPT-2的WebText规模类似,从数量上对比的话,比谷歌的JFT-300M数据集多一个亿,所以说这是一个很大规模的数据集。CLIP虽然是多模态模型,但它主要是用来训练可迁移的视觉模型。所有的模型都训练32个epochs,采用AdamW优化器,而且训练过程采用了一个较大的batch size:32768。由于数据量较大,最大的ResNet模型RN50x64需要在592个V100卡上训练18天,而最大ViT模型ViT-L/14需要在256张V100卡上训练12天,训练CLIP需要耗费非常大的资源。
CLIP推理: zero-shot 推理
给定一张图片,如何利用预训练好的网络去做分类呢?这里论文很巧妙地设置了一道“多项选择”。具体来说,给网络一堆分类标签,比如cat, dog, bird,利用文本编码器得到向量表示。然后分别计算这些标签与图片的余弦相似度;最终相似度最高的标签即是预测的分类结果。论文提到,相比于单纯地给定分类标签,给定一个句子的分类效果更好。比如一种句子模板 A photo of a ...,后面填入分类标签。这种句子模板叫做 prompt(提示)。论文还说,句子模板的选择很有讲究,还专门讨论了prompt engineering,测试了好多种类的句子模板。提示信息有多种,如图3可以看到它用不同的类别替换一句话中不同的词,形成不同的标签。
图3:CLIP预测图
推理过程中最关键的一点,在于我们有很高的自由度去设置“多项选择题”。从前的分类网络的类别数量是固定的,一般最后一层是跟着 softmax 的全连接层;如果要更改类别数量,就要更换最后一层;并且预测的内容是固定的,不能超过训练集的类别范围。但对于 CLIP 来说,提供给网络的分类标签不仅数量不固定,内容也是自由的。如果提供两个标签,那就是一个二分类问题;如果提供1000个标签,那就是1000分类问题。标签内容可以是常规的分类标签,也可以是一些冷门的分类标签。 CLIP 的主要贡献之一——摆脱了事先定好的分类标签。
损失函数:CLIP模型的损失函数由两部分组成:对比损失和分类损失。对比损失是通过最大化正确图像-文本对的相似性和最小化错误图像-文本对的相似性来训练模型。分类损失则用于训练模型对图像和文本进行多任务分类。这两个损失函数共同作用,帮助CLIP模型学习到更好的视觉表示和语义理解能力。
实现伪代码:
1.加载预训练的图像编码器和文本编码器。
2.对于每个(batch)图像-文本对:
3.重复以上步骤直至收敛或达到指定的训练轮数。
具体代码如下代码1所示。
- # image_encoder - ResNet or Vision Transformer
- # text_encoder - CBOW or Text Transformer
- # I[n, h, w, c] - minibatch of aligned images
- # T[n, l] - minibatch of aligned texts
- # W_i[d_i, d_e] - learned proj of image to embed
- # W_t[d_t, d_e] - learned proj of text to embed
- # t - learned temperature parameter
-
- # 分别提取图像特征和文本特征
- I_f = image_encoder(I) #[n, d_i]
- T_f = text_encoder(T) #[n, d_t]
-
- # 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化
- I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
- T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
-
- # 计算缩放的余弦相似度:[n, n]
- logits = np.dot(I_e, T_e.T) * np.exp(t)
-
- # 对称的对比学习损失:等价于N个类别的cross_entropy_loss
- labels = np.arange(n) # 对角线元素的labels
- loss_i = cross_entropy_loss(logits, labels, axis=0)
- loss_t = cross_entropy_loss(logits, labels, axis=1)
- loss = (loss_i + loss_t)/2
代码1:CLIP实现核心的类似numpy的伪代码
总结:CLIP在图像文本匹配或者图像文本检索任务上,速度很快。因为这两个任务通常有一个很大的已有的数据库,CLIP可以提前把数据库里所有的图像文本的特征提前抽取好,当给定新的一张图片或者一个文本,将其与已有的数据库做匹配,直接计算一个点乘,矩阵乘法是比较快的。
局限性:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。