原文地址:Understanding Multimodal LLMs,by Sebastian Raschka, on 2024-11-03
理解多模态大语言模型:主流技术与最新模型导论
这两个月的发展可谓突飞猛进。人工智能研究领域再次涌现出大量成果,两项诺贝尔奖授予了AI相关方向,同时还有多篇颇具价值的研究论文相继发表。
其中,Meta AI发布了最新的Llama 3.2系列模型,包含10亿和30亿参数的开源权重大语言模型,以及两款多模态模型。
在本文中,我将讲解多模态大语言模型的工作原理。此外,我还会梳理并总结近几周发布的十余篇最新多模态相关论文与模型(包括Llama 3.2),对比它们的技术路线。
(如需查看目录菜单,请点击左侧的横线图标。)

多模态大语言模型示意图:可接收音频、文本、图像、视频等多种输入模态,输出文本模态结果。
不过在开始之前,我还有一则个人的好消息要和大家分享!我的新书《Build A Large Language Model (From Scratch)》终于在亚马逊上架了:
https://amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167

https://amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167 现已登陆亚马逊
撰写这本书付出了巨大的心血,过去两年里收到的所有支持与正向反馈都让我无比感激——尤其是最近这几个月,很多热心读者都分享了他们的阅读感受。谢谢大家,作为作者,没有什么比得知这本书能对大家的职业生涯产生帮助更让人振奋的了!
对于已经读完本书、期待更多内容的读者,请保持关注!接下来几个月我会在GitHub仓库中补充一些附赠内容。
附:如果你已经读过这本书,恳请你能在亚马逊留下一条评价:https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167/ ;这对我们作者来说真的帮助很大!
1. 多模态大语言模型的应用场景
什么是多模态大语言模型?正如引言中所提,多模态大语言模型是能够处理多种输入类型的大语言模型,其中“模态”指的是特定的数据类型——比如传统大语言模型处理的文本,以及声音、图像、视频等等。为简化起见,本文将主要围绕图像模态与文本输入的组合展开讲解。
多模态大语言模型最经典、最直观的应用是图像描述:输入一张图片,模型生成对该图片的文字描述,如下图所示。

多模态大语言模型应用示例,来源:https://x.com/PainSci/status/1309570607458086914
当然,它的应用场景远不止于此。比如我个人很喜欢的一个用法:从PDF表格中提取信息,并转换为LaTeX或Markdown格式。
2. 构建多模态大语言模型的主流方案
构建多模态大语言模型主要有两种技术路线:
- 方案A:统一嵌入解码器架构(Unified Embedding Decoder Architecture)
- 方案B:跨模态注意力架构(Cross-modality Attention Architecture)
(顺便一提,目前这些技术似乎还没有统一的官方术语,如果大家见过其他说法欢迎告诉我。更简洁的表述可以是“纯解码器架构”和“基于交叉注意力的架构”。)

多模态大语言模型的两种主流架构方案
如上图所示,统一嵌入解码器架构仅使用单个解码器模型,和GPT-2、Llama 3.2这类原生大语言模型架构非常相似。在该方案中,图像会被转换为与原始文本token嵌入维度相同的token,拼接后一同输入大语言模型进行处理。
跨模态注意力架构则通过交叉注意力机制,在注意力层内部直接融合图像嵌入与文本嵌入。
接下来的章节,我们会从概念层面讲解这两种方案的工作原理,再结合最新的多模态大语言模型研究论文,看看它们在实际中的应用。
2.1 方案A:统一嵌入解码器架构
我们先从统一嵌入解码器架构讲起,其结构如下图所示。

统一嵌入解码器架构示意图:基于原生解码器风格大语言模型(如GPT-2、Phi-3、Gemma、Llama 3.2),输入由图像token嵌入与文本token嵌入共同组成。
在统一嵌入解码器架构中,图像会被转换为嵌入向量,其过程和纯文本大语言模型中将输入文本转换为嵌入的过程类似。
对于处理文本的典型纯文本大语言模型,文本输入通常先经过分词(比如字节对编码BPE),再通过嵌入层,如下图所示。

文本分词并转换为token嵌入向量的标准流程示意图,后续将输入大语言模型进行训练与推理。
2.1.1 图像编码器的原理
与文本的分词和嵌入过程对应,图像嵌入通过图像编码器模块生成(而非分词器),如下图所示。

图像编码为图像块嵌入的流程示意图
上图中的图像编码器内部是如何工作的?处理图像时,我们首先将图像切分为更小的块,就像分词时把单词拆分为子词一样。随后这些图像块由预训练的视觉Transformer(ViT)进行编码,如下图所示。

经典视觉Transformer(ViT)结构示意图,与2020年论文https://arxiv.org/abs/2010.11929提出的模型类似。
注意,视觉Transformer通常用于分类任务,所以上图中我画出了分类头。但在我们的场景中,只需要用到图像编码器部分。
2.1.2 线性投影模块的作用
前图中所示的“线性投影”由单个线性层(即全连接层)构成。该层的作用是将展平为向量的图像块,投影到与Transformer编码器维度兼容的嵌入空间中。线性投影的过程如下图所示:一个被展平为256维向量的图像块,被向上投影为768维向量。

线性投影层示意图:将展平后的图像块从256维投影到768维嵌入空间。
如果大家想看代码示例,在PyTorch中,我们可以这样实现图像块的线性投影:
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) # 展平每个图像块
x = self.projection(x) # 对每个展平的图像块做投影
return x
# 示例用法
batch_size = 1
num_patches = 9 # 每张图像的总块数
patch_size = 16 # 每个图像块为16×16像素
num_channels = 3 # RGB图像
embedding_dim = 768 # 嵌入向量的维度
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)
# 输出为
# torch.Size([1, 9, 768])
如果你碰巧读过我的《Machine Learning with PyTorch and Scikit-Learn》一书(https://www.amazon.com/Machine-Learning-AI-Essential-Questions/dp/1718503768/),就会知道我们可以用卷积运算替代线性层,二者在数学上是等价的。在这里这种方法非常实用,因为我们可以用两行代码同时完成图像块划分与投影:
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)
# 输出为
# torch.Size([1, 9, 768])
2.1.3 图像分词与文本分词的对比
我们已经简要讲解了图像编码器(以及其中的线性投影)的作用,现在回到之前的文本分词语义类比,将图像与文本的分词、嵌入过程做一个横向对比,如下图所示。

左侧:图像分词与嵌入;右侧:文本分词与嵌入。二者对比示意图。
如上图所示,我在图像编码器之后额外加了一个投影模块。这个投影层通常就是另一个线性投影层,和之前讲解的类似,作用是将图像编码器的输出投影到与文本token嵌入维度一致的尺寸,如下图所示。(后续我们会看到,这个投影层有时也被称作适配器、转接器或连接器。)

图像分词与文本分词的另一组对比:投影层的作用是匹配文本token的嵌入维度。
当图像块嵌入与文本token嵌入的维度一致后,我们就可以直接将它们拼接起来,作为大语言模型的输入,正如本节开头的图所示。为了方便查阅,这里再放一次该图。

将图像块token投影到与文本token嵌入相同维度后,即可直接拼接为标准大语言模型的输入。
顺便一提,本节讨论的图像编码器通常是预训练好的视觉Transformer,最常用的选择是CLIP(https://github.com/openai/CLIP)或OpenCLIP(https://github.com/mlfoundations/open_clip)。
不过,也有一些方案A的变体直接对图像块进行处理,比如Fuyu-8B(https://www.adept.ai/blog/fuyu-8b),其结构如下图所示。

Fuyu多模态大语言模型标注图:无需图像编码器,直接对图像块进行处理。(图标注来源:https://www.adept.ai/blog/fuyu-8b)
如上图所示,Fuyu将输入图像块直接输入线性投影(或嵌入层),自主学习图像块嵌入,而不像其他模型和方案那样依赖额外的预训练图像编码器。这种方式极大简化了架构与训练配置。
2.2 方案B:跨模态注意力架构
我们已经讲解了构建多模态大语言模型的统一嵌入解码器架构,理解了图像编码的基本原理。现在我们来介绍另一种实现多模态大语言模型的方案——交叉注意力,其结构概要如下图所示。

跨模态注意力架构方案示意图,用于构建多模态大语言模型。
在上图所示的跨模态注意力架构中,我们仍然使用之前讨论过的图像编码器结构。但不同的是,我们不把编码后的图像块作为大语言模型的输入,而是通过交叉注意力机制,将输入图像块连接到多头注意力层中。
这个思路由来已久,可以追溯到2017年论文《Attention Is All You Need》(https://arxiv.org/abs/1706.03762<)中提出的原始Transformer架构,如下图所示。/p>

原始Transformer架构中使用的交叉注意力机制高层示意图。(标注图来自《Attention Is All You Need》论文:https://arxiv.org/abs/1706.03762)
注意,上图中原始的Transformer最初是为机器翻译任务设计的。它由左侧的文本编码器(接收待翻译句子)和右侧的文本解码器(生成翻译结果)组成。在多模态大语言模型的场景下,编码器替换为图像编码器,但核心思路是一致的。
交叉注意力是如何工作的?我们先通过概念图看看常规自注意力机制内部的原理。

常规自注意力机制概要。(该流程展示了常规多头注意力模块中的一个注意力头。)
上图中,x是输入,Wq是用于生成查询(Q)的权重矩阵。同理,K代表键,V代表值。A是注意力得分矩阵,Z是输入(x)经过变换后得到的输出上下文向量。(如果这部分看起来难以理解,可以参考我的《Build A Large Language Model (From Scratch)》一书第3章的详细讲解:https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167/;或者也可以看我的这篇文章:https://magazine.sebastianraschka.com/p/understanding-and-coding-self-attention)
与自注意力不同,交叉注意力有两个不同的输入源,如下图所示。

交叉注意力示意图:存在x1和x2两个不同的输入
结合前两张图可以看出,在自注意力中,我们处理的是同一个输入序列;而在交叉注意力中,我们混合或组合两个不同的输入序列。
在《Attention Is All You Need》论文的原始Transformer架构中,两个输入x1和x2分别对应左侧编码器模块的输出序列(x2),以及右侧解码器部分正在处理的输入序列(x1)。在多模态大语言模型的场景下,x2是图像编码器的输出。(注意,查询通常来自解码器,而键和值通常来自编码器。)
注意,在交叉注意力中,两个输入序列x1和x2的元素数量可以不同,但它们的嵌入维度必须匹配。如果令x1 = x2,就等价于自注意力。
3. 统一解码器与交叉注意力模型的训练
我们已经大致讲解了两种主要的多模态设计方案,现在简要谈谈训练过程中三大组件的处理方式,其概要如下图所示。

多模态大语言模型的不同组件概览。标注1-3的组件在多模态训练过程中可选择冻结或解冻。
与传统纯文本大语言模型的开发类似,多模态大语言模型的训练也分为两个阶段:预训练与指令微调。但与从零开始训练不同,多模态大语言模型的训练通常以一个预训练好、经过指令微调的纯文本大语言模型作为基座。
对于图像编码器,常用的是CLIP,且在整个训练过程中通常保持不变,不过也有例外,我们后面会讲到。在预训练阶段冻结大语言模型部分,只训练投影层(一个线性层或小型多层感知机)也是常见做法。由于投影层的学习能力有限(通常只有一到两层),在多模态指令微调阶段(第二阶段)通常会解冻大语言模型,以实现更全面的参数更新。但注意,在基于交叉注意力的模型(方案B)中,交叉注意力层在整个训练过程中都是解冻的。
介绍完两种主流方案(方案A:统一嵌入解码器架构;方案B:跨模态注意力架构)后,你可能会好奇哪种效果更好。答案取决于具体的权衡取舍:
- 统一嵌入解码器架构(方案A)通常更易实现,因为不需要对大语言模型架构本身做任何修改。
- 跨模态注意力架构(方案B)通常被认为计算效率更高,因为它不会用额外的图像token占用输入上下文,而是在后续的交叉注意力层中引入图像信息。此外,如果训练时冻结大语言模型参数,该方案可以保留原始大语言模型的纯文本性能。
我们会在后面的章节结合英伟达NVLM论文,继续讨论模型性能与响应质量的相关内容。
到这里,多模态大语言模型的引言部分就告一段落了。写的时候我才发现这部分比最初计划的要长很多,正好可以在这里稍作收尾。
不过,为了提供更实用的视角,我们最好来分析几篇实现了这些方案的最新研究论文。接下来的章节我们就来探讨这些论文。
4. 最新多模态模型与技术进展
在本文余下部分,我将梳理多模态大语言模型的最新研究,重点关注近几周发表的工作,以控制内容的范围。
因此,这不是一份历史性综述,也不是对多模态大语言模型的全面盘点,而是对最新进展的快速概览。我会尽量精简总结,毕竟一共有10项工作。
最后的结论部分会有一张总览图,对比这些论文采用的技术方案。
4.1 Llama 3模型家族
Meta AI于2024年7月31日发表的论文(https://arxiv.org/abs/2407.21783)早在今年夏天就已发布,按大语言模型领域的时间尺度来看,感觉已经是很久之前的事了。不过,他们当时只介绍了多模态模型,直到很晚才正式发布,所以我认为把Llama 3纳入这份清单是合理的。(Llama 3.2系列模型于9月25日正式官宣并开放使用。)
多模态版Llama 3.2包含110亿和900亿参数两个版本,属于图文模型,采用前面讲到的基于交叉注意力的方案,其结构如下图所示。

Llama 3.2采用的多模态大语言模型方案示意图。(标注图来自Llama 3论文:https://arxiv.org/abs/2407.21783。图中视频与语音部分被隐去,以聚焦图像部分。)
注意,虽然图中也画出了视频和语音作为可选模态,但截至撰写本文时,已发布的模型仅支持图像和文本。
Llama 3.2采用基于交叉注意力的方案。但和我之前讲到的常规做法有些不同——通常在多模态大语言模型开发中,我们会冻结图像编码器,只在预训练阶段更新大语言模型参数。
而这里研究人员的做法几乎相反:他们更新图像编码器,但不更新语言模型的参数。他们在论文中表示,这是有意为之,目的是保留模型的纯文本能力,使得11B和90B多模态模型可以在文本任务上作为Llama 3.1 8B和70B纯文本模型的直接替代品。
训练本身分多轮进行,从Llama 3.1文本模型开始。加入图像编码器和投影层(这里称为“适配器”层)后,先在图文数据上进行预训练。随后,和Llama 3纯文本模型的训练流程类似(我在这篇文章中讲过:https://magazine.sebastianraschka.com/i/147749119/llama-overview),再进行指令微调和偏好微调。
研究人员没有采用CLIP这类预训练模型作为图像编码器,而是从零开始预训练了一个视觉Transformer。具体来说,他们采用了经典视觉Transformer架构的ViT-H/14变体(6.3亿参数)(参考论文:https://arxiv.org/abs/2010.11929),并在25亿对图文数据上预训练了5个epoch;这一步是在将图像编码器接入大语言模型之前完成的。(该图像编码器接收224×224分辨率的图像,将其划分为14×14的图像块网格,每个块大小为16×16像素。)
由于交叉注意力层会引入大量参数,因此它们仅在每四个Transformer块中添加一层。(对于8B模型,这会增加30亿参数;对于70B模型,则增加200亿参数。)
4.2 Molmo与PixMo:开源权重与开源数据打造的顶尖多模态模型
2024年9月25日的论文(https://www.arxiv.org/abs/2409.17146)值得关注,因为它承诺不仅开源模型权重,还开源数据集与源代码,和纯文本领域的OLMo大语言模型类似。(这对大语言模型研究意义重大,让我们可以查看完整的训练流程与代码,也能在相同数据集上做消融实验、复现结果。)
如果你好奇标题里为什么有两个名字:Molmo指的是模型本身(Multimodal Open Language Model,多模态开放语言模型),而PixMo(Pixels for Molmo)是配套的数据集。

Molmo的纯解码器方案(方案A)示意图。标注图改编自《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简化了训练流程,没有采用多阶段预训练,而是选择了一套统一的流水线,同时更新所有参数——包括基座大语言模型、连接器和图像编码器的参数。
Molmo团队提供了多种基座大语言模型可选:
- OLMo-7B-1024(完全开源的模型基座)
- OLMoE-1B-7B(混合专家架构,效率最高的模型)
- Qwen2 7B(开源权重模型,性能优于OLMo-7B-1024)
- Qwen2 72B(开源权重模型,性能最佳)
4.3 NVLM:开源旗舰级多模态大语言模型
英伟达2024年9月17日的论文(https://arxiv.org/abs/2409.11402)格外有意思,因为它没有只聚焦于单一方案,而是探索了两种路线:
- 方案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)的设计理念是结合两者的优势:输入一张图像缩略图,再通过交叉注意力传入动态数量的图像块,以捕捉更精细的高分辨率细节。
简而言之,研究团队发现:
- NVLM-X在处理高分辨率图像时计算效率更出色。
- NVLM-D在OCR相关任务中准确率更高。
- NVLM-H融合了两种方法的优点。
和Molmo等方案类似,他们也以纯文本大语言模型为起点,而非从零预训练多模态模型(因为这样通常效果更好)。此外,他们使用的是经过指令微调的大语言模型,而非基础基座模型。具体来说,基座大语言模型是Qwen2-72B-Instruct(据我所知,Molmo使用的是Qwen2-72B基础版模型)。
在NVLM-D方案中,研究人员训练了所有大语言模型参数;而对于NVLM-X,他们发现在预训练和指令微调阶段,冻结原始大语言模型参数、只训练交叉注意力层就可以取得很好的效果。
图像编码器方面,他们没有使用典型的CLIP模型,而是采用了InternVL(https://arxiv.org/abs/2312.14238),且在所有阶段都保持冻结。
投影层采用多层感知机,而非单个线性层。
4.4 Qwen2-VL:以任意分辨率增强视觉语言模型的世界感知能力
前两篇论文与模型(Molmo和NVLM)都基于Qwen2-72B大语言模型。而在这篇论文中,通义千问研究团队推出了自己的多模态大语言模型Qwen2-VL,论文发表于2024年10月3日(https://arxiv.org/abs/2409.12191)。
这项工作的核心是所谓的“朴素动态分辨率(Naive Dynamic Resolution)”机制(“naive”是刻意使用的词,并非“native”的笔误,不过“原生”的含义也同样贴切)。该机制让模型能够处理不同分辨率的图像,而无需简单下采样,支持以原始分辨率输入图像。

通义千问多模态模型概览:可原生处理多种不同分辨率的输入图像。(标注图来自《Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution》论文:https://arxiv.org/abs/2409.12191)
原生分辨率输入的实现方式是对经典ViT进行修改:移除原始的绝对位置嵌入,引入二维旋转位置编码(2D-RoPE)。
他们采用了参数量为6.75亿的经典视觉编码器,以及不同尺寸的大语言模型基座,如下表所示。

不同尺寸Qwen2-VL模型的组件构成。(标注图来自《Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution》论文:https://arxiv.org/abs/2409.12191)
训练本身分为3个阶段:(1)仅预训练图像编码器;(2)解冻所有参数(包括大语言模型);(3)冻结图像编码器,仅对大语言模型进行指令微调。
4.5 Pixtral 12B
Mistral AI于2024年9月17日发布的Pixtral 12B(https://mistral.ai/news/pixtral-12b/)采用方案A:统一嵌入解码器架构,是Mistral AI的首款多模态模型。遗憾的是目前没有相关技术论文或报告,但Mistral团队在官方博客中分享了几个值得关注的细节:https://mistral.ai/news/pixtral-12b/。
有意思的是,他们没有使用预训练的图像编码器,而是从零训练了一个4亿参数的图像编码器。大语言模型基座则采用120亿参数的Mistral Nemo模型(https://mistral.ai/news/mistral-nemo/)。
和Qwen2-VL类似,Pixtral也原生支持可变尺寸图像输入,如下图所示。

Pixtral处理不同尺寸图像的方式示意图。(标注图来自Pixtral官方博客:https://mistral.ai/news/pixtral-12b/)
4.6 MM1.5:多模态大语言模型微调的方法、分析与洞见
2024年9月30日的论文(https://arxiv.org/abs/2409.20566)提供了实用的训练技巧,并推出了混合专家架构的多模态模型,以及一款和Molmo类似的稠密模型。模型尺寸覆盖广泛,从10亿到300亿参数不等。
该论文中的模型聚焦于方案A:统一嵌入Transformer架构,该架构能有效组织输入,适配多模态学习。
此外,论文还做了一系列有意思的消融实验,探究了数据混合比例以及使用坐标token的效果。

MM1.5方案示意图:加入了额外的坐标token来表示边界框。(标注图来自《MM1.5: Methods, Analysis & Insights from Multimodal LLM Fine-tuning》论文:https://arxiv.org/abs/2409.20566)
4.7 Aria:开源多模态原生混合专家模型
2024年10月8日的论文(https://arxiv.org/abs/2410.05993)提出了另一种混合专家模型方案,和Molmo、MM1.5系列中的某个变体类似。
Aria模型总参数量为249亿,其中每个文本token激活35亿参数。图像编码器(基于SigLIP,https://arxiv.org/abs/2303.15343)有4.38亿参数。
该模型基于交叉注意力方案,整体训练流程如下:
- 从零开始完整训练大语言模型基座。
- 同时预训练大语言模型基座与视觉编码器。
4.8 百川-Omni
2024年10月11日的论文(https://arxiv.org/abs/2410.08565)推出了百川-Omni,一款70亿参数的多模态大语言模型,采用方案A:统一嵌入解码器架构,如下图所示。

百川-Omni模型概览:可处理多种输入模态。(标注图来自《Baichuan-Omni Technical Report》论文:https://arxiv.org/abs/2410.08565)
百川-Omni的训练过程分为三阶段:
- 投影层训练:初始阶段只训练投影层,视觉编码器与大语言模型均保持冻结。
- 视觉编码器训练:随后解冻视觉编码器并进行训练,大语言模型仍保持冻结。
- 全模型训练:最后解冻大语言模型,实现端到端的完整训练。
该模型采用SigLIP视觉编码器,并集成了任意分辨率训练模块(https://arxiv.org/abs/2204.07156),通过下采样技术处理高分辨率图像。
虽然报告没有明确说明大语言模型基座,但从模型参数量和命名规则来看,很可能基于百川7B大语言模型。
4.9 Emu3:下一词预测即可解决一切问题
2024年9月27日发布的《Emu3: Next-Token Prediction is All You Need》论文,提出了一种极具竞争力的扩散模型替代方案,用于图像生成,且完全基于Transformer解码器架构。尽管严格来说它不算经典意义上的多模态大语言模型(经典多模态模型聚焦于图像理解而非生成),但Emu3的价值在于,它证明了Transformer解码器可以用于图像生成——这项任务通常由扩散方法主导。(不过需要注意,此前已经有过类似的思路,比如LlamaGen:https://arxiv.org/abs/2406.06525。)

Emu3主要是一款用于图像生成的大语言模型,可作为扩散模型的替代方案。(标注图来自《Emu3: Next-Token Prediction is All You Need》论文:https://arxiv.org/abs/2409.18869)
研究人员从零开始训练Emu3,随后使用直接偏好优化(DPO,代码参考:https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/04_preference-tuning-with-dpo/dpo-from-scratch.ipynb)让模型对齐人类偏好。
其架构包含一个受VQGAN启发的视觉分词器(参考论文:https://arxiv.org/abs/2209.09002)。核心大语言模型架构基于Llama 2,但完全从零训练。
4.10 Janus:解耦视觉编码,实现统一的多模态理解与生成
前面我们主要关注的是面向图像理解的多模态大语言模型,刚才的Emu3则是图像生成的例子。而2024年10月17日的论文(https://arxiv.org/abs/2410.13848)提出了一个在单个大语言模型基座中统一多模态理解与生成任务的框架。
Janus的核心特性是解耦视觉编码路径,以适配理解与生成两类任务的不同需求。研究人员认为,图像理解任务需要高维度的语义表示,而生成任务需要精细的局部信息与全局图像一致性。通过分离这两条路径,Janus可以高效满足不同的需求。
该模型采用与百川-Omni类似的SigLIP视觉编码器处理视觉输入;对于图像生成,则使用LlamaGen分词器(https://arxiv.org/abs/2406.06525)处理生成过程。Janus的基座大语言模型是DeepSeek LLM 1.3B(https://arxiv.org/abs/2401.02954)。

Janus采用的统一纯解码器框架概览。(标注图来自《Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation》论文:https://arxiv.org/abs/2410.13848。)
该模型的训练过程分为三个阶段,如下图所示。

Janus模型三阶段训练流程示意图。(标注图来自《Janus: Decoupling Visual Encoding for Unified Multimodal Understanding and Generation》论文:https://arxiv.org/abs/2410.13848)
- 第一阶段:只训练投影层与图像输出层,大语言模型、理解编码器与生成编码器均保持冻结。
- 第二阶段:解冻大语言模型基座与文本输出层,实现理解与生成任务的统一预训练。
- 第三阶段:解冻整个模型,包括SigLIP图像编码器,进行监督微调,让模型全面整合并优化其多模态能力。
结论
大家可能已经注意到,我几乎完全没有提及模型效果与计算性能的对比。首先,由于普遍存在的数据污染问题(即测试数据可能被包含在训练数据中),在公开基准上对比大语言模型与多模态大语言模型的性能本身就存在挑战。
此外,不同模型的架构组件差异极大,很难做到公平的横向对比。因此,要为英伟达团队点赞,他们开发了不同版本的NVLM,至少让我们可以对比纯解码器与交叉注意力两种方案的差异。
总而言之,本文的核心结论是:多模态大语言模型的成功构建有很多种不同的技术路径。下图总结了本文涉及的各模型的不同组件与训练方案。

本文涉及的不同模型及其子组件、训练方案概览
希望本文的讲解对你有帮助,让你对多模态大语言模型的工作原理有了更清晰的理解!
本杂志是一项个人兴趣项目。如果您愿意支持我的创作,可以考虑购买我的新书:https://amzn.to/4fqvn0D。(我相信这本书会让你收获满满,因为它对大语言模型工作原理的讲解深度是其他地方找不到的。)
现已登陆亚马逊
如果你读过这本书,并且能抽出几分钟时间,我非常希望你能在亚马逊留下评价:https://www.amazon.com/Build-Large-Language-Model-Scratch/dp/1633437167 。这对我们作者来说帮助非常大!
另外,我最近也在Substack上开通了付费订阅选项,可以直接支持本杂志的创作。
你的支持意义重大!谢谢大家!