Kosmos-2: 在多模态大语言模型中引入基准和指代能力

2024-03-06 05:52

本文主要是介绍Kosmos-2: 在多模态大语言模型中引入基准和指代能力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Kosmos-2: 在多模态大语言模型中引入基准和指代能力
FesianXu 20240304 at Baidu Search Team

前言

之前笔者在博文中介绍过kosmos-1模型 [1],该模型脱胎于MetaLM采用『因果语言模型作为通用任务接口』的思想,采用了多种形式的多模态数据进行训练得到。而在本文将要介绍的kosmos-2中,作者则尝试引入了基准(grounding)和指代(referring)能力,使得多模态大语言模型的人机交互形式更加友好、灵活和多样。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注明出处,谢谢。

∇ \nabla 联系方式:

e-mail: FesianXu@gmail.com

github: https://github.com/FesianXu

github page: https://fesianxu.github.io/

知乎专栏: 计算机视觉/计算机图形理论与应用

微信公众号:机器学习杂货铺3号店


在我们正式介绍kosmos-2之前,我们首先了解下什么是指代(referring)功能和基准(grounding)功能,如Fig 1所示,这是百度app中的以图搜图功能,用户拍摄一张图片,此时用户可以对图中的多种物体进行画框,随后用户可以选择对被框框中的物体进行识别、提问或者发起搜索等。这个功能使得用户在以图搜图的场景中,可以更加灵活地和场景中的物体进行交互,这便是所谓的指代功能。各位读者有兴趣可以自行在手机百度App上体验这个功能。
fig1_image_ir

Fig 1. 百度搜索的以图搜图功能,支持一定程度的指代功能,通过画框显式筛选用户感兴趣的物体进行提问或者发起搜索。

当然,这种功能的一种最简单的实现思路就是对被框中的物体进行图片裁剪,直接对裁剪后的图片进行处理,显然这种方法将会丢失该框中物体和图片中其他物体的上下文关系。让我们举个例子,如Fig 2 (a)所示,如果对蓝色框中的物体进行提问,如果只是对蓝色框中的雪人进行裁剪后喂到模型中处理,就难以获得图片全局和被框中物体的上下文关联,因此很难分析出『他身上的微光是篝火倒映的结果』这个结论。在这个过程中,从原图中框定一些包围盒(Bounding box, bbox),通过提供这个包围盒的左上顶点坐标 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)和右下角坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)即可。如Fig 2 (b)所示,这个过程称之为指代 (Referring),而所谓的基准(Grounding)1,则指的是模型的输出中,会对不同实体同时输出其在图中的包围盒的坐标。Grounding也可以翻译成『接地』,这让我们联想到了电子工程中的『地线』,电压的大小都是针对于地线而言的,因此『接地』『基准』可以理解为是为文本概念和视觉概念的对齐,而这个对齐更为显式,因为其要求模型提供了对应实体的包围盒坐标,此时的『地线』就是图片中特定的包围盒了。
fig2_refer_grounding

Fig 2. 基准功能和指代功能的解释和示例,可以使得多模态大语言模型具有全局的视觉理解和更灵活的人机交互能力。

如Fig 3所示,本文要介绍的kosmos-2 [2] 正是一种通过构建特定的多模态数据,引入了指代和基准能力的多模态大语言模型。作者在LAION-2B和COYO-700M数据集的基础上构建了基准图文对数据集(GRounded Image-Text pairs, GRIT),这种数据集是在<图片, 图片文本描述>成对数据的基础上,拆解和重组图片的文本描述,使得产生了不同粒度的文本片段(如名词片段、指代表述等),并通过基准物体识别模型(如GLIP [3])产出不同粒度文本片段的包围盒,通过这种方法形成了约9100万图片,1.15亿文本片段,1.37亿包围盒的GRIT数据集。将GRIT数据和Kosmos-1采用的多模态数据融合在一起训练得到了kosmos-2模型。
fig3_kosmos_2

Fig 3. Kosmos-2的示意图,其主要特点是引入了指代和基准能力。

因此kosmos-2的主要升级点其实是GRIT数据集的构建,我们着重关注下数据的构建细节。如Fig 4所示,GRIT数据的构建主要包括两大步骤:

  1. 创建名词片段-包围盒成对样本:给定一个图片-文本描述样本,对文本描述样本进行名词片段提取,同时采用物体识别模型对图片进行处理得到所有包围盒,对提取好的名词片段和包围盒进行组建,得到名词片段-包围盒成对样本。注意到作者舍弃了抽象的名词片段,如"love", “time”, "freedom"等,这些抽象的概念容易带了噪声。
  2. 产出指代表述-包围盒成对样本:只是名词片段无法对一些复杂、组合概念进行描述,因此可以考虑对名词进行一些组合,构建出所谓的指代表述(referring expression)文本,本文通过SpaCy对文本进行依存关系树(dependency tree)解析,然后依次递归每个名词片段的子节点,然后将递归的子节点的词和该名词进行拼接得到扩展。举个具体的例子如下所示。
a dog in a field of flowers的依存关系树,由SpaCy 3.6.1生成。dog              ___|____            |        in         |        |           |      field        |    ____|______     |   |           of  |   |           |    a   a        flowers1. 以dog为中心进行扩展: a dog in a field of flowers
2. 以field为中心进行扩展: a field of flowers
3. 以flowers为中心进行扩展:flowers

为了减少冗余,作者只保留了那些不被其他指代表述或者名词片段包含的部分,以刚才的扩展为例子,作者保留了"a dog in a field of flowers",而舍弃了"a field of flowers"和"a field of flowers"。然后将"a dog"的包围盒赋值给了最终保留下的"a dog in a field of flowers"。整个过程如Fig 4所示。
fig4_grit_construction

Fig 4. GRIT数据集构建流程,主要由两大步骤构成:名词片段-包围盒成对数据提取、指代表述-包围盒成对数据组建。

在模型方面,kosmos-2沿用了kosmos-1的模型结构和训练范式,但是可以提供视觉回答(以输出图片中包围盒坐标的形式提供),也可以提供视觉输入和包围盒输入。此处的包围盒输入和输出都是左上角坐标和右下角坐标的形式,为了将训练目标统一到自回归生成,有必要将连续的坐标离散化到离散的token形式。一种可行的方法是将一个长宽分别为 W W W H H H的图片均匀划分到 P × P P \times P P×P的分块(patch)中,每一个分块大小为 ( W / P ) × ( H / P ) (W / P) \times (H / P) (W/P)×(H/P)像素。对于每个分块而言给它赋予一个唯一的token id,采用每个分块的中心像素的坐标代表整个分块的左边。最终在整个词表中将会新增 P × P P \times P P×P个新的包围盒『词』,至此包围盒的输入输出和文本输入输出便是打平了。

此时一个包围盒的输入或输出如<box><loc1><loc2></box>loc1loc2表示左上角和右下角分块的token id,而<box></box>则是特殊标记,表示了包围盒的开始和结束。如果一个文本片段包含了多个包围盒,则通过<delim>这个特殊标记进行连接,最终形式如<box><loci_1><loci_2><delim>...<locj_1><locj_2></box>

然后以类似于书写markdown文档超链接的形式,给文本片段添加包围盒,如<p> text span </p><box><loc1><loc2></box>,其中的<p></p>是特殊标记,表示了需要提供基准的文本片段。最终一个完整的输入如下所示,其中的<s></s>表示整个序列的开始和结束,而<image></image>则表示了提供的视觉向量的开始和结束,<grounding> 也是一个特殊标记,用于告诉模型将文本输出进行视觉基准,这是因为在训练时候同时包含有纯文本数据、图文对数据和图文交织数据,需要<grounding> 这个特殊标记告诉模型需要进行文本输出基准了。

<s> <image> Image Embedding </image> <grounding> <p> It </p> <box> <loc44> <loc863> </box> 
seats next to <p> a campfire </p> <box> <loc4> <loc1007> </box> </s>

在kosmos-1的纯文本数据、图文交织数据、图文对数据的基础上,作者引入了GRIT基准图文数据,损失计算只对离散的token进行,如文本token和包围盒位置token,而略过特殊标记。在实验中,作者将 P = 32 P=32 P=32,因此一共新增有 32 × 32 = 1024 32 \times 32=1024 32×32=1024个包围盒位置token,一个训练batch size包含了419k个token,其中185k个token来自于文本数据集,215k来自于原始图文对数据和基准图文数据,19k个来自于图文交织数据。

作者在实验部分验证了模型的基准和指代能力,同时给出了不少测试结果,笔者没看到有需要特别注意的,就不在这里贴出来了,有兴趣的读者自行去翻阅原文即可。笔者看来,从MetaLM到kosmos-1,再到kosmos-2,其实模型结构和训练范式并没有变化,优化的点主要还是各种多模态数据的构建上,这其实也启示我们在大模型年代,如何构建更好更合适的数据可能比魔改模型结构更有收益,数据采集和清洗是一种艺术,也许我们应该给予数据更多的关注和研究。

Reference

[1]. https://blog.csdn.net/LoseInVain/article/details/136428429, 《Kosmos-1: 通用接口架构下的多模态大语言模型》

[2]. Peng, Zhiliang, et al. “Kosmos-2: Grounding Multimodal Large Language Models to the World.” arXiv preprint arXiv:2306.14824 (2023). aka Kosmos-2.

[3]. Li, Liunian Harold, et al. “Grounded language-image pre-training.” Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2022. aka GLIP.


  1. 在深度学习领域,“grounded” 通常指的是将模型的输出或表示与真实世界中的某些实体或概念相关联或对齐。这种关联可以为模型提供更丰富、更具解释性的信息,并有助于提高其性能。 当谈到“video grounded”时,这通常意味着视频数据中的某些内容与模型的输出或中间表示之间存在某种形式的对齐或关联。例如,在视频描述生成任务中,模型可能会生成描述视频内容的文本。如果这些描述确实与视频中的实际事件、物体或动作相对应,那么可以说模型在这方面是"grounded"的。简而言之,“grounded” 在这里意味着模型不仅仅是生成一些看似合理但与真实内容无关的输出,而是能够捕捉并与真实世界中的实体或事件建立联系。 ↩︎

这篇关于Kosmos-2: 在多模态大语言模型中引入基准和指代能力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779018

相关文章

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

一文教你Python引入其他文件夹下的.py文件

《一文教你Python引入其他文件夹下的.py文件》这篇文章主要为大家详细介绍了如何在Python中引入其他文件夹里的.py文件,并探讨几种常见的实现方式,有需要的小伙伴可以根据需求进行选择... 目录1. 使用sys.path动态添加路径2. 使用相对导入(适用于包结构)3. 使用pythonPATH环境

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超