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

文章目录

  • 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.hqwc.cn/news/542808.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux ffmpeg编译

下载源码 https://ffmpeg.org/ csdn下载源码包 不想编译可以直接下载使用静态版本 https://ffmpeg.org/download.html https://johnvansickle.com/ffmpeg/ 根据cpu类型,下载解压后就可以直接使用了。 linux编译 安装底层依赖 yum install gcc yum isntall …

VXLAN学习笔记

声明:该博客内容大部分参考参考链接整理 什么是VXLAN? VXLAN(Virtual Extensible LAN)即虚拟扩展局域网,是大二层网络中广泛使用的网络虚拟化技术。在源网络设备与目的网络设备之间建立一条逻辑VXLAN隧道,采用MAC in UDP的封装方…

在Linux下安装和使用MySQL 看这篇文章就够了 mysql在ubuntu22下安装使用教程

第一步,在Linux上装MySQL数据库 首先,确保Ubuntu保持网络通畅 两种设置方式 方法一、设置-》网络-》连接方式-》网络地址转换(NAT) ​ 方法二、设置-》网络-》连接方式-》桥接 选择正确的网卡 右下角这里有个网络图标 也可以进行设置 2、更新软件源…

JDK8和JDK11在Ubuntu18上切换(解决nvvp启动报错)

本文主要介绍JDK8和JDK11在Ubuntu18上切换,以供读者能够理解该技术的定义、原理、应用。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:计算机杂记 🎀CSDN主页 发狂的小花 🌄人…

【Docker篇】数据卷相关操作

文章目录 🎈前言🍔数据卷🛸操作命令⭐创建一个数据卷,并查看数据卷在宿主机的目录位置 🌹挂载数据卷 🎈前言 在前面文章的nginx案例中,修改nginx的html页面时,需要进入nginx内部。并…

Vue 3 + TypeScript 项目中全局挂载并使用工具函数

一、proxy方式 1.封装日期选择工具函数: 在untils文件夹下新建index.ts,并导出工具函数 /*** 获取不同类型日期* param:类型 dateVal: 是否指定*/ export function getSystemDate(param: any, dateVal: any) {let systemDate dateVal ? new Date(da…

BlenderGIS 快捷键E 报错问题 Report: Error

最新版的Blender4.0 对于 BlenderGIS2.28版本的插件不兼容,BlenderGIS2.28兼容Blender3.6.9及之前的版本,应该是BlenderGIS插件很久没更新了导致的。

手撕算法-对称二叉树

力扣101. 对称二叉树 链接 https://leetcode.cn/problems/symmetric-tree/description/ 题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。示例1:此树是对称的。示例2:此树也是对称的示例3:此树不对称 思路 一颗…

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

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

AI成就画质冠军!海信电视U8N Pro的“硬参数”和“软实力”

不得不说&#xff0c;这几年AI落地大有摧枯拉朽之势&#xff0c;也离普通人的生活越来越近了。 如果说&#xff0c;曾经1997年“深蓝”计算机赢下国际象棋世界冠军&#xff0c;还没那么让人印象深刻&#xff0c;2016年Alpha Go战胜围棋世界冠军&#xff0c;即使广泛关注&#…

[做题]双指针

第一天刷题。一个平实的开始&#xff0c;希望能坚持下来&#xff0c;不求波涛汹涌&#xff0c;大浪淘沙&#xff0c;但求静水流深&#xff0c;川流不息。 先学习双指针。题目方向分为两个&#xff1a;链表和数组。 在处理数组和链表相关问题时&#xff0c;双指针技巧是经常用到…

SQLiteC/C++接口详细介绍之sqlite3类(十三)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十二&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09;&#xff08;未发表&#xff09; 40.sqlite3…