-
点击蓝字 关注我们
01
引言
本文旨在阐述多模态大语言模型(Multimodal LLMs)的工作原理。同时,后续将系统梳理并总结近期发布的十余篇多模态领域最新论文及模型,通过横向对比解析其技术路径差异。
多模态LLM可以接受不同模态的输入 (audio, text, images, and videos) 将 text作为输出的模态。
02
何谓多模态大语言模型?正如引言所提示的,多模态大语言模型是能够处理多种输入类型的大语言模型。此处"模态"特指数据的特定形式——例如文本(传统大语言模型的输入形式)、声音、图像、视频等。为简化讨论,本文将聚焦于图像与文本的同时处理。
03
04
标准文本处理流程示意图:展示文本经过标记化处理并转换为标记嵌入向量后,在训练和推理阶段输入大语言模型的常规流程。
类似于文本的标记化(tokenization)与嵌入(embedding)过程,图像嵌入通过图像编码器模块(image encoder module)生成,如下图所示。
图像编码器将输入图像生成图像块嵌入的流程示意图。
经典视觉Transformer(ViT)架构示意图
注意:由于ViT通常用于分类任务,上图中包含了分类头(classification head)。但在本文场景中,我们仅需要图像编码器部分。
上图中展示的线性投影层由一个单独的线性层(即全连接层)构成。该层的作用是将展平为向量的图像块投影到与Transformer解码器兼容的嵌入维度。如下图所示,这种线性投影的具体表现为:一个被展平为256维向量的图像块,通过上投影操作被映射到768维的向量空间。
import torchclass PatchProjectionLayer(torch.nn.Module):def __init__(self, patch_size, num_channels, embedding_dim):super().__init__()self.patch_size = patch_sizeself.num_channels = num_channelsself.embedding_dim = embedding_dimself.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 patchx = self.projection(x) # Project each flattened patchreturn 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])
在简要讨论了图像编码器(以及作为编码器组成部分的线性投影层)之后,让我们回到之前提到的文本Token化的类比,并如下图所示,将文本与图像的分词及嵌入过程进行直观对比。
投影器的作用在于使图像标记的嵌入维度与文本标记的嵌入维度相匹配
在将图像块标记嵌入投影到与文本标记嵌入相同的维度后,我们可以直接将它们拼接起来作为标准LLM的输入。
无需图像编码器的Fuyu多模态大语言模型示意图
在讨论了基于统一嵌入解码器架构构建多模态大语言模型的方法,并理解了图像编码器的基本原理后,下面我们将探讨另一种基于交叉注意力机制实现多模态大语言模型的替代方案,如下图所示。
构建多模态大语言模型的跨模态交叉注意力架构方法示意图。
原始Transformer论文中交叉注意力机制示意图
常规注意力机制示意图
交叉注意力机制示意图
如上两图所示,在自注意力机制(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,则交叉注意力机制退化为自注意力机制 。
在讨论了两种主要的多模态设计方法后,我们简要总结下图所示的多模态大模型(Multimodal LLM)训练流程中的三个核心组件及其训练策略。
多模态LLM中三个不同的组件
在引入两种主要方法(Method A:统一嵌入解码器架构与Method B:跨模态交叉注意力架构)后,您可能想知道哪种方法更优。
点击上方小卡片关注我
添加个人微信,进专属粉丝群!

