当前位置: 首页 > 科技观察

OpenAICLIP模型袖珍版,24MB用于文字图像匹配,在iPhone上运行

时间:2023-03-21 19:25:16 科技观察

OpenAI的CLIP模型在图像和文本类别匹配方面非常强大,但原始CLIP模型是在超过4亿个图像文本对上训练的,这消耗相当大的计算能力。PicCollage公司的研究人员最近进行了关于减小CLIP模型尺寸的研究,并取得了优异的成果。今年1月初,OpenAI打破了自然语言和视觉的维度壁垒,先后推出了两个连接文本和图像的神经网络DALL·E和CLIP,后者可以完成图像和文本类别的匹配。CLIP可以可靠地执行一系列视觉识别任务,给定一组语言表达的类别,它可以立即将图像与其中一个类别匹配,并且不需要像标准神经网络那样训练这些类别。微调特定数据。CLIP模型效果的一些示例。资料来源:继OpenAI之后,OpenAI在CLIP模型中发现了多模态神经元。这样的神经元可以对以文本、符号或概念的形式呈现的相同概念做出反应,例如,“蜘蛛侠”神经元(类似于哈莉·贝瑞神经元)可以对蜘蛛的图像、文本“蜘蛛”和漫画的图像做出反应字符”蜘蛛侠回答。虽然CLIP模型在将图像与文本类别匹配方面非常强大,但它在超过4亿个图像-文本对上进行了训练,并使用了大量的计算能力,需要256个GPU进行两周的训练。这对于普通开发者来说是不可想象的,那么,有没有可能在不牺牲性能的情况下,减小CLIP模型的体积呢?近日,PicCollage公司的研究人员针对这个课题进行了研究,他们在自己的内容上测试了CLIP模型的性能产品并获得了满意的结果。但是,它很快发现了CLIP模型的一个怪癖:在搜索查询中文本相似性优先于语义相似性。他们想解决CLIP模型的问题过分强调文本相似性以获得更相关的搜索结果。此外,研究人员还想缩小CLIP模型的体积,探索在IOS设备上部署的可能性。他们使用模型蒸馏来减小CLIP的大小。350MB的原始模型(可以称为教师模型)被提炼为48MB(学生模型),精度为FP32。并且,在单个P100GPU上训练数周后,他们将48MB学生模型转换为CoreML格式,并再次获得具有FP16精度且性能变化几乎可以忽略不计的24MB模型。研究人员表示,蒸馏后的模型可以在iPhone等IOS设备上运行。接下来,我们详细解释一下研究者的探索过程。过分强调图像中的文本让我们通过一个简单的设置来演示这一点,考虑三张图像:其中包含单词“Cat”的图像;带有“Gat”字样的图片;附有猫的照片。假设你要搜索“猫”这个词,CLIP会把这个文本转化为一个向量,即text_vector,上面三个图像向量的text_vector余弦相似度如下:我们可以得到搜索词和图像的相似度可以用两种方式表达“相似性”:图像包含与搜索词相似的文字:即文字相似;图像和搜索词在语义上相似:即语义相似度。在构建搜索功能时,研究人员可能更喜欢语义相似性而不是文本相似性。研究人员发现,CLIP往往会给具有相似文本的图像更高的分数。解决方案过分强调图像中的文本假设在共享向量空间中存在一个方向,其中图像的“文本”属性变化很大,而其他(语义)属性保持不变。如果我们能找到这个方向,我们就可以用一个指向这个方向的向量,把它加到所有的图像向量(或文本向量)上,然后对它们进行归一化,计算余弦相似度,我们称这个向量为textness_bias向量。换句话说,在执行以下操作之前:image_vectors/=np.linalg.norm(image_vectors,axis=-1,keepdims=True)cosine_similarities=text_vector@image_vectors我们需要执行以下操作:#addbiastotheimagevectorsimage_vectors+=scale*textness_bias#oraddbiastothetextvectortext_vector+=scale*textness_bias下一个问题是如何找到textess_bias向量?这里有两种不同的方法可以得出相似的答案。下面是第二种方法:减少“文本性”:训练一个没有隐藏层的小模型我们创建了一个包含文本和不包含文本的图像数据集。这个想法是训练一个模型,然后使用模型的权重作为文本性偏差的指示器:classModel(nn.Module):def__init__(self,dim=512):super(Model,self).__init__()self.linear=nn.Linear(dim,2)defforward(self,x):returnself.linear(x)model=Model()Thenweusedtheweightvectorresponsibleforpredictingthepositivelabelasthetextnessbias.Anotherinterestingfindingwasthataddingthebiastothetextvectorwasmuchmoreeffectivethanaddingittotheimagevectors.textness_bias=model.linear.weight[1]text_vector+=scale*textness_biasThebiggerthescale,themoreemphasisCLIPputsontextualsimilarity.Let'stakealookatsomeoftheresults.ResultsofcontrollingtextualsimilarityinsearchForeverysearchterm,我们按顺序改变标度值,例如:-2、-1、0、1、2。对于每个标度值,我们将前十个结果存储在单个行中。因此,对于每个搜索词,我们得到一个图像网格,其中每一行对应一个比例的值和包含该比例的前十个结果。注意文本相似性的偏好如何随着我们从顶部行到底部行而增加:减少“文本”:训练没有隐藏层的小模型创建包含和不包含文本的图像数据集。这个想法是训练一个模型,然后使用模型权重作为文本偏差指标:classModel(nn.Module):def__init__(self,dim=512):super(Model,self).__init__()self.linear=nn.Linear(dim,2)defforward(self,x):returnsself.linear(x)model=Model()然后用权重向量预测正标签,作为textnessbias,也可以发现加入对文本向量的偏置比将其添加到图像向量中更有效textness_bias=model.linear.weight[1]text_vector+=scale*textness_biasscale越大,CLIP会更加强调文本相似性,让我们看一些结果。控制搜索中的文本相似度结果对于每个搜索词,我们依次改变比例值如下:-2、-1、0、1、2。对于每个比例值,我们将前10个结果存储在一行中。因此,对于每个搜索词,您都会得到一个图像网格,其中每一行对应一个比例值,并包含该比例值的前10个结果。ViT的模型蒸馏CLIP非常强大,以至于研究人员决定下一步使用模型蒸馏来减小其大小。该任务包含一些细节:使用蒸馏的方法:CLIP模型实际上是两个具有一组不相交参数的模型:ViT(将图像转换为矢量)和Transformer(将文本转换为矢量)。我们决定对ViT模型(~350MB,FP32精度)进行模型蒸馏。学生ViT模型的大小被确定为小于50MB。学生模型:最初的ViT模型由一个名为VisualTransformer的类定义。该模型是根据以下代码创建的:teacher_clip=VisualTransformer(input_resolution=224,patch_size=32,width=768,layers=12,heads=12,output_dim=512)为了创建学生模型,研究减少了宽度和层数的两倍。由于头数的不确定性,该研究定义了两个版本——一个头数与教师模型相同,一个头数是教师模型的两倍。这是为了看看增加水头对模型的性能有什么影响。student_clip_12_heads=VisualTransformer(input_resolution=224,patch_size=32,width=768//2,layers=12//2,heads=12,output_dim=512)student_clip_24_heads=VisualTransformer(input_resolution=224,patch_size=32,width=7/2,layers=12//2,heads=24,output_dim=512)本研究首先训练student_clip_12_heads。用于训练的数据:该研究开始使用从各种来源获得的大约200,000张图像的数据集进行训练。大约10个时期后,一旦我们开始看到一些有希望的结果,训练数据集就会增加到超过800,000张图像。使用的损失函数:KLD+L1损失之和用于训练模型。对于前十个epoch,温度设置为4,然后降低到2。在训练student_clip_12_heads之后,研究微调了student_clip_24_heads的权重。该研究的一个主要挑战是收集数据以涵盖各种图像。原始CLIP在4亿张图像上进行了训练。虽然收集如此大规模的图像是不切实际的,但该研究的重点是从标准开源数据集中收集图像。为了规避对大量图像的需求,该研究还尝试使用零镜头蒸馏,但没有奏效。CLIP中蒸馏ViT模型的结果本研究使用COCO测试数据集通过查看每个搜索词的前20个结果来查看蒸馏CLIP模型的性能,并且还根据前N个结果评估平均精度原始CLIP和蒸馏CLIP(MAP),每个搜索词的N范围从10到20。研究发现,对于每个N值,MAP约为0.012。如此低的值表明原始CLIP和蒸馏CLIP的结果没有太多共同之处。虽然这听起来令人沮丧,但提取CLIP模型的结果看起来很有希望。尽管这两个模型都给出了语义上有意义的结果,但快速查看这两个模型的前20个结果可以揭示MAP值较低的原因。教师模型中“bird”一词的结果:学生模型中“bird”一词的结果:如上两图所示,虽然两个模型几乎没有产生相同的结果,但每个模型的结果都有意义。

猜你喜欢