多模态串讲(上)

news2024/11/15 8:50:26

多模态的学习在最近几年异常火爆,除了普通的多模态学习,比如视觉问答,图文检索等,其实之前讲的所有这种Language Guided Detection,或者Language Guided Segmentation,这些任务都是多模态的,还有最近火的文本图像生成或者文本视频生成,我们耳熟能详的DALL·E2,Stable Diffusion、Phenaki Video、Imagen Video,以上这些统统属于多模态学习

这次的多模态串讲,可能更多的还是偏向传统的多模态学习,即下游任务是图文检索,即Image Text Retrieval、VQA【视觉问答】、Visual Reasoning【视觉推理】、Visual Entailment【视觉蕴含】,但即使如此,相关工作也是数不胜数。

串讲的第一部分讲一下只用Transformer Encoder的一些方法,比如说之前的ViLT、CLIP,还有我们今天讲解的ALBEF和VLMo。第二部分我们会讲解到用Transformer Encoder和Decoder一起的一些方法,比如说BLIP、CoCa、BEIT V3以及PaLI。

在讲解ALBEF之前,我们先简单回顾一下ViLT、CLIP。

ViLT

以下图片来自ViLT论文的图二。

ViLT这篇论文的研究动机,其实就是为了把目标检测从视觉端拿掉,原因很简单,因为用一个预训练的目标检测器去抽取视觉特征的时候,其就会面临很多很多的局限性,但是直到Vision Transformer(21年之前)出现之前,很难有什么很好的办法能把这个预训练的目标检测器给移除掉,所以说最早期的工作,比如说分类(a)VSE或者VSE++的工作,他们的文本端就是直接抽一个文本特征,但是他们的视觉端就非常大,即需要的计算量非常的多,因为其是一个目标检测器,然后当得到了文本特征和视觉特征之后,最后只能做一个很简单的模态之间的交互,从而去做这种多模态的任务。后续这些工作,即分类(c)里的工作,即我们耳熟能详的OSCAR或者ViLBERT、UNITER,他们发现对于这种多模态 的任务来说,最后这个模态之间的交互非常重要的,只有有了模态之间更深层的交互,对于这种VQA、VR、VE这些任务来说,效果才会非常好,所以他们把最初的这种简单的点乘的,这种模态之间的交互,便变成了一个Transformer的Encoder,或者变成别的更复杂的模型结构,去做这种模态之间的交互,所以这些方法的性能都非常好,但是随之而来的缺点也非常明显,所有这一系列的工作,统统都用了这个预训练的目标检测器,再加上后边这个更大的模态融合的部分,这个模型不论是训练还是部署都非常困难,所以说当Vision Transformer出来之后,ViLT这篇论文也就应运而生了。

因为他们发现,在Vision Transformer里,这种基于Patch的视觉特征,其实跟之前这种基于Bounding Box的视觉特征也没什么太大区别,他也能很好的拿来做图片分类、目标检测的任务,这样,我们就把一个预训练好的目标检测器直接换成了一层的Patch Embedding,就能去抽取这个视觉的特征了,大大降低了计算复杂度, 尤其是在做推理的时候。

但是如果你的文本特征,直接简单的tokenize一下,视觉特征也只是简单的patch embedding一下,那肯定是远远不够的。所以对于多模态任务来说,这个后面的模态融合非常关键,所以ViLt就把之前(c)类里的这些方法,这个模态融合的方法直接借鉴了过来,用一个很大的Transformer encoder 去做模态融合从而达到了还不错的效果。

因为移除了预训练的目标检测器,换成了可以学习的Patch embedding layer,所以说ViLT模型极其简单,虽然作为一个多模态学习的框架,但是其实跟NLP那边的框架没有什么区别,无非就是先都tokenized了一下,然后直接扔给一个Transformer去学习,所以非常简单易学,但是ViLT也有它自己的缺点。首先,第一个缺点就是性能不够高,ViLT在很多任务上比不过(c)类里的这些方法。原因是对于现有的这些多模态任务而言,有可能是这些数据集的bias,也有可能是这个任务需要更多的视觉能力,总之,我们需要更强的视觉部分,即视觉模型应该要比文本模型要大,最后和这个效果才能好。但是在ViLT里,文本端用的tokenizer其实是很好的,但是visual embedding是random initialized,所以其效果自然就很差。其次,ViLT虽然说它的推理时间很快,但训练时间非常非常慢。在非常标准的一个4 million的set,ViLT需要64张GPU,而且是32G的,训练三天,所以它在训练上的复杂度和训练上的时间丝毫不亚于(c)类的方法。所以它是结构上简化了多模态学习,但没有真的让多模态学习所有人都玩得起。

基于以上两点,ALBEF呼之欲出。

CLIP

CLIP模型也是一个非常简单的结构,其是一个典型的双塔模型,即他有两个模型,一个对应文本,一个对应视觉。在训练的时候,通过对比学习,让已有的图像文本对在空间上拉得更近,让不是一个对的图像文本拉的更远,从而最后学到非常好的图像文本特征,然后一旦学到很好的图像文本特征之后,CLIP只需要做很简单的点乘,就可以去做多模态任务。尤其是对图像文本匹配,或者图像文本检索来说,CLIP简直是神一样的存在,它不光效果好,而且跟高效。

因为我们往往做图像文本匹配,或者图像文本检索任务的时候,我们是有一个很大的已有的数据库的,这个时候如果我们新来一张图片,或者新来一个文本,我们要跟已有的数据库去做匹配 ,那其他所有的方法,比如图上的(a)(c)(d)都会非常的慢,因为其所有的数据都要过一遍编码器,但是CLIP模型就不需要,它可以提前把数据库里所有的图像文本的特征提前都抽取好,并且是想什么时候抽取就什么时候抽取,抽取好放在那里即可,等我们真正想用的时候,直接做一个点乘就好,矩阵乘法还是相当快的。所以CLIP的这个实际应用非常广泛。

但是CLIP模型也有他的缺陷,他虽然对图文匹配的任务非常在行,但是对别的任务,比如VQA、VR、VE这些任务来说 ,性能就不够好了,因为毕竟只靠一个简单的点乘,还是不能够分析特别复杂的情况。

回顾到这里,我们来捋一下,总结一下之前的这些方法,哪些是好的,哪些是不好的。我们接下来该提出怎么样的改进呢?

首先我们来看模型的结构,因为我们有图像的输入和文本的输入,刚开始的模型很定是有两支的,因为它需要去抽取这个文本图像特征,但是我们一直强调,在多模态学习里,视觉特征要远远大于文本特征,所以我们知道使用更大更强的视觉模型,比如一个更大的ViT是好的,是我们需要坚持使用的。同时,作为多模态学习,模态之间的融合也是非常关键的,我们也要保证这个模态融合的模型,也要尽可能的大。

所以,我们大概知道,如果想做一个很好的多模态学习,其网络结构应该很像这个(c),即 文本编码器应该要比图像编码器要小,最后多模态融合部分尽可能的大。当然,这里的视觉模型很定不想要再用一个目标检测模型了,所以我们更多的是我们会采取一个比较的Vision Transformer,而不是简单的一个Patch embedding去做。

总之,模型大概就长以下这个样子。

 模型有了,我们如何训练呢?

我们知道CLIP模型就用了一个对比学习的Loss,即Image Text Contrastive,即ITC LOSS训练,效果已经很好了。所以我们知道ITC训练不错还高效,我们应该采纳。

之前(c)类的这种方法,他们往往有目标检测,所以他们提出了一个叫做Word Patch Alignment,即文本的一个单词和这个图像的一个patch,应该有一个对应的关系,但是因为现在这个目标检测模型已经没有了,而且在ViLT里头,我们发现这个WPA Loss算起来是非常的慢的,所以才导致这个ViLT模型训练起来这么费劲,所以我们不太想使用WPA Loss了

剩下常用的还有两个Loss,一个是我们耳熟能详的Mask Language Modeling【即Bert的训练方式,遮住一个词然后再去预判这个词语(完形填空)】,这个loss肯定是非常有用,到现在为止,不光是NLP还是Vision ,基本都大一统的全部使用Mask Modeling。另外还有一个Image text Matching的Loss,在之前的(c)和(d)的这种方法之中,都取得了很好的结果,所以我们也想继续采纳。

所以我们发现,可能对于一个好的多模态学习的模型结构来说,我们的目标函数应该也就是ITC、ITM和MLM这三个的合体,最后效果应该不错。

ALBEF

现在我们来看ALBEF的这个模型结果,其实就会发现,我们通过总结做出来的这些预测,基本上都是正确的。比如从模型结构来说,在图像这边的编码器,其实就是一个12层的Transformer Base Model。

 但是在文本这边,将一个12层的Bert Model,劈成了两个部分,前六层,拿来做文本的编码器,后六层做多模态融合的编码器。

满足我们刚刚所做的两个假设。第一个假设是整个图像编码器会比文本编码器要大,一边有12层的Transformer Block,另一边只有6层的Transformer Block。第二个是模态之间的融合也必须要大,所以这里面并不是一个简单的点乘,而是使用了6层的Transformer Block。

从目标函数来说,ALBEF就是用了这个Image Text Contrastive【ITC loss】和这个Image Text Matching和Mask Language Modeling,三个loss 的合体去训练这个模型。

之所以我们可以通过之前的一些对比和总结,得到接下来研究方向的一些假设,而且真的被一些后续的工作所验证,其实不是巧合,因为大部分工作的出发点 ,或者它的研究动机,其实就是在总结前人工作这个优缺点之中得到的,所以如果我们没有一些研究的idea,或者说我们不知道接下来研究方向该如何走的时候,还是需要去更相关的文献,并且不光是读这些文献,更重要的是做一个总结,每一篇论文我们都得到哪些insight,有什么东西是可取的,可以继续发扬光大,有什么东西不要,最好我们可以将其移除,通过这种不停地阅读、总结和对比。绝大多数便会给我们一个很明确的研究方向

ALBEF

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation

这个团队在做出ALBEF这论文之后,又相继作了BLIP、MUST,还有Video那边的ALPro一系列的多模态工作。

(1)摘要部分 

 最近图像文本的这种大规模的特征学习,已经变得非常火爆了,因为这个时候CLIP和Align这些工作都已经出来,基于CLIP的后续工作也出来很多。

大部分的方法都是用一个、、、、、、、

写到这里,突然发现自己有点不感冒,先挖个坑在这吧

【多模态论文串讲·上【论文精读】】 https://www.bilibili.com/video/BV1Vd4y1v77v/?share_source=copy_web&vd_source=9ee2521627a11b87c06e3907e194e1ab 

以上是学习链接,感兴趣的小伙伴,自行查看哟!

有用的话,请多多给老师一键三连! 

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

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

相关文章

SpringCloud之负载均衡Ribbon

1.Ribbon是什么? •Ribbon是 Netflix 提供的一个基于HTTP和TCP的客户端负载均衡工具。 •Ribbon主要有两个功能: 1.简化远程调用 2.提供客户端的软件负载均衡算法 Ribbon客户端组件提供一系列完善的配置项,如连接超时,重试等…

ERA5数据不同下载方法

ERA5数据不同下载方法1 ERA5简介2 ERA5下载的三种方法2.1 方法1:GEE下载2.2 方法2:官方网站下载2.3 方法3:通过Python脚本下载(以Linux系统为例)总结参考1 ERA5简介 ERA5是ECMWF对全球气候的第五代大气再分析。再分析…

ArcGIS基础实验操作100例--实验17按条件计算属性字段值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 基础编辑篇--实验17 按条件计算属性字段值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

工业远程I/O模块CANopen I/O模块 安装接线说明

1)外观尺寸 DIN35mm Rail标准导轨支架外观与尺寸: 2)面板说明 指示灯说明运行指示灯 绿色预留预留错误指示灯 红色CANopen地址设置开关,CANopen 通讯速率设置开关,当 0表示通信速率为10Kbps 4表示通信速率为250Kbps 1表…

Linux | 内存 | 由内存页不足(page allocation failure)引起程序杀死(OOM Killer)

本文对由于 page allocation failure 而引起 Out of Memory Killer 的背景及工作原理进行不完全总结。 更新:2022 / 12 / 30 文章目录触发条件__alloc_pages_slowpath()__vmalloc_area_node()__vmalloc_node_range工作原理结合实例1.2.GFP_ATOMIC 和 __GFP_COMP&am…

阿里云弹性预测 AHPA:助力厨芯科技降本增效

作者:李鹏(元毅) “使用阿里云弹性预测 AHPA,降低了 K8s 容器成本,同时减轻了运维工作量,加速了业务容器化的进程。”—— 朱晏(厨芯科技VP) 背景 厨芯科技,是全球领先的餐饮设备和服务提供商…

TCP 的报头结构 和 三次握手---详解(看完必会)

TCP 的三次握手: 在搞懂三次握手前,必须要搞明白TCP报头的结构内容 TCP报头结构: 源端口号 : 源计算机上的应用程序的端口号;目的端口号 : 目标计算机的应用程序端口号;序列号:客户端给服务端发送数据时…

React 配置文件(二) 配置环境变量

开发环境一般分为: UAT(测试环境) PRE(预上线环境) PROD(生产环境) 所以本地开发分别搭建相对应环境 2.安装 dotenv 3.在package.json文件中配置环境 "scripts": { "start": "react-app-rewired start", "uat": "dotenv…

【Linux】文件系统与inode

一、文件系统 理解文件系统前首先我们要来先了解一下磁盘结构。 接下来我们看看以水平、垂直角度来看看磁盘结构,并将其区域进行划分。 磁盘的垂直分布 (此图最上面的一面和最下面的一面无磁头,则不存储数据): 磁头数:磁头就是在…

LeetCode303.区域和检索 - 数组不可变

LeetCode刷题记录 文章目录📜题目描述💡解题思路⌨C代码📜题目描述 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中…

Windows nc命令下载使用与使用bash建立反弹shell

今天继续给大家介绍渗透测试相关知识,本文主要内容是Windows nc命令下载使用与使用bash建立反弹shell。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强…

磨金石教育摄影技能干货分享|王汉冰摄影作品欣赏—《沙狐之眼》

一、偏爱新疆风光的摄影师王汉冰 王汉冰是新疆人,身为摄影师的他对新疆的大好风光有着强烈的偏爱。 因此经常驾车游历,期望寻找到好的风景,将它记录下来,让世人都能感受到大美新疆的壮丽。 在今年七月,王汉冰来到巴音郭…

C语言 内存函数 自定义类型 结构体 枚举 联合

perror #include <stdio.h> #include <errno.h> #include <string.h>//strerror //perror与上相关 更加方便直接打印错误信息 上边需要先将错误码转换为错误信息 再用printf打印 // int main() {//打开文件失败的时候&#xff0c;会返回NULLFILE* pf fo…

同为(TOWE)IPS系列工业插头插座、连接器的选型及特点

所谓工业插头插座、连接器&#xff0c;即欧洲标准插头插座&#xff0c;主要用于实现电信号的传输和控制以及电子与电气设备之间的电源连接。它可以通过连接器插头与插座之间的插合和分离&#xff0c;使电路产生接通和断开&#xff0c;适用于对安全、寿命和性能具有高要求的应用…

5款OCR文字识别软件推荐_分享好用的OCR(图片转文字)工具

5款OCR文字识别软件推荐 不知道大家是不是不知道OCR单词识别这个词。 小编认为&#xff0c;经常处理各种办公文件的朋友&#xff0c;对OCR文字识别这个词肯定有一定的了解&#xff0c;因为在处理办公文件的时候&#xff0c;很有可能会遇到对OCR文字识别的需求。 而当我们遇到O…

ubuntu16.04运行YOLOV5并部署

运行环境 环境&#xff1a;ubuntu 16.04 CUDA: 10.2 执行模型推理 1. 下载yoloV5 repo git clone https://github.com/ultralytics/yolov52. 用conda新建python环境 conda create -n yolo python3.83. 安装需求包 pip install -r requirements.txt 4. (requremets中包含…

@Configuration如何保证@Bean单例语义?

1. 前言 Spring允许通过Bean注解方法来向容器中注册Bean&#xff0c;如下所示&#xff1a; Bean public Object bean() {return new Object(); }默认情况下&#xff0c;bean应该是单例的&#xff0c;但是如果我们手动去调用Bean方法&#xff0c;bean会被实例化多次&#xff0…

iServer使用影像服务(二)——影像服务发布为wmts和wms服务的加载

前言 自从SuperMap iServer10.2.0版本开始新增影像服务模块&#xff0c;并支持大规模影像&#xff08;栅格&#xff09;数据快速发布为影像服务&#xff0c;之后推出的版本中都陆陆续续对影像服务模块扩充了新功能、增强了新特性&#xff1b;如在SuperMap iServer10.2.1版本中…

JAVA注解使用

JAVA注解使用简介概念说明自定义注解注解格式元注解注解本质属性注解生成文档案例生成的源代码生成Doc简单的自定义反射演示注解定义调用类定义测试通过注解实现配置类定义枚举类定义注解配置类使用注解测试自动生成数据库生成演示数据库注解定义使用注解创建数据表使用注解创建…