大数跨境
0
0

理解多模态大语言模型(一)

理解多模态大语言模型(一) AI算法之道
2025-03-20
7
导读:多模态大模型技术讲解
  • 点击蓝字
    关注我们










    01


    引言



本文旨在阐述多模态大语言模型(Multimodal LLMs)的工作原理。同时,后续将系统梳理并总结近期发布的十余篇多模态领域最新论文及模型,通过横向对比解析其技术路径差异。

多模态LLM可以接受不同模态的输入 (audio, text, images, and videos) 将 text作为输出的模态。






02

多模态大语言模型的应用场景

何谓多模态大语言模型?正如引言所提示的,多模态大语言模型是能够处理多种输入类型的大语言模型。此处"模态"特指数据的特定形式——例如文本(传统大语言模型的输入形式)、声音、图像、视频等。为简化讨论,本文将聚焦于图像与文本的同时处理。

多模态大语言模型的经典直观应用是图像描述生成:用户输入一张图片,模型即可输出对图像的文本描述。
当然,其应用场景远不止于此。例如,日常中经常使用的一个应用案例是:从PDF表格中提取结构化信息,并精准转换为LaTeX或Markdown格式。





03


多模态大语言模型的构建方案

当前,构建多模态大语言模型的模型结构有如下两套方案:
A. 统一嵌入解码器架构方法;
B. 跨模态交叉注意力架构方法。
如上图所示,统一嵌入的解码器架构采用单一解码器模型,其结构类似于未经修改的大语言模型架构(如GPT-2或Llama 3.2)。在该方法中,图像会被转换为与原始文本标记(tokens)具有相同嵌入维度的图像标记(tokens),使得大语言模型能够将文本输入标记和图像输入标记拼接(concat)后共同处理。
此外,跨模态交叉注意力架构则通过交叉注意力机制(cross-attention),直接在注意力层中实现图像嵌入与文本嵌入的深度融合。
在接下来的章节中,我们将首先从概念层面探讨这些方法的工作原理,然后通过分析近期关于多模态大语言模型的论文,了解这些架构在实践中的具体应用方式。





04


方案A: 统一嵌入解码器架构方案

让我们从统一嵌入解码器架构开始,其结构如下图所示
统一嵌入解码器架构示意图:采用未经修改的解码器大语言模型(如 GPT-2、Phi-3、Gemma 或 Llama 3.2),其输入包含图像标记和文本标记的嵌入向量。
在该架构中,图像会被转换为嵌入向量(embedding vectors),其处理方式类似于纯文本大语言模型中将输入文本转换为嵌入向量的过程。
对于典型的纯文本大语言模型,文本输入通常会经历标记(token)化处理(例如使用字节对编码),随后通过嵌入层转换为嵌入向量,如下图所示。

标准文本处理流程示意图:展示文本经过标记化处理并转换为标记嵌入向量后,在训练和推理阶段输入大语言模型的常规流程。





05
组件一:理解Image Encoders

类似于文本的标记化(tokenization)与嵌入(embedding)过程,图像嵌入通过图像编码器模块(image encoder module)生成,如下图所示。

像编码器将输入图像生成图像块嵌入的流程示意图。


上文提到的图像编码器内部是如何工作的?在处理图像时,我们首先将图像划分为较小的图像块(类似于文本标记化中将词语切分为子词的操作)。随后,这些图像块会通过一个预训练的视觉转换器(ViT)进行编码,如下图所示。

经典视觉Transformer(ViT)架构示意图


注意:由于ViT通常用于分类任务,上图中包含了分类头(classification head)。但在本文场景中,我们仅需要图像编码器部分。







06
组件二:线性投影层的用途

上图中展示的线性投影层由一个单独的线性层(即全连接层)构成。该层的作用是将展平为向量的图像块投影到与Transformer解码器兼容的嵌入维度。如下图所示,这种线性投影的具体表现为:一个被展平为256维向量的图像块,通过上投影操作被映射到768维的向量空间。
对于更倾向于查看代码示例的读者,我们可以通过如下PyTorch代码实现图像块的线性投影:
import torchclass 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 = 1num_patches = 9 # Total patches per imagepatch_size = 16 # 16x16 pixels per patchnum_channels = 3 # RGB imageembedding_dim = 768 # Size of the embedding vectorprojection_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])






07
文本嵌入 VS 图像嵌入

在简要讨论了图像编码器(以及作为编码器组成部分的线性投影层)之后,让我们回到之前提到的文本Token化的类比,并如下图所示,将文本与图像的分词及嵌入过程进行直观对比。
正如上图所示,我们在图像编码器之后添加了一个额外的投影模块。这个投影模块通常只是一个额外的线性投影层,其结构与之前介绍的线性投影层类似。其作用是将图像编码器的输出投影到与嵌入文本标记相匹配的维度空间,如下图所示。(值得注意的是,这个投影模块在不同文献中有时也会被称为适配器(adapter)或连接器(adaptor)。

投影器的作用在于使图像标记的嵌入维度与文本标记的嵌入维度相匹配


现在,由于图像块嵌入与文本标记嵌入具有相同的维度,我们可以直接将它们拼接起来作为大语言模型(LLM)的输入,如本节开头处的图示所示。为方便查阅,下方再次展示了同一图示。

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


值得一提的是,本节讨论的图像编码器通常是预训练的视觉Transformer(Vision Transformer)。常用的选择是CLIP或OpenCLIP。不过,也存在直接处理图像块的Method A的变体,例如下图所示的Fuyu模型。

无需图像编码器的Fuyu多模态大语言模型示意图


如上图所示,Fuyu直接将输入图像块输入线性投影层(或嵌入层)来学习自身的图像块嵌入表征,而非像其他模型和方法那样依赖额外的预训练图像编码器。这种做法极大简化了模型架构和训练配置。






08
方案B: 跨模态交叉注意力架构方案

在讨论了基于统一嵌入解码器架构构建多模态大语言模型的方法,并理解了图像编码器的基本原理后,下面我们将探讨另一种基于交叉注意力机制实现多模态大语言模型的替代方案,如下图所示。

建多模态大语言模型的跨模态交叉注意力架构方法示意图。


在上图所示的跨模态交叉注意力架构(Cross-Modality Attention Architecture)方法中,我们仍沿用先前讨论的相同图像编码器配置。然而,不同于将图像块直接编码为大型语言模型(LLM)的输入,我们通过跨模态交叉注意力机制在多头注意力层中建立图像块与文本输入之间的连接。

这一思路与2017年《Attention Is All You Need》提出的原始Transformer架构一脉相承(如下图所示),其核心是通过交叉注意力机制实现不同模态或序列位置间的动态交互。

原始Transformer论文中交叉注意力机制示意图


需要注意的是,上图中展示的原始论文《Attention Is All You Need》中Transformer的结构,该结构最初是为机器翻译任务设计的。其架构包含一个文本编码器(图中左侧部分)——负责接收待翻译的句子,以及一个文本解码器(图中右侧部分)——负责生成翻译结果。而在多模态大语言模型(Multimodal LLM)的语境下,编码器被替换为图像编码器,但其核心设计思想一脉相承。
交叉注意力如何运作? 让我们通过常规自注意力机制的内部示意图(见下图)来理解其基本原理。在自注意力中,每个输入元素(如单词)会通过Query、Key、Value向量与其他元素建立关联;而在交叉注意力中,这种关联将跨越不同模态——例如图像块的Key/Value矩阵与文本的Query矩阵进行交互,从而实现视觉特征与语言特征的动态对齐与信息融合。

常规注意力机制示意图


在上图中,x 是输入,Wq 是用于生成查询向量(Q)的权重矩阵。类似地,K 表示Key向量,V 表示Value向量。A 是注意力分数矩阵,Z 则是将输入(x)转换为输出上下文向量的结果。
交叉注意力机制(cross-attention)与自注意力机制(self-attention)不同,我们涉及两个不同的输入源,如下图所示:

交叉注意力机制示意图


如上两图所示,在自注意力机制(Self-Attention)中,我们处理的是同一输入序列;而在交叉注意力机制(Cross-Attention)中,我们混合或组合了两个不同的输入序列。

在原始 Transformer 架构(出自论文 Attention Is All You Need)中,两个输入 x1 和 x2 分别对应左侧编码器模块的输出(x2)和右侧解码器部分正在处理的输入序列(x1)。在多模态大模型(Multimodal LLM)的上下文中,x2 通常是图像编码器的输出(例如,文本生成时融合图像特征)。

在交叉注意力中,查询(Queries)通常来自解码器,而键(Keys)和值(Values)来自编码器 

需要注意的是,交叉注意力中的两个输入序列 x1 和 x2 的元素数量可以不同,但它们的嵌入维度(Embedding Dimensions)必须匹配。若将 x1 = x2,则交叉注意力机制退化为自注意力机制 。





09
训练流程

在讨论了两种主要的多模态设计方法后,我们简要总结下图所示的多模态大模型(Multimodal LLM)训练流程中的三个核心组件及其训练策略。

多模态LLM中三个不同的组件


与传统纯文本大语言模型(Text-only LLM)类似,多模态大模型的训练也分为两个阶段:预训练(Pretraining)和指令微调(Instruction Finetuning)。不同之处在于,多模态大模型的训练通常以预训练且经过指令微调的纯文本大模型(如GPT、LLaMA等)作为基础模型,而非从头开始训练。

对于图像编码器,通常采用预训练的CLIP模型,并在整个训练过程中保持冻结状态(但也有例外情况,后文将展开讨论)。在预训练阶段,语言模型(LLM)部分通常也被冻结,仅训练投影器(Projector)——一个线性层或小型多层感知机(MLP)。由于投影器的学习能力有限(通常仅1-2层),在多模态指令微调阶段(第二阶段),LLM部分通常会被解冻以进行更全面的参数更新。然而,在基于跨模态交叉注意力架构(Method B)的模型中,跨模态交叉注意力层在整个训练过程中始终处于可训练状态。

在引入两种主要方法(Method A:统一嵌入解码器架构与Method B:跨模态交叉注意力架构)后,您可能想知道哪种方法更优。

答案取决于具体的权衡取舍。统一嵌入解码器架构(Method A)通常更易于实现,因为它无需对LLM的原始架构进行任何修改 。跨模态注意力架构(Method B)则常被认为具有更高的计算效率,因为它不会在输入上下文中引入额外的图像标记(tokens),而是通过跨模态交叉注意力层动态融合图像特征,从而避免输入序列长度爆炸 。此外,若在训练中保持LLM参数冻结,此方法还能保留原始LLM的纯文本任务性能(如文本生成质量不受干扰) 。





至此,我们对多模态大语言模型的基础介绍告一段落。尽管内容已远超最初计划,但为了提供实践视角,后续文章将通过近期研究论文的案例分析,进一步探讨这些方法的具体应用。


点击上方小卡片关注我




添加个人微信,进专属粉丝群!





【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读436
粉丝0
内容573