朝花夕拾:多模态图文预训练的前世今生
Diffusion Models专栏文章汇总:入门与实战
前言:时间来到2024年,多模态大模型炙手可热。在上一个时代的【多模态图文预训练】宛若时代的遗珠,本文的时间线从2019年到2022年,从BERT横空出世讲到ViT大杀四方,再到MLLM大放异彩,全面梳理一下多模态图文预训练的前世今生。
目录
图文预训练
什么是图文预训练?
图文预训练下游任务:VQA
图文预训练下游任务:NLVR
图文预训练下游任务:图文检索
小结
发展脉络
开山鼻祖:2018年Bert
大杀四方:2020年 ViT
增光添彩:2021年 CLIP
暴力美学:Florence
图文预训练
什么是图文预训练?
图文预训练是一种多模态学习方法,它通过结合图像和文本数据进行训练,以学习跨模态的语义表示。这种方法能够使模型同时理解图像内容和相关联的文本信息,从而在多种下游任务中实现更好的性能。图文预训练模型通常包含两个主要部分:图像编码器(Image Encoder)和文本编码器(Text Encoder),分别用于将图像和文本转换为高维特征向量。在训练过程中,模型会学习使匹配的图文对在特征空间中更接近,而不匹配的图文对更远离。
图文预训练借鉴了文本预训练的范式,对图文输入进行预训练,并应用于下游图文交互任务。
图文预训练下游任务:VQA
VQA(Visual Question Answering)的任务是给定一张图片和一个与图片内容相关的问题,找到对应的答案。答案的类型由问题的类型确定。比如“is the”类的问题,答案就是“yes”或者“no”。“what color”类型的问题,答案就是“red”、“white”等颜色。实践中通常把整个数据集中的answer进行计数统计,最终转换成一个分类问题。
典型数据集:VQA v2
图文预训练下游任务:NLVR
NLVR (Natural Language for Visual Reasoning),给定一张图片和一个推论,判断这个推论是否正确。实践中是一个二分类问题(“true”或者“false”)。
典型数据集:NLVR2
图文预训练下游任务:图文检索
图文检索(Image Text Retrieval)即给定图片检索相关文本或者给定文本检索相关图片。通常关注的指标是Recall@top n。
典型数据集:Flickr30k
小结
发展脉络
开山鼻祖:2018年Bert
2018年,BERT横空出世,在NLP领域建立了预训练的范式,这种充分利用大量无标注数据从而碾压下游任务的范式取得了极大成功,使得CV领域和图文领域在接下来的几年,一直在努力引入这种成功的范式。
2019年图文领域对应的工作出来了,比较典型的有VisualBERT、VL-BERT,还有相对较晚的UNITER。从名字就可以看出,这些工作受BERT的启发,本身的工作也都和BERT很像。
我们回到当时的场景思考一下,如何把图文的数据都丢到BERT里去呢?文本部分还好,不用改,主要的问题在于图片怎么转换成embedding?这里可以有很多不同方式,早期的方法通常是先对图片做通用的目标检测,得到一系列的region box,然后过CNN,得到一系列图片embedding。
输入搞定了,预训练任务怎么扩展?文本可以继续使用MLM,图片部分怎么处理?
- VisualBERT参考BERT里的NSP(给定一个文本pair判断是否是连贯上下文)提出了Sentence-image prediction,也就是给定一个图文对判断是随机组合还是原始组合。
- VL-BERT的做法是参考MLM,提出了Masked RoI Classification with Linguistic Clues,也就是将一部分region mask掉,然后根据文本和其他图片信息去预测这个region的类目。
- UNITER将这些预训练任务整理了下:
- 将mask region类的任务称为Masked Region Modeling (MRM),这里面又可以分为回归和分类。
- 将图文匹配的任务称为Image-Text Matching (ITM)。
- 将细粒度的图文匹配任务称为Word-Region Alignment (WRA)。这里使用了Optimal Transport (OT)的思想,将细粒度的对齐问题建模成一个运输优化问题。
- UNITER还对不同的预训练任务做了消融实验,其结论为:预训练任务的作用排序:MLM > ITM > MRC > WRA
预训练范式方面,这些工作直接用BERT的参数初始化模型,然后再进行图文预训练。
数据方面,这些工作通常都是使用开源的图文数据集,如CC、COCO,体量大致在百万级别。
这里的预训练范式也改成了:
- 1.单模态预训练
- 图片用BEIT
- 文本用BERT
- 2.图文预训练
预训练范式改进了以后,性能又得到了提升。
2021年METER是一个整合的工作,它就训练任务、模型架构等方面做过大量比较,结论是:
- 模型结构:
- 融合头用cross-attention优于用merge-attention
- backbone最佳组合:RoBERTa + Swin Transformer / CLIP-ViT
- decoder类型的结构并不能带来增益
- 预训练任务:
- MLM + ITM是基石,图片的mask预训练任务像MIM其实可有可无(注意这里是多模态数据预训练时,前置的单图预训练还是很有增益的)
除此之外METER还分享了两点经验:
- 按照参数是否随机初始化而设置不同的学习率,也能带来较多的提升。
- 提高图片像素可以带来较大提升。
大杀四方:2020年 ViT
2020年,CV圈也迎来了里程碑式的工作:ViT,它对图片输入的处理简单粗暴,直接划分成16 × 16个patch,并在论文的题目中宣称:“一张图等于16 × 16个字”。ViT引发了transformer在CV界的广泛应用,于是自然有人将这个思路引入到图文预训练中来,这就是ViLT。
ViLT的做法其实几乎和UNITER如出一辙,不过将所有的region都替换成了patch。这里会产生一个小问题:region是有类别的,而patch因为是随机切分,没有类别,所以也就没有MRM这类的任务了。不过这个影响不大,因为MRM的贡献本来就不大。
ViLT和UNITER不同的是,ViLT基于ViT参数进行了初始化,而UNITER是基于BERT。另外ViLT也提出了两个提点建议:全词mask和图片的数据增强。
那引入patch有什么好处呢?
- 提速:ViLT和UNITER的预测速度比为15ms:900ms,而diff部分也主要来自于目标检测的耗时。
- 结构统一、简单。图片省去了额外的特征提取操作。
但整体来说,ViLT的性能并没有优于UNITER,它的贡献在于让大家认识到省掉目标检测是可能的;且这是一个工业应用affordable的方案。我们也在实际应用中采用了ViLT的方案,在下游任务上取得了不错的效果。
增光添彩:2021年 CLIP
2021年图文领域也出现了一个里程碑式的工作:CLIP。CLIP最初的动机是学习一个迁移性能好的图片表示。它的想法很简单:用文本信息作为弱监督,通过对比学习来学习图片表示。它的整体架构很简单,采用了文本encoder和图片encoder双流的结构,融合的head只是一个简单的相似度计算。
那么优秀的迁移性是通过什么实现的呢?
- 基于wikipedia的海量图文对(4亿对),涵盖各种领域。
- 基于和文本表示对比学习的弱监督:文本表示相比于类目信息量更丰富。
CLIP最终的性能是令人惊艳的,最让人惊艳的是图文匹配的能力。当时一些基于CLIP去做以文搜图、以文搜视频的应用层出不穷。这个结果给人一种感觉:对比学习在跨模态对齐的任务中,大有可为。
CLIP这种双流结构+对比学习在模态对齐的任务上效果拔群,但在VQA这中分类任务中就表现平平了。究其原因,还是因为CLIP的融合头太简单了,于是出现了一些后续工作,将双流+对比学习的范式和之前的单流范式进行结合。
首先出现的是CLiP-ViL:文本还是不变,图片先过CLIP的图片encoder生成一系列图片表示,然后再一起进入一个单流的transformer。这种范式,也就是先多流后单流,后来称为新的潮流。
采用先多流后单流范式的影响力更大的工作是ALBEF。
ALBEF前面的多流和CLIP一样,做对比学习。而它是这么解释为什么要先多流对比学习的:
- 图文embedding对齐后,让单流的融合头学习更容易。
- 单模态(特别是图片)的encoder可以学得更好。
- 相对于之前简单的ITM,可以引入更多负例。
另外考虑到现实数据可能比较noisy,ALBEF还提出了MoD(momentum distillation)。整体思路就是引入动量更新,即一个相对平滑的teacher模型,用于生成伪标签,让目标模型利用伪标签进行一致性正则约束。
但不得不说的是,既然引入了对比学习,鉴于CLIP的经验,图文预训练的数据其实应该更多。因此ALBEF除了和之前其他工作对齐的百万级数据外,海训练了千万级数据的版本。至此,ALBEF的性能碾压了UNITER,基于patch的方案也终于在数据量和对比学习的加持下,打败了基于region的方案。
除了这种先多流后单流的方式,还有没有其他可能的方式去引进对比学习呢?有没有办法改造下单流让它可以直接使用对比学习呢?VLMO提供了另一种思路:我们可以只替换ffn来表示不同模态的encoder(MoME),这样encoder其他地方都可以复用,attention也只有self attention,没有cross attention。
这里的预训练范式也改成了:
- 1.单模态预训练
- 图片用BEIT
- 文本用BERT
- 2.图文预训练
预训练范式改进了以后,性能又得到了提升。
暴力美学:Florence
为了追求极致性能,后面出现了一些彻底“不讲武德”的工作,继续充分挖掘大模型、大数据。
Florence在做图文对比学习时,直接怼了9亿图文对;再配合roberta的预训练文本encoder(VQA架构基于METER),最终效果也再度炸裂。
相关文章:

朝花夕拾:多模态图文预训练的前世今生
Diffusion Models专栏文章汇总:入门与实战 前言:时间来到2024年,多模态大模型炙手可热。在上一个时代的【多模态图文预训练】宛若时代的遗珠,本文的时间线从2019年到2022年,从BERT横空出世讲到ViT大杀四方,…...

亳州自闭症寄宿制学校,关注孩子的学习和生活
在特殊教育领域,自闭症儿童的教育与成长一直是社会各界关注的焦点。近年来,随着对自闭症认识的加深,越来越多的寄宿制学校应运而生,致力于为这些特殊的孩子提供全面、个性化的教育服务。在安徽亳州,这样的学校正努力为…...

Root me CTF all the day靶场ssrf+redis漏洞
Rootme CTF all the day靶场ssrfredis漏洞 一、环境介绍1、漏洞地址2、漏洞介绍 二、 搭建环境三、测试过程3.1 读取系统文件3.2 探测开放的服务器端口(dict协议)3.3 redis未授权访问3.3.1 利用redis来写ssh密钥(gopher协议写入)3.3.2 利用redis写定时任…...

C#中Json序列化的进阶用法
本文所有json序列化,都使用的Newtonsoft.Json包 1 JsonIgnore 在 Newtonsoft.Json 中,如果你不想将某些属性转换为 JSON 字符串,可以使用多种方法来实现。以下是几种常见的方法: 1.1 使用 [JsonIgnore] 特性 [JsonIgnore] 特性…...

IO相关的常用工具包
常用工具包Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包。 作用:提高IO流的开发效率。 使用步骤: 1、在项目中创建一个文件夹:lib 2、将jar包复制粘贴到lib文件夹 3、右键点击jar包,选择Add as Library--->点击OK …...

Spring Boot集成RBloomFilter快速入门Demo
在大数据处理和缓存优化的场景中,布隆过滤器(Bloom Filter)因其高效的空间利用和快速的查询性能而被广泛应用。RBloomFilter是布隆过滤器的一种实现,通常用于判断一个元素是否存在于一个集合中,尽管它存在一定的误判率…...

布局性能优化
布局使用不当回导致卡顿、掉帧、响应慢等问题 一、布局流程 1、应用侧会根据前端UI描述创建后端的页面节点树,其中包含了处理UI组件属性更新、布局测算、事件处理等逻辑 2、页面节点树创建完成后,UI线程会对每个元素进行测算(Measure&#…...

智云人才推荐与管理系统
1.产品介绍 产品名称:智云人才推荐与管理系统 主要功能: 智能人才匹配引擎 功能描述:利用先进的人工智能算法,根据企业岗位需求(如技能要求、工作经验、教育背景等)自动从海量人才库中筛选并推荐最合适的…...

git在远程分支上新建分支
需求: 在远程分支release/test的基础上创建一个新的分支test_20241009 确保本地仓库的信息是最新的 git fetch origin执行了 git fetch,本地仓库已经包含了 origin/release/test 的最新信息。当基于这个远程跟踪分支创建新分支时,会得到一个包…...

用Python实现的高校教师资格考试题库程序
最近朋友参加了高校教师资格考试,在考试前需要刷题来保证通过。但是教资网站上的题库只有接近考试才更新,并且官方题库的刷题效率还是有点低。 👆官方题库的样子 于是想到了是否能够将官方题库内容记录下来,然后自己创建一个高效…...

OpenVINO基本操作流程
环境配置: conda env list:可以查看有哪些环境 conda activate intel:启动某个环境 pip list:可以查看此环境下都下载了哪些软件包 from openvino.inference_engine import IEcore#从OpenVINO推理引擎中导入IECore类 import numpy as np import cv2 1&…...

Spring MVC 注解详解:@RequestBody,@RequestParam 和 @PathVariable
Spring MVC 提供了一系列注解,用于简化请求数据的获取和处理。了解并掌握这些注解的使用,对于开发RESTful API和处理HTTP请求至关重要。本文将详细介绍 RequestBody,RequestParam 和 PathVariable 注解,并附带具体的代码示例&…...

MySQL 8 中的 sql_mode
MySQL 8 中的 sql_mode 设置:提升数据库安全性与性能 在现代数据库管理中,MySQL 是一个广泛使用的开源关系型数据库。随着数据的增长和复杂性增加,良好的数据库配置显得尤为重要。sql_mode 是 MySQL 提供的一个强大功能,它可以帮…...

13种pod的状态
13种pod的状态 生命周期 Pending:Pod被创建后进入调度阶段,k8s调度器依据pod声明的资源请求量和调度规则,为pod挑选一个适合运行的节点。当集群节点不满足pod调度需求时,pod将会处于pending状态。Running:Pod被调度到节点上,k8s将pod调度到节点上后,进入running状态。S…...

2025考研今天开始预报名!攻略请查收
2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程?需要准备哪些信息? 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段: 网上预报名时间为10月9日至10月12日(每日9࿱…...

JS中的Promise经典题目解析
这段代码很有代表性,涵盖了多个 JavaScript 知识点,特别是不同异步操作的执行优先级。 async function async1() {console.log(async1 start);await async2();console.log(async1 end); }async function async2() {console.log(async2); }console.log(s…...

【机器学习】金融预测 —— 风险管理与股市预测
我的主页:2的n次方_ 在金融领域,机器学习(ML)已经成为了不可或缺的工具。金融预测,尤其是风险管理和股市预测,涉及海量数据和复杂模式的分析,而这些正是机器学习擅长处理的领域。通过分析历…...

Bootstrap 5 分页组件使用教程
Bootstrap 5 分页组件使用教程 引言 Bootstrap 5 是一个流行的前端框架,它提供了一套丰富的组件和工具,用于快速开发响应式和移动优先的网页。分页组件是 Bootstrap 5 中用于分割长列表或数据集的重要部分,它可以帮助用户更容易地浏览内容。本文将详细介绍如何在您的项目中…...

Linux 安装 NVM 并配置 npm 加速,开发 node 项目不再愁
由于需要在 linux 机器上完成 node 项目的构建,需要安装 nodejs, 想着不同项目需要使用不同的版本,索性安装一下 nvm 吧,因为之前在 windows 上已经安装过 nvm-windows, 应该很容易上手,我尝试了官网提供的几种方式,最…...

MySQL 多条件查询
在 MySQL 中,多条件查询通常使用 WHERE 子句来指定多个条件。这些条件可以通过逻辑运算符(如 AND、OR、NOT)进行组合,以实现复杂的查询需求。以下是一些常见的多条件查询示例: 使用 AND 运算符 AND 运算符用于组合多…...

深度学习模型
1. 引言 在过去的十年间,深度学习的崛起引发了人工智能领域的革命,深刻影响了多个行业。深度学习是一种模仿人脑神经元的工作方式,通过多层神经网络进行数据处理与特征学习。其应用范围从简单的图像识别到复杂的自然语言处理、自动驾驶和医疗…...

Nexpose 6.6.271 发布下载,新增功能概览
Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…...

SimpleRAG-v1.0.3:增加文件对话功能
Kimi上有一个功能,就是增加文件之后对话,比如我有如下一个私有文档: 会议主题:《如何使用C#提升工作效率》 参会人员:张三、李四、王五 时间:2024.9.26 14:00-16:00 会议内容: 1. 自动化日常任…...

数学建模算法与应用 第7章 数理统计与方法
目录 7.1 参数估计与假设检验 Matlab代码示例:均值的假设检验 7.2 Bootstrap方法 Matlab代码示例:Bootstrap估计均值的置信区间 7.3 方差分析 Matlab代码示例:单因素方差分析 7.4 回归分析 Matlab代码示例:线性回归 7.5 基…...

【网络】洪水攻击防御指南
洪水攻击防御指南 摘要: 本文深入探讨了洪水攻击的概念、危害以及防御策略。通过Java技术实现,我们将学习如何通过编程手段来增强服务器的安全性。文章不仅提供了详细的技术解读,还包含了实用的代码示例和流程图,帮助读者构建一个…...

应对Redis大Key挑战:从原理到实现
在使用Redis作为缓存或数据存储时,开发者可能会遇到大Key(Big Key)问题。大Key是指在Redis中存储的单个键值对,其值的大小非常大,可能包含大量数据或占用大量内存。大Key问题会导致性能下降、内存消耗过多以及其他潜在…...

网络安全的全面指南
目录 网络安全的全面指南1. 引言2. 网络安全的基本概念3. 网络安全框架4. 常见网络安全攻击及案例4.1 病毒与恶意软件攻击案例4.2 钓鱼攻击案例4.3 DDoS 攻击案例 5. 网络安全最佳实践5.1 强密码策略5.2 定期更新和补丁管理5.3 数据备份与恢复策略 6. 企业网络安全策略6.1 安全…...

前端性能优化全面指南
前端性能优化是提升用户体验的关键,页面加载速度、响应时间和交互流畅度直接影响用户的留存率和满意度。以下是常用的前端性能优化方法,从网络层、资源加载、JavaScript 执行、渲染性能等方面进行全方位优化。 减少 HTTP 请求 合并文件:将多…...

JavaScript-API(倒计时的实现)
基础知识 1.时间对象的使用 1.1 实例化 要获取一个时间首先需要一个关键词new了实例化 const time new Date() 如果是获取具体的具体的时间 const time new Date(2024-6-1 16:06:44) 1.2 日期对象方法 方法作用说明getFullYear()获得年份获得4…...

【C++】——继承【上】
P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:Yan. yan. …...