【多模态大模型】 BLIP in ICML 2022
一、引言
论文: BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
作者: Salesforce Research
代码: BLIP
特点: 该方法分别使用ViT和BERT进行图像和文本特征提取;提出使用image-text contrastive learning (ITC)损失、image-text matching (ITM)损失、Language Modeling (LM)损失进行模型优化;提出Captioning and Filtering (CapFilt)生成并过滤从网络上获取的图像-文本对。
⚠️ 在学习该方法前,建议补充ViT、BERT、ALBEF的相关知识。
二、详情
BLIP的整体结构图如下:
可见,BLIP在结构上主要包括1个图像编码器、1个文本编码器、1个基于图像的文本编码器、1个基于图像的文本解码器;在损失上主要包括image-text contrastive learning (ITC)损失、image-text matching (ITM)损失、Language Modeling (LM)损失;此外,BLIP还提出了CapFilt处理噪声图像-文本对。
⚠️ 为了提升训练效率,减少参数量,BLIP使用了参数共享策略,上图中同颜色的模块使用同一组参数。具体参数关系如下:
- 图像编码器中所有参数独立;
- 文本编码器、基于图像的文本编码器、基于图像的文本解码器中的FFN使用同一组参数;
- 文本编码器和基于图像的文本编码器中的双向自注意力使用同一组参数;
- 基于图像的文本编码器和基于图像的文本解码器中的交叉注意力使用同一组参数;
- 基于图像的文本解码器中的因果自注意力参数独立。
2.1 模型结构
如上图,BLIP在结构上主要包括1个图像编码器、1个文本编码器、1个基于图像的文本编码器、1个基于图像的文本解码器。
2.1.1 图像编码器
BLIP的图像编码器使用ViT-B/16,共12层transformer编码层,由在ImageNet-1k上进行预训练的权重初始化。输入图像转为token后会再扩充一个名为[CLS]的token(初始化全0的可学习参数向量),用来表达图像的全局信息。最后输出的是经过12个transformer模块优化过的输入图像的token和[CLS]的token。
关于ViT的详情,请参考我之前的博客Vision Transformer。
2.1.2 文本编码器
BLIP的文本编码器使用BERT,共12层transformer编码层,由BERT base _{\textbf{base}} base初始化。输入文本会在最前面扩充一个名为[CLS]的token,用来表达文本的全局信息。最后输出经Tokenizer和BERT优化过的输入文本的token和[CLS]的token。
[CLS]直接放在句子最前面,例如原文本是“I am very happy today.”,则新文本应为“[CLS] I am very happy today.”)
2.1.3 基于图像的文本编码器
BLIP的基于图像的文本编码器属于多模态编码器(进行图像和文本的信息交互),使用12层含交叉注意力的transformer编码层(文本编码器无交叉注意力)。图像编码器的输出会作为基于图像的文本编码器中交叉注意力的输入。输入文本会在最前面扩充一个[Encode],作为图像-文本对的多模态特征。最后输出经Tokenizer和12层含交叉注意力的transformer编码层优化过的输入文本的token和[Encode]的token。
BERT中没有交叉注意力,所以
基于图像的文本编码器是在文本编码器的自注意力和FFN之间插入了交叉注意力,交叉注意力中的权重被随机初始化。
2.1.4 基于图像的文本解码器
BLIP的基于图像的文本解码器属于多模态解码器(进行图像和文本的信息交互),使用12层含交叉注意力的transformer解码层(文本编码器无交叉注意力)。图像编码器的输出会作为基于图像的文本解码器中交叉注意力的输入。输入文本会在最前面扩充一个[Decode]作为句子的开始;将最后的句号替换为[EOS]作为句子的结束。最后通过自回归的因果注意力预测下一个token。
基于图像的文本编码器与基于图像的文本解码器的主要差别在于前者使用双向自注意力,后者使用因果自注意力。
双向自注意力其实就是不做mask的自注意力,因为整个句子的所有token两两都可交互计算注意力相似度所以称之为双向自注意力。
因果自注意力就是带因果mask的自注意力,mask会遮蔽下一个要预测的token及后面的所有token。如下图,当我们已经有"[Decode] I"时,"love China [EOS]"都会被遮蔽,这种无法通过上下文预测下一个token的策略,就是因果自注意力。
2.2 损失函数
如上图,BLIP使用image-text contrastive learning (ITC)损失、image-text matching (ITM)损失、Language Modeling (LM)损失进行预训练。
2.2.1 ITC损失
ITC损失旨在更好地学习两个单模态的特征表达,使两个模态的特征能够对齐,即图像特征与对应文本描述的特征更相似,反之更不相似。
BLIP借用了MoCo的思想额外保存一个通过指数移动平均更新的动量模型来生成负样本和软伪标签,从而确定正负图像-文本对以及动量蒸馏损失。
BLIP沿用了ALBEF中的
ITC损失,详情请参考我之前博客ALBEF in NeurIPS 2021的2.2.1节。
2.2.2 ITM损失
ITM损失旨在学习图像-文本多模态特征,以表达图像和文本之间的对齐情况。这是一个二分类损失,在[Encode]对应的token后加一个全连接和softmax即可预测输入的图像-文本对是否匹配,匹配为1,不匹配为0。
BLIP通过计算ITC损失时得到的当前批次图像-文本两两之间的相似度来选取hard的负图像-文本对,连同原配的正图像-文本对进行二分类训练。
BLIP沿用了ALBEF中的
ITM损失,详情请参考我之前的博客ALBEF in NeurIPS 2021的2.2.3节。
2.2.3 LM损失
LM损失旨在使模型具备生成图像文本描述的能力。前两个损失都在编码器上,只能完成理解型任务,例如图像-文本检索;该损失在解码器上,能够完成生成型任务,例如视觉问答。
LM损失依赖于因果mask,就是将一句话复制多份,然后进行倒三角式的mask,使模型每次都只能根据当前的内容预测下一个token。预测时需要在对应token后跟一个全连接和softmax才能判断token所对应单词是否正确。
2.3 生成过滤
从网络爬虫下来的图像-文本对富含噪声,BLIP提出CapFilt生成更合适的图像描述(Captioning)然后过滤不合适的图像-文本对(Filtering)。
下图是CapFilt对一个噪声的图像-文本对的处理过程:
由于通常我们看到一个蛋糕图片后希望获取的是它的店铺位置从而去购买,所以我们从网上下载的数据很可能是一个蛋糕图片和一个对商铺的描述;但实际我们希望得到的是针对图片中内容的描述,例如这个蛋糕的外观。可见,Captioner能够生成更合适的图像描述,Filter能够过滤不合适的图像-文本对并保留合适的图像-文本对。
CapFilt的流程图如下:
可见,其详细步骤是:
- 使用从网络上下载的带噪声的图像-文本对和不含噪声的开源数据集中人工标注的图像-文本对训练一个模型。
- 使用在不含噪声的开源数据集中人工标注的图像-文本对分别微调
Filter和Captioner,Filter仅使用ITC损失和ITM损失进行微调,Captioner仅使用LM损失进行微调。 - 将从网络上下载的图像送入
Captioner生成对该图像的文本描述,形成人造图像-文本对。 - 将从网络上下载的图像-文本对连同
Captioner生成的人造图像-文本对一起送入Filter过滤其中文本描述不合适的图像-文本对。 - 使用过滤后得到的更高质量的图像-文本对连同不含噪声的开源数据集中人工标注的图像-文本对进行模型的重新训练。
Filter通过计算ITM损失时使用的二分类头进行过滤,匹配的保留,不匹配的被滤除。
Captioner通过基于图像的文本解码器进行生成,输入图像和[Decode]进行下一token的预测,然后[Decode]连同预测一起送入基于图像的文本解码器进行再下一token的预测,如此循环,直至预测出[EOS]截止。
相关文章:
【多模态大模型】 BLIP in ICML 2022
一、引言 论文: BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 作者: Salesforce Research 代码: BLIP 特点: 该方法分别使用ViT和BERT进行图像和文本特征提取&am…...
Flutter开发Dart 中的 mixin、extends 和 implements
目录 前言 1.extends 2.implements 3.mixin 前言 在 Dart 中,mixin、extends 和 implements 是面向对象编程中常用的关键字,它们分别用于不同的继承和实现方式。理解它们的用法和区别对于编写高质量、可维护的 Dart 代码至关重要。本文…...
SAPUI5基础知识20 - 对话框和碎片(Dialogs and Fragments)
1. 背景 在 SAPUI5 中,Fragments 是一种轻量级的 UI 组件,类似于视图(Views),但它们没有自己的控制器(Controller)。Fragments 通常用于定义可以在多个视图中重用的 UI 片段,从而提…...
express连接mysql
一、 安装express npm install express --save二、express配置 //引入 const express require("express"); //创建实例 const app express(); //启动服务 app.listen(8081, () > {console.log("http://localhost:8081"); });三、安装mysql npm i m…...
24暑假算法刷题 | Day24 | LeetCode 93. 复原 IP 地址,78. 子集,90. 子集 II
目录 93. 复原 IP 地址题目描述题解 78. 子集题目描述题解 90. 子集 II题目描述题解 93. 复原 IP 地址 点此跳转题目链接 题目描述 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用…...
Postman本地化测试全攻略:打造多语言API的秘诀
Postman本地化测试全攻略:打造多语言API的秘诀 在全球化的今天,许多应用程序都需要支持多语言环境,以满足不同地区用户的需求。API的本地化测试是确保应用程序能够在不同语言和区域设置下正确运行的关键环节。Postman作为一个强大的API开发和…...
摆弄it:越走越深
在英语中,it是一个单词,就是“它”,这是众所周知的事情。今天,我们就来摆弄一下it,摆弄一下“它”,看看能摆弄出什么名堂来。 一、它是它自己 it 大家都知道,同样,itself࿰…...
网页上空格
  no-break space(普通的英文半角空格但不换行) 中文全角空格 (一个中文宽度)   en空格(半个中文宽度)   em空格 (一个中文宽度) 四分之一em空格 (四分之一中文宽度) 相比平时的空格(), 拥有不间断(non-breaking)特性。即连续…...
Linux服务管理(四)Apache服务
Apache服务 1、基于IP的虚拟主机2、基于IP端口的虚拟主机3、基于域名的虚拟主机4、prefork模式5、worker模式6、event模式7、细说驱动工作模式和MPM(多处理模块)工作模式 新旧域名都保留,因为旧域名已有一定的知名度和流量,直接下…...
Qt基础 | TCP通信 | TCP服务端与客户端程序设计 | QTcpServer | QTcpSocket
文章目录 一、TCP 通信1.TCP 通信概述2.TCP 服务器端程序设计2.1 主窗口定义与构造函数2.2 网络监听与 socket 连接的建立2.3 与 TCP 客户端进行数据通信 3.TCP 客户端程序设计3.1 主窗口定义与构造函数3.2 与服务器端建立 socket 连接3.3 与 TCPServer 的数据收发 4.小结 Qt 网…...
设计模式实战:订单处理系统的设计与实现
问题描述 设计一个订单处理系统,支持订单的创建、处理、取消和通知功能。系统需要确保订单处理流程的灵活性和可扩展性。 设计分析 命令模式 命令模式用于将请求封装成对象,从而使我们可以用不同的请求、队列或日志来参数化其他对象。订单处理系统中的每个操作(创建订单…...
[论文笔记]思维链提示的升级版——回退提示
引言 今天又带来一篇提示策略的论文笔记:TAKE A STEP BACK: EVOKING REASONING VIA ABSTRACTION IN LARGE LANGUAGE MODELS。 作者提出了回退提示(STEP-BACK PROMPTING)技术,使大模型能够进行抽象,从包含具体细节的实例中推导出高层次的概念…...
【Redis进阶】主从复制
1. 主从结构引入 在分布式系统中,涉及到一个严重问题:单点问题 即如果某个服务器程序只有一个节点(单台机器提供服务),就会出现以下两个问题: 可用性问题,如果这台机器挂了,意味着…...
编程类精品GPTs
文章目录 编程类精品GPTs前言种类ChatGPT - GrimoireProfessional-coder-auto-programming 总结 编程类精品GPTs 前言 代码类的AI, 主要看以下要点: 面对含糊不清的需求是否能引导出完整的需求面对完整的需求是否能分步编写代码完成需求编写的代码是否具有可读性和可扩展性 …...
ubuntu在命令行输出里查找内容,dmesg
直接执行查看日志指令会出来很多页。dmesg为开机日志信息。记录了开机时硬件的过程 sudo dmesg 执行结果: 可以用竖号“|”,在前一条命令返回的内容进行查找。下图为查找bluetooth sudo dmesg |grep -i bluetooth...
图片url处理(带http和不带http)方法
后端返回的接口数据,图片路径,有的是相对路径,有的是带http的路径 得处理一下,如果是相对路径就拼上服务器的地址(xxx),如果是带http的路径就正常显示 方法: imageUrl(url){let str RegExp(http);let ne…...
Git(分布式版本控制系统)、Gitlab、分支、分支冲突
目录 1.Git概述 2.Git的功能特性 3.Github社区和Gitlab 1.Github社区 2.Gitlab 4.Git的安装及配置 1.Git安装 2.配置Git环境 3.常用指令 4. 建立git仓库 1.创建一个目录 2.初始化当前目录仓库 3.查看隐藏文件 4.新建文件并添加到缓存 5.提交文件到仓库 6.查看历…...
dockerfile部署镜像 ->push仓库 ->虚拟机安装建木 ->自动部署化 (详细步骤)
目录 创建私服仓库 vi /etc/docker/daemon.json vim deploy.sh判断脚本内容 创建 建木 后端部署 命名空间 设置密码用户名 创建git仓库 gitignore文件内容 图形项目操作 git maven docker镜像 点击流程日志 vim /etc/docker/daemon.json 执行部署脚本 ip 开发…...
Android串口开发及读取完整数据的解决方法
串口发送实质就是向串口设备写入、读取字节流,和文件的操作很相似,安卓官方已经提供了android-serialport-api,在开源社区上也有很多衍生项目可以借鉴,本文介绍其中一种用法。 添加依赖 在Module下的 build.gradle 中添加: implementation com.aill:A…...
java之对象向下转型
java中,向下转型是为了重新获得因为向上转型而丢失的子类特性。在先下转型前,必须先进行向上转型。 语法格式如下 父类类型 父类对象子类实例 子类类型 子类对象(子类)父类对象 示例代码如下 class Animal01 {public void sh…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
