Ovis原理解读: 多模态大语言模型的结构嵌入对齐

在这里插入图片描述

论文:https://arxiv.org/pdf/2405.20797
github:https://github.com/AIDC-AI/Ovis

在多模态大语言模型 (MLLM) 中,不同的嵌入策略有显著的区别。以下是使用基于连接器的方法与 Ovis 方法的比较:
不同方案总结对比

基于连接器的方法-优缺点(connector-based approach)

  • 策略:在基于连接器的方法中,视觉嵌入通过连接器(connector)转化为与文本嵌入具有相同维度。
  • 具体实现:文本嵌入从一个文本嵌入表中索引,而连接器的作用是将视觉嵌入调整到相同的尺度和形式,使其能够与文本嵌入一起处理。
  • 优点:这种方法确保了视觉和文本嵌入在形式上的一致性,方便后续的联合处理。
  • 缺点:连接器可能限制了视觉特征的表达能力,无法完全捕捉到视觉输入的复杂模式和细节。

Ovis 方法-优缺点

  • 策略:Ovis 引入了一个额外的视觉嵌入查找表,从而生成结构化的视觉嵌入,并对齐两种模态的嵌入策略。
  • 具体实现:在 Ovis 中,这个额外的视觉嵌入表的每一行对应一个唯一的视觉词汇,表示不同的视觉模式。Ovis 首先将视觉编码器输出的连续 token 映射为概率 token,通过索引视觉嵌入表多次来生成最终的视觉嵌入。这种方法利用了整个嵌入表的期望值,捕捉了视觉输入的丰富语义。
  • 优点:这种方法能够更好地捕捉视觉输入中的复杂模式,提升了视觉信息的表达能力。此外,通过与文本嵌入策略的一致性设计,提高了两种模态信息的融合效果。
  • 缺点:引入额外的视觉嵌入表可能增加计算复杂度,需要更多的存储和计算资源。

Ovis 总结

它提出了一种新颖的多模态大语言模型 (MLLM) 架构,称为 “Ovis”。该架构吸收了大语言模型 (LLMs) 的洞见,从而建立视觉输入的结构化嵌入。如图1所示,Ovis 引入了一个额外的可学习视觉嵌入查找表,用以转换连续的视觉tokens,从而与文本嵌入的结构完整性相呼应。图2展示了在各种基准测试中,Ovis 在相同参数范围内优于开源 MLLMs,而 Ovis-14B 在整体表现上也超越了高资源的专有模型 Qwen-VL-Plus。

具体而言,Ovis 包含一个视觉嵌入表,其行对应于唯一的视觉词汇,代表不同的视觉模式。给定由视觉编码器 [22] 输出的视觉块的连续token,Ovis 首先将该token 映射为概率token,展示其在整个视觉词汇表中的相似性。这个概率token 捕捉单个视觉块中的丰富语义,其中可能包含多个视觉词汇的模式,有效地将视觉token视为从视觉嵌入表中基于分布抽样而来。随后,Ovis多次根据概率token 索引视觉嵌入表,生成一个最终的视觉嵌入,即整个嵌入表的嵌入期望。因此,Ovis 将视觉嵌入策略与其文本嵌入结构的本质对齐。

视觉嵌入表的优化和生成概率token 的参数显著影响 MLLM 的性能。与之前方法使用图像上的向量量化自动编码器和各种其他损失不同 [78, 23, 33],Ovis 利用联合文本生成损失,并以三阶段方式优化参数。这种学习过程使得 Ovis 避免了由于缺乏文本指导而在视觉语言任务中表现不足的风险。

以开源的视觉 Transformer 和 LLM 模型作为骨干实现 Ovis,并在不同的多模态基准中评估其性能。结果表明,在大多数基准测试中,Ovis 在相同参数范围内优于流行的开源 MLLMs。具体而言,Ovis-8B 与其竞争对手相比表现出较大的优势,而 Ovis-14B 始终超越了被比较的开源 MLLMs。
在这里插入图片描述

首先回顾了多模态大语言模型(MLLMs)中的视觉和文本嵌入策略的差异。接着,我们介绍了提出的架构Ovis,该架构包括用于概率性tokens的线性映射和在大语言模型(LLM)中引入的视觉嵌入查找表。

1 视觉和文本tokens的差异

图像和文本都作为输入被送入MLLM,但它们的标记化策略各不相同。设 I ∈ R C × W × H I \in \mathbb{R}^{C \times W \times H} IRC×W×H 为图像的像素值张量,其中 C C C W W W H H H 分别表示图像的通道数、宽度和高度。图像首先被划分为一系列视觉块(visual patches) { P i ∈ R C × w × h } i = 1 , 2 , … , n \{P_i \in \mathbb{R}^{C \times w \times h}\}_{i=1,2,\ldots,n} {PiRC×w×h}i=1,2,,n,其中 w w w h h h 分别表示视觉块的宽度和高度, n = ⌈ W w ⌈ ⌈ H h ⌈ n = \left\lceil \frac{W}{w} \right\lceil \left\lceil \frac{H}{h} \right\lceil n=wWhH 为视觉块的数量。给定预训练的视觉转换器(ViT)骨干网 g θ g_{\theta} gθ ,我们将这些视觉块转换为一系列视觉表示 { r i ∈ R d } i = 1 n \{r_i \in \mathbb{R}^d\}_{i=1}^n {riRd}i=1n

对于文本输入,设 { t i } i = 1 m \{t_i\}_{i=1}^m {ti}i=1m 为文本tokens的输入序列,它们将被 LLM f ϕ f_{\phi} fϕ 处理。在 MLLM 中,视觉 { r i } i = 1 n \{r_i\}_{i=1}^n {ri}i=1n 和文本 { t i } i = 1 m \{t_i\}_{i=1}^m {ti}i=1m 的tokens都需要转换为相同的形式,随后 LLM 处理所有tokens,并生成一个文本tokens的输出序列。我们用 λ \lambda λ 来表示图像指示器token的索引,即 t λ = <image > t_{\lambda} = \text{\textless image \textgreater} tλ=<image >,多模态输入tokens变成:
[ t 1 , … , t λ − 1 , <image > , … , t m ] ( 1 ) [ t_1, \ldots, t_{\lambda-1}, \text{\textless image \textgreater}, \ldots, t_m ] \ \ \ \ \ \ \ \ (1) [t1,,tλ1,<image >,,tm]        (1)由于视觉和文本tokens的维度不同,直接用 { r i } i = 1 n \{r_i\}_{i=1}^n {ri}i=1n 替换 <image > \text{\textless image \textgreater} <image >是困难的。先前的方法引入了额外的线性投影、MLP或transformer架构来将视觉tokens映射成与文本tokens相同的形式。

2 概率性视觉Tokens

在Equation 1中与其使用连续的视觉tokens,我们对齐图像和文本的内部标记化策略以激发MLLM的潜力。为了模拟离散的文本tokens,我们使用一个线性头 R K × d R^{K \times d} RK×d 来变换具体的视觉tokens。假设K是视觉词汇表的大小,即唯一视觉词的数量,给定一个视觉token r i r_i ri,我们首先通过线性投影和softmax归一化将 r i r_i ri 转换为一个 ( K − 1 ) (K-1) (K1) 维的概率单纯形 Δ K \Delta^K ΔK
v i = softmax ( W r i ) , W ∈ R K × d ( 2 ) v_i = \text{softmax}(W r_i), W \in R^{K \times d} \ \ \ \ \ \ \ \ (2) vi=softmax(Wri),WRK×d        (2) v i ∈ Δ K v_i \in \Delta^K viΔK 视为一种概率token,这是一种在包含K个视觉词汇的视觉词汇表上的概率分布。如果 r i r_i ri 更多地与某些模式相关,则 v i v_i vi 中对应的元素应更大。

:给定一个视觉嵌入表,我们将每个视觉词与其原型 { w i ∈ R d } i = 1 K \{w_i \in R^d\}_{i=1}^K {wiRd}i=1K 关联。为了匹配一个连续的视觉token与嵌入表中的K个视觉词,我们利用内积来计算它们的相似度值。Equation 2是 r i r_i ri 与所有视觉词之间的归一化相似度。

3 视觉嵌入表

在LLMs中,通常采用文本嵌入表将词汇表中的每个词映射到一个嵌入向量。对于以one-hot形式表示的每个文本token t i t_i ti,其嵌入 T i ∈ R d ′ T_i \in R^{d'} TiRd 是由 t i t_i ti 中非零索引指示的文本嵌入表中的行。

类似地,我们引入一个额外的视觉嵌入表,其中每个视觉词(每一行)与一个嵌入向量 e k ∈ R d ′ e_k \in R^{d'} ekRd 关联, d ′ d' d 是嵌入维度。为了使视觉和文本tokens的嵌入具有兼容的形状,我们将视觉嵌入表的维度设定为与文本嵌入表相同。

相应地,每个视觉token v i v_i vi 的嵌入可以基于概率性token推导出来:
V i = ∑ k = 1 K v i , k e k ∈ R d ′ ( 3 ) V_i = \sum_{k=1}^K v_{i,k}e_k \in R^{d'} \ \ \ \ \ \ \ \ (3) Vi=k=1Kvi,kekRd        (3)

其中 v i , k v_{i,k} vi,k 表示 v i v_i vi 的第 k 个成分。另一方面,由于 v i ∈ Δ K v_i \in \Delta_K viΔK,上述公式可以重写为
V i = E k ∼ v i [ e k ] V_i = \mathbb{E}_{k \sim v_i}[e_k] Vi=Ekvi[ek]
这是视觉词的嵌入的期望,视觉词从 v i v_i vi 中抽样。换句话说,我们假设视觉嵌入可以基于视觉块的概率token v i v_i vi 从离散的视觉嵌入表中抽样。

:考虑到视觉块 r i r_i ri 的多义性,仅从嵌入表中为其分配一个视觉词(即由 arg ⁡ max ⁡ j ∈ { 1 , … , K } v i j \arg \max_{j \in \{1, \ldots, K\}} v_{ij} argmaxj{1,,K}vij 索引)可能忽略块内包含的丰富语义。为解决这个问题,我们将视觉块与多个视觉词关联,由 v i v_i vi 中非零元素表示,这些元素代表视觉块与K个视觉词的相关性。

我们随后使用所选视觉词汇的加权组合 V i V_i Vi 作为最终的块嵌入。换句话说,基于 v i v_i vi 的值,从嵌入表中索引出多个视觉嵌入,并利用这些嵌入的加权平均作为视觉嵌入模块的最终输出。附录E中的实验验证了 v i v_i vi 的稀疏性。视觉嵌入 V i V_i Vi 既捕捉了丰富的视觉语义,同时其生成过程与文本生成过程相似。

4 Ovis的训练策略

视觉和文本嵌入组合后作为输入送入LLM。具体来说,我们将以下多模态输入嵌入序列
[ T 1 , … , T λ − 1 , V 1 , … , V n , T λ + 1 , … , T m ] ( 4 ) [T_1, \ldots, T_{\lambda-1}, V_1, \ldots, V_n, T_{\lambda+1}, \ldots, T_m]\ \ \ \ \ \ \ \ (4) [T1,,Tλ1,V1,,Vn,Tλ+1,,Tm]        (4)输入到LLM。所有tokens不仅具有相同的维度,而且通过嵌入表以相似方式生成。LLM将输出一个文本token序列 o 1 , … , o l o_1, \ldots, o_l o1,,ol

Ovis分三阶段训练,并始终通过文本生成损失(即Ovis输出的文本tokens与真实文本之间的交叉熵)进行优化。这三个阶段的差异在于其可训练参数和训练数据的类型。

阶段1:我们冻结LLM的所有参数,以及视觉编码器 g g g 中大部分参数(一个开源的预训练ViT骨干网)。我们随机重新初始化 g g g 最后一层的参数,使用诸如COYO [7] 等视觉描述数据集训练重新初始化的参数和Ovis的投影矩阵 W W W 以及视觉嵌入表 { e k } k = 1 K \{e_k\}_{k=1}^K {ek}k=1K。对于标题数据集中的每个图像,我们构建一个训练样本,输入为“的标题:”并将其标签为“CAPTION”,其中CAPTION表示图像的标题。

阶段2:在这个阶段,我们继续训练Ovis的W,视觉嵌入表 { e k } k = 1 K \{e_k\}_{k=1}^K {ek}k=1K 以及视觉编码器 g g g 中的所有参数。LLM仍然冻结。与第一阶段使用的标题样本不同,我们利用如ShareGPT4V-Pretrain [11] 等视觉描述数据,这些数据集的训练样本结构化为描述图像的对话。

阶段3:在阶段1和阶段2的训练中赋予Ovis视觉感知能力之后,本阶段的重点是多模态指令学习。目标是使Ovis具备跟随多模态指令的能力。为此,我们解冻LLM模块,并在多模态指令数据集(如LLaVA-Finetune [47])上训练Ovis的全部参数。

总结

通过三阶段的训练策略,Ovis能够逐步获得视觉感知和跟随多模态指令的能力。这种策略既保证了模型在视觉和文本上的高效整合,又通过多模态任务不断提升模型的实际应用能力。

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

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

相关文章

斜杠往哪斜、路径绝对还是相对,终端目录切换不再迷茫

目录 路径表示绝对路径相对路径两者区别 路径中斜杠的用法正反斜杠对比表一个常见的问题 终端切换目录常用cd指令同一盘符内跨盘符 路径表示 在计算机文件系统中&#xff0c;路径是用来指定文件或目录位置的一种方式。路径可以是绝对路径或相对路径&#xff1a; 绝对路径 绝…

cmake 编译 vtk

1. 下载 VTK 源码 vtk 源码&#xff0c;点击&#xff1a;官网下载 在官网选择合适的版本下载&#xff0c;这里下载的是 vtk 8.2.0 版本 2. 下载 CMake CMake 工具&#xff0c;点击&#xff1a;镜像下载 下载版本比较新的 CMake 版本&#xff0c;这里使用的是 CMake 3.29.2 版…

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…

C++基础:constexpr,类型转换和选择语句

constexpr 提到constexpr&#xff0c;我们会发现它和const类比 常和const类比constexpr符号常量必须给定一个在编译时已知的值&#xff0c; 若某个变量初始化时的值在编译时未知&#xff0c;但初始化后绝不变。 #include<iostream> #include<vector> #include&l…

【机器学习基础】激活函数

激活函数 1. Sigmoid函数2. Tanh&#xff08;双曲正切&#xff09;函数3. ReLU函数4. Leaky ReLU函数 1. Sigmoid函数 观察导数图像在我们深度学习里面&#xff0c;导数是为了求参数W和B&#xff0c;W和B是在我们模型model确定之后&#xff0c;找出一组最优的W和B&#xff0c;使…

Go使用exec.Command() 执行脚本时出现:file or directory not found

使用 Go 提供的 exec.Command() 执行脚本时出现了未找到脚本的 bug&#xff0c;三个排查思路 &#xff1a; exec.Command(execName, args…) 脚本名字不允许相对路径 exec.Command(execName, args…) execName 只能有脚本名&#xff0c;不允许出现参数 如果你是使用 Windows …

Python爬虫:商品详情的“八卦记者”

亲爱的代码侦探们&#xff0c;今天咱们不聊那些让人头秃的bug&#xff0c;也不谈那些让人眼花的架构图。咱们来聊聊那些在代码世界里挖掘商品秘密的“八卦记者”——Python爬虫。 Python爬虫&#xff1a;商品详情的“八卦记者” 想象一下&#xff0c;你在代码的世界里&#xf…

[笔记] ffmpeg docker编译环境搭建

文章目录 环境参考dockerfile 文件步骤常见问题docker 构建镜像出现 INTERNAL_ERROR 失败? 总结 环境 docker 环境 系统centos 7.9 (无所谓了 你用docker编译就无所谓系统了) ffmpeg3.3 参考 https://blog.csdn.net/jiedichina/article/details/71438112 dockerfile 文件 …

《等保测评新视角:安全与发展的双赢之道》

在数字化转型的浪潮中&#xff0c;企业面临的不仅是技术革新的挑战&#xff0c;更有信息安全的严峻考验。等保测评&#xff0c;作为国家网络安全等级保护的一项重要措施&#xff0c;不仅为企业的安全护航&#xff0c;更成为推动企业高质量发展的新引擎。本文将从全新的视角&…

如何将markdown文件转换为pdf

最近笔者在用vscode写markdown&#xff0c;但是提交时往往需要交pdf。所以就涉及到如何将markdown转化为pdf格式。 首先&#xff0c;需要在vscode上安装插件 markdown Preview Enhanced 之后在vscode的右上角即可看到下述图标&#xff0c;点击&#xff0c;vscode右半面就会显示…

【论文阅读】PGAN

1. WHY 问题 图像超分辨率一直是一个热门研究课题&#xff0c;具有重要的应用价值。基于生成对抗网络GAN的单幅图像超分辨率方法显示重建图像与人类视觉特征更一致。因此&#xff0c;基于 GAN 的网络优化已成为图像超分辨率的主流。然而&#xff0c;一些最新研究表明&#xf…

【JIT/极态云】技术文档--函数设计

一、简介 函数是计算机编程中非常重要的概念。它是一段代码&#xff0c;可以在程序中多次调用&#xff0c;用于完成特定的任务。 函数通常接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回一个结果。这个结果可以被程序中的其他代码使用。 二、新建函数 在函数列表…

Springboot整合spring-boot-starter-data-elasticsearch

前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖&#xff0c;旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch&#xff0c;提供了一套完整…

mysql-Innodb锁相关内容

1、InnoDB存储引擎包含的锁类型 共享锁&#xff08;S锁&#xff09;和排他锁&#xff08;X锁&#xff09;意向锁记录锁间隙锁Next-key锁插入意向锁Auto-INC 锁空间索引的谓词锁 2、共享锁&#xff08;S锁&#xff09;和排他锁&#xff08;X锁&#xff09;-- 锁定数据行 共享…

使用Git进行团队协作开发

使用Git进行团队协作开发 Git简介 安装Git 在Windows上安装Git 在macOS上安装Git 在Linux上安装Git 设置Git用户信息 创建Git仓库 基本Git命令 添加文件 提交更改 查看状态 克隆仓库 推送更改 获取更改 分支管理 创建分支 切换分支 合并分支 删除分支 解决合并冲突 检查冲突…

docker安装、设置非sudo执行、卸载

安装 sudo snap install docker 设置docker非sudo执行 sudo groupadd docker sudo usermod -aG docker $USER newgrp docker sudo chown root:docker /var/run/docker.sock 卸载docker 1.删除docker及安装时自动安装的所有包 apt-get autoremove docker docker-ce docker-…

数据结构_二叉树

二叉树的性质 满二叉树 完全二叉树 完全二叉树的特点 二叉树的存储结构 顺序存储 链式存储 二叉链表 三叉链表 二叉树遍历算法 先序遍历 先序遍历&#xff1a;ABDC 中序遍历 后序遍历 层次遍历

Win11安装基于WSL2的Ubuntu

1. 概述 趁着还没有完全忘记&#xff0c;详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了&#xff0c;还是很值得安装和使用的&#xff0c;笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装 在Win11搜…

Unity编辑器 连接不到SteamVR问题记录

问题表现&#xff1a;之前正常的工程&#xff0c;某天打开后运行&#xff0c;在SteamVR未打开时&#xff0c;Unity工程运行后无法调用起来Steam VR&#xff0c;无任何反应&#xff0c;但用其他软件则可以调用起来SteamVR&#xff0c;并且运行正常&#xff0c;在重装了XR的一些插…

nfs作业

nfs作业 服务机&#xff1a; 编写配置文件&#xff1a; [rootlocalhost ~]# vim /etc/exports 配置文件内容&#xff1a; /nfs/shared *(ro,sync) /nfs/upload 192.168.36.0/24(rw,anonuid210,anongid210,sync) /home/tom 192.168.36.132(rw) 创建目录&#xff0c;文件&am…