alook使用方法视频,alook使用技巧好用吗

  

  机器心脏报告   

  

  机器之心编辑部   

  

  OpenAI的CLIP模型在匹配图片和文本类别方面非常强大,但原始的CLIP模型是在超过4亿个图文对上训练的,消耗了相当大的计算能力。最近,PicCollage公司的研究人员进行了减小剪辑模型尺寸的研究,取得了很好的效果。   

  

  今年1月初,OpenAI打破了自然语言和视觉之间的次元墙,相继推出了连接文本和图像的dalle E和CLIP两个神经网络。后者可以将图像与文本类别进行匹配。CLIP可以可靠地执行一系列视觉识别任务,并给出一组用语言表示的类别,即它可以立即将一幅图像与其中一个类别进行匹配,而不需要像标准的神经网络那样对这些类别的具体数据进行微调。   

  

  CLIP模型的一些效果示例。资料来源:OpenAI   

  

  之后OpenAI在CLIP模型中发现了多模态神经元。这种神经元可以以文本、符号或概念的形式对同一概念做出反应。比如“蜘蛛侠”神经元(类似于哈莉贝瑞神经元),可以对蜘蛛形象、文字“蜘蛛”的形象、动漫人物“蜘蛛侠”的形象做出反应。   

  

  虽然CLIP模型在匹配图像和文本类别方面非常强大,但它是在超过4亿个图像-文本对上训练的,需要256个GPU训练两周。这对于普通开发者来说是无法想象的。因此,是否有可能缩小 CLIP 模型的尺寸,并且不减弱其性能呢?   

  

  最近,来自PicCollage公司的研究人员研究了这个话题。他们已经在自己的内容产品上测试了CLIP模型的性能,获得了满意的结果。然而,CLIP模型的一个奇怪点很快被发现:在搜索查询中优先考虑文本相似度而不是语义相似度.他们想解决CLIP模型过于注重文本相似性的问题,从而获得更相关的搜索结果。   

  

  此外,研究人员还希望缩小CLIP模型的大小,并探索将其部署在IOS设备上的可能性。他们使用模型提取的方法来减少剪辑的大小。经过蒸馏,原来350MB的模型(可以称之为教师模型)缩减为48MB(学生模型),精度为FP32。而且在单个P100 GPU上训练了几个星期后,他们把48MB的学生模型转换成CoreML格式,重新得到24MB的模型,精度达到FP16,性能变化几乎可以忽略不计。研究人员说蒸馏后的模型可以在 iPhone 等 IOS 设备上运行.   

  

  接下来,我们将详细解读这位研究者的探索过程。   

  

  在图像中过分强调文本   

  

  让我们用一个简单的设置来演示这个问题,考虑三张图片:   

  

  一张有“猫”字的图片;一张有“Gat”字样的图片;一张有猫的照片。   

  

     

  

  假设您正在搜索“猫”这个词。CLIP会将这个文本转换成一个向量,即text_vector。上述三个图像向量的余弦相似度如下:   

  

     

  

  我们可以得出结论,搜索词与图像的相似度可以通过两种方式表达“相似度”:   

  

  图像包含与搜索词相似的文本:即文本相似;与图像搜索词的语义相似度:即语义相似度。在构造搜索函数时,研究者可能更喜欢语义相似度而不是文本相似度。研究人员发现,CLIP倾向于给具有相似文本的图像更高的分数。   

  

  解决方案在图像中过分强调文本   

  

  假设共享向量空间中有一个方向,在这个方向上,图像的“text,textness”属性变化很大,而其他(语义)属性保持不变。如果能找到这个方向,就可以用一个向量指向它,把它加到所有的图像向量(或者文本向量)上,然后归一化,计算余弦相似度。我们称这个向量为textness_bias向量。   

  

  换句话说,在执行以下操作之前:   

  

  image _ vectors/=NP . linalg . norm(image _ vectors,axis=-1,keepdims=true)余弦_相似度=text _ vector @ image _ vectors我们需要进阶如下:   

  

  #向图像向量image_vec添加偏差   

tors += scale * textness_bias# or add bias to the text vectortext_vector += scale * textness_bias下一个问题是如何找到 textess_bias 向量?这里有两种不同的方法,可以得到相似的答案。如下是第二种方法:

  

Reducing “textness”: training a small model with no hidden layerWe created a dataset of images with and without text in them. The idea was to train a model and then use the weights of the model as an indicator of textness bias:class Model(nn.Module): def __init__(self, dim=512): super(Model, self).__init__() self.linear = nn.Linear(dim, 2)def forward(self, x): return self.linear(x)model = Model()Then we used the weight vector responsible for predicting the positive label as the textness bias. Another interesting finding was that adding the bias to the text vector was much more effective than adding it to the image vectors.textness_bias = model.linear.weight<1>text_vector += scale * textness_biasThe bigger the scale, the more emphasis CLIP puts on textual similarity. Let's take a look at some of the results.Results of controlling textual similarity in searchFor every search term, we varied the value of scale sequentially like so: -2, -1, 0, 1, 2. For each value of scale, we stored the top ten results in a single row. Thus for each search term, we got a grid of images where each row corresponded to a value of scale and contained top ten results for that scale. Notice how the preference for textual similarity increases as we go from top row to bottom row:减少「文本」:训练一个没有隐藏层的小模型

  

创建一个包含和不包含文本的图像数据集,实现思想是训练一个模型,然后使用模型权重作为 textness bias 指示器:

  

class Model(nn.Module): def __init__(self, dim=512): super(Model, self).__init__() self.linear = nn.Linear(dim, 2)def forward(self, x): return self.linear(x)model = Model()然后使用权重向量预测正标签,作为 textness bias,同时还可以发现将偏差添加到文本向量比将其添加到图像向量更有效。

  

textness_bias = model.linear.weight<1>text_vector += scale * textness_biasscale 越大,CLIP 就会更加强调文本相似性,让我们来看看一些结果。

  

在搜索中控制文本相似性的结果

  

对于每个搜索词,我们依次改变 scale 的值如下:-2, -1, 0, 1, 2。对于每个 scale 值,我们将 top10 结果存储在一行中。因此,对于每个搜索项可以得到一个图像网格,其中每一行对应一个 scale 值,并包含该 scale 值的 top10 结果。

  

  

ViT 的模型蒸馏

  

CLIP 具备强大的功能,下一步研究者决定使用模型蒸馏来减小其大小。该任务包含一些细节:

  

使用蒸馏的方法:CLIP 模型实际上是具有一组不相交参数的两个模型:ViT(将图像转换为向量)和 Transformer(将文本转换为向量)。我们决定对 ViT 模型(~350MB,FP32 精度)进行模型蒸馏。student ViT 模型的大小决定为小于 50MB。

  

student 模型:原始 ViT 模型是由一个名为 VisualTransformer 的类定义的。该模型依照如下代码创建:

  

teacher_clip = VisualTransformer(input_resolution=224,patch_size=32,width=768,layers=12,heads=12,output_dim=512)为了创建 student 模型,该研究将宽度和层数减少了两倍。由于不确定 head 的数量,该研究定义了两个版本――一个与 teacher 模型的 head 数量相同,另一个版本的 head 数量是 teacher 模型的两倍。这是为了了解增加 head 对模型的性能有什么影响。

  

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=768//2,layers=12//2,heads=24,output_dim=512)该研究首先训练 student_clip_12_heads。

  

用于训练的数据:该研究首先以从多种来源获取的约 200000 张图像的数据集开始训练。大约 10 个 epoch 之后,一旦开始看到一些有希望的结果,训练数据集就增加到 800000 多张图像。使用的损失函数:KLD + L1 损失的总和用于训练模型。对于前十个 epoch,温度(temperature)设置为 4,然后降低到 2。训练完 student_clip_12_heads,该研究微调了 student_clip_24_heads 上的权重。该研究面临的一项主要挑战是收集数据以涵盖各种图像。原始 CLIP 是在 4 亿张图像上训练的。虽然收集如此大规模的图像是不切实际的,但该研究专注于从标准开源数据集收集图像。为了规避对大量图像的需求,该研究还尝试使用 Zero Shot 蒸馏,但没有奏效。

  

CLIP 中蒸馏 ViT 模型的结果

  

该研究使用 COCO 测试数据集通过查看每个搜索词的前 20 个结果来查看蒸馏 CLIP 模型的性能,还根据原始 CLIP 和蒸馏 CLIP 的前 N 个结果评估了均值平均精度 (MAP),每个搜索词的 N 的范围从 10 到 20。该研究发现对于每一个 N 值,MAP 大约为 0.012。如此低的值表明原始 CLIP 和蒸馏 CLIP 的结果不会有很多共同的结果。虽然这听起来令人沮丧,但蒸馏 CLIP 模型的结果看起来非常有希望。尽管两种模型都给出了语义上有意义的结果,但快速浏览两种模型的前 20 个结果可以找到 MAP 值很低的原因。

  

teacher 模型中「bird」一词的结果:

  

  

student 模型中「bird」一词的结果:

  

  

如上两图所示,尽管两个模型几乎没有产生相同的结果,但每个模型的结果都有意义。

  

原文链接:https://tech.pic-collage.com/distillation-of-clip-model-and-other-experiments-f8394b7321ce

相关文章