本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。
原文链接:快速学习一个算法,CLIP
今天给大家介绍一个强大的算法模型,CLIP。
CLIP (Contrastive Language–Image Pre-training) 是一个由 OpenAI 开发的多模态预训练模型,它能够理解图像和相关文本之间的关系。
CLIP 的核心思想是通过对比学习(Contrastive Learning)训练一个模型,使其能够将图像和描述性文本映射到同一个向量空间中。
CLIP 模型的主要意义在于其跨模态学习能力,即能同时处理和理解图像及其文本描述。这种能力使得 CLIP 在处理视觉任务时不局限于固定的数据集和预定义的类别,而是能够理解在训练时未曾见过的概念或对象。
此外,CLIP 可以使用自然语言描述来进行零样本学习(zero-shot learning),即直接使用文本描述来进行图像识别,而不需要额外的模型训练。
零样本学习(zero-shot learning)是指模型尝试预测在训练数据中未出现过一次的类别。
例如,经过对狗和猫进行分类训练的图像分类器有望在我们赋予它的任务上表现出色,即对狗和猫进行分类。我们通常不会期望经过对狗和猫进行训练的机器学习模型能够很好地检测浣熊。而 CLIP 往往在它们没有直接接受过训练的任务上表现良好,这被称为 “零样本学习”。
CLIP 架构
CLIP 模型包括两个主要的组成部分:一个图像编码器和一个文本编码器,这两者共同工作来将图像和文本映射到一个共同的特征空间中。
-
图像编码器
通常使用卷积神经网络(CNN)或 Vision Transformer(ViT)架构。这些编码器被训练来处理图像数据,提取重要的视觉特征。
-
文本编码器
通常基于 Transformer 架构,设计用于处理文本数据。这些编码器被训练来处理文本数据,提取重要的文本特征。
两个编码器都输出嵌入向量(即高维特征表示),这些向量随后通过对比损失函数进行优化,确保图像与其相应的文本描述在特征空间中彼此接近,而与不相关文本的距离则较远。通过这种方式,CLIP 学习如何将图像和文本对齐到同一特征空间,实现跨模态的理解和处理。
假设给定一批 N 个图像和相应的文本描述,会生成 N*N 个图像和文本对,在这些对中,N 对应该具有较高的余弦相似度,而其余 N²-N 个不正确的配对应该具有较低的余弦相似度。
首先,我们通过图像编码器(ViT 或 ResNet 模型)以获取尺寸为 NxI 的图像嵌入。将文本通过文本编码器以获取尺寸为 NxT 的文本嵌入。
为了测量它们在表示上的相似性,我们希望对图像的嵌入和相应的文本的嵌入进行点积。但这两个向量分别是 I 维和 T 维。为了使它们达到相同的维度,我们引入了两个投影(线性)层,一个用于图像,一个用于文本,使它们达到相同的维度 D。经过投影层后,我们将得到两个形状为 NxD 的矩阵。
接下来,将两个矩阵相乘,从而得到一个 BxB 矩阵,其中行表示图像,列表示文本,其值代表了图像(embedding)与文本(embedding)的相似性。
CLIP 损失函数
对于像我这样还没有尝试过对比损失的人来说,这是最有趣的部分。
我们知道,我们希望相应图像和文本的向量对齐。这意味着点积必须尽可能接近(矩阵中的对角线元素) 1。对于其他所有内容,我们需要将其推向 0。
因此,对于给定的标题,我们对所有图像的点积取 softmax,然后取交叉熵损失。
同样,对于给定的图像,我们对所有标题重复该过程。
接下来,我们对这两个损失取平均值。然后我们通过反向传播来更新权重。这就是 CLIP 的构建和训练方式。
代码解析
def contrastive_loss(logits, dim):
neg_ce = torch.diag(F.log_softmax(logits, dim=dim))
return -neg_ce.mean()
def clip_loss(similarity: torch.Tensor) -> torch.Tensor:
caption_loss = contrastive_loss(similarity, dim=0)
image_loss = contrastive_loss(similarity, dim=1)
return (caption_loss + image_loss) / 2.0
def metrics(similarity: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
y = torch.arange(len(similarity)).to(similarity.device)
img2cap_match_idx = similarity.argmax(dim=1)
cap2img_match_idx = similarity.argmax(dim=0)
img_acc = (img2cap_match_idx == y).float().mean()
cap_acc = (cap2img_match_idx == y).float().mean()
return img_acc, cap_acc
应用实例
由于 CLIP 模型具有理解图像与文本的能力,使其在多种应用场景中表现出色。
以下是一些主要的应用例子。
-
零样本图像分类
在没有训练特定类别的情况下识别图像中的对象。
-
图像搜索
CLIP 可以用来实现基于文本的图像检索。
-
多模态内容生成
CLIP 可以与图像生成模型(如DALL·E)结合,根据文本描述生成具体的图像。
下面,我们来看一下 clip 如何进行零样本图像分类。
首先,我们将所有单词插入上下文(提示)并将其传递给文本编码器。接下来,使用余弦相似度公式(简单点积)将所有相应的嵌入与图像嵌入进行比较。最后,我们选择点积最大的文本。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。