当前位置: 首页 > news >正文

视觉语言大模型模型介绍-CLIP学习

多模态学习领域通过结合图像和文本信息,为各种视觉语言任务提供了强大的支持。图像和文本的结合在人工智能领域具有重要的意义,它使得机器能够更全面地理解人类的交流方式。通过这种结合,模型能够处理包括图像描述、视觉问答、特征提取和图像-文本匹配在内的多种任务。这些任务不仅推动了计算机视觉和自然语言处理的边界,也为实际应用如自动内容标注、增强现实和智能助手提供了技术基础。随着技术的进步,这些多模态模型正变得越来越精准和高效,极大地丰富了人机交互的体验。

一、首先介绍一下几个任务吧

Image Captioning、VQA、Feature Extraction 、 Image-Text Matchin

这里用的是BLIP的demo

1、Image Captioning

图像描述目标是让计算机自动为图像生成描述性的文本。这个任务不仅需要识别图像中的显著对象,理解它们之间的相互作用,还需要用自然语言来表达这些信息。

例子:上传一张图片,模型需要识别图片中的主体、场景以及动作等,然后将这些信息整合成一句自然语言描述。

2、VQA (Visual Question Answering)

视觉问答,它要求模型能够理解图像内容并回答有关图像的问题。VQA任务的挑战在于需要模型具备理解视觉场景和语言问题的能力,并能够将两者结合起来生成准确答案。

例子:

3、Feature Extraction

特征提取涉及从原始数据中提取出有用的特征,以便用于后续的数据分析或模型训练。在深度学习中,特征提取通常指的是从经过训练的模型中获取学习到的表示,这些表示可以捕捉到数据的关键属性。

例子: 如验证两张图片是否包含相同的物体,或者根据提示在图像检索系统中寻找目标图片。

4、Image-Text Matching

图像-文本匹配要求模型能够衡量图像和文本之间的语义相似度。

例子: 模型需要理解图片的视觉内容和文本的语义信息,并判断它们是否语义一致。

二、发展

1、 最经典的就是2021年的CLLP,用了大规模的数据集,用4亿文本对使 zero-shot 性能得到里程碑式的提升,

2、 2022年的BL1P, 之前的CLIP是一个图像理解模型,不能对图像进行一个文本描述生成,它是一个集图像生成和文本描述为一体的模型,并且,它考虑到从网络上采集(爬取)的数据存在大量噪声,(这个噪声指图片对应的标签、文本 错误、不匹配),BLIP模型采用了一种称为CapFilt ( Captioning and Filtering) 的方法来去除噪声数据。这种方法包含两个主要步骤:

Captioner:基于图像的文本解码器,用于生成图像的文本描述。通过这个步骤, 模型可以为图像创建额外的文本描述, 从而增加训练数据。

Filter(过滤器):它的作用是评估生成的字幕与图像的匹配度, 并过滤掉与图像不匹配的噪声文本。这样可以从原始网络文本和合成文本中删除嘈杂的字幕, 留下更准确的数据。

3、BLIP-2的一个显著特点是它使用了预先训练好的图像和文字处理模型, 并且在训练过程中保持这些模型不变。通过一个叫做Q- Former的轻量级组件, 将图像信息和文字信息连接起来。它有两个主要的训练阶段:第一阶段让视觉-语言表示学习, 通过对比学习的方式, 学习对齐图像表示和文本表示;第二阶段, 将Q- Former的输出连接到冻结的LLM中, 以获取LLM的生成语言能力, 实现图像到文本的生成。

4、 LLaVA(Large Language and Vision Assistant)LLaVA模型使用视觉编码器CLIP ViT-L/14和语言解码器LLaMA构成多模态大模型,然后使用生成的数据进行指令微调。LLaVA模型的特点是它能够处理多模态指令,即同时包含视觉和语言元素的指令。它通过端到端训练的方式,使得模型能够根据视觉输入和文本指令来生成相应的文本输出。

5、MobileVLM: A Fast, Strong and Open Vision Language Assistant for Mobile Devices,一种针对移动设备运行的多模态视觉语言模型(MMVLM)。它是多种移动导向架构设计和技术的融合,包括一组规模为1.4B和2.7B参数的从零开始训练的语言模型,一个预先在CLIP风格上进行多模态视觉模型训练的模型,通过一个高效的投影器进行跨模态交互。在几个典型的VLM基准测试上评估MobileVLM。MobileVLM与一些更大模型相比具有相同的表现。更重要的是,在高通骁龙888 CPU和英伟达Jetson Orin GPU上测量推理速度,分别获得21.5个 Token 和65.3个 Token 每秒的state-of-the-art性能。

三、CLIP模型

CLIP: Contrastive Language–Image Pre-training

[ Learning Transferable Visual Models From Natural Language Supervision]

1、迁移学习与零样本学习

  • 迁移学习在计算机实际中广泛使用,在使用大规模数据集预训练后,针对特定任务仍然需要收集样本对模型进行微调,迁移学习可以加快学习速度,并提高模型的性能。

  • 零样本学习(Zero-Shot Learning)希望模型在没有直接针对特定类别的训练数据的情况下识别和分类对象。例如,尽管模型之前没有直接学习过关于“斑马”的数据,但它可以通过关联“条纹”、“黑马”和“白底”等描述性特征来识别斑马。这种方法依赖于将每个类别与一系列描述性属性相关联,使得模型能够通过属性匹配而非直接的图像样本来识别新对象。

    之前的工作受限于模型的发展和数据的规模没有取得很好的效果,而CLIP采用了先进的Transfomer结构,并且从互联网爬取了包含4亿图像-文本对的数据集WIT。

CLIP在使用时,标签其实是可以改的,不仅是ImageNet的1000个类,你可以换成任何单词,图片也可以是任何图片,然后你依旧可以通过计算相似度的方式判断出这张图片里到底有哪些物体,并且泛化性还特别好。

这个性质才是CLIP的强大之处,也是CLIP模型最吸引人的地方,因为它彻底摆脱了固定类别标签的限制,无论是在训练还是在推理时,都不需要提前定义好的标签列表,任意给一张照片,都可以通过给模型提供不同的文本句子来知道这张图片里到底有没有感兴趣的物体。CLIP不仅能识别新物体,由于它将视觉语义和文字语义联系在一起,学到的特征语义性非常强,迁移效果也非常好。

2、对比学习

在CLIP模型的训练过程中,每个批次包含n个图像-文本对,这意味着有n张图片和n个相应的句子。通过图像编码器和文本编码器,我们得到n个图像特征和n个文本特征。CLIP利用这些特征进行对比学习,这是一种灵活的方法,只需要定义好正样本和负样本。在这个场景中,配对的图像和文本对是正样本,因为它们描述的是相同的内容,这些正样本位于特征矩阵的对角线上。而矩阵中所有非对角线上的元素则被视为负样本,因为它们代表不匹配的图像-文本对。这样,我们有n个正样本和n^2 - n个负样本。一旦定义了正负样本,模型就可以通过对比学习进行训练,无需任何手动标注,CLIP通过这种方式学习图像和文本之间的对齐关系。

具体的操作流程其实也不复杂,

  1. 在图像编码和文本编码后,使用L2范数进行特征归一化,将向量的模长缩放到相同的大小

  2. 计算相似度使用矩阵乘法(@ 操作符)计算归一化后的图像特征向量和文本特征向量之间的点积,得到相似度分数。

  3. 损失计算:预测的相似度分布与目标相似度分布之间的交叉熵损失。

3、实验结果

在27个数据集上将CLIP零样本性能与预训练+微调的有监督resnet对比。绿色是CLIP比Resnet50效果好的,在差的中比如DTD这是一个纹理分类的数据集,clever是一个计数的数据集,

为什么CLIP在DTD这些数据集上效果差?

这些任务可能更需要模型对图像的细节和上下文信息。但CLIP可能没有专门针对这些复杂任务进行优化。

传统的CNN通常在图像的浅层特征上表现较好,但对于一些需要深层次语义理解的任务,它们可能无法有效地抽象出足够的特征。例如,纹理分类可能需要模型能够捕捉到图像的细微纹理差异,而物体计数则需要理解图像中的物体间关系和数量。后面就是通过深度网络和更强的特征提取、 注意力机制、 多尺度处理、 细粒度特征提取等

4、CLIP中ResNet50做Image Encoder时容易被忽略的细节

CLIP-ResNet50模型有一个型号采用了ResNet50作为其图像编码器, ResNet50的结构相对较小(几十M),但整体CLIP模型的参数量仍然很大,为什么?

CLIP的训练目标是将图像和文本映射到同一个潜在空间中,以实现跨模态对比学习。模型需要一个高维的联合嵌入空间,来表示图像和文本的语义相关性,多模态--文本编码器(Transformer)GPT2-1.5B,对比学习目标,这两部分参数非常大。

ResNet50的扩展

虽然CLIP使用的是ResNet50,但OpenAI对这个ResNet结构做了适当的调整,以适应与文本编码器的联合训练。CLIP中的ResNet50通常经过预处理和调整。

首先想要进行 CLIP 这样的对比学习,进行特征比较的过程需要的向量,仅仅是特征向量长度而不是序列,所以没有序列维度,而ResNet这样的网络去掉池化和全连接出来的特征如果输入的是标准大小的图片的话是一个(7*7)的特征向量。所以这个向量含有位置信息,而不能对齐局部信息。

最主要的是:最后的 池化层 采用了QKV 注意力机制,而不是平均池化。

原来的ResNet(avgpool): AdaptiveAvgPool2d(output_size=(1, 1)) (fc): Linear(in_features=2048, out_features=1000, bias=True)
CLIP中的  ModifiedResNet(attnpool): AttentionPool2d(    (k_proj): Linear(in_features=2048, out_features=2048, bias=True)    (q_proj): Linear(in_features=2048, out_features=2048, bias=True)    (v_proj): Linear(in_features=2048, out_features=2048, bias=True)    (c_proj): Linear(in_features=2048, out_features=512, bias=True)  ))

AttentionPool2d 结构分析

import torchclass AttentionPool2d(nn.Module):    def __init__(self, spacial_dim: int, embed_dim: int, num_heads: int, output_dim: int = None):        super().__init__()        self.positional_embedding = nn.Parameter(torch.randn(spacial_dim ** 2 + 1, embed_dim) / embed_dim ** 0.5)#(位置嵌入)        '''引入了一个位置嵌入,用于帮助模型捕捉空间信息。在常规的卷积网络中,池化操作是通过均匀降采样来实现的,而这里引入了一个注意力池化层,通过注意力机制选择更加有信息量的特征。'''        self.k_proj = nn.Linear(embed_dim, embed_dim)        self.q_proj = nn.Linear(embed_dim, embed_dim)        self.v_proj = nn.Linear(embed_dim, embed_dim)        self.c_proj = nn.Linear(embed_dim, output_dim or embed_dim)        self.num_heads = num_heads    def forward(self, x):        x = x.flatten(start_dim=2).permute(2, 0, 1)  # NCHW -> (HW)NC        x = torch.cat([x.mean(dim=0, keepdim=True), x], dim=0)  # (HW+1)NC        x = x + self.positional_embedding[:, None, :].to(x.dtype)  # (HW+1)NC        x, attn_weights = F.multi_head_attention_forward(            query=x[:1], key=x, value=x,  # 这里是池化的原因,只对全局进行了注意力的查询            embed_dim_to_check=x.shape[-1],            num_heads=self.num_heads,            q_proj_weight=self.q_proj.weight,            k_proj_weight=self.k_proj.weight,            v_proj_weight=self.v_proj.weight,            in_proj_weight=None,            in_proj_bias=torch.cat([self.q_proj.bias, self.k_proj.bias, self.v_proj.bias]),            bias_k=None,            bias_v=None,            add_zero_attn=False,            dropout_p=0,            out_proj_weight=self.c_proj.weight,            out_proj_bias=self.c_proj.bias,            use_separate_proj_weight=True,            training=self.training,            need_weights=True        )        self.attn_weights = attn_weights        return x.squeeze(0)

CLIP模型的最大贡献在于它打破了传统的固定类别标签的范式,使得在收集数据集和训练模型时不再受限于预定义的类别数量,如ImageNet的1000类或COCO的80类。CLIP通过无监督学习,利用图像和文本的配对,可以预测它们的相似性或生成相关内容,从而在推理时更加灵活,甚至能够进行零样本分类任务。这种创新使得CLIP在物体检测、分割、视频动作识别、检索、多模态学习和图像生成等多个领域都有广泛的应用,展现了其巨大的影响力。从创新度、有效性和问题大小三个维度来看,CLIP都达到了极高的标准,其灵活性和高效性让我们看到了人工智能发展的新希望。

四、大模型的参数为什么大?

大模型使用了大规模的数据集进行训练,参数量肯定是会增加的,这可以显著提升模型的学习能力和性能。例如,GPT-3模型拥有1750亿个参数,而Meta开源的Llama模型参数量在80亿到700亿之间。 

但是大模型的参数体现在哪?

​其实这与传统的卷积神经网络类似,主要是加大模型的宽度和深度。

1. 模型规模(层数和宽度)

•最初的Transformer:原始的Transformer由6层编码器和6层解码器组成。每层的维度为512,前馈网络的隐藏层维度为2048。

•现代大模型:这些模型的层数大幅增加(GPT-3  96层),并且每层的维度也扩大了(GPT-3的隐藏层维度为12288,)。

2. 自注意力机制(Self-Attention)

•*最初的Transformer:自注意力的参数量为3 * d_model* d_head,即512 * 64 * 3,这对每一层来说相对较小。

•现代大模型:GPT-3有96个注意力头,每个头的维度为128。3×128^2×96

参考

  1. lLearning Transferable Visual Models From Natural Language Supervision. OpenAI 2021.

  2. lBLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation. Arxiv 2022.

  3. lAlign before Fuse: Vision and Language Representation Learning with Momentum Distillation. NIPS 2021

  4. lBLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models. ICML 2023.

  5. lVisual Instruction Tuning. NIPS 2023.

  6. lImproved Baselines with Visual Instruction Tuning. Arxiv 2023.

  7. [多模态大模型之clip,blip,blip–2,llava]

    https://www.bilibili.com/video/BV1vr421b7dP/?share_source=copy_web&vd_source=e7551656b52210b8f1bf3f198cce4fc4

  8. CLIP 论文逐段精读【论文精读】

    https://www.bilibili.com/video/BV1SL4y1s7LQ/?share_source=copy_web&vd_source=e7551656b52210b8f1bf3f198cce4fc4

  • 关注公众机器视觉与人工智能实验室


http://www.mrgr.cn/news/30466.html

相关文章:

  • HTB-Blue(永恒之蓝漏洞复现)
  • CTFshow——萌新隐写(未完待续)
  • 现在市场上有哪些大模型?什么样的大模型适合国内企业?
  • 机器学习之非监督学习(四)K-means 聚类算法
  • Gradio 自定义组件
  • 算法-查找算法(顺序查找二分查找)
  • YOLOv8的GPU环境搭建方法
  • Java 之网络编程
  • c++ static(详解)
  • C++中的哑元和内联函数
  • github的使用
  • Redis---卸载Redis
  • PyTorch经典模型
  • java序列化对象后读取数据错误的问题
  • 初学者笔记本电脑玩转大模型系列一:利用ollama跑大模型
  • Ceph官方文档_01_Ceph简介
  • C++ prime plus-4-编程练习
  • 【读书笔记-《30天自制操作系统》-22】Day23
  • 枚举(not二分)
  • 【移动端开发】“明日头条APP”