一站式解读多模态——Transformer、Embedding、主流模型与通用任务实战(下)

本文章由飞桨星河社区开发者高宏伟贡献。高宏伟,飞桨开发者技术专家(PPDE),飞桨领航团团长,长期在自媒体领域分享AI技术知识,博客粉丝9w+,飞桨星河社区ID为GoAI 。分享分为上下两期,本期分享从主流多模态模型和多模态实战项目等方面介绍多模态。

上篇文章主要从时间线对多模态模型进行总结,在文章最后引入模态对齐概念,本篇文章将针对经典的多模态模型展开详细介绍,围绕多模态模型如何进行模态对齐,最后以多模态框架PaddleMIX进行项目实战,欢迎大家讨论交流。

主流多模态模型介绍

本篇首先将围绕多模态模型的基本思想、模型结构、损失设计及训练数据集情况,对CLIP、BLIP、BLIP2等经典多模态模型展开详细介绍,总结如下:

CLIP

论文:Learning Transferable Visual Models From Natural Language Supervision

CLIP采用双塔结构,其核心思想是通过海量的弱监督文本对,通过对比学习,将图片和文本通过各自的预训练模型获得编码向量,通过映射到统一空间计算特征相似度,通过对角线上的标签引导编码器对齐,加速模型收敛。CLIP是一种弱对齐,可应用于图文相似度计算和文本分类等任务!

CLIP结构图CLIP具体步骤如下:

1.CLIP将图像和文本先分别输入一个图像编码器image_encoder和一个文本编码器text_encoder,得到图像和文本的向量表示 I_f 和 T_f 。其中 Image Encoder是 ResNet 或 Vision Transformer,Text Encoder 为 GPT-2。

2.将图像和文本的向量表示映射到一个多模态空间(不同类型的数据整合到一个统一的空间),得到新的可直接进行比较的图像和文本的向量表示 I_e 和T_e 。

3.计算图像向量和文本向量之间的cosine相似度。上述得到n x n矩阵,对角线为正样本为 1,其他为负样本0。有了n个图像的特征和n个文本的特征之后,计算 cosine similarity,得到的相似度用来做分类的logits。

4.对比学习的目标函数就是让正样本对的相似度较高,负样本对的相似度较低。logits 和 ground truth 的labels 计算交叉熵损失,loss_i,loss_t分别是 Image 和 Text 的 loss,最后求平均就得到loss。CLIP代码示例:

I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

BLIP

论文:BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation (统一视觉语言理解和生成的引导语言图像预训练)

代码地址:https://github.com/salesforce/BLIP

BLIP既可以做内容理解,还可以做文本生成,是一个大一统的多模态预训练框架。(理解+生成)

BLIP结构图

引用来源:论文《BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation》

模型组成

BLIP由四个模块组成,分别是image encoder、text encoder(和image encoder 统一称为unimodal encoder)、image-grounded text encoder、image-grounded text decoder。

  1. Image encoder:visual transformer,VIT

  2. text encoder:BERT(双向自注意力机制+FFN),加一个 cls_token放在text input前面总结整句话

  3. image-grounded text encoder:将image encoder的输出一起输入cross attention中(image embedding作为key,value,text embedding作为query),输入端加一个任务特定的encoder token,采用双向自注意力机制,使得text全部可见。

  4. image-grounded text decoder:将image encoder的输出一起输入cross attention中(image embedding作为key,value,text embedding作为query),输入端加一个任务特定的decoder token,attention采用causal self-attention,使得text只能见到当前和历史的文本。

损失构成

BLIP由三个损失函数监督,前两个是understanding-based ,另一个是generation-based。具体损失如下:

Image-Text Contrastive Loss (ITC)

ITC通过对比学习,鼓励正向的图像-文本对在特征空间内靠近,与负向对相远离,对齐视觉和文本转换器的特征空间。研究表明,ITC有效地促进了视觉和语言理解的提升。为了强化这一过程,ITC引入了动态编码器以产生特征,并利用软标签作为训练目标,以识别负对中潜在的正对。

Image-Text Matching Loss (ITM)

ITM专注于学习精细的视觉-语言对齐多模态表示。作为一个二分类任务,ITM用于预测图像-文本对是否匹配,通过线性层(ITM头)和它们的多模态特征。采用硬负采样策略,选择批次中对比相似度较高的负对参与损失计算,以获得更信息丰富的负样本。与ITC不同,ITM直接处理图像输入,能更精确地判断图像与文本的一致性。

Language Modeling Loss (LM)

LM旨在基于给定图像生成文本描述。LM通过交叉熵损失优化,以自回归形式训练模型,最大化文本可能性。在计算损失时,采用了0.1的标签平滑策略。不同于VLP中广泛使用的Masked Language Modeling损失,LM赋予模型根据视觉信息生成连贯文本描述的泛化能力。

数据生产

BLIP的关键创新在于引入了预训练部分的Filter和Captioner模块。尽管CLIP使用了超过4亿个未经筛选的网络数据进行训练,但由于数据中包含大量噪声,模型的准确性受到了影响。在此基础上,BLIP引入了以下两个模块:Filter和Captioner。

Filter用于清除不匹配的文本信息(去除噪声图像-文本对),而Captioner用于生成高质量文本信息(生成给定web图像的标题),进而提升图像-文本对训练数据集质量。两种都是通过相同的预训练MED模型进行初始化,并在COCO数据集上分别进行微调,调优是一个轻量级的过程。

BLIP数据生产过程(Filter和Captioner模块)

引用来源:论文《BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation》

具体来说,首先,BLIP使用从网络爬取到的可能不匹配的数据和部分人工标注的匹配数据(如COCO数据集)组成的数据集D进行预训练。BLIP利用人工标注的数据和内部的ITC&ITM模块微调Filter,筛选出不匹配的图像-文本对。其次,使用同样的标注数据和BLIP的Decoder微调Captioner,使其能根据图像生成匹配的文本。这些新文本再通过Filter判断其与原图像的匹配程度。

注:Captioner生成的文本并非始终比网络数据更匹配,但提供了更多选择,以实现更优的匹配结果。通过这种方法,BLIP能构建一个高质量的新数据集D。

BLIP-2

论文:Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models (节约多模态训练成本:冻结预训练好的视觉语言模型参数 )

代码:

https://github.com/salesforce/LAVIS/tree/main/projects/blip2

为减少计算成本并避免灾难性遗忘的问题,BLIP-2 在预训练时冻结预训练图像模型和语言模型,但简单地冻结预训练模型参数会导致视觉特征和文本特征难以对齐。论文中,作者提出了一种预训练框架,利用 “预训练frozen冻结的图像编码器 + 可学习的Q-Former” 和 “预训练frozen冻结的LLM大规模语言模型” 来进行图像和语言的联合预训练。

引用来源:论文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

1)Image Encoder:负责从输入图片中提取视觉特征,本文试验CLIP 训练的 ViT-L/14和EVA-CLIP训练的 ViT-g/14两种网络结构。

2)Large Language Model:负责文本生成,本文试验decoder-based LLM and encoder-decoder-based LLM。

3)Q-Former:为BLIP2核心使用,用两阶段预训练 Q-Former 来弥补模态差距,共分为表示学习和生成学习两个阶段。

第一阶段:表征学习

BLIP2第二阶段

引用来源:论文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

学习阶段:Q-Former作为桥梁,来衔接图像编码器和LLM,并缩小两者表征上的GAP。Q-Former整体训练目标沿用BLIP(即图文匹配,图生文,图文对比学习),但在框架上更加精简,使用UniLM风格的统一自编码和自回归,使得由BERT随机初始化的32个Learned Queries将图像编码器的表示在语言空间中压缩对齐(其中,CA为每两层插入一次,用于融合图片视觉表征)。

第二阶段:从大规模语言模型学习视觉到语言生成

生成学习阶段:将 Q-Former连接到冻结的 LLM,以利用 LLM 的语言生成能力。这里使用全连接层(FC,可视为Q-Former到LLM的适配器)将输出的Query嵌入线性投影到与 LLM 的文本嵌入相同的维度,然后将投影的Query嵌入添加到输入文本嵌入前面,实现替换LLM的部分文本嵌入(即软提示)。

由于 Q-Former 已经过预训练,可以提取包含语言信息的视觉表示,因此它可以有效地充当信息瓶颈,将最有用的信息提供给 LLM,同时删除不相关的视觉信息,减轻了 LLM 学习视觉语言对齐的负担。BLIP2在Decoder-only 和Encoder-Decoder 架构的模型上均进行了实验。

BLIP2第二阶段

引用来源:论文《Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models》

多模态实战项目

实战平台:本次实战平台环境推荐采用飞桨星河社区,平台项目展示页面如下。

飞桨星河社区提供强大易用的环境,包括上传自己的数据集及训练可视化,还可以加载多任务套件(PaddleNLP、PaddleOCR、PaddleDetection、PaddleClas任等),更大的亮点在于轻量代码实现,共同助力开发者轻松进行深度学习。相比个人环境,飞桨平台已预配环境,用户无需自行安装GPU环境可直接编程、运行实验,用户注册后进入BML Code Lab享受编程乐趣,可快速搭建模型,降低门槛。

PaddleMIX 介绍

官网Github:PaddleMIX PaddleMIX是基于飞桨的跨模态大模型开发套件,聚合图像、文本、视频等多种模态,覆盖视觉语言预训练、文生图、文生视频等丰富的跨模态任务。提供开箱即用的开发体验,同时满足开发者灵活定制需求,探索通用人工智能。目前支持的多模态预训练模型:

1. 使用教程

克隆PaddleMIX项目:

git clone https://github.com/PaddlePaddle/PaddleMIX

安装PaddleMIX和ppdiffusers环境

cd PaddleMIX
pip install -e .
cd ppdiffusers
pip install -e .

安装appflow 依赖环境

pip install -r paddlemix/appflow/requirements.txt

2. 一键预测

PaddleMIX提供一键预测功能,无需训练,覆盖图文预训练,文生图,跨模态视觉任务,实现图像编辑、图像描述、数据标注等多十几种种跨模态应用(可自行更开预训练任务模型)。以开放世界检测分割为例,在安装环境后新建如下.py脚本直接运行即可。

from paddlemix.appflow import Appflow
from ppdiffusers.utils import load_image

task = Appflow(app="openset_det_sam",   #更改应用名称
                   models=["GroundingDino/groundingdino-swint-ogc","Sam/SamVitH-1024"],  #更换模型任务,可组合
                   static_mode=False) #如果开启静态图推理,设置为True,默认动态图
url = "https://paddlenlp.bj.bcebos.com/models/community/CompVis/stable-diffusion-v1-4/overture-creations.png"
image_pil = load_image(url)
result = task(image=image_pil,prompt="dog")

注:以上部分模型支持SFT和Lora微调,由于篇幅原因,大家可以访问Readme文档自行查看。具体任务效果大家可以自行尝试,非常方便!下面作者将主要以PaddleMIX库中的BLIP2模型展开介绍。

基于PaddleMIX的多模态模型VQA和Caption任务–以BLIP2为例

  1. 环境准备
cd PaddleMIX
pip install -r requirements.txt

2.数据准备

(1)coco数据 数据部分,默认使用coco_karpathy数据,使用该数据不需另外配置,会自动下载。目前已支持 “coco_caption”,"vg_caption"等数据集训练。数据标注示例:

    {'caption': 'A woman wearing a net on her head cutting a cake. ', 'image': 'val2014/COCO_val2014_000000522418.jpg', 'image_id': 'coco_522418'}

(2)自定义数据 如果需要自定义数据,推荐沿用上述数据格式处理自己的数据。更多可参考数据集中的annotations/coco_karpathy_train.json文件。在准备好自定义数据集以后, 可以使用 load_dataset() 来加载数据.

(3)模型介绍 PaddleMix支持BLIP-2系列模型,目前包括BLIP-2-OPT、BLIP-2-FlanT5

  • blip2-stage1 :对应上述blip2的第一阶段预训练模型,可用于开启第二阶段预训练;
  • blip2-stage2 :使用论文中数据训练好的第一阶段模型,可用于开启第二阶段预训练;
  • blip2-pretrained-opt :对应论文精度Blip2第二阶段训练完成的模型,语言模型使用opt,可用于模型微调任务或进行zeroshot vqa推理;
  • blip2-caption-opt :对应论文精度Blip2第二阶段训练完成并在caption数据集进行微调的模型,语言模型使用opt,可用于image caption推理;

3.BLIP2训练配置

BLIP2训练无需更改参数即可开始训练,参考代码如下:

MODEL_NAME="paddlemix/blip2-stage2"fleetrun --master '127.0.0.1' --nnodes 1 --nproc_per_node 8 --ips '127.0.0.1:8080' run_pretrain_stage2.py \
    --per_device_train_batch_size 128 \     
    --model_name_or_path ${MODEL_NAME}  \
    --warmup_steps 2000 \
    --eta_min 1e-5 \
    --learning_rate 0.0001 \
    --weight_decay 0.05 \
    --num_train_epochs 10 \
    --tensor_parallel_degree 1 \  #设置张量模型的并行数。
    --sharding_parallel_degree 1 \ #设置分片数量,启用分片并行。
    --output_dir "./output" \ 
    --logging_steps 50 \
    --do_train \
    --save_strategy epoch \

注:其中#MODEL_NAME 路径配置为 paddlemix/ + 已支持的model name(如blip2-pretrained-opt2.7b,paddlemix/blip2-stage1等) 可配置参数说明(具体请参考paddlemix/examples/blip2/run_pretrain_stage2.py)

第一阶段训练

单卡训练

CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_pretrain_stage1.py

多卡训练

fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_pretrain_stage1.py

第二阶段训练

单卡训练

CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_pretrain_stage2.py

多卡训练

fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_pretrain_stage2.py

4.评估

问答任务评估

fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_eval_vqav2_zeroshot.py

生成任务评估

fleetrun --gpus=0,1,2,3 paddlemix/examples/blip2/run_eval_caption.py

5.预测

CUDA_VISIBLE_DEVICES=0 python paddlemix/examples/blip2/run_predict.py

多模态模型趋势总结

思想:图文特征对齐、指令微调、多任务;

结构:图像编码器Image Encoder±大语言模型LLM+对齐模块 Loss;

设计:参考对比学习探索不同的图文特征对齐方式,同时增加指令微调能力;

多模态任务学习项目推荐:PaddleMIX

Github: https://github.com/PaddlePaddle/PaddleMIX

跨模态检索相关项目:多模态CLIP以文搜图注:更多完整的多模态项目可访问飞桨官方查阅!

地址:https://aistudio.baidu.com/index

全文总结

本文主要对多模态模型的概念、下游任务类型、数据集、发展时间线的基础理论进行介绍,着重讲解经典多模态大模型(CLIP、BLIP、BLIP2等)原理及结构,最后对飞桨多模态框架PaddleMIX进行介绍,对多模态通用任务基础项目实战,感兴趣的同学可访问官方Github进行学习,最后欢迎大家相互交流学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/528634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下的ASLR保护机制详解及其绕过

写在前面: 本篇博客为本人原创,但非首发,首发在先知社区 原文链接: https://xz.aliyun.com/t/13924?time__1311mqmxnQ0%3DqGwx2DBqDTlpzeG%3DKT8qQTID&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣的…

设计模式总结-抽象工厂模式

抽象工厂模式 模式动机模式定义模式结构模式分析模式实例与解析实例一:电器工厂 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工…

4.8QT

将按钮3,基于qt4版本连接实现点击按钮3,实现关闭窗口。 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), btn3(new QPushButton(this)) {ui->s…

D1084 5A低压差电压调整器应用方案,内含电流限制和热保护功能,防止任何过载时产生过高的结温。

1、 概述: D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。输出电压可通过电位器调节或1.5V, 1.8V, 3.3V三个固定电压版。内含电流限制和热保护功能,防止任何过载时产生过高的结温。D1084系列电路有标准TO-220、TO-263和TO-252封装形式。 2、 典…

代码随想录训练营day32

第八章 贪心算法 part02 1.LeetCode. 买卖股票的最佳时机II 1.1题目链接:122.买卖股票的最佳时机 II 文章讲解:代码随想录 视频讲解:B站卡哥视频 1.2思路:本题首先要清楚两点:只有一只股票!当前只有买股…

02_物联网感知技术

物联网感知技术 物联网感知技术 物联网感知技术

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…

漫谈GIS和空间数据库技术

1 GIS和CAD有啥区别 地理信息系统(GIS)和计算机辅助设计(CAD)是两种不同的技术,它们在功能、应用和数据处理方面有着显著的区别。以下是根据搜索结果得出的GIS和CAD的主要区别: 1. **数据处理的侧重点不同…

Redis-底层数据结构

Redis-底层数据结构 redisObject对象机制对象共享引用计数以及对象的消毁 动态字符串SDS链表链表的优缺点: 压缩链表ziplist的缺点 字典-Dictrehash渐进式rehash 整数集-intSet内存分布图整数集合的升级 跳表 - ZSkipList快表-quicklistlistpack redisObject对象机制 typedef s…

【神经网络】生成对抗网络GAN

生成对抗网络GAN 欢迎访问Blog总目录! 文章目录 生成对抗网络GAN1.学习链接2.GAN结构2.1.生成模型Generator2.2.判别模型Discrimintor2.3.伪代码 3.优缺点3.1.优势3.2.缺点 4.pytorch GAN4.1.API4.2.GAN的搭建4.2.1.结果4.2.2.代码 4.3.示意图:star: 1.学习链接 …

浅析安全传输协议HTTPS之“S”

当前互联网,在各大浏览器厂商和CA厂商的推动下,掀起了一股HTTPS应用浪潮。为了让大家更好的了解HTTPS,本文给大家介绍关于HTTPS 中的S一个整体的认识。从其产生的历史背景、设计目标说起,到分析其协议设计结构、交互流程是如何实现…

kernel32.dll文件丢失的几种相应解决办法,成功解决丢失难题

当启动计算机并尝试运行某个应用程序时,屏幕上突然弹出一条醒目的错误提示:“电脑显示kernel32.dll丢失”。这也就意味着操作系统在当前环境下无法找到名为“kernel32.dll”的动态链接库文件。这个问题可能会导致一些应用程序无法正常运行,给…

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口: Text(content?: string | Resource) 参数: 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效,显示Span内容,并且此时text组件的样式不…

模型优化和调整(2)

接模型优化和调整(1) 调整反向传播 梯度消失和梯度爆炸 梯度消失和梯度爆炸都和计算出来的“delta”有关。理想的delta应该是逐渐减小的。如果delta一直太小,则会导致下降太慢,甚至对于权重没有改变,此时形成了梯度…

远程桌面无法连接怎么办?

远程桌面无法连接是指在尝试使用远程桌面功能时出现连接失败的情况。这种问题可能会给工作和生活带来极大的不便,因此我们需要寻找解决办法。在讨论解决方案之前,我们先来了解一下【天联】组网的优势。 【天联】组网的优势有很多。它能够解决复杂网络环境…

我自己开发的App上架了

我自己开发的App上架了 1、梦想实现 前几天,我在华为应用市场上架了我自己开发的App,心情十分激动。自从毕业后进入职场,在Android岗位上干了5年,一直想要开发一款App,为什么会有这种想法?一是能够按照自…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型,使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重:2B和7B。每种尺寸都带有经过预训练&a…

大话设计模式——18.策略模式(Strategy Pattern)

简介 是一系列算法的封装,即做的事情相同(方法名称相同)但是实现的方式不同,以相同方式调用所有的算法,减少算法与使用算法的耦合。直接调用方法。 UML图 应用场景 Java AWT中的LayoutManager(布局管理器&…

蓝桥杯简单模板

目录 最大公约数 两个数的最大公约数 多个数的最大公约数 最小公倍数 两个数的最小公倍数 多个数的最小公倍数 素数 ​编辑 位数分离 正写 ​编辑 反写 闰年 最大公约数 两个数的最大公约数 之前看见的是辗转相除法,例如现在让算一个49,21…

Three.js--》实现2D转3D的元素周期表

今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 目录 项目搭建 平铺元素周期表 螺旋元素周期表 网格元素周期表 球状元素周期表 加底部交互按钮 项目…