图文多模态模型CLIP

前言

CLIP带给我的震撼是超过transformer的,这是OpenAI的重要贡献之一。就如官网所描述的:

CLIP: Connecting Text and Images

用对比学习(Contrastive Learning)来对齐约束图像模型和文本模型。用文本嵌入指导图像学习,图像嵌入指导文本学习。这样一来,图像分类进入了CLIP时代,不需像传统深度学习图像分类一样,先定义出类别范围,然后准备各类别的数据(比如MNIST的十分类,ImageNet的千分类)。

我们有了CLIP,可以直接任意给出一个class set如{“cat”,“dog”, “horse”,“Other”},然后给定一张图片,CLIP自然会给出图片的类别的score。

第一次见识到CLIP能力是在MSRA的分享会上,表现出的效果非常Impressive。首先,CLIP有强大的zero-shot功能,能够在零样本的基础下在ImageNet-1K的表现超过ResNet-50.

按照惯例
论文标题:Learning Transferable Visual Models From Natural Language Supervision
论文链接:https://arxiv.org/abs/2103.00020
github: https://github.com/OpenAI/CLIP


CLIP
CLIP
CLIP的大体思路就如上图所示,咱们有一个Image Encoder和一个Text Encoder分别把图像和文本编码为1024-d或者768-d的向量,我们叫做image embeddingtext embedding。CLIP的思想是将image embeddingtext embedding放到一个域里,让相应的image embeddingtext embedding有更大的相似性。

这里相似性的评估是余弦相似性,概念十分简单,即两个向量夹角的余弦值。想进一步了解Cosine Similarity的可戳《【AI数学】余弦相似性(含python实现)》。

对于n个图文对,咱们可以得到一个nxn的余弦相似性矩阵,只要使对角线的位置尽可能的接近1,而其他位置尽可能接近0,这就达到了我们优化的目的。先不急着看loss function,先看对比学习的思想,作者也引用了这篇2016年的文章《Improved Deep Metric Learning with
Multi-class N-pair Loss Objective》,大概看一张图就可以:
contrastive learning
传统的深度神经网络训练方法是比较输出值和标注值的差别,让正例离近一点,让负例远离一点;而对比学习找一大堆样例,互相之间的异类尽量远。回到CLIP,对于每一个batch,只有绑定的图文对(自己)才是正例,而其他所有图文对,都构成两两之间的负例关系。

在这里我分享自己做实验的经验,CLIP这种大规模数据集的对比学习训练依赖超大的batch size,理论上batch size越大越好,一般参考值也在4096以上。而且,如果没有较大的batch size,CLIP甚至训不收敛(与训练时间无关),因为每个batch没有足够大的对比视野。想训标准版CLIP,请考虑16卡A100以上的训练条件。

我们看CLIP的训练伪代码:
CLIP训练代码
这里构造了一个symmetric cross entropy,也很简单。只是把针对image部分和针对text部分的交叉熵损失函数加到一起。

我学习到这里的时候有一个疑问,为什么labels用np.arange(n)而不是用one-hot?相信很多同学也有这个疑问。我们想让相似性矩阵到对角线接近1,而其他位置为0,难道不是用一个对角阵当label吗

事实上,代码中构造的labels等价于构造对角阵label,仔细对比我们可以发现,labels的维度是n,而logits的维度是nxn,labels维度低于logits,这是one-hot的另一种表达方式,等价于nxn的对角阵。对这点还有不明白的,可戳《【AI数学】交叉熵损失函数CrossEntropy》, 最后面有这种用法的详解。

有疑问可留言交流~

### CLIP多模态算法概述 CLIP(Contrastive Language–Image Pre-training)是由OpenAI开发的一种用于连接图像和文本的多模态模型[^2]。该模型通过对比学习的方式,将不同形式的数据映射到同一特征空间内,在此空间中语义相近的内容会彼此靠近。 #### 算法原理 在训练过程中,CLIP接收成对的图片及其对应的描述作为输入,并尝试最小化正样本间的距离而最大化负样本间差异。具体来说: - **编码器结构**:分别构建了两个独立却参数共享的神经网络——一个是用来处理自然语言句子序列的文字编码器;另一个则是针对视觉信息设计的对象识别卷积神经网路(CNN)或Transformer架构的图像编码器。 - **损失函数定义**:对于每一对关联的图文组合而言,如果它们被正确配对,则视为正类;反之则属于错误匹配即为负类。整个过程旨在优化一个基于余弦相似度计算得到的概率分布下的交叉熵损失值。 ```python import torch.nn.functional as F def contrastive_loss(image_embeddings, text_embeddings): logits = image_embeddings @ text_embeddings.T / temperature labels = torch.arange(len(logits)) loss_i = F.cross_entropy(logits, labels) loss_t = F.cross_entropy(logits.T, labels) return (loss_i + loss_t)/2 ``` #### 实现细节 为了使模型能够泛化至未见过的任务上,CLIP采用了大量的互联网抓取数据来进行无标签式的自我监督预训练。这些海量且多样化的实例有助于捕捉广泛存在的跨模式联系规律,从而赋予模型强大的zero-shot迁移能力[^3]。 此外,由于引入了先进的注意力机制以及精心调整后的超参配置方案,使得最终产出的结果具备较高的鲁棒性和表达力。 #### 应用场景 得益于其出色的性能表现,CLIP已被广泛应用到了诸如零样本图像分类、文本引导的目标检测等领域之中。不仅如此,在一些创意生成任务里也能见到它的身影,比如根据给定提示词合成逼真的艺术作品等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木盏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值