BLIP-2:冻结现有视觉模型和大语言模型的预训练模型

news2024/11/15 11:01:22

Li J, Li D, Savarese S, et al. Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models[J]. arXiv preprint arXiv:2301.12597, 2023.

BLIP-2,是 BLIP 系列的第二篇,同样出自 Salesforce 公司,2023 年初挂在了 arXiv 上,不到一年时间已经拥有 600+ 引用量,可见其影响力。现在很多多模态大模型都是基于 BLIP-2 进一步拓展的。

与 ALBEF、BLIP 类似,BLIP-2 的目标是训练一个图文多模态预训练模型。不同点是,BLIP-2 是使用现有的单模态编码器,并且分两阶段冻结图像编码器和文本编码器训练出多模态预训练模型。这使得 BLIP-2 能够在降低训练成本的同时提高性能,给其带来了巨大的优势。

在这里插入图片描述

本文不再按照论文解读的方式逐段记录,只专注于介绍 BLIP-2 技术本身。本文参考 多模态学习6—深入理解BLIP-2,更多参考资料如下:

  • 全文翻译:BLIP2:下一代多模态模型的雏形;
  • 文章总结:[BLIP/BLIP2/InstructBLIP] 图文多模态理解与生成、一文读懂BLIP和BLIP-2多模态预训练;
  • 领域现状:多模态大模型 CLIP, BLIP, BLIP2, LLaVA, miniGPT4, InstructBLIP 系列解读;

目录

  • 一. 背景
  • 二. BLIP-2 原理
    • 1. BLIP-2 模型
    • 2. 预训练方法
  • 三. 实验
    • 1. 实验结果
    • 2. 对比实验
  • 四. 总结
  • 五. 复现

一. 背景

现有的视觉语言预训练 (VLP) 方法在训练图文多模态模型时,往往采用端到端的训练模式,主要存在以下两个问题:

  • 训练成本大:多模态模型需要大量数据,并且模型结构复杂,因此训练成本较高;
  • 模型灾难性遗忘:大语言模型在微调时,会产生遗忘现象。因此如果直接将单模态的预训练模型加入到多模态模型中进行联合训练,可能会产生灾难性的遗忘问题;

为此,作者提出了 BLIP-2 模型:

  • 使用现有的预训练过的视觉模型和语言模型(本文使用的是 大语言模型 LLM),避免 从头训练 (train-from-scratch),以减少训练成本;
  • 预训练期间 冻结 (froze) 单模态模型的参数,从而避免模型的灾难性遗忘;
  • 要想使用预训练过的单模态模型,就必须保证跨模态间能够对齐。为了让两个冻结的单模态模型对齐,引入了 Querying Transformer (Q-Former) 模块来对图文进行对齐,从而让图像和文本产生交互;

    LLM 本质上是个语言模型,无法直接接受其他模态的信息,所以需要把各个模态的信息统一到 LLM 能理解的特征空间。为此,作者提出了 Q-Former。为了融合特征,那 Q-Former 采用 transformer 架构最合适不过了。其实这里的 Q-Former 就是在 ALBEF 的基础上改进得到的。
    相较于 ALBEF,Q-Former 最大的不同就是引入了 Queries。这些 Queries 通过 Cross-Attention 与图像的特征交互,通过 Self-Attention 与文本的特征交互。

二. BLIP-2 原理

BLIP-2 全称也是 Bootstrapping Language-Image Pre-training,是一种 冻结现有视觉模型和大语言模型的预训练模型。这里的 Bootstrapping 指的是预训练阶段使用先前的学习结果来改进当前的学习结果:第一阶段的预训练使用冻结的视觉模型来学习图像 - 文本表示,第二阶段的预训练使用冻结的大型语言模型来学习图像 - 文本生成。

1. BLIP-2 模型

BLIP-2 由预训练的视觉模型 Image Encoder、预训练的大语言模型 Large Language Model、可学习的 Q-Former 组成:

  • Image Encoder:从输入图片中提取视觉特征。文中采用了两种不同的网络结构:CLIP 训练过的 ViT-L/14 和 EVA-CLIP 训练过的 ViT-g/14;
  • Large Language Model:大语言模型进行文本生成。文中采用了尝试了两种不同的网络结构:decoder-based LLM 和 encoder-decoder-based LLM;
  • Q-Former:弥补视觉和语言两种模态间的差异,实现跨模态间的对齐。Q-Former 使用了一组可学习的 查询向量 Queries 来从冻结的 Image Encoder 中提取视觉特征,然后传入 LLM 供其生成文本;

在这里插入图片描述

整个模型的流程是:Image Encoder 接收图像作为输入,输出图像的视觉特征;Q-Former 接收文本和 Image Encoder 输出的图像视觉特征,结合查询向量进行融合,学习与文本相近的视觉特征,输出 LLM 能够理解的视觉表示;最后 LLM 模型接收 Q-Former 输出的视觉标识,生成对应文本。

2. 预训练方法

在介绍 Q-Former 的训练方法之前,需要先明确 Q-Former 的结构:Q-Former 由 Image Transformer 和 Text Transformer 两个子模块构成,它们共享相同的自注意力层:

  • Image Transformer:用于与冻结的图像编码器进行交互,从中提取一定数量的输出特征;
  • Text Transformer:既可以作为文本编码器,也可以作为文本解码器。它创建一组可学习的 Queries 作为 Image Transformer 的输入,这些 Queries 在 Image Transformer 中通过自注意力层相互作用,并通过交叉注意力层与冻结的图像特征进行交互。根据预训练任务的不同,可以应用不同的自注意力掩码来控制查询文本交互;

在这里插入图片描述

Q-Former 使用 BERTbase 的预训练权重初始化,而交叉注意力层则是随机初始化。Q-Former 总共包含 188M 的参数。

预训练 Q-Former 时采用两阶段的训练策略:

  • 第一阶段:冻结 Image Encoder 的参数,训练 Queries 和 Q-Former,让 Queries 能够从 Image Encoder 中提取图像特征,转化为和文本特征接近的视觉特征。这一阶段相当于在将图像特征空间拉近到文本特征空间;
    在这里插入图片描述

  • 第二阶段:冻结 LLM 的参数,训练 Queries 和 Q-Former,使得模型能够获取强大的 zero-shot 能力和图像生文本的能力。这一阶段相当于学习如何将视觉信息转换为自然语言文本,以便在后续的任务中生成与图像相关的自然语言描述;
    在这里插入图片描述

两阶段的具体训练方法详见 多模态学习6—深入理解BLIP-2。

从功能上讲,Q-Former 机制本质上是为了对齐图像和文本。如果没有对齐操作,直接进行第二阶段的 LLM 生成任务学习,那么模型最后的结果会比较差,论文中也有实验证明。但对齐操作并不是一定需要 Q-Former 这种形式么,只要能够将 Image encoder 提取的原始图像特征进行某种程度的映射,理论上就可以进行对齐。但采用 Q-Former 确实有一些明显的优势,包括特征数量的固定、参数共享等。

三. 实验

1. 实验结果

下图的 zero-shot image-to-text generation 示例展现了 BLIP-2 模型超强的能力,包括视觉对话、知识推理、信息检索、语言表达、文本生成等:
在这里插入图片描述

2. 对比实验

文中还对比了不同 VLP 模型在 Image Captioning、VQA、Image-Text Retrieval 等任务上的表现:
在这里插入图片描述

四. 总结

BLIP-2 是一个典型的图文多模态模型,使用训练好的单模态模型和 Q-Former 机制,通过两阶段训练对不同模态进行对齐,有效地减少了训练成本并解决了模型的遗忘现象。

作者在文末表明,BLIP-2 也存在一些局限性:

  • 上下文学习能力的缺失:由于预训练数据集中的每个数据只包含一个图像 - 文本对,因此 LLM 无法学习到一个序列中多个图像 - 文本对的相关性;
  • LLM 知识库的不准确性:由于语言任务完全依赖 LLM,因此 LLM 知识库的不准确性和滞后性都会对语言任务的结果带来影响。并且冻结 LLM 参数还会带来一定的风险,包括 LLM 中的攻击性语言、社会偏见等。一种解决办法是进行微调,或者对有害数据集进行过滤;

五. 复现

Salesforce 没有开源预训练的代码,只开源了 训练好的模型 和 API,通过导入 lavis.models 包进行调用,可以直接拿来做下游任务。网页版的 Demo 也可以在线完成 Image Captioning、VQA 等任务(已停用)。

以 blip2_instructed_generation.ipynb 为例,调用 BLIP-2 提供的 API 处理下游任务。一开始使用的是 Google Colab,但加载模型时内存超限;后来换成 AutoDL,但 demo 文件调用封装的 lavis.models 需要从 https://huggingface.co/models 加载,遇到 OSError: Can't load tokenizer for 'bert-base-uncased'. 问题,查阅 huggingface 的讨论区发现是网络问题 1,AutoDL不能访问。下面只展示 demo 里自带的实验结果。

实验结果

在这里插入图片描述

在这里插入图片描述


  1. What to do when HuggingFace throws “Can’t load tokenizer” ↩︎

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

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

相关文章

聚观早报 |地平线征程6芯片来了;鸿蒙智行官网上线

【聚观365】11月20日消息 地平线征程6芯片来了 鸿蒙智行官网上线 Redmi K70系列设计细节 vivo X100系列明日开卖 特斯拉将交付10辆Cybertruck电动皮卡 地平线征程6芯片来了 据“地平线HorizonRobotics”公众号消息,在2023广州车展上,地平线宣布征程…

振弦式渗压计的安装方式及注意要点

振弦式渗压计的安装方式及注意要点 振弦式渗压计是一种高精度、高效率的地下水位测量仪器。它可以测量地下水位的高度,计算地下水的压力,从而推算出地下水的流量。对于地下水资源管理和保护、治理工程等方面具有非常重要的意义。在安装振弦式渗压计时&a…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 🥊 Python 什么是 Python? Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

理化生考试系统中智能排考系统的功能

理化生考试系统是基于大数据技术以及智能图像识别技术研发的教育工具,可以帮助学生以及老师快捷准确的进行理化生实验的学习和考试。它主要应用于省、市级学生实验操作考核中考、学业考试的考试平台,通过信息技术应用让实验教学清晰高效,考前…

好莱坞罢工事件!再次警醒人类重视AI监管,人工智能矛盾一触即发!

原创 | 文 BFT机器人 关注国外新闻的应该都知道,最近焦点新闻是好莱坞史上最大规模的一场罢工运动。这场维持118天的罢工运动,终于在11月9号早上12点在好莱坞宣布结束。这场罢工运动虽是演员工会和代表资方的影视制片人联盟的茅盾,但直接引发…

电力感知边缘计算网关产品设计方案-业务流程设计

1.工业数据通信流程 工业数据是由仪器仪表、PLC、DCS等工业生产加工设备提供的,通过以太网连接工业边缘计算网关实现实时数据采集。按照现有的通信组网方案,在理想通信状态下可以保证有效获取工业数据的真实性和有效性。 边缘计算数据通信框架图: 2.边缘计算数据处理方案 …

学生适合用哪种台灯?公认好用的学生护眼台灯分享

作为一名家长,平常最关心的事情应该就是孩子健康问题。不过通过调查数据我们可以发现,我国的青少年儿童近视率是非常高的,达到了52.7%。也就是说平均每十个孩子当中就有5个是存在视力问题的!看着这些触目惊心的数字,回…

系列一、JUC概述

一、概述 juc是java.util.concurrent在并发编程中使用的工具类。 二、进程 & 线程 2.1、进程概述 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元&a…

AnyLogic 8.8.4:遗传优化和步行电梯 AnyLogic 8.8.5

AnyLogic 8.8.4:遗传优化和步行电梯 2023年7月19日 | 阿纳斯塔西娅日利亚耶娃 新发布行人建模 AnyLogic 8.8.4 现已可供下载。新版本有两个显着特点:内置基因优化和行人图书馆电梯。有关 AnyLogic 8.8.4 中发布的所有改进和更新的更多详细信息&#xf…

利用iptable实现ssh端口复用后门

目录 第一种方式:利用ICMP 远程遥控iptables进行端口复用 创建端口复用链 创建端口复用规则 开启开关 关闭开关 let’s do it 第二种方式:利用tcp数据包中的关键字 端口复用链 端口复用规则 开启开关 关闭开关 let‘s do it 第三种方式&am…

unordered_map,unordered_set模拟实现

目录 一 . 底层结构--哈希 1.直接定址法 2. 除留余数法 哈希桶 3. 一些定义 二 . 模拟实现哈希表 1.哈希表框架 ​编辑 2.插入 3.查找 4 . 删除 5.解决使用问题 6.完整代码 三 .实现unordered_map, unordered_set 1. 初步实现unordered_map, unordered_set 2.…

Leetcode—53.最大子数组和【中等】

2023每日刷题&#xff08;三十四&#xff09; Leetcode—53.最大子数组和 前缀和算法思想 参考灵茶山艾府 实现代码 #define MAX(a, b) ((a > b) ? (a) : (b)) #define MIN(a, b) ((a < b) ? (a) : (b)) int maxSubArray(int* nums, int numsSize) {int ans INT_…

ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 &#xff0c; 想着不如把docker利用起来&#xff0c;下面算是一个初学者使用docker运行ros的记录&#xff1a; 1. 安装 使用官方安装脚本自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh验证是否安装成功 doc…

信驰达科技加入智慧车联产业生态联盟ICCE,共创智慧车联未来

图1 信驰达加入智慧车联产业生态联盟 信驰达拥有60余项专利认证及软件著作权&#xff0c;以及BQB、SRRC、FCC、IC、CE、RoHS、REACH、KCC等数百个权威产品认证&#xff0c;公司是车联网联盟(CCC)和智慧车联产业生态联盟&#xff08;ICCE&#xff09;会员&#xff0c;已通过ISO…

[Kettle] 单变量统计

单变量统计是对数据进行单个变量的数据统计&#xff0c;以字段为单变量&#xff0c;可以分别对多个字段进行数据统计&#xff0c;统计类型有N(统计数量)、最小值、最大值、平均值、样本标准差、中位数和任意百分位数等 数据源 2018年上学期期末考试成绩(Kettle数据集9).xlsht…

基于Pyflwdir实现流域的提取(参照官网例子)

本文参照官网例子实现流域的提取,官方GitHub地址如下pyflwdir&#xff1a; 该工具包目前仅支持D8和LDD两种算法&#xff0c;在效率上具有较好的应用性&#xff0c;我用省级的DEM&#xff08;30米&#xff09;数据作为测试&#xff0c;输出效率可以满足一般作业需要。 环境env…

【LeetCode】每日一题 2023_11_20 最大子数组和(dp)

文章目录 刷题前唠嗑题目&#xff1a;最大子数组和题目描述代码与解题思路 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 今天是一道 LeetCode 的经典题目&#xff0c;如果是 LeetCode 老手&#xff0c;估计都刷过&#xff0c;话是这么说&#xff0c;但咱…

大力说企微入门系列第二课:搭建体系

对于大部分人来说&#xff0c;学习有三动&#xff1a; 学习之前非常激动&#xff1b; 学习时候非常感动&#xff1b;学习之后是一动不动&#xff1b; 不知道大家看了上一课的《大力说企微入门系列第一课&#xff1a;企业微信的注册验证和认证》之后&#xff0c;是一动不动还是…

求二叉树的高度(可运行)

输入二叉树为&#xff1a;ABD##E##C##。 运行环境&#xff1a;main.cpp 运行结果&#xff1a;3 #include "bits/stdc.h" using namespace std; typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;int tag; }BiTNode,*BiTree;void createTree(BiTre…

深入浅出讲解python闭包

一、定义 在 Python 中&#xff0c;当一个函数内部定义的函数引用了外部函数的局部变量时&#xff0c;就形成了一个闭包。这个内部函数可以访问并修改外部函数的局部变量&#xff0c;而这些局部变量的状态会一直被保存在闭包中&#xff0c;即使外部函数已经执行完毕。 这种机…