【大模型系列】统一图文理解与生成(BLIP/BLIPv2/InstructBLIP)

news2024/12/26 9:19:38

文章目录

  • 1 BLIP(2022, Salesforce Research)
    • 1.1 简介
    • 1.2 数据角度
    • 1.3 模型角度
    • 1.4 BLIP预训练的目标
  • 2 BLIP2(ICML2023, Salesforce)
    • 2.1 简介
    • 2.2 模型架构
    • 2.3 训练细节
  • 3 InstructBLIP(2023, Salesforce)
    • 3.1 指令微调技术(Instruction-tuning)
    • 3.2 数据集准备
    • 3.3 Instruction-aware视觉特征提取框架

1 BLIP(2022, Salesforce Research)

BLIP:统一视觉-语言理解和生成的自举多模态模型,其下游的应用可以为检索任务、描述任务、VQA任务(视觉问答)、NLVR(Natural Language Vision Reasoning)

  • 论文地址:https://arxiv.org/abs/2201.12086/
  • 项目地址:https://github.com/salesforce/BLIP/
  • 官方解读:https://blog.salesforceairesearch.com/blip-bootstrapping-language-image-pretraining/
  • 极市平台解读:https://www.cvmart.net/community/detail/7740/

1.1 简介

BLIP(BLIP: Bootstrapping Language-Image Pretraining for Unified Vision-Language Understanding and Generation)是Salesforce Research在2022年公开的一个统一理解和生成的多模态模型,该方法的Motivaion如下:

  • 问题一:目前VLP(Vision-Language Pre-training)数据大多来自于网络爬取,如CLIP。其中的caption包含很多噪声,不是一个理想的监督来源;
  • 问题二:在以往的VLP框架中,仅在理解任务或者生成任务方面表现出色,很少有可以兼顾的模型。

BLIP针对以上的两个问题,提出了解决方案:

  • 针对问题一:提出一种bootstrapping caption的方案来“提纯”带噪声的网络爬取数据,从而提升多模态模型的能力;
  • 针对问题二:提出一种新的VLP框架BLIP统一视觉语言理解和生成任务,比现有的方法更适应广泛的下游任务;

1.2 数据角度

  • 先用含噪声的数据训练一遍BLIP
  • 再使用BLIP的生成功能Captioner生成一系列的字幕,把生成的字幕通过Filter过滤一遍得到干净的数据
  • 最后使用干净的数据训练一遍BLIP

Step1: 用人工标注的数据集图文对{Ih, Th}对预训练模型Image-ground text encoder和decoder进行微调;

Step2: 遍历web datasets {Iw, Tw}进行以下操作:

  • Step2.1: 通过image-ground text decoder(Captioner)预测Iw的caption Ts,此时图片有2个图文对,一个是网络上爬取的{Iw,Tw},一个是预测的{Iw, Ts};
  • Step2.2: 通过Image-ground text encoder(Filter)来判别{Iw,Tw}、{Iw, Ts}的图文是否matching,过滤不匹配的图文对;

Step3: 汇总所有匹配的图文对D = {{Iw,Tw},{Iw,Ts},{Ih, Th}}
在这里插入图片描述

1.3 模型角度

模型涉及4个结构:

  • Image Encoder (ViT) : 首先进行图像特征的提取,这个前向过程相对较重,就是ViT的架构;
  • Text Encoder (BERT) : 这是一个标准的 BERT,这里用 ITC (Image-Text Contrastive Loss) 目标函数激活 Text Encoder 模块,目标是对齐 Image Encoder Transformer 和 Text Encoder Transformer 的特征空间;其中 [CLS] token 附加到文本输入的开头以总结句子。作用是提取文本特征做对比学习。
  • Image-grounded Text Encoder (变种 BERT,Filter):在标准 BERT 的结构里,于 Bi Self-Att 和 Feed Forward 之间插入 Cross Attention (CA) 模块,以引入视觉特征。这里用 ITM (Image-Text Matching Loss) 目标函数激活,ITM 是一个二分类任务,用来预测 image-text pair 的 正匹配 还是 负匹配,目的是学习 image-text 的多模态表示,调整视觉和语言之间的细粒度对齐;添加一个额外的 [Encode] token,作为图像文本的联合表征。
  • Image-grounded Text Decoder (变种 BERT,Captioner) 将 Image-grounded Text Encoder 结构中的 Bi Self-Att 替换为 Causal Self-Att。这里用 Language Modeling Loss (LM) 目标函数激活,目标是生成给定图像的文本描述。添加一个额外的 [Decode] token 和结束 token,作为生成结果的起点和终点。

颜色相同的部分表示参数共享,即视觉-文本编码器和视觉-文本解码器共享除self-attention层之外的所有参数。每个image-text在输入时,Image只需要经过一个ViT模型,text部分需要经过3次BERT模型。

1.4 BLIP预训练的目标

BLIP 在预训练期间联合优化了3个目标,有两个理解任务的目标函数和一个生成任务的目标函数。

对比学习目标函数 (Image-Text Contrastive Loss, ITC)

ITC 作用于1 视觉编码器 和 2 文本编码器,目标是对齐视觉和文本的特征空间。方法是使得正样本图文对的相似性更大,负样本图文对的相似性更低,在 ALBEF 里面也有使用到。作者在这里依然使用了 ALBEF 中的动量编码器,它的目的是产生一些伪标签,辅助模型的训练。

图文匹配目标函数 (Image-Text Matching Loss, ITM)

ITM 作用于1 视觉编码器 和 3 视觉文本编码器,目标是学习图像文本的联合表征,以捕获视觉和语言之间的细粒度对齐。ITM 是一个二分类任务,使用一个分类头来预测图像文本对是正样本还是负样本。作者在这里依然使用了 ALBEF 中的 hard negative mining 技术。

语言模型目标函数 (Language Modeling Loss, LM)

BLIP 包含解码器,用于生成任务。既然有这个任务需求,那就意味着需要一个针对于生成任务的语言模型目标函数。LM 作用于1 视觉编码器 和 4 视觉文本编码器,目标是根据给定的图像以自回归方式来生成关于文本的描述。与 VLP 中广泛使用的 MLM 损失 (完形填空) 相比,LM 使模型能够将视觉信息转换为连贯的字幕。

2 BLIP2(ICML2023, Salesforce)

BLIPv2:节约多模态训练成本,冻结预训练好的视觉语言模型参数

  • 论文地址:https://arxiv.org/pdf/2301.12597.pdf/
  • 代码地址:https://github.com/salesforce/LAVIS/tree/main/projects/blip2/
  • 极市平台解读: https://www.cvmart.net/community/detail/7768/

2.1 简介

BLIP2也是salesforce在2023发表在ICML2023上的方法,这个工作提出了一种借助现成的冻结参数的预训练视觉模型和大型语言模型的,高效的视觉语言预训练方法。但是,简单的冻结预训练好的视觉模型的参数或者语言模型的参数会带来一个问题:就是视觉特征的空间和文本特征的空间,它不容易对齐。那么为了解决这个问题,BLIP-2 提出了一个轻量级的 Querying Transformer,该 Transformer 分两个阶段进行预训练。

  • 第一阶段从冻结的视觉编码器中引导多模态学习,
  • 第二阶段从冻结的文本编码器中引导多模态学习。
    在这里插入图片描述

2.2 模型架构

在这里插入图片描述
在这里插入图片描述

  • QFormer(Querying Transformer): 用来对齐图片和文本特征,它包含图像transformer和文本transformer两个模块,后者少一个cross-attention层,且两个transformer共享self-attention参数;
  • Image Encoder: CLIP训练的Vit-L/14,EVA-CLIP训练的ViT-g/14
  • Text Encoder: OPT,FlanT5

2.3 训练细节

参考资料:https://zhuanlan.zhihu.com/p/664011842

Q-Former训练第一步:联合视觉编码器训练

Q-Former 训练的第一步,作者将 Q-Former 连接到冻结参数的图像编码器,并使用图像-文本对进行预训练,那么这一步的目标是训练好 Q-Former,以便 Queries 可以学习到如何更好地结合文本提取图片信息。

训练的目标函数,作者遵循 BLIP 的做法,联合优化3个具有相同输入格式和模型参数的预训练目标,每个目标函数使用不同的 mask Attention 来控制注意力的交互。

1. 图文对比学习(Image-Text Contrastive Learning,ITC)

与常规ITC任务不同的是:单个图片BLIP2产生的image embedding有32个(等于learned query的数量),而text embedding只有1个。BLIP2的操作是,同时计算32个image embedding与text embedding的距离,仅取最近的计算loss。下图详细梳理了整体pipeline及对应的shape变化(忽略了batchsize)

2. 图文匹配任务(Image-Text Matching,ITM)

这是多模态预训练中的经典目标函数,旨在更加细粒度地对齐图像和文本的表征,使其互信息最大化

此时会将query embedding与text embedding拼接起来作为输入,送入到QFormer中的Image Transformer中,通过一个二分类线性分类器,最后对Qformer在query embedding位置的输出向量取平均后进行预测。下图中详细展示了整体pipeline与shape变化(包含batch size维度)。

3. 基于图像的文本生成(Image-Grounded Text Generation,ITG)

ITG 给定一张输入图片,旨在训练 Q-Former 生成对应的文本描述。此处直接用QFormer的text transformer做image caption任务。有一个细节值得注意:作者将图片与文本表征的交互放到了self-attention中。

Q-Former训练第二步:联合视觉编码器和大型语言模型训练 在生成预训练的阶段,作者把 Q-Former 和冻结参数的 LLM 连接起来,以利用 LLM 的文本生成能力。 其过程如下:

  • 输入图片到Image Encoder后得到图像的表征;
  • 图像表征与Queries一起送入到Q-Former中得到Queries的输出;
  • 再经过全连接层与Text tokens的维度对齐之后,输入给LLM Decoder中进行解码预测

在这里插入图片描述

作者尝试了2种大语言模型,分别时基于Decoder-only和介于Encoder-Decoder架构

  • Decoder-Only架构:使用语言建模目标函数进行训练,冻结参数的LLM任务时根据Q-Former提供的视觉表征俩生成预测文本;
  • Encoder-Decoder架构:把LLM分成两段,前缀模板随着Queries的输出喂给LLM的Encoder,希望Decoder输出后缀预测;

3 InstructBLIP(2023, Salesforce)

主要工作:基于BLIPv2,将指令微调的范式引入到视觉语言模型上。

  • Paper:https://arxiv.org/pdf/2305.06500.pdf
  • Github:https://github.com/salesforce/LAVIS/tree/main/projects/instructblip

文章的主要贡献:

  • 将26个数据集转化成instruction tuning的格式,全面系统地研究了指令微调技术在视觉-语言模型上使用;
  • 提出了一个基于指令(instruct-aware)的视觉特征提取框架;

3.1 指令微调技术(Instruction-tuning)

参考资料:https://www.datalearner.com/blog/1051681306547159

指令微调技术的主要思想就是在输入阶段对指令做调整,使其得到更好的结果输出。如对于问题任务,Instruction可以提供具体的指令,例如:“请回答下列问题:谁是美国的第一位总统?”。以InstructGPT为例,其基本流程如下:

  • 准备自然语言指令集: 针对特定任务,准备一组自然语言指令,描述任务类型和任务目标,例如情感分类任务的指令可以是“该文本的情感是正面的还是负面的?”。
  • 准备训练数据集: 针对特定任务,准备一个标记化的数据集,其中每个数据样本都包含输入文本和标签,例如情感分类任务的标签可以是“正面”或“负面”。
  • 将自然语言指令和数据集转换为模型输入: 将自然语言指令和数据集转换为模型输入,例如对于情感分类任务,将自然语言指令和文本拼接作为输入,例如:“该文本的情感是正面的还是负面的?这家餐厅的食物很好吃。”
  • 在指令上进行微调: 在指令上进行微调,以适应特定任务的需求,提高模型在任务上的性能。

这样的方式训练了出来的模型可以让模型更好地识别输入的意图,同时也在zero-shot中表现更好!InstructBLIP的自然语言指令集模板如下:

在这里插入图片描述

3.2 数据集准备

在这里插入图片描述

基于上一节的自然语言指令集模板,将26个数据集转化成Instruction tuning的形式。 其中13个用于训练(held-in),剩余13个用于验证和测试(held-out)。

在训练期间,把所有训练集held-in的数据混合后,在不同任务中均匀采样instruction templates,语言建模损失函数训练:给定输入图片和Instruction templates,希望它输出回答。

为了避免过拟合较小的数据集,欠拟合较大的数据集,作者修改了采样概率,数据集越大的,采样概率越高,越小的,采样概率越低:p = sqrt(S) / Σ(sqrt(Si)),其中S是每个数据集的大小。

3.3 Instruction-aware视觉特征提取框架

在这里插入图片描述

结构上:Image encoder(ViT-g/14)、LLM(FlanT5-XL-3B,FlanT5-XXL-11B,Vicuna-13B)都冻结,只微调Q-Former 。其中可学习的Queries通过Self-attention层与Instructions进行交互,可学习的Queries通过Cross-attention再与Image embeddings进行交互,这样就可以鼓励网络提取与任务相关的图像特征,整个过程非常直观和符合直觉。

推理阶段:

  • 针对大部分描述性任务,如 image captioning,open-ended VQA 等,InstructBLIP 可以直接使用 LLM 生成的文本作为输出;
  • 针对选择性任务,如 classification 和 multi-choice VQA ,将LLM生成的内容词汇限制为候选列表进行排序,计算每个候选的对数似然,选择最高值的一个作为最终预测。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——动态顺序表

数据结构的动态顺序表有以下几个操作:创建,销毁,初始化,增删查改和打印以及内存空间不够时的扩容 本文的宏定义: #define SeqTypeData int 1.动态顺序表的创建 typedef struct SeqListInit{//动态顺序表的创建SeqT…

双指针算法_复写零

题目: 给一个固定长度的数组arr,将数组中出现的每一个0都复写一遍,并且将其余元素都往右移动 且不要再超过数组长度的位置写入元素,在数组上直接修改 示例: 双数组模拟操作: 从示例来看,因为…

【状态压缩DP】第十三届蓝桥杯省赛C++ B组《积木画》(C++)

【题目描述】 小明最近迷上了积木画,有这么两种类型的积木,分别为 I 型(大小为 2 个单位面积)和 L 型(大小为 3 个单位面积): 同时,小明有一块面积大小为 2N 的画布,画布…

模板进阶:非类型模板参数,特化

一、非类型模板参数 非类型模板参数&#xff0c;就是用一个常量作为 类/函数 的模板参数&#xff0c;在 类/函数 中可以被当成常量使用。 template<class T, size_t N>// N 为一个非类型模板参数 class Stack { public:Stack(){_a new T[N];} protected:T* _a; };int m…

腾讯云服务器入站规则端口开放使用指南(CentOS系统)

第一步&#xff1a;开放安全组入站规则 来源处0.0.0.0/0是对IPv4开发&#xff0c;::/0是对IPv6开放&#xff1b; 协议端口按照提示填写即可。云服务器防火墙开放 第三步&#xff1a;本地防火墙开放 sudo firewall-cmd --zonepublic --add-port你的端口号/tcp --perma…

RTT——stm32f103的can总线通信

1.创建工程 2.配置时钟和引脚 引脚配置使能CAN 时钟配置&#xff0c;采用外部高速时钟 生成MDK工程后复制相关初始化函数到RTT-studio中 将void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)函数复制至broad.c文件中 将时钟配置函数复制到drv_clk.c中&#xff0c;只复制函数…

Java8中Stream流API最佳实践Lambda表达式使用示例

文章目录 一、创建流二、中间操作和收集操作筛选 filter去重distinct截取跳过映射合并多个流是否匹配任一元素&#xff1a;anyMatch是否匹配所有元素&#xff1a;allMatch是否未匹配所有元素&#xff1a;noneMatch获取任一元素findAny获取第一个元素findFirst归约数值流的使用中…

Linux下的多线程编程:原理、工具及应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …

【C++ RB树】

文章目录 红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入代码实现总结 红黑树 AVL树是一颗绝对平衡的二叉搜索树&#xff0c;要求每个节点的左右高度差的绝对值不超过1&#xff0c;这样保证查询时的高效时间复杂度O( l o g 2 N ) log_2 N) log2​N)&#xff0c;…

钉钉小程序 - - - - - 如何通过一个链接打开小程序内的指定页面

方式1 钉钉小程序 scheme dingtalk://dingtalkclient/action/open_mini_app?miniAppId123&pagepages%2Findex%2Findex%3Fx%3D%25E4%25B8%25AD%25E6%2596%2587 方式2 https://applink.dingtalk.com/action/open_mini_app?type2&miniAppIdminiAppId&corpIdcorpId&…

MySQL行锁核心知识介绍

MySQL的行锁是数据库中用于控制并发访问的一种机制。它允许在数据库的行级别上实现锁定&#xff0c;从而允许多个事务同时修改不同行的数据&#xff0c;而不会相互干扰。这种锁机制可以提高数据库的并发性能&#xff0c;减少锁争用&#xff0c;提高事务的吞吐量。在本教程中&am…

一周学会Django5 Python Web开发-Jinja3模版引擎-安装与配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计35条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

.Net Core 中间件验签

文章目录 为什么是用中间件而不是筛选器&#xff1f;代码实现技术要点context.Request.EnableBuffering()指针问题 小结 为什么是用中间件而不是筛选器&#xff1f; 为什么要用中间件验签&#xff0c;而不是筛选器去验签? 1、根据上图我们可以看到&#xff0c;中间件在筛选器之…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器&#xff08;3&#xff09;Bug问题记录1&#xff…

前端和后端权限控制【笔记】

前端权限设置【笔记】 前言版权推荐前端权限设置需求效果实现资源 后端权限控制1.给所有前端请求都携带token2.添加拦截器3.配置到WebMvcConfiguration4.更多的权限验证 最后 前言 2024-3-15 18:27:26 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FormLink)

提供静态卡片交互组件&#xff0c;用于静态卡片内部和提供方应用间的交互&#xff0c;当前支持router、message和call三种类型的事件。 说明&#xff1a; 该组件从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件仅可…

Gitlab CI/CD 自动化打包部署前端(vue)项目

一、虚拟机安装 1.vmware下载 2.镜像下载 3.Ubuntu 4.新建虚拟机 一直点下一步&#xff0c;直到点击完成。 5.分配镜像 二、Gitlab CI/CD 自动化部署项目 1.配置GitLab CI/CD&#xff1a; A.在你的Vue.js项目中&#xff0c;创建一个名为.gitlab-ci.yml的文件&#xff0…

Javaweb--CSS

一&#xff1a;概述 CSS &#xff08;Cascading Style Sheet&#xff08;层叠样式表&#xff09;&#xff09;是一门语言&#xff0c;用于控制网页表现。 W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;JavaScrip…

【计算机网络】UDP/TCP 协议

TCP 协议 一、传输层1. 再谈端口号2. 端口号范围划分3. 进程和端口号4. netstat5. pidof 二、UDP 协议1. UDP 协议端格式(报文)2. UDP 的特点3. 面向数据报4. UDP 的缓冲区 三、TCP 协议1. 认识 TCP2. TCP 协议段格式&#xff08;1&#xff09;4 位首部长度&#xff08;2&#…

(三)丶RabbitMQ的四种类型交换机

前言&#xff1a;四大交换机工作原理及实战应用 1.交换机的概念 交换机可以理解成具有路由表的路由程序&#xff0c;仅此而已。每个消息都有一个称为路由键&#xff08;routing key&#xff09;的属性&#xff0c;就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型&a…