跳到主要内容

多模态预训练 CLIP

CLIP(Contrastive Language–Image Pre-training)是OpenAI的第一篇多模态预训练的算法,它延续了GPT系列“大力出奇迹”的传统。模型是一个基于图像和文本并行的多模态模型,然后通过两个分支的特征向量的相似度计算来构建训练目标。为了训练这个模型,OpenAI采集了超过4亿的图像-文本对。CLIP在诸多多模态任务上取得了非常好的效果,例如图像检索,地理定位,视频动作识别等等,而且在很多任务上仅仅通过无监督学习就可以得到和主流的有监督算法接近的效果。CLIP的思想非常简单,但它仅仅通过如此简单的算法也达到了非常好的效果,这也证明了多模态模型强大的发展潜力。

算法讲解

对比学习预训练

CLIP的核心思想是将图像和文本映射到同一个特征空间。这个特征空间是一个抽象的概念,例如当我们看到一条狗的图片的时候,我们心中想的是狗,当我们读到狗的时候我们想的也是狗,那么我们心中想象的狗,便是“特征空间”。

所以CLIP也是由两个编码器组成,如图1所示:

  • 图像编码器:用于将图像映射到特征空间;
  • 文本编码器:用于将文本映射到相同的特征空间。

在模型训练过程中,我们取到的每个batch由 $n$ 个图像-文本对组成

这 $n$ 个图像送入到图像编码器中会得到 $n$ 个图像特征向量 $\mathbf{x}_i \in \mathbb{R}^d$ 同理将这 n 个文本送入到文本编码器中我们可以得到 n 个文本特征向量 () 因为只有在对角线上的图像和文本是一对,所以CLIP的训练目标是让是一个图像-文本对的特征向量相似度尽可能高,而不是一对的相似度尽可能低,这里相似度的计算使用的是向量内积。 通过这个方式,CLIP构建了一个由 $n^2$ 个样本组成的损失函数,其中有 $n$ 个正样本和 $n^2-n$ 个负样本。 另外,因为不同编码器的输出的特征向量长度不一样,CLIP使用了一个线性映射将两个编码器生成的特征向量映射到统一长度,

图像编码器

CLIP的图像编码器选择了5个不同尺寸的残差网络 以及3个不同尺寸的ViT ,并对模型细节做了调整,具体介绍如下。

残差网络

CLIP采用了ResNet-50作为基础模型,并在其基础上做了若干个调整。主要调整如下:

  1. 引入了模糊池化:模糊池化的核心点是在降采样之前加一个高斯低通滤波;
  2. 将全局平均池化(Global Average Pooling)替换为注意力池化,这里的注意力是使用的Transformer中介绍的自注意力(Self-Attention)。

CLIP采用的Transformer共有5组,它们依次是ResNet-50,ResNet-100以及按照EfficientNet的思想对ResNet-50分别作 4 倍, 16 倍和 64 倍的缩放得到的模型,表示为ResNet-50x4,ResNet-50x16,ResNet-50x64。

Vision Transformer

CLIP的图像编码器的另一个选择是ViT,这里的改进主要有两点:

  1. 在patch embedding和position embedding后添加一个LN;
  2. 换了初始化方法。

ViT共训练了ViT-B/32,ViT-B/16以及ViT-L/14三个模型。

文本编码器

CLIP的文本编码器使用的是Transformer,它共有12层,512的隐层节点数以及8个头。

CLIP用于图像识别

当训练完模型之后,CLIP模型的效果实现了图像和文本向同一个特征空间映射的能力。当进行图像识别时,我们将待识别的图像映射成一个特征向量。同时我们将所有的类别文本转换成一个句子,然后将这个句子映射成另外一组特征向量。文本特征向量和图像特征向量最相近的那一个便是我们要识别的目标图像的类,如图所示

优点

  1. 训练高效:CLIP采取了对比学习的训练方式,可以在一个大小为N的batch中同时构建 n2 个优化目标,实现简单快捷,计算高效。此外CLIP的对比学习的训练方式也比基于Image Caption构建的预训练任务简单很多,模型的收敛速度也快了很多;
  2. 方便迁移:CLIP图像对应的标签不再是一个值了,而是一个句子。这就让模型映射到足够细粒度的类别上提供了可操作空间。由此我们也可以对这个细粒度的映射进行人为控制,进而规避一些涉黄,涉政,涉种族歧视等敏感话题;
  3. 全局学习:CLIP学习的不再是图像中的一个物体,而是整个图像中的所有信息,不仅包含图像中的目标,还包含这些目标之间的位置,语义等逻辑关系。这便于将CLIP迁移到任何计算机视觉模型上。这也就是为什么CLIP可以在很多看似不相关的下游任务上(OCR等)取得令人意外的效果。

缺点

  1. 数据集:虽然CLIP采取了4亿的图像文本对的数据集,但这4亿的图像文本对并未对外开源。且构建这4亿数据的5万条查询语句介绍的也不详细。而且从它介绍的数据集构建方式来看,它的这种构建数据集的方式还略显单薄,而整个计算机视觉任务是非常庞大且复杂的。如何构建一个分布更合理且全面的数据集是一个非常值得探讨的方向。
  2. 通用效果:CLIP在论文和它的官方网站上也说了CLIP的一些缺点,例如更细粒度的分类任务,数据集未覆盖到的任务上的表现。这些从本质上来看还是说明了CLIP还是一个有偏的模型。目前看来仅仅通过它的4亿条数据以及对比学习预训练还不足以让模型学习到在NLP上那些通用的能力,这一方向也亟待提升。
  3. 夸大零样本:CLIP在论文中以及一些宣传上,有些过分夸大它零样本学习(zero-shot learning)的能力。从它的模型效果来看,CLIP还是通过庞大的数据集来尽可能的覆盖下游任务,而它在未见过的数据上表现非常不理想。我认为这种通过庞大的数据集覆盖尽可能多的任务的训练方式,并不能证明模型的零样本学习的能力。因为在更传统的计算机视觉中,零样本更应该是DBM这类生成模型才有的效果。