理解多模态 LLM | Sebastian Raschka

作者:Sebastian Raschka | 日期:2024年11月3日 

这两个月可谓是风起云涌。AI 研究领域再次迎来了大量进展,其中包括两项诺贝尔奖授予了与 AI 相关的研究成果,以及多篇颇具看点的研究论文相继发表。

其中之一是 Meta AI 发布了他们最新的 Llama 3.2 模型,该系列包含 1B 和 3B 的开源权重大型语言模型版本,以及两个多模态模型。

在这篇文章中,我旨在解释多模态 LLM 是如何运作的。此外,我还将回顾并总结过去几周内发布的大约十余篇最新多模态论文和模型(包括 Llama 3.2),并对它们的实现方式进行比较。

一个多模态 LLM 的示意图,该模型可以接收不同类型的输入模态(音频、文本、图像和视频),并以文本作为输出模态

1. 多模态 LLM 的使用场景

什么是多模态 LLM?正如在引言中所暗示的,多模态 LLM 是一种能够处理多种不同类型输入的大型语言模型,其中每一种“模态”指的是一种特定类型的数据——例如文本(如传统 LLM 中的文本)、声音、图像、视频等。为简化讨论,本文将主要聚焦于图像模态与文本输入的结合。

多模态 LLM 一个经典且直观的应用是图像描述(image captioning):你提供一张输入图像,模型会生成对该图像的文字描述,如下图所示。

一个多模态 LLM 对一个梗图进行解释的示例

当然,还有许多其他的使用场景。例如,我个人非常喜欢的一个应用是:从 PDF 表格中提取信息,并将其转换为 LaTeX 或 Markdown 格式。

2. 构建多模态 LLM 的常见方法

构建多模态 LLM 主要有两种方法:

  • • 方法 A:统一嵌入-解码器架构(Unified Embedding Decoder Architecture)方法;
  • • 方法 B:跨模态注意力架构(Cross-modality Attention Architecture)方法。

(顺便一提,我并不认为这些技术目前已经有官方统一的术语;如果你见过相关命名,也欢迎告诉我。例如,更简略的说法可能是“仅解码器(decoder-only)”方法,以及“基于交叉注意力(cross-attention-based)”的方法。)

用于开发多模态 LLM 架构的两种主要方法

如上图所示,统一嵌入-解码器架构使用的是一个单一的解码器模型,其形式与未修改的 LLM 架构(例如 GPT-2 或 Llama 3.2)非常相似。在这种方法中,图像会被转换为与原始文本 token 具有相同嵌入维度的 token,使得 LLM 在将它们拼接之后,可以同时处理文本与图像输入 token。

跨模态注意力架构则通过交叉注意力机制,在注意力层内部直接融合图像与文本的嵌入表示。

在接下来的章节中,我们将从概念层面探讨这些方法是如何工作的。随后,我们还将回顾近期关于多模态 LLM 的研究论文,以了解这些方法在实践中的具体应用方式。

2.1 方法 A:统一嵌入-解码器架构

让我们从统一嵌入-解码器架构开始,该架构再次如下面的图所示。

统一嵌入-解码器架构的示意图。该架构使用的是一个未经修改的解码器风格 LLM(例如 GPT-2、Phi-3、Gemma 或 Llama 3.2),其输入由图像 token 嵌入和文本 token 嵌入共同组成

在统一嵌入-解码器架构中,图像会被转换为嵌入向量,其方式类似于标准纯文本 LLM 中将文本输入转换为嵌入的过程。

对于一个典型的、仅处理文本的 LLM,文本输入通常会先进行分词(例如使用字节对编码,Byte-Pair Encoding),然后通过一个嵌入层,如下图所示。

文本分词并将其转换为 token 嵌入向量的标准流程示意图,这些嵌入随后会在训练和推理过程中被传递给 LLM

2.1.1 理解图像编码器

与文本的分词与嵌入过程类似,图像嵌入是通过一个图像编码器模块(而不是分词器)生成的,如下图所示。

将图像编码为图像 patch 嵌入的过程示意图

那么,上图中展示的图像编码器内部究竟发生了什么?为了处理一张图像,我们首先会将其划分为更小的 patch,类似于在分词过程中将单词拆分为子词。随后,这些 patch 会被送入一个预训练的视觉 Transformer(ViT)进行编码,如下图所示。

一个经典视觉 Transformer(ViT)结构的示意图,类似于论文《An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale》(2020)中提出的模型

需要注意的是,ViT 通常用于分类任务,因此我在上图中包含了分类头。不过,在这里我们只需要图像编码器部分。

2.1.2 线性投影模块的作用

在前一张图中所示的“线性投影”由一个单独的线性层(即全连接层)构成。该层的目的是将被展平为向量的图像 patch 投影到一个与 Transformer 编码器兼容的嵌入维度中。下图展示了这一线性投影过程:一个被展平为 256 维向量的图像 patch 被上投影为一个 768 维向量。

一个线性投影层的示意图,该层将展平后的图像 patch 从 256 维投影到 768 维嵌入空间

对于更偏好查看代码示例的读者,我们可以使用如下 PyTorch 代码来实现图像 patch 的线性投影:


     
     
      
     
     import torch


class
 PatchProjectionLayer(torch.nn.Module):

    def
 __init__(self, patch_size, num_channels, embedding_dim):
        super
().__init__()
        self
.patch_size = patch_size
        self
.num_channels = num_channels
        self
.embedding_dim = embedding_dim
        self
.projection = torch.nn.Linear(
            patch_size * patch_size * num_channels, embedding_dim
        )

    def
 forward(self, x):

        batch_size, num_patches, channels, height, width = x.size()
        x = x.view(batch_size, num_patches, -1)  # Flatten each patch
        x = self.projection(x)  # Project each flattened patch
        return
 x


# Example Usage:

batch_size = 1
num_patches = 9  # Total patches per image
patch_size = 16  # 16x16 pixels per patch
num_channels = 3  # RGB image
embedding_dim = 768  # Size of the embedding vector

projection_layer = PatchProjectionLayer(patch_size, num_channels, embedding_dim)

patches = torch.rand(
    batch_size, num_patches, num_channels, patch_size, patch_size
)

projected_embeddings = projection_layer(patches)
print
(projected_embeddings.shape)

# This prints

# torch.Size([1, 9, 768])

如果你恰好读过我的《Machine Learning Q and AI》一书,你可能会知道,有一些方法可以用卷积操作来替代线性层,并且在数学上是等价的。在这里,这种方式尤其方便,因为我们可以用两行代码同时完成 patch 的生成与投影:


     
     
      
     
     layer = torch.nn.Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16))

image = torch.rand(batch_size, 3, 48, 48)
projected_patches = layer(image)

print
(projected_patches.flatten(-2).transpose(-1, -2).shape)
# This prints

# torch.Size([1, 9, 768])

2.1.3 图像与文本的分词对比

在简要讨论了图像编码器(以及作为其组成部分的线性投影)的作用之后,让我们回到前文提到的文本分词类比,并并排对比文本与图像的分词和嵌入过程,如下图所示。

图像分词与嵌入(左)以及文本分词与嵌入(右)的并排对比示意图

正如你在上图中所看到的,我在图像编码器之后额外加入了一个投影器(projector)模块。这个投影器通常只是另一个线性投影层,与前文解释的线性层非常相似。其目的是将图像编码器的输出投影到一个与文本 token 嵌入维度一致的空间中,如下图所示。(正如我们稍后将看到的,这个投影器有时也被称为 adapter、adaptor 或 connector。)

另一组图像分词与文本分词的并排对比示意图,其中投影器的作用是匹配文本 token 的嵌入维度

当图像 patch 嵌入与文本 token 嵌入具有相同的嵌入维度之后,我们就可以像本节开头图示那样,直接将它们拼接后作为 LLM 的输入。为便于参考,下面再次给出该示意图。

在将图像 patch token 投影到与文本 token 嵌入相同的维度之后,我们可以直接将它们拼接后作为标准 LLM 的输入

顺便一提,本节讨论的图像编码器通常是一个预训练的视觉 Transformer。一个常见的选择是 CLIP 或 OpenCLIP。

不过,也存在一些方法 A 的变体,它们直接在 patch 上进行操作,例如下图所示的 Fuyu。

Fuyu 多模态 LLM 的注释示意图,该模型直接在图像 patch 上操作,而不使用图像编码器。(注释图来自:https://www.adept.ai/blog/fuyu-8b)

如上图所示,Fuyu 将输入的 patch 直接送入一个线性投影层(或嵌入层),从而学习其自身的图像 patch 嵌入,而不是像其他模型和方法那样依赖额外的预训练图像编码器。这在很大程度上简化了模型架构与训练流程。

2.2 方法 B:跨模态注意力架构

既然我们已经讨论了用于构建多模态 LLM 的统一嵌入-解码器架构方法,并理解了图像编码背后的基本概念,那么现在让我们来讨论一种通过交叉注意力来实现多模态 LLM 的替代方式,其概要如下面的图所示。

用于构建多模态 LLM 的跨模态注意力架构方法示意图

在上图所示的跨模态注意力架构方法中,我们仍然使用前面讨论过的同样的图像编码器设置。然而,不同之处在于:我们不再将图像 patch 编码后作为 LLM 的直接输入,而是通过交叉注意力机制,将这些输入 patch 连接到多头注意力层中。

这一思想与原始的 Transformer 架构密切相关,其源头可以追溯到 2017 年的《Attention Is All You Need》论文,如下图所示。

原始 Transformer 架构中所使用的交叉注意力机制的高层示意图。(注释图来自《Attention Is All You Need》论文:https://arxiv.org/abs/1706.03762。)

需要注意的是,上图中展示的原始《Attention Is All You Need》Transformer 最初是为语言翻译任务而开发的。因此,它由一个文本编码器(图中左侧部分)和一个文本解码器(图中右侧部分)组成:编码器接收待翻译的句子,解码器生成对应的翻译结果。在多模态 LLM 的语境下,编码器不再是文本编码器,而是图像编码器,但基本思想是相同的。

那么,交叉注意力是如何工作的呢?让我们先来看一张概念图,了解常规自注意力机制内部发生了什么。

常规自注意力机制的结构示意图。(该流程图展示的是一个标准多头注意力模块中的其中一个注意力头)

在上图中,x 表示输入,Wq 是用于生成查询(Q)的权重矩阵。类似地,K 表示键(keys),V 表示值(values)。A 表示注意力分数矩阵,而 Z 则是将输入 x 转换后得到的输出上下文向量。(如果这部分内容让你感到困惑,你可以参考我所著的《从零开始构建大型语言模型》一书的第 3 章,其中有一个全面的介绍;或者,你也可以参考我的文章《理解并实现自注意力、多头注意力、交叉注意力与因果注意力》,它同样会对这里的内容有所帮助。)

与自注意力不同,在交叉注意力中,我们有两个不同的输入来源,如下图所示。

交叉注意力示意图,其中存在两个不同的输入 x1 和 x2

正如前两幅图所展示的那样,在自注意力中,我们处理的是同一个输入序列;而在交叉注意力中,我们会混合或组合两个不同的输入序列。

在《Attention Is All You Need》论文所提出的原始 Transformer 架构中,这两个输入 x1 和 x2 分别对应于左侧编码器模块返回的序列(x2),以及右侧解码器部分正在处理的输入序列(x1)。在多模态 LLM 的语境下,x2 是图像编码器的输出。(需要注意的是,查询通常来自解码器,而键和值通常来自编码器。)

需要注意的是,在交叉注意力中,两个输入序列 x1 和 x2 可以包含不同数量的元素;然而,它们的嵌入维度必须一致。如果我们令 x1 = x2,那么这就等价于自注意力。

3. 统一解码器与跨注意力模型的训练

在我们已经简要讨论了两种主要的多模态设计选择之后,现在让我们简要介绍一下在模型训练过程中,如何处理三大主要组件。这些组件在下图中进行了概括。

多模态 LLM 中不同组件的整体概览。图中编号为 1–3 的组件在多模态训练过程中可以选择被冻结或解冻

与传统纯文本 LLM 的开发过程类似,多模态 LLM 的训练同样包含两个阶段:预训练(pretraining)和指令微调(instruction finetuning)。然而,与从零开始训练不同的是,多模态 LLM 的训练通常是以一个已经完成预训练并经过指令微调的纯文本 LLM 作为基础模型。

对于图像编码器而言,CLIP 是一种常见选择,并且在整个训练过程中通常保持不变,尽管也存在一些例外情况,我们将在后文中进行探讨。在预训练阶段保持 LLM 部分冻结也是一种常见做法,此时训练的重点仅放在投影器(projector)上——该投影器通常是一个线性层或一个较小的多层感知机。由于投影器的学习能力有限,通常只包含一到两层,因此在多模态指令微调阶段(第 2 阶段)往往会解冻 LLM,以便进行更全面的参数更新。不过需要注意的是,在基于交叉注意力的方法(方法 B)中,交叉注意力层在整个训练过程中始终是解冻状态。

在介绍完两种主要方法(方法 A:统一嵌入-解码器架构;方法 B:跨模态注意力架构)之后,你可能会好奇,究竟哪一种方法更有效。答案取决于具体的权衡取舍。

统一嵌入-解码器架构(方法 A)通常更容易实现,因为它不需要对 LLM 的架构本身进行任何修改。

跨模态注意力架构(方法 B)通常被认为在计算效率上更具优势,因为它不会通过额外的图像 token 来占用输入上下文,而是将这些信息延后在交叉注意力层中引入。此外,如果在训练过程中保持 LLM 参数冻结,这种方法还能够维持原始 LLM 的纯文本性能。

我们将在后续章节中重新讨论模型性能与响应质量的问题,届时将会介绍 NVIDIA 的 NVLM 论文。

至此,我们已经完成了对多模态 LLM 的一段相当冗长的介绍。写到这里时,我也意识到讨论内容已经比最初计划的要多得多,这大概也是一个合适的收尾点。

不过,为了提供更具实践意义的视角,接下来如果能考察几篇近期实现了上述方法的研究论文,将会非常有帮助。因此,在本文接下来的章节中,我们将对这些论文进行探讨。

4. 最新的多模态模型与方法

在本文的剩余部分中,我将回顾近期关于多模态 LLM 的研究文献,并将重点放在最近几周内发表的工作上,以便将讨论范围控制在一个合理的尺度之内。

因此,这并不是一篇关于多模态 LLM 的历史性综述或全面回顾,而只是对最新进展的一个简要观察。鉴于这里一共要介绍 10 篇工作,我也会尽量让这些总结保持简短,避免过多铺垫性的内容。

在本文最后的结论部分,我会给出一个总览,对这些论文中所使用的方法进行对比。

4.1 Llama 3 模型家族(The Llama 3 Herd of Models)

《The Llama 3 Herd of Models》论文(2024 年 7 月 31 日)由 Meta AI 发布。以 LLM 的发展节奏来看,这篇论文发表于今年夏初,已经让人感觉像是“很久以前”的事情了。不过,考虑到他们当时只是描述了多模态模型,而并未立即发布,直到很久之后才真正开放这些模型,我认为将 Llama 3 纳入本次综述是合理的。(Llama 3.2 模型于 9 月 25 日正式发布并对外提供。)

多模态 Llama 3.2 模型提供了 110 亿参数和 900 亿参数两个版本,它们是图像-文本模型,采用了前文介绍过的、基于交叉注意力的方法,其结构如下面的图所示。

Llama 3.2 所采用的多模态 LLM 方法示意图。(注释图来自 Llama 3 论文:https://arxiv.org/abs/2407.21783。图中对视频和语音部分进行了视觉遮挡,以便将注意力集中在图像部分)

需要注意的是,尽管该图也展示了视频和语音作为潜在模态的可能性,但截至本文撰写时,实际发布的模型仅聚焦于图像和文本。

Llama 3.2 采用的是基于交叉注意力的方法。不过,它与我前文所描述的多模态 LLM 开发流程略有不同。通常情况下,在多模态 LLM 的开发中,我们会冻结图像编码器,并在预训练阶段仅更新 LLM 的参数。

而在这里,研究人员几乎采取了相反的策略:他们更新了图像编码器,但并未更新语言模型的参数。他们指出,这样做是有意为之,其目的是保留文本模型的原有能力,使得 110 亿和 900 亿参数的多模态模型可以在文本任务中,作为 Llama 3.1 的 80 亿和 700 亿参数纯文本模型的直接替代品。

训练过程本身是通过多轮迭代完成的,起点是 Llama 3.1 的纯文本模型。在加入图像编码器和投影层(在这里被称为 “adapter”)之后,模型首先在图像-文本数据上进行预训练。随后,与 Llama 3 纯文本模型的训练流程类似(我曾在一篇较早的文章中介绍过这一过程),研究人员又对模型进行了指令微调和偏好微调。

在图像编码器方面,研究人员并未采用诸如 CLIP 这样的预训练模型,而是使用了一个从零开始训练的视觉 Transformer。具体来说,他们采用了经典视觉 Transformer 架构中的 ViT-H/14 变体(6.3 亿参数)(Dosovitskiy 等人,2020)。在将图像编码器连接到 LLM 之前,他们先在包含 25 亿对图像-文本样本的数据集上,对该 ViT 进行了 5 个 epoch 的预训练。(该图像编码器接收 224×224 分辨率的图像,并将其划分为 14×14 的 patch 网格,每个 patch 的尺寸为 16×16 像素。)

由于交叉注意力层会显著增加模型参数量,因此这些层仅在每第四个 Transformer block 中加入。(对于 80 亿参数模型,这会额外增加 30 亿参数;而对于 700 亿参数模型,则会额外增加 200 亿参数。)

4.2 Molmo 与 PixMo:用于最先进多模态模型的开放权重与开放数据

《The Molmo and PixMo: Open Weights and Open Data for State-of-the-Art Multimodal Models》论文(2024 年 9 月 25 日)之所以值得关注,是因为它承诺不仅开源模型权重,还将开放数据集与源代码,其开放程度与仅语言模型的 OLMo LLM 相当。(这对于 LLM 研究而言意义重大,因为它使我们能够查看完整、精确的训练流程与代码,同时也允许我们在相同的数据集上进行消融实验并复现结果。)

如果你在疑惑为何论文标题中会出现两个名称,那么其中 Molmo 指的是模型本身(Multimodal Open Language Model,多模态开放语言模型),而 PixMo(Pixels for Molmo)则是为 Molmo 提供支持的数据集。

Molmo 所采用的仅解码器方法(方法 A)的示意图。该注释图改编自《The Molmo and PixMo: Open Weights and Open Data for State-of-the-Art Multimodal Models》论文:https://www.arxiv.org/abs/2409.17146

如上图所示,图像编码器使用的是现成的视觉 Transformer,具体而言是 CLIP。这里所说的 “connector” 指的是一个“投影器(projector)”,其作用是将图像特征与语言模型对齐。

Molmo 通过避免多阶段预训练来简化训练流程,而是选择了一条更为直接的管线,对所有参数进行统一更新——包括基础 LLM、连接器以及图像编码器本身。

Molmo 团队为基础 LLM 提供了多种选择:

  • • OLMo-7B-1024(一个完全开放的模型骨干),
  • • OLMoE-1B-7B(一种混合专家架构;效率最高的模型),
  • • Qwen2 7B(一个开放权重模型,其性能优于 OLMo-7B-1024),
  • • Qwen2 72B(一个开放权重模型,同时也是性能最强的模型)。

4.3 NVLM:开放的前沿级多模态 LLM(Open Frontier-Class Multimodal LLMs)

NVIDIA 的《NVLM: Open Frontier-Class Multimodal LLMs》论文(2024 年 9 月 17 日)尤为引人关注,因为它并未专注于单一方法,而是同时探索了两种路线:

  • • 方法 A:统一嵌入-解码器架构(“仅解码器架构”,NVLM-D),以及
  • • 方法 B:跨模态注意力架构(“基于交叉注意力的架构”,NVLM-X)。

此外,他们还提出了一种混合方法(NVLM-H),并对这三种方法进行了严格的、可直接对比的实验评估。

三种多模态方法的总体概览。(注释图来自《NVLM: Open Frontier-Class Multimodal LLMs》论文:https://arxiv.org/abs/2409.11402)

如上图所总结的那样,NVLM-D 对应于前文讨论的方法 A,而 NVLM-X 对应于方法 B。混合模型(NVLM-H)背后的核心思想是结合两种方法的优势:首先将一张图像缩略图作为输入,然后再通过交叉注意力机制引入数量动态变化的图像 patch,以捕获更精细的高分辨率细节。

简而言之,研究团队发现:

  • • NVLM-X 在处理高分辨率图像时展现出更优的计算效率。
  • • NVLM-D 在 OCR 相关任务中能够取得更高的准确率。
  • • NVLM-H 则综合了两种方法的优势。

与 Molmo 以及其他一些方法类似,他们并未从零开始预训练一个多模态模型,而是以一个纯文本 LLM 作为起点(这种做法通常能获得更好的效果)。此外,他们使用的是一个已经经过指令微调的 LLM,而非基础模型。具体而言,其骨干语言模型是 Qwen2-72B-Instruct(据我所知,Molmo 使用的是 Qwen2-72B 的基础模型)。

在 NVLM-D 方法中,他们训练了 LLM 的全部参数;而在 NVLM-X 方法中,他们发现,在预训练和指令微调两个阶段中,冻结原始 LLM 参数、仅训练交叉注意力层即可获得良好效果。

在图像编码器方面,他们并未使用常见的 CLIP 模型,而是采用了 InternViT-6B(https://arxiv.org/abs/2312.14238),并且在整个训练流程的所有阶段中始终保持该图像编码器冻结。

投影器(projector)采用的是一个多层感知机(MLP),而不是单一的线性层。

4.4 Qwen2-VL:在任意分辨率下增强视觉-语言模型对世界的感知能力

前面介绍的 Molmo 与 NVLM 这两项工作,均基于 Qwen2-72B 语言模型。在这篇论文中,Qwen 研究团队本身正式发布了一款多模态 LLM——《Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution》(2024 年 10 月 3 日)。

该工作的核心在于其所谓的“朴素动态分辨率(Naive Dynamic Resolution)”机制(这里的 “naive” 是作者有意为之,并非 “native” 的笔误,尽管 “native” 在语义上同样说得通)。该机制使模型能够在不进行简单下采样的情况下,处理不同分辨率的图像,从而允许直接以原始分辨率输入图像。

Qwen 多模态模型的整体概览,该模型能够以原生方式处理多种不同分辨率的输入图像。(注释图来自 Qwen2-VL 论文:https://arxiv.org/abs/2409.12191)

这种原生分辨率输入是通过对 ViT 进行修改来实现的:移除了原始的绝对位置编码,并引入了 2D-RoPE。

他们使用了一个参数规模为 6.75 亿的经典视觉编码器,并搭配了多种不同规模的 LLM 骨干,如下表所示。

不同 Qwen2-VL 模型的组成组件。(注释图来自 Qwen2-VL 论文:https://arxiv.org/abs/2409.12191)

其训练流程分为三个阶段:(1)仅对图像编码器进行预训练;(2)解冻所有参数(包括 LLM);(3)冻结图像编码器,仅对 LLM 进行指令微调。

4.5 Pixtral 12B

Pixtral 12B(2024 年 9 月 17 日)采用了方法 A:统一嵌入-解码器架构,是 Mistral AI 发布的首个多模态模型。遗憾的是,目前并没有对应的技术论文或报告,不过 Mistral 团队在其博客文章中分享了一些有意思的细节。

值得注意的是,他们并未使用预训练的图像编码器,而是从零开始训练了一个拥有 4 亿参数的图像编码器。语言模型骨干则选用了 120 亿参数的 Mistral NeMo 模型。

与 Qwen2-VL 类似,Pixtral 也原生支持可变尺寸的图像输入,如下图所示。

Pixtral 处理不同尺寸图像的方式示意图。(注释图来自 Pixtral 博客文章:https://mistral.ai/news/pixtral-12b/)

4.6 MM1.5:来自多模态 LLM 微调的技术、分析与洞见

《MM1.5: Methods, Analysis & Insights from Multimodal LLM Fine-tuning》论文(2024 年 9 月 30 日)提供了大量实践层面的经验总结,并介绍了一种混合专家(Mixture-of-Experts)多模态模型,以及一个类似 Molmo 的稠密模型。这些模型的参数规模跨度很大,从 10 亿到 300 亿不等。

该论文中的模型主要聚焦于方法 A,即统一嵌入 Transformer 架构,该架构能够有效地对多模态输入进行组织。

此外,论文还包含了一系列有趣的消融实验,重点分析了数据混合策略以及坐标 token 的使用效果。

MM1.5 方法示意图,其中引入了额外的坐标 token 来表示边界框。(注释图来自 MM1.5 论文:https://arxiv.org/abs/2409.20566)

4.7 Aria:一种开放的多模态原生混合专家模型

《Aria: An Open Multimodal Native Mixture-of-Experts Model》论文(2024 年 10 月 8 日)提出了另一种混合专家模型方案,与 Molmo 和 MM1.5 中的一些变体较为相似。

Aria 模型总参数规模为 249 亿,其中每个文本 token 分配 35 亿参数。其图像编码器采用的是 SigLIP,参数规模为 4.38 亿。

该模型基于跨注意力方法,并采用了如下总体训练流程:

  • • 从零开始完整训练 LLM 骨干模型。
  • • 同时对 LLM 骨干与视觉编码器进行预训练。

4.8 Baichuan-Omni

《Baichuan-Omni Technical Report》(2024 年 10 月 11 日)介绍了 Baichuan-Omni,这是一款 70 亿参数的多模态 LLM,基于方法 A:统一嵌入-解码器架构,其整体结构如下图所示。

Baichuan-Omni 模型的整体概览,该模型能够处理多种输入模态。(注释图来自 Baichuan-Omni 论文:https://arxiv.org/abs/2410.08565)

Baichuan-Omni 的训练流程分为三个阶段:

  1. 1. 投影器训练阶段:仅训练投影器,同时冻结视觉编码器与语言模型(LLM)。
  2. 2. 视觉编码器训练阶段:解冻视觉编码器并进行训练,同时保持 LLM 冻结。
  3. 3. 完整模型训练阶段:解冻 LLM,使整个模型能够端到端联合训练。

该模型使用 SigLIP 作为视觉编码器,并引入 AnyRes 模块,通过下采样技术来处理高分辨率图像。

尽管技术报告中并未明确说明 LLM 的具体骨干模型,但结合参数规模与命名方式推断,其很可能基于 Baichuan 7B LLM。

4.9 Emu3:下一 token 预测就是你所需要的一切

《Emu3: Next-Token Prediction is All You Need》论文(2024 年 9 月 27 日)提出了一种颇具吸引力的图像生成方案,作为扩散模型的替代方法,其完全基于 Transformer 解码器架构。尽管它并非传统意义上的多模态 LLM(即主要关注图像理解的模型),但 Emu3 依然非常有意思,因为它表明 Transformer 解码器同样可以胜任长期由扩散模型主导的图像生成任务。(当然,在此之前也已有类似工作,例如《Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation》。)

Emu3 主要是一种用于图像生成的 LLM,可作为扩散模型的替代方案。(注释图来自 Emu3 论文:https://arxiv.org/abs/2409.18869)

研究人员从零开始训练了 Emu3,随后使用直接偏好优化(Direct Preference Optimization,DPO)对模型进行对齐,以匹配人类偏好。

其架构中包含一个受 SBER-MoVQGAN 启发的视觉 tokenizer。核心 LLM 架构基于 Llama 2,但完全是从头训练的。

4.10 Janus:通过解耦视觉编码实现统一的多模态理解与生成

在前文中,我们主要聚焦于用于图像理解的多模态 LLM,并在 Emu3 中看到了一个图像生成的例子。接下来,《Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation》论文(2024 年 10 月 17 日)提出了一个在单一 LLM 骨干内同时统一多模态理解与生成任务的框架。

Janus 的一个关键特征是对视觉编码路径进行解耦,以满足理解任务与生成任务在表示层面的不同需求。研究人员指出,图像理解任务需要高维的语义表示,而图像生成任务则需要细粒度的局部信息与整体一致性。通过分离这两条路径,Janus 能够更有效地应对这些差异化需求。

该模型在视觉输入处理上采用了 SigLIP 编码器,与 Baichuan-Omni 中使用的方案相同;在图像生成方面,则使用了向量量化(VQ)tokenizer。Janus 的基础 LLM 是参数规模为 13 亿的 DeepSeek-LLM。

Janus 所采用的统一仅解码器框架概览。(注释图来自 Janus 论文:https://arxiv.org/abs/2410.13848)

该模型的训练流程分为三个阶段,如下图所示。

Janus 模型的三阶段训练流程示意图。(注释图来自 Janus 论文:https://arxiv.org/abs/2410.13848)

在阶段一中,仅训练投影器层与图像输出层,同时冻结 LLM、理解编码器与生成编码器。在阶段二中,解冻 LLM 骨干与文本输出层,从而在理解与生成任务上进行统一预训练。最后,在阶段三中,解冻包括 SigLIP 图像编码器在内的整个模型,并进行有监督微调,使模型能够充分整合并细化其多模态能力。

结论

你可能已经注意到,我几乎完全跳过了对模型性能与计算性能的系统性比较。首先,由于公开基准测试中普遍存在数据污染问题(即测试数据可能已被包含在训练数据中),对 LLM 与多模态 LLM 的性能进行客观比较本身就极具挑战。

此外,各模型在架构组件上的差异也非常大,使得进行真正意义上的“同类对比”变得十分困难。因此,必须特别称赞 NVIDIA 团队提出的 NVLM 不同变体,至少在仅解码器与交叉注意力方法之间实现了可比性分析。

无论如何,本文最核心的结论在于:多模态 LLM 可以通过多种不同的方式成功构建。下图总结了本文中所涵盖模型的不同组件配置。

本文所涵盖各类模型的总体概览,包括其子组件与训练方法

希望你在阅读本文后能有所收获,并对多模态 LLM 的工作机制有一个更清晰的理解。


本杂志是一个个人热情驱动的项目,你的支持有助于它持续发展。

如果你愿意支持我的工作,可以考虑我的书 《Build a Large Language Model (From Scratch)》,或它的续作 《Build a Reasoning Model (From Scratch)》。(我相信你会从中收获颇多;它们以你在其他地方很难看到的深度,系统讲解了 LLM 的工作原理。)

感谢你的阅读,也感谢你对独立研究的支持。

《Build a Large Language Model (From Scratch)》现已在 Amazon 上发售;《Build a Reasoning Model (From Scratch)》目前可在 Manning 平台以 Early Access 形式获取

如果你已经阅读了这本书,并且有几分钟时间,我将非常感激你能留下一个 简短的评价。这对我们作者来说帮助非常大。

https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167

你的支持意义重大!谢谢你!

https://magazine.sebastianraschka.com/p/understanding-multimodal-llms

如果觉得内容不错,欢迎你点一下「在看」,或是将文章分享给其他有需要的人^^

相关好文推荐:

这是最好的时代,也是最坏的时代

理解推理型 LLM | Sebastian Raschka

理解用于评估大语言模型(LLM)的四种主要方法 | Sebastian Raschka

从 DeepSeek V3 到 Mistral 3 Large:现代大语言模型(LLM)架构设计概览(三)| Sebastian Raschka

从 DeepSeek V3 到 Mistral 3 Large:现代大语言模型(LLM)架构设计概览(二)| Sebastian Raschka

从 DeepSeek V3 到 Mistral 3 Large:现代大语言模型(LLM)架构设计概览(一)| Sebastian Raschka

Agent 设计模式 | Lance

递归语言模型(Recursive Language Models) | Alex Zhang

重新构想 LLM 记忆:将上下文作为训练数据,使模型能够在测试时学习 | Nvidia

Manus 中的上下文工程 | Lance

引入嵌套学习(Nested Learning):一种用于持续学习的全新机器学习范式

如何构建多智能体研究系统

真正决定 AI 系统上限的是什么?

软件 2.0 | karpathy

2025年 LLM 年度回顾 | karpathy

苦涩的教训

0条留言

留言