广告行业中那些趣事系列90:从理论到实践多模态学习模型CLIP

导读:本文是“数据拾光者”专栏的第九十篇文章,这个系列将介绍在广告行业中自然语言处理和推荐系统实践。本文主要从理论到实践详细介绍了OpenAI推出的多模态学习模型CLIP。
欢迎转载,转载请注明出处以及链接,更多关于自然语言处理、推荐系统优质内容请关注如下频道。
知乎专栏:数据拾光者
公众号:数据拾光者

01 背景介绍

之前做广告聚类项目时,需要根据广告的素材图片和文案两种模态数据进行聚类操作,从而给广告打上聚类id。整体做法就是使用多模态学习模型获取广告的emd数据,然后使用faiss构建索引,计算emd之间的cos相似度,满足一定阈值则打上一样的聚类id。获取广告emd的多模态学习模型我们使用的就是当时比较火的OpenAI的CLIP模型。这篇从理论到实践详细介绍下CLIP模型。

02 CLIP相关介绍

CLIP是OpenAI在2021年在论文《Learning Transferable Visual Models From Natural Language Supervision》提出的多模态学习模型。截止到2024.11.25论文引用次数已经达到24882了,github开源项目有3.3K的fork,26.1K的star,影响力非常牛。

CLIP的论文下载地址:https://arxiv.org/abs/2103.00020

CLIP的github项目地址:https://github.com/openai/CLIP

2.1 CLIP需要解决的问题

CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于文本-图像对比的预训练方法或者模型。关于对比学习的介绍可以参考我之前写的文章《广告行业中那些趣事系列34:风头正劲的对比学习和项目实践》。因为当时CV模型主要通过有监督学习的方式来预测图像类别,需要标注数据。而CLIP希望通过无监督学习的方式,利用互联网上公开的海量的数据集,使用文本-图像pair对数据,也就是图像以及对应的文本描述数据,通过对比学习的方式来学习文本和图像的匹配关系。也就是将CV场景中图像分类任务从有监督学习的方式转变成无监督学习的方式,具有极大的开拓意义。

2.2 CLIP的数据集介绍

当时计算机视觉工作主要的数据集主要包括MS-COCO(Lin et al.,2014)、Visual Genome(Krishna et al.,2017)和YFCC100M(Thomee et al.,2016)三个。尽管MS-COCO和Visual Genome是高质量的众包标注数据集,但按照现代标准来看,它们的规模相对较小,每个数据集大约只有10万张训练照片。而其他计算机视觉系统则在高达35亿张的Instagram照片数据集上进行训练(Mahajan et al.,2018)。YFCC100M有1亿张照片,是一个不错的选择,但是每张图片的元数据是稀疏的,并且质量参差不齐。许多图片使用自动生成的文件名,比如“20160716 113957.JPG”作为“标题”,还有的图片包含相机曝光设置的描述等。如果筛选包含自然语言标题或描述的英语图片,数据集会缩减到1500万,这个量级和ImageNet差不多。

OpenAI从互联网上各种公开可用的来源收集了4亿(图片,文本)对的数据集。为了尽可能广泛地涵盖视觉概念,用于搜索(图像,文本)对数据的query量级是50W,每个query最多包含2W张图片。所得到的数据显示与用于训练GPT-2的WebText数据集有相似的总词数。这个数据集叫做WebImageText(简称WIT)。

2.3 CLIP训练流程

CLIP训练流程主要包括三部分:

  • Contrastive pre-training:预训练阶段,使用图片 - 文本对进行对比学习训练;

  • Create dataset classifier from label text:提取预测类别文本特征;

  • Use for zero-shot predictiion:进行 Zero-Shoot 推理预测。

0551bda71d1c2b053eca1c9df4634eea.png

图 CLIP训练流程

2.3.1 预训练阶段

CLIP主要包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型,比如BERT之类的都行。论文中Text Encoder固定选择一个包含63M参数的text transformer模型;而Image Encoder用来提取图像的特征,论文中Image Encoder采用了两种的不同的架构,一是常用的CNN架构ResNet,二是基于transformer的ViT,其中ResNet包含5个不同大小的模型:ResNet50,ResNet101,RN50x4,RN50x16和RNx64(后面三个模型是按照EfficientNet缩放规则对ResNet分别增大4x,16x和64x得到),而ViT选择3个不同大小的模型:ViT-B/32,ViT-B/16和ViT-L/14。

08afb86c69c14bb0e4530198ce83f857.png

图 CLIP中Text Encoder和Image Encoder

CLIP通过基于batch的对比学习的方式进行预训练学习。如下图所示,在一个batch图文对训练数据中,文本和图片会分别经过各自的编码器得到emd数据,然后经过组合得到NxN条样本数据Text_i-Image_j,其中正样本是匹配的图文对数据有N条,其他则是负样本数据。对比学习核心的指导原则是:通过构造相似实例和不相似实例获得一个表示学习模型,通过这个模型可以让相似的实例在投影的向量空间中尽可能的接近,而不相似的实例尽可能的远离。CLIP模型会预测出N个可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity),即上图所示的矩阵。CLIP的训练目标就是最大化N个正样本的相似度,同时最小化N个负样本的相似度。

75bfd5da31e3c26c285aa2e5033294cb.png

图 基于对比学习的预训练流程

2.3.2 提取预测类别文本特征

因为数据集是图文对数据,所以需要对文本进行一些预处理操作。以 ImageNet 数据集举例说明,原数据集包含1000个类别,并且都是单词。CLIP预训练的时候将单词转化成了语句,比如构建语句模版 A photo of a {label}。这样输入到Text Encoder就是这样的模版语句:

742dd1960706857aed886c8ce425fa23.png

图 提取预测类别文本特征

这里prompt模版涉及到NLP中的prompt工程技术,prompt模版构建的好坏会影响模型的效果。之所以将标签转化成文本语句输入给Text Encoder,主要原因是CLIP在预训练的时候使用的就是语句描述。

2.3.3 zero-shot图像分类推理流程

最后是CLIP推理流程。比如我们用CLIP去做图像分类任务,通过zero-shot的方式,也就是不使用一条任务相关的数据集,通过迁移学习,CLIP可以利用预训练学习到的知识完成分类任务。具体预测流程是将图片经过Image Encoder进行编码得到Image_i,然后和上面图像分类任务对应抽取的预测类别文本编码Text_i计算cos相似度,将相似度最高的那个文本编码对应的类别作为图像的分类标签即可完成分类任务。使用CLIP模型用于zero-shot图像分类任务流程如下:

81fd1fb3d487ad4353efff803f461f49.png

图 zero-shot图像分类推理流程

2.4 CLIP算法实现

CLIP实现非常简单,下面是伪代码:

3d18a5c2800960a6130819196d2ede48.png

下面是torch版本的python代码:

a76cf3a8a3cd734b89517b474189af7a.png

2.5 CLIP效果展示

论文对比了CLIP在zero-shot场景下和使用下游数据微调的的ResNet50模型效果,在27个数据集上有16个任务是有提升的。下面是在各任务上效果提升情况:

8df65dda3c3ae55e0c11ed638032b0eb.png

图 CLIP在zero-shot场景下和ResNet50效果对比

CLIP在few-shot场景下效果也不错,下面是对比了BiT-M(ImageNet-21K)、SimCLRv2、ResNet50和Linear Probe CLIP分别在1/2/4/8/16个实例下的模型效果,CLIP在few-shot下的效果提升非常明显:

5e42d4d24990e37596f18d1ae51d8d3d.png

图 CLIP在few-shot下模型效果对比

需要说明下,Linear Probe 的意思是把预训练模型冻结住,只用于提取特征,然后训练最后的全连接层用于分类。

2.6 CLIP模型应用场景

CLIP模型的应用范围非常广,可以很好的迁移到其他场景中:

  • 图像分类测试:使用CLIP进行图像分类的简单测试,例如识别海贼王人物艾斯的图片。通过计算图像和候选类别文本的相似度值,CLIP能够以高概率判定图像类别;

  • 跨模态检索:CLIP不仅可以从文本中检索相关的图像,还可以通过图像检索出相应的文本描述。这种跨模态检索能力使其在信息检索、知识管理等领域非常有用。

  • 图像检索:基于文本来搜索图像是CLIP最能直接实现的一个应用,其实CLIP也是作为DALL-E的排序模型,即从生成的图像中选择和文本相关性较高的。

  • 视频理解:CLIP是基于文本-图像对来做的,但是它可以扩展到文本-视频,比如VideoCLIP就是将CLIP应用在视频领域来实现一些zero-shot视频理解任务。

  • 图像编辑:CLIP可以用在指导图像编辑任务上,HairCLIP这篇工作用CLIP来定制化修改发型。

  • 图像生成:CLIP还可以应用在图像生成上,比如StyleCLIP这篇工作用CLIP实现了文本引导的StyleGAN。

  • 自监督学习:最近华为的工作MVP更是采用CLIP来进行视觉自监督训练

  • 电商平台中的商品推荐:CLIP可以用于提升商品搜索和推荐的效果,减少对人工标签的依赖,提高推荐的准确性和相关性;

  • 图像内容审核与管理:CLIP可以用于自动化审核图片中的内容是否符合平台规范,帮助管理员快速处理。

2.7 CLIP局限性

CLIP的作者在第六章介绍了 CLIP 的局限性:

  • CLIP的zero-shot性能虽然总体上比supervised baseline ResNet-50要好,但在很多任务上比不过SOTA methods,因此CLIP的transfer learning还有待提升;

  • CLIP在fine-grained分类(花的分类、车的分类之类的)、抽象的任务(如计算图中object的个数)以及预训练时没见过的task(如分出相邻车辆的距离)上zero-shot性能不好,但是不代表CLIP预训练模型就没用,可以提供很强的视觉先验知识;

  • Zero-shot CLIP在OCR这一类真正意义上的out-of-distribution data上性能不好;

  • CLIP zero-shot在很多分类任务中有效,但本质还是在有限的类别中进行对比、推理。不能像image caption完全自由的生成新的概念,这是CLIP功能上的缺陷,因为CLIP终究不是生成模型;

  • CLIP没有解决深度学习数据效率差的问题,将CLIP和自训练相结合可以有效提升数据利用效率;

  • CLIP的训练数据是从网上采集的,这些图文对数据没有做数据清洗和偏差处理;

  • 很多视觉任务很难用text来表达,如何用更高效的few-shot learning方法优化CLIP也很重要。

03 CLIP源码实践

使用CLIP模型去CIFAR-100 dataset数据集上进行分类任务源码实践:

e060e47dd16d0246ed464bfbc65f9771.png

模型输出结果如下:

16fa7b0fdc0a471c39fc7d97b63f6536.png

下面还有一个机器学习课程源码,从CLIP安装到下载数据集,再到利用CLIP 做 zero-shot prediction,使用CIFAR数据集微调 CLIP模型,再到冻结CLIP网络的基础上添加分类层等任务,可以参考如下源码:

https://github.com/yunhao-tech/Course_project/blob/master/Advanced%20Machine%20learning/Final%20project_CLIP.ipynb

04 广告场景中使用CLIP

我们实际业务场景中,主要是在广告场景中使用CLIP多模态学习模型来获取广告(主要包括图像和文本两种模态)的emd数据。业务背景是这样的,我们平台会对一些新广告进行补贴。很多广告主为了获取补贴就通过对素材图片进行裁剪、缩放等方式来大量复制裂变广告。同时在广告投放阶段,需要对同屏广告进行控制,防止特别相似的广告在同一个页面展示。为了识别出这些相似广告,需要对相似广告进行聚类。具体的流程就是首先收集广告语料库数据,用广告素材和文案等数据使用广告类目标签在CLIP预训练模型上进行微调;然后使用微调之后的CLIP模型去获取广告对应的emd;基于emd使用faiss构建索引库,计算广告之间的cos相似度,满足一定阈值则打上相同的聚类id。这个聚类id用于下游广告投放屏控等场景。

其中在广告聚类场景下使用广告语料数据进行微调:构建多分类任务,使用文案和广告类目标签作为label,prompt:the copywriter of this ad is {copywriter},the label of this ad is {lable}。

参考资料

【1】https://openai.com/index/clip/

【2】Learning Transferable Visual Models From Natural Language Supervision

【3】clip资料汇总,包括论文、代码:https://github.com/yzhuoning/Awesome-CLIP

最新最全的文章请关注我的微信公众号或者知乎专栏:数据拾光者。

47ddb726072029bada4520940df53daf.png

码字不易,欢迎小伙伴们关注和分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值