GPT-4o热潮来袭:探索图生文本的奥秘(多模态大模型系列之一) 原创 精华
我在专栏[大语言模型的技术原理和应用]中介绍了大语言模型(LLM)原理和应用,LLM对语言建模,输入输出都是文本,属于单模态模型。
LLM的出现让人们看到了AGI的希望,但要实现AGI,就要让机器像人类一样实现多种感官协作,所以多模态是AGI必经之路。从今天开始我们将进入多模态领域。openAI刚刚发布的GPT-4o就是一种多模态大模型。
一、初识多模态大模型
1.1多模态大模型定义
所谓“多模态”简单来讲就是模型能够处理多种数据模态,例如,文本、图像、视频、音频等。
因为视频是由多帧图像组成,音频转化为频谱图后也可以看作是一种特殊的图像,所以多模态主要关注图像和文本这两种数据模态。
*openAI的文生视频模型Sora,则是将图像看作是一种特殊的视频*
所谓“大模型”是相对传统机器学习模型而言的,传统机器学习模型使用特定数据完成特定任务,一旦训练完成很难泛化到其它任务,大模型是在海量数据下进行预训练使其具备通用能力,然后通过微调完成某一个任务。
1.2多模态任务类型
了解完多模态大模型的定义,接下来看看多模态大模型到底能干什么。这也是学好多模态以及能够顺利读完后续内容的重要前提。
多模态任务大体可以分为理解和生成两大类。
图文检索,即给定文本或者图片,检索出与之匹配的图片或文本。本质上就是分类任务,在这个过程中没有新内容生成,只是基于输入做出判断,所以被视为理解型任务,
视觉推理、视觉问答都是图生文任务,与之对应的是文生图任务,像这种有新内容生成的则被视为生成型任务。
文生图,例如,Stable Diffusion和DALL-E,输入一段描述文字,模型输出一张图片。
图生文,例如,视觉问答,输入一张图片,再输入一个问题,模型输出答案。
除此之外,多模态还有很多应用,文生视频、Lanuguage Guided Detection、Lanuguage Guided Segmentation等等。
1.3多模态大模型在线体验
理解这些任务类型的最好方式就是亲身体验一下,这里给大家介绍几个在线体验的网址。
GPT-4o:OpenAI,受限免费
https://chatgpt.com/
Gemini 1.5 pro: Google 免费
https://aistudio.google.com/app/prompts/new_chat
腾讯混元大模型:腾讯,免费
https://hunyuan.tencent.com/bot/chat
为了测试到底哪家强?我决定考考它们,让它们分析下面图片中的四面体有几个三角形?还是有点难度的,要识别三角形,就得能识别出这是个多面体,要识别多面体,就得能区分实现和虚线的意义,并且还得排除由于图像质量引起的锯齿干扰。
下面分别是它们的回答。
目前看,还是GPT-4o略胜一筹。
二、多模态大模型结构
人脑可以同时处理多种模态输入,并且各种模态起到相互辅助理解的作用,人类大脑皮层中的不同功能区负责处理不同的信号,在多模态大模型中,处理不同的数据模态,也需要不同的模型架构。
*题外话:马斯克的脑机接口就是将极细的电极一端插入到控制行为的大脑皮层中,将收集到的信号传送给机械设备替代人类完成动作,或者跳过坏死的脊柱,将电极另一端连接到完好的脊柱上进行信号传递*
如果有图片输入,则需要有能理解图像的组件,我们称之为图像编码器;如果有文本输入,则需要有能理解文本的组件,我们称之为文本编码器;如果有图片输出,则需要有能生成图像的组件,我们称之为图像解码器;如果有文本输出,则需要有能生成文本的组件,我们称之为文本解码器。
*对于解码器,有的地方也会叫生成器*
以视觉问答为例,它是一种图生文任务,输入是图像,还会输入一个问题,输出是文本。
2.1图像编码器
图像编码器负责提取视觉表征,也就是理解图像上有什么。无论是CV中的图像分类、目标检测、图像分割,表征提取都是必要步骤,甚至可以说深度学习其实就是表征学习。
*题外话:如果你去相亲,回来后父母问你对方怎么样?你说浓眉大眼樱桃口,这就是一种外貌表征,就算只有一面之缘,过了很久再次碰到你也能瞬间认出,这是视觉提取表征后与记忆匹配了。*
能够提取图像特征的,首先想到的肯定是卷积神经网络CNN,图像经过卷积层后输出特征图,在浅层网络(靠近输入端)会提取一些具体的特征,例如边缘、角点或简单的纹理,随着层数的加深,特征会变得抽象。如物体的整体形状和结构。
在NLP中,当Transformer处理一个单词时,它会计算这个单词与其它所有词的注意力分数,而CNN只会考虑卷积核范围内的像素,即使特征图的感受野会随着层数增加越来越大,但CNN仍是局部注意力,而Transformer则是全局注意力,全局注意力能更好的提取图像特征。
随着Transformer在NLP中取得成功,有人将这种架构迁移到了CV领域,就有了ViT(Vision Transformer)。
ViT
除了模型架构,成为大模型的另一个因素是能在大规模语料上预训练,有人将NLP中的预训练方法照搬到了CV中,在NLP中,BERT在预训练时会将句子中的单词进行随机掩码,通过反向传播调整模型参数,让模型去准确预测出掩码的token,ViT则是将图像划分为patches,再对patches进行随机掩码,然后让模型去预测缺失部分,这个过程是自监督的。
但是在ViT之前,CV中使用的是另一种更常用的预训练方法,就是先在ImageNet这种大规模数据上预训练,让模型学习到一些提取基本特征的能力,然后在专用数据上进行微调。
总结一下,图像编码器通常采用ViT架构,并且采用掩码的方式预训练。
2.2文本编码器
对于VQA任务,还会输入一个问题,所以还需要文本编码器对文本进行表征提取,文本编码器通常采用Tranformer Encoder架构,因为Encoder在处理每个token时会考虑所有词,所以擅长理解任务。
对文本编码到底是什么意思?这个我在动画讲解Tranformer一,动画讲解Tranformer二中讲的很清楚了。
举个例子,“一个棕色的腊肠狗”,在进入Transformer编码器前,先转换成Tokens,假设基于词的Tokenlization,{“一个”,“棕色的”,“腊肠狗”},然后转换成词嵌入,假设词嵌入维度为2,假设采用word2vec进行初始化{(0.1,0.2),(0.3,0.4),(0.5,0.6)},经过多头注意力和MLP后输出{(0.1,0.2),(0.3,0.4),(0.48,0.56)},“腊肠狗”的词嵌入被修改了,新的词嵌入具有了棕色腊肠的含义了。这里我们假设词嵌入一个维度编码了狗的品种,第二个维度则编码了颜色。而最初那个词嵌入,也就是在这个二维空间中(0.5,0.6)这个点则表示狗。
这里我们仅使用了2维的词嵌入,GPT3的词嵌入维度是12288,12288维度空间能表达很丰富的语义信息,人类很难想象高维度空间,因为借助计算机也只能显示三维空间,对于这个例子,在12288维空间中,别说是“棕色的腊肠狗”就算是“脾气暴躁棕色的腊肠狗”,““脾气暴躁棕色皮毛蓝色眼睛的腊肠狗””等等,即使添加多个修饰词也都能在这个高维空间中找到对应的点。
*将Token转换成词嵌入,通常LLM会有一个嵌入层,也就是一个矩阵,我叫它词嵌入转换表,矩阵的高度是训练数据中所有唯一词的个数,矩阵的宽度是词嵌入维度,根据token id去查找这个表就能获取词嵌入向量了,这个表中的值在训练开始时是随机初始化的,并在训练过程中进行更新*
2.3文本解码器
VQA任务的输出也是文本,这个任务由文本解码器来完成,文本解码器通常采用Tranformer Decoder架构,因为这种自回归模型擅长文本生成,一个典型的例子就是GPT。
对于预测下一个词,一开始是用统计学的方法实现的,如果训练数据中出现“腊肠狗”的次数比较多,那么,当出现“腊肠”时,模型很可能就会预测下一个词是“狗”,这个例子是通过前面两个词预测下一个词,也可以通过前面一个词预测下一个词,这个被称为多元文法,当然也可以通过前后两个词预测中间词,当给出“腊”和“狗”时,很容易预测中间词是“肠”,你发现没,BERT和GPT的预训练方法跟这个很像啊!。
2.4多模态融合
多模态融合的目的是,让图像编码器对一幅狗的图像的编码输出和文本编码器对“一只狗”的编码输出不仅维度相同,而且在向量空间中越接近越好。否则你干你的,我干我的,就没办法将多模态融合在一起。
当获得了这只腊肠狗的图像编码后,让它分别与“一只腊肠狗”,“一只加菲猫”等的文本编码进行相似度计算,就能够实现图像分类和检索的任务。
如果将图像编码作为文本解码器交叉注意力模块的K,V,“what is in the picture?”作为文本解码器交叉注意力模块的Q,就实现了一个视觉问答任务。
而如果图像编码与“一只棕色腊肠狗在草坪上玩耍”更接近,这就实现了更深层次融合,这对于视觉问答和推理这种生成任务更友好。
2.5图像解码器
VAE,GAN,Stable Diffusion将在下一篇文章介绍。
多模态大模型的发展过程中,图像编码器,文本编码器,文本解码器比较稳定,基本上就是ViT和Transformer,主要变化的是多模态融合模块,下面就来看一下多模态发展史。
三、多模态发展史
CLIP:Learning Transferable Visual Models From Natural Language Supervision(2021)
https://arxiv.org/pdf/2103.00020
我们都知道,机器学习分为监督学习、无监督学习、强化学习。而在多模态领域,更确切地说在多模态的开山之作CLIP中又提出了一个叫做对比学习的概念,对比学习是一种自监督学习方法,也是一种特殊的无监督学习方法。
对比学习最重要的是要构造正负样本对。
拿ImageNet为例,每一张图像和它的标签就是一个正样本对,和其它标签就是负样本,一幅狗的图像和“a dog”就是正样本,从不同角度拍摄的狗的图像和“a dog”也是正样本,但和“a cat”就是负样本。
在训练过程中,CLIP通过对比学习不仅将图像和文本编码统一到一个向量空间中,而且通过对比损失函数调整模型参数,让正样本的距离拉进,同时负样本的距离疏远。
距离的衡量是通过计算向量的余弦夹角也就是向量的点乘。
那如何获取整个句子或者整个图片的编码呢?我们都知道编码器输出每个单词的词嵌入,答案是CLS token,它编码了整个句子,或者更直接的将所有词的向量加权平均。
图像编码器:ResNet或者ViT
文本编码器:Tranformer
对比学习充当了多模态融合的作用。
经过预训练后的CLIP可以直接用于zero shot分类任务,将闭集模型扩展到开集模型,将标签替换成语言。例如,ImageNet分类。给一张图像,先用图像编码器提取特征,然后构造文本a photo of{class},并用文本编码器编码,计算余弦相似度,找到相似度最大的类别。
CLIP还有一个好处是可以提前计算好图像和文本的编码并存储起来,当来一个新的图像和文本时,可以直接拿出来用,并不需要重新计算。
所以,CLIP对于图文检索任务特别友好。
但道有所能,则必有所不能,通过简单的向量点乘实现多模态融合对检索任务非常友好,但对于生成任务就有点力不从心了。
从此进入了融合能力提升时代,也就是需要一个更复杂的多模态融合模块。
ViLT:Vision-and-Language Transformer Without Convolution or Region Supervision(2021)
https://arxiv.org/pdf/2102.03334
ViLT首先在模型结构上做了改进,在ViT出现之前,图像编码器用的是CNN,具体来说是一个目标检测模型或者直接使用像ResNet这样的骨干网络提取特征,无论对于训练还是推理效率都很低。所以ViLT文本编码器和图像编码器使用简单的线性映射层。
ViLT另一大贡献是改进了CLIP的缺点,也就是强化了多模态融合模块,来增强多模态融合能力。所以,ViLT使用Transformer Encoder作为融合模块。
正是由于ViLT模型图像编码器过于简单,使其跟复杂的视觉文本编码器的模型比,效果不理想。而且实验证明,其训练过程中模型收敛的也很慢。
在损失函数上,ViLT没有使用CLIP中的ITC(Image-Text Contrast)损失函数,而是使用了ITM(Image Text Matching)损失函数和MLM(Masked Language Modeling)损失函数,还有一个Word Patch Alignment损失函数。
MLM损失函数:
对于一个Transformer Encoder模型,例如Bert,在预训练过程中会通过对序列中的token进行掩码方式进行预训练,让模型预测缺失的被掩码token,这个损失函数也是评估模型的这个能力的。
ITM损失函数:
如上图,BERT编码器有个CLS Token,这个损失函数用于判断图文匹配程度。通过最小化这个损失函数来达到融合的目的。
虽然ViLT没有达到预期,但在ViLT这篇论文中,对多模态模型也进行了经验性总结,也为后续模型发展定下了基调。也就是在模型结构上视觉编码器要比文本编码器大,而且模态融合也要强,不能只是简单的使用向量余弦夹角。
对于损失函数,ITC,ITM和MLM这三个也被认定是最有效的。
为什么视觉编码器要比文本编码器大?
文字是人造的,图像是自然的,每个词包含的语义信息要比图像的单个像素更丰富,你可以做个实验,你把文本和图像都做随机遮挡,把图像遮挡80%仍可分析图像中的是什么,但文本就做不到了。
从此之后,多模态大模型朝着大一统的方向发展。
模型结构上的统一,例如,都使用无论视觉编码器,文本编码器还是多模态融合编码器,都统一使用Transformer架构。
任务上的统一,用同一个模型完成理解和生成任务,图文检索,分类,VR,VE,VQA等。
ALBEF:Align before Fuse: Vision and Languag Representation Learning with Momentum Distillation(2021)
https://arxiv.org/pdf/2107.07651
ALBEF模型符合我们在ViLT中对一个好的多模态模型的定义,就是视觉编码器要比文本编码器强,多模态融合能力要强,并且模型既能很好的用于图文检索又能用于生成任务。
但有人会问了,生成任务是需要解码器的,可到目前为止用的都是Transformer编码器啊,而且编码器也主要用于多模态融合任务。
那是如何实现VQA的?
其实也可以变相实现的,我们称之为闭集VQA。
在此之前,先来说一下如何使用Bert实现问答,本质上就是将其转换成一个分类任务,例如将CLS Embedding后面加一个多分类模型,或者将问题和一个上下文一起发给Bert,然后通过一个二分类预测答案在上下文中的起始位置和结束位置。
对于VQA而言,也可以看作一个分类任务,也就是事先准备好答案,例如一共10个答案,然后将图像编码作为交叉注意力模块的K,V,问题作为Q,然后将融合模块的CLS token的输出输入到一个10分类MLP中。
但这种方法的缺点显而易见了,不够灵活,后面我们会看到将使用带有Transformer解码器的模型,这类模型就能够灵活的生成文本了。
ALBEF全部采用Transformer架构,图像编码器有12层,将另一个12层的Transformer编码器拆开,一半用于文本编码,一半用于多模态融合。视觉编码器要比文本编码器复杂,使用编码器作为融合模块,这都符合前面对于“一个合理的多模态大模型”的预期。
视觉编码器会使用DeiT预训练模型,文本编码器和融合模块用Bert预训练模型参数进行初始化,如果直接将视觉文本特征送入融合模块,效果不会很好,因为他们不是对齐的,所以在进入融合模块之前,先采用前面提到的对比学习进行多模态对齐。
损失函数同样使用了ITC,MLM和ITM。
从网上爬下来的图像文本对往往带有很严重的噪声,例如,华山的宣传画,描述的是青山绿水,有人嬉戏玩耍,但为了提高检索率,往往只会用华山等关键词。但关键词往往不能描述图像中的内容,所以使用Momentum Model去生成为标签,本质上就是为了生成高质量的训练数据。
VLMO: Unified Vision-Language Pre-Training with Mixture-of-Modality-Experts(2022)
https://arxiv.org/pdf/2111.02358
前面的CLIP是一种双塔对偶结构,一个图像编码器和一个文本编码器,然后采用向量点乘实现模态之间的交互,好处是可以预先计算所有图文的向量,来加快图文检索任务。但缺点也很明显,不善于生成任务。
为了增强融合能力以适应生成任务,后续都是单塔模型,将一个Transformer分成两部分,一部分用于文本编码器,另一部分用于多模态编码器,虽然提升了融合能力,但不灵活,对于图文检索任务,需要计算Transformer Encoder融合编码器的相似度分数,但这对图文检索不友好。
那能不能把双塔和单塔的优点结合起来呢?既能单独用来对文本视觉编码,又能融合。
所以VLMO中提出了混合专家模型(MOE)。
(对于MOE,这是一种思想,大家可以回想下传统机器学习中的集成学习,在VLMO中,不同专家能够处理不同的数据模态,架构不同,还有一种MOE思想是采用同一种架构,但每个专家去学习不同领域的知识,例如,马斯克开源的Grok大模型)
MOME整体上就是一个Transformer Encoder结构,这实现了模型架构上的统一,但是对Transformer Block里面做了改动,主要是对MLP层做了改动,多头注意力层共享参数。其MLP层划分为三种模态专家,分别是视觉专家(V-FFN)用于图像编码,语言专家(L-FFN)用于文本编码,以及视觉-语言专家(VL-FFN)用于图像-文本融合。
训练时,也是迭代进行,先像BEiT那样视觉预训练,然后,冻结MSA和V-FFN参数,再像BERT那样文本预训练,最后输入图像文本对视觉语言预训练。
VLMO不仅实现了模型架构上的统一,而且也实现了任务上的统一,既能像CLIP那样实现图文检索,也能处理生成任务。
BeiT v3:Image as a Foreign Language: BEIT Pretraining for All Vision and Vision-Language Tasks(2022)
https://arxiv.org/pdf/2208.10442
以前我们使用ViT作为图像编码器,使用Transformer处理文本,两者本质上还是不同的,为了实现大一统,能不能把图像也看做是一种特殊的语言?
多模态继续朝大一统的方向努力。
BEiT-3出现了,它将图像看作是一种特殊的语言(Imglish)。
它与VLMO在模型架构上很类似,也使用了MoE架构,所以可以适用于不同下游任务,例如,a和b中用于分别编码图像和文本,c中用于视觉和文本融合,d中类似CLIP的对比学习,以及e中的文本生成。
损失函数不需要ITM和ITC,只要MLM损失。
但前面我们也说过,只有编码器的模型在处理生成任务上是不灵活的,接下来我们将看到带有Transformer解码器的模型,这类模型就能够灵活的生成文本了。
BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation(2022)
https://arxiv.org/pdf/2201.12086
BLIP这篇论文有两个贡献点,一个是从模型,二个是数据。
前面提到的这些模型只使用了Transformer Encoder,适合理解任务,不能直接用于生成任务。这时候需要加一个Decoder模块。并且提出了一个统一的模型来处理不同的任务。
BLIP包括三个编码器和一个解码器,编码器负责编码图像和文本,解码器负责根据编码器的输出生成文本。
损失函数ITC和ITM,LM。通过ITC损失函数对齐图像和文本;图像编码特征通过交叉注意力与文本特征融合。生成多模态特征,通过image-ground Text encoder去计算ITM损失。因为是Transformer Decoder,用于文本生成,而不是预测掩码,所以损失函数由MLM变成了LM。
注意,颜色相同的模块参数是共享的。图片经历一次前向过程,文本需要经历三次。
在数据上,提升预训练数据质量对于多模态性能提升很重要,但从网上下载的图像文本对有噪音,还是通过有个方法提升训练数据质量。论文提出了Captioner和Filter。
如上图,从互联网爬下来的图像描述是“blue sky bakery in sunset park”,这句话更适合搜索引擎,并没有很好的描述图片。
下面是Captioner模块根据图片生成的文本描述,很好的描述了图片中的内容。Filter则会判断是互联网上爬的好还是Cap生成的好,最后过滤掉质量不好的。
具体过程是,Cap中用最大的BLIP模型生成40描述,Filter中用CLIP检索出质量最好的5个。再用CLIP ResNet找到最好的。
CoCa:Contrastive Captioners are Image-Text Foundation Models(2022)
https://arxiv.org/pdf/2205.01917
与ALBEF很像,一个图像编码器,一个Transformer decoder分两半。
只使用Decoder,只使用ITC和LM损失,解决训练效率问题。其它模型都要forward好几次。
Flamingo: a Visual Language Model for Few-Shot Learning(2022)
https://arxiv.org/pdf/2204.14198
当前大语言模型就有很强的语言理解和生成能力,具有in context few-shot推理能力,那能不能利用这些LLM资源呢?
Flamingo借鉴LLM的Few-Shot推理能力,使其善于VR VE VQA等生成任务。
视觉编码器也是用预训练好的ViT模型,例如BeiT,如果训练过程中参数保持不变,直接将视觉编码器的输出给LLM肯定不是对齐的,那如何实现多模态的融合?
要么微调ViT的参数,要么中间加一个Adapter。
Flamingo选择冻结大语言模型以及视觉预训练模型参数,然后通过加一个Adapter实现模态之间的对齐。
从此进入大语言模型加持时代。
视觉问答
下图是Flamingo的模型结构,蓝色的模型参数是冻结的。
视觉编码器是一个预训练的ResNet。
Perceiver Resampler就是Adapter,将ResNet的输出特征映射成视觉tokens。
GATED XATTN-DENSE layers:类似交叉注意力,视觉tokens作为LLM的条件输入。
BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models(2023)
https://arxiv.org/pdf/2301.12597
BLIP-2与BLIP相比,也是引入了LLM,总体上就是图像编码器提取图像表征,然后将表征与用户Query一起输入到类似GPT的大语言模型,然后以自回归的方式生成文本。这里图像的表征,就像是RAG中的上下文,也就是告诉大语言模型,要基于图像表征的内容,针对我的问题给出答案。
BLIP2同样冻结了图像编码器和LLM的参数,然后让Querying Transformer充当Adapter的角色。
预训练分两个阶段,第一个阶段,视觉文本表示学习,让Querying Transformer学习到的视觉表示与文本靠近,第二阶段让LLM理解Querying Transformer的输出。这两个过程都是调节Querying Transformer的参数,其它都是冻结参数的。
下图是第一阶段训练过程。输入图像文本对,损失函数ITC,ITM以及ITG。
下图是第二阶段预训练,全连接层的目的是将Q-Former的输出维度调整到LLM的输入维度。
同样使用Cap Filter模块去除互联网数据的噪声,生成质量更好的图像文本对。
上述模型虽然是多模态,但大多聚焦在文本和图像,下面的模型能够处理,语音,点云,红外线,射线,图,时序,视频,是真正意义上的多模态。
IMAGEBIND: One Embedding Space To Bind Them All(2023)
https://arxiv.org/pdf/2305.05665
ImageBind的核心思想是,虽然有多种数据模态,如果实现两两对齐很复杂,如果能找到一个中间人,也就是Image,让其它模态与Image对齐,那么其它模态间也就能实现对齐了。
Meta-Transformer: A Unified Framework for Multimodal Learning (2023)
https://arxiv.org/pdf/2307.10802
前面所有模型都需要构造图像文本对,Meta-Transformer不需要构造多模态输入配对训练数据,它通过Data-to-Sequence Tokenization将不同模态映射到同一个嵌入空间,然后通过Unified Encoder提取表征,最后通过Task-Specific Heads处理不同任务,Meta-Transformer虽然不需要配对多模态数据,但需要与任务相关的标签信息来训练模型。
下图是Meta-Transformer与其它模型的对比。
本文转载自公众号人工智能大讲堂