Multimodal Large Language Model 总结
最近MLLM的进展实在是太快了, 必须得赶紧写一篇博客出来了… 再不写这些知识就要过期了…
所以, 本文只是以总结的形式梳理了近期比较有代表性的MLLM, 推荐有基础后再阅读.
Revolution of Visual-Language Adapter
目前的MLLM基本组成有三部分, Visual Backbone, V-L Adapter, LLM:
该图出自The Revolution of Multimodal Large Language Models: A Survey.
之前的MLLM基本在LLM内部没有什么变化, Visual Encoder基本也用的CLIP的Vision Encoder, 主要区别在于Adapter上.
Flamingo
Flamingo代表了在LLM主干中加入Cross Attention从而用视觉增强文本表示的一派.
Flamingo将视觉信息融入LLM的方式是在LM Block的主干上串行的加入一个用Cross Attention增强文本表示的模块, 从而让文本表示中能融入视觉信息:
预训练LM为Chinchilla 1.4 / 7 / 70B.
作者在每个LM Block前面加上了一个Gated Cross - Attention Block. 结构如下:
以Language为Query, Vision input为Key和Value, 并用Tanh和残差做一下过滤, 决定视觉增强的文本表示流通率的门控系数为全0初始化, 跟LoRA有点类似.
其中Receiver Resampler是用类似BLIP和CoCa的Query和Cross-Attention汲取有效的视觉信息:
Resampler中Cross Attention的Key和Value是Visual Representation和Query Representation的拼接.
比较有趣的是作者提到了Flamingo对交错图文(Interleaved Image Text)的数据的处理方法:
在一系列文本和一系列图像构成的图文交错数据中, 每个文本块中Token在Cross - Attention中只能对对应的Visual Token做Attention(深蓝色), 而无法对其他Visual Token做Attention(浅蓝).
在作者的实验中, 将作者构建的交错图文数据集去掉后, 模型效果下降非常恐怖.
BLIP-2 / InstructBLIP
BLIP-2开创了以VL对齐的Q - Former抽取视觉信息送给LLM的先河.
BLIP-2
BLIP-2我们在VLP总结里面其实已经讲过了, 在这里只是简单的把它粘过来, 以保证内容完整性.
出发点: 当前大规模模型在预训练期间的高额计算消耗太大, 数据也用的特别多.
作者引入一个lightweight Querying Transformer (Q - Former)来完成Visual & Language模态的桥接过程:
作者把Q - Former的训练拆分为两个阶段:
- 首阶段: 让Q - Former从Freeze Image Encoder中学习VL表示.
- 次阶段: 从Freeze LLM中学习VL表示.
Q - Former结构和首阶段预训练如下:
Q - Former实际上由双塔的两个Transformer组成, 分别被称为Image Transformer和Text Transformer. 结构上类似于BLIP中的Image - Grounded Text Encoder和Text Encoder.
Image Transformer的SA和Text Transformer的SA参数是共享的(这点和VLMo出奇的一致). Learnable Query从Image Transformer给入, 通过CA来从Frozen Image Encoder中获取视觉信号.
作者还在文中补充了一个小细节, 实际上的Visual Key Value采用的是Image Encoder的倒数第二层输出, 而不是最后一层, 效果会稍微好一点, 这点与大家使用Stable Diffusion的时候取CLIP的倒数第二层输出有点类似.
所以从结构上来看, 首阶段的训练目标是希望Query能够学到从Image Encoder中抽取对Text最有用的内容. 再看训练任务也是这样, 设计了三种:
- ITC(Image - Text Contrastive Learning): 虽然说是老生常谈的Loss, 但因为Query经过Trm以后得到的表示有多个, 所以作者计算了多个Query与Text Transformer
[CLS]
的余弦相似度, 选择相似度最大的作为正样本. 为了避免信息泄露, 在做ITC的时候要保证Q和T之间是互相不可见的(最右侧Mask). - ITG(Image - grounded Text Generation): 使得Q对T完全可见, T单独用Casual Mask, 然后生成图文匹配的文本段. 这就要求Query必须覆盖Image的全部信息, 且Query抽取出的信息必须是有效的(中间Mask).
[CLS]
也被换成[DEC]
. - ITM(Image - Text Matching): ITM也是常见Loss, Q必须拥有两个模态的信息才能一起判断图文是否匹配, 作者对所有Query都计算ITM Loss, 最后取平均作为Logits, 同时也使用Hard Negative.
次阶段预训练, 直接用Q - Former完成图生文:
由于在首阶段中Q - Former已经完成了Query从Image Encoder中抽取关键信息的学习, 这也就使得Visual Signal可以被Query以Soft Visual Prompt的形式传递给LLM. 所以Q - Former中的Text Transformer变得不再必要, 可以被丢弃. Query表示还需要过一层Linear Project和大模型输入维度对齐.
如果不要首阶段直接硬学的话, 由于没有Text Transformer打辅助, 所以想要让Q - Former学到从Image中抽取出更多有关文本的信息会更难. 但文本模态在Q - Former首阶段训练中起到的实际上是一个Grounding的作用, 根据Language来让Learnable Query抽取更多有用的信息.
InstructBLIP
延续BLIP-2的Q - Former, 在Q - Former中添加了Instruct, 从而使得Q - Former能完成Instruction-aware Visual Feature Extraction, 从而将Visual Feature从静态的变为动态的, 能够做到instruction following:
其余细节基本一致.
直接使用BLIP-2里面已经对齐好的Q - Former作为初始化(看做是预训练), 然后直接在Q - Former和LLM侧继续进行指令微调, 使Q - Former能够理解指令, 并完成指令引导的视觉特征抽取. 指令构造来自人工手动.
与之类似的还有同样为BLIP系列续作的X-InstructBLIP, 但审稿人似乎认为这种方法并没有具备很大的贡献, 以及实验不够充分缺乏与当前的MLLM对比, 于是在ICLR 24被拒稿了.
LLaVA系列
LLaVA代表了整个使用MLP为Adapter的一派.
LLaVA
与BLIP-2的Q - Former不同, LLaVA抛弃了沉重的Visual Extractor设计:
用预训练的CLIP抽取的Visual Feature作为Vision Signal, 再用一次Linear Projection后送到LLM里面.
在LLM中, Visual Token仍然是Autoregressive Encoding的.
LLaVA训练的时候遵循多轮对话:
在第一轮对话的时候把图像信息附加进去即可.
作者设计了两阶段微调, 让LLM能适配Visual Input:
- Stage 1: Pre - training for Feature Alignment, 只调Linear Projection的参数, 使Visual Feature和LLM Embedding Space对齐.
- Stage 2: Fine - tuning End-to-End, 让Linear Projection和LLM一起调.
比较有意思的是, LLaVA的指令数据集是用LLM(ChatGPT / GPT4)生成的, 通过把图像中的信息以自然语言描述出来从而传递给更高阶的LLM, 让LLM生成指令数据.
比如直接把图中物体的Caption和BBox都传进去, 然后让LLM生成三种类型的问题:
LLaVA的表现超过了BLIP-2.
LLaVA 1.5
LLaVA 1.5是LLaVA的改进版本:
主要做了如下改动:
- 限制了LLM的输出格式, 让LLaVA直接以简短的方式回答, 有利于VQA任务.
- 从一层Linear Project变成了两层MLP.
- 加入了学术方面的数据集, 用于解锁LLaVA对视觉区域细粒度理解能力.
- 提高了图像分辨率, 并加入了额外数据源.
LLaVA-NeXT(LLaVA-1.5-HD)
增强了推理, OCR和World Knowledge.
通过动态分辨率输入, 支持”任意”分辨率大小的图像作为输入(实际训练阶段最大支持4倍):
把大图切分为小Patch, 分别用Visual Encoder编码, 再把一个下采样的图编码, 作为全局信息, 全拼接后一起送给LLM.
特性如下:
- 支持动态分辨率输入.
- 采用更强的用户指令数据, 加入更多跟文档以及图片理解的数据.
- 增大LLM backbone的Scale.
Rethinking Design of MLLM
从Flamingo并入LLM主路的Cross Attention, 再到BLIP-2里Q - Former, 再到LLaVA直接用简单的MLP就完成视觉信号输入, 确实可以得出一些关于MLLM设计的结论, 并引导MLLM的设计走向.
Prismatic VLMs
作者探寻了四个维度的VLM设计, 并给出了一些结论:
- Optimization Procedure:
- Multi - Stage Training: LLaVA中是分两个阶段训练, 第一个阶段训练Projection Layer, 第二个阶段全Finetune. 本文作者发现其实直接略过第一阶段也可以, 这样还可以节省训练时间.
- Full Finetuning through Visual Backbones: 在上述单阶段过程中, 必须要把Visual Backbone Freeze住, 不然模型会崩掉, 尤其是Location Task(这个结论和训练数据也可能有关).
- Image Processing and Pretrained Visual Representations:
- Choosing a Pretrained Vision Representation: 同规模下, 用VL Contrastive训练过的CLIP, SigLIP比纯视觉无监督DINOv2和有监督的ViT效果要好.
- Image Processing across Visual Backbones: 对于CLIP而言, 简单的Resize比Crop-Resize要好, SigLIP则在简单的Resize和Letterbox Padding上表现类似. 不同模型似乎不太一样, 无法得出一个确信的结论.
- Scaling Image Resolution: 高分辨率确实好.
- Ensembling Different Visual Representations: 集成DINOv2和SigLIP的特征效果最好.
- Language Models:
- Base vs. Instruct - Tuned LMs: 没有经过指令微调的LLM和经过指令微调的LLM表现近似, 并且没有经过指令微调的base LLM出现幻觉更少.
- Do Better LMs Lead to Better VLMs?: LLM本身的表现与VLM最终表现不一定有很强的关联.
- Co-training on Language-only Safety Data: 加入Text-Only的安全数据后, 性能只有一点点下降, 但是增加了不少在对话过程中的安全性.
- Scaling Properties Around Training Time and Data:
- Are we Undertraining?: 很多方法都只Train了一个epoch, 实际上有些模型没有充分训练, 还可以继续训练第二个epoch.
- Adding Additional Vision-Language Data: 更多样性的数据堆Scaling VLM很重要.
MM1
Apple团队的工作, 除了从模型角度揭示了一些MLLM的设计表现, 也从数据角度进行了分析.
这里直接给出论文中得出的结论:
- Visual Encoder: 图像分辨率影响最大, 然后才是Visual Backbone的Size和数据.
- VL Adapter: Visual Token的数量和图像分辨率最关键, VL Adapter的类型反而不太重要.
- Data:
- 交错数据对提升Few - Shot和Text - Only影响很大, Caption数据对Zero - Shot提升比较大.
- Text-Only数据对Few - Shot和Text - Only性能提升有帮助.
- 合理图文数据配比能带来更好的MM性能并保持住纯文本任务上的性能.
- 合成数据有助于Few - Shot Learning.
Idefics2
来自抱抱脸团队的工作. 文中对MLLM的可能设计做了探索, 最终探索得到的模型结构如下:
输入图像 -> Visual Encoder -> Projection + Pooling -> 大图分割成小图, 且可能和文本交错 -> LLM -> 输出文本.
一些关键结论:
- 固定参数量下, LLM的质量相比于Visual Backbone的质量对VLM的影响更大(这点和Prismatic VLMs有冲突).
- Cross - Attention(Flamingo并入LLM主干的Cross Attention)比Autoregressive(指不改动Decoder Only的LLM本身, 比如LLaVA)的表现在单模态Backbone冻结的时候效果要好, 但当Backbone解冻的时候, 反而Autoregressive Manner会更好一些, 即使Cross - Attention吃了更多参数.
- Fully Autoregressive的架构的预训练Backbone如果都解冻会导致模型发散, 用LoRA可以缓解这个问题.
- Visual Token过多时, 通过Learnable Pooling来减少Visual Token的数量可以很明显的增加下游任务上的推理效果和训练 / 推理速度.
- 对在固定大小的正方形图像预训练的Visual Backbone, 采用LoRA等方式来保留图像的原始长宽比和分辨率, 不会降低性能, 并且同时还能加速训练和推理并减少显存.
- 在训练时将大图变为拆分出的多张小子图和大图本身, 都作为Visual Token输入到模型当中, 可以在推理阶段用推理效率换来更多的推理性能, 尤其是在涉及到阅读图像中文本的任务中更为明显.
经过一系列摸索以后发现, 之前纠结的VL Adapter形式似乎并不是很重要, 图像分辨率和Visual Token数是重要的, 这也会成为未来(现在已经)的主流发展方向.
除去上述三篇论文以外, 还建议大家阅读一下这个知乎问题, 里面也有很多真知灼见:
- 多模态大语言模型(MLLM)为什么最近的工作中用BLIP2中Q - Former结构的变少了?.
- 也有一些工作对Q - Former的问题做了一些分析:
Do not Stop Generation!
LLM主要还是面向AIGC, 生成还是有很多要做的工作.
NExT-GPT
上面讲的都是一些VLM, 有没有扩展到更多模态的工作?
NExT-GPT提出了从文本 / 图像 / 语音 / 视频作为输入再到上述四种模态生成的LLM框架:
能非常明显的从图中观察到, NExT-GPT是纯粹的LLM Centric, 所有其他模态的编码和生成都围绕LLM来构建. 所有模态都跟Language进行了对齐, 所以可以完成任意模态到Text再到任意模态的生成.
当进行对话时, NExT-GPT能够根据对话过程中生成的特殊Token及其表示来生成对应模态的内容:
特殊的Token有<IMG_i>
, <AUD_i>
, <VID_i>
, 这些特殊Token的表示会被作为每种模态的Diffusion里面的Condition来引导对应模态生成.
作者用ImageBird当做编码器, 同时编码Image, Audio, Video作为输入.
在优化模型时, 主要做了Encoder和Decoder两侧的模态对齐.
因为要将所有模态都和Text对齐, 所以可以拿除文本以外的模态Encoder抽取出的表示经过Projection, 在各模态Caption的过程中完成Encoder侧对齐:
同样的, 由于有各模态Diffusion的Caption, 可以将Diffusion的Text Encoder对Caption编码后的表示(Condition)与LLM输出的特殊Token经过Projection后的表示对齐, 从而完成Decoder侧对齐:
为了让NExT-GPT在对话过程中拥有模态迁移的能力, 还需要进行Modality-switching Instruction Tuning. 对LLM做LoRA Tuning, 并设计几种模态切换的对话场景:
指令数据集根据GPT4和各种模态的Caption共同构造, 之后再人工筛选一下.
DreamLLM
DreamLLM提出了一种能够处理图文交错数据的方法, 并且这种方法能在原始多模态空间中采样生成:
当DreamLLM需要生成图像的时候, 会生成一个特殊的Dream Token <dream>
.
一旦生成这个Token, 就说明LLM需要生成图像了. 接着会有若干个Dream Query以Autoregressive Manner喂给到LLM里, 最后这组Dream Query的表示会被用于生成Diffusion Model的Condition. 生成的图像会被Visual Encoder和Projection重新提取为Visual Embedding输入到模型中.
由于这种方式是直接生成或处理的图像, 不需要用CLIP之类的模型对Visual Embedding进行对齐, 所以整个生成过程都是在原始多模态空间中进行的.
训练分为三个阶段, 整个过程Diffusion Model都是冻住的:
- Alignment Training: Linear Visual Projector, Linear Condition Projector和Learnable Dream Embedding解冻, 用30M图文对对齐所有Projector和Dream Query, 在这个期间做图文理解和文图生成. 这样就可以把除了LLM以外的所有组件初步对齐到一个偏于LLM的Multimodal Space.
- I-GPT Pretraining: 解冻LLM, 做大规模文本图像的联合生成式建模, 将所有组件对齐到真正的Multimodal Space.
- Supervised Fine-tuning: 加上指令按下游任务Finetune.
Joint / Interleaved Image-Text Generation
本身LLM其实是一个Universal Decoder, 它的能力一定不止于Text Generation. 如果能够直接统一Visual Token和Text Token生成的方式, 则会带来更灵活的生成效果. 有多种方式可以达到这个效果, 其中一种就是用VQ(Vector Quantization)把视觉图像变成离散化Token, 将Codebook里的离散Token.
当然, VQ这个过程不是必要的, 因为有很多种方式可以达到这个效果, 从DreamLLM里就可以看出来.
因此, 在需要生成图像的时候, 只需要MLLM预测出对应的Visual Token, 然后再交给Diffusion之类的Visual Decoder做个解码, 就能拿到需要的图像了. 这样做的好处是整个Token Space对Vision和Language都是Joint Training的, 能达到非常灵活的输出效果…
比如说在对话过程中, 模型发现用户难理解就直接出个图, 甚至也可以从用户输入的图像中截取一部分做辅助说明(生成Visual Token, 然后再Decode回去), 也可以同时在对话中处理图像并返还给用户.
再结合Flamingo, Idefics2和MM1中发现的交错数据带来的提升, 以及DreamLLM这种交错生成框架的出现, 如果这条线能做Work的话, 能够推测出Joint / Interleaved Generation的时代就要来了, 我比较看好它和Diffusion结合在一起的发挥.
这个部分暂时没什么时间, 没法串起来讲一下, 因为补这条线需要从VQ-VAE先开始讲起, 而且它还在不断演进中… 所以只能给大家一个阅读思路:
- 预备知识:
- SPAE: SPAE: Semantic Pyramid AutoEncoder for Multimodal Generation with Frozen LLMs.
- VLTokenizer: Beyond Text: Frozen Large Language Models in Visual Signal Comprehension.
- LaVIT: UNIFIED LANGUAGE-VISION PRETRAINING IN LLM WITH DYNAMIC DISCRETE VISUAL TOKENIZATION.
- SEED系列:
- Chameleon: Chameleon: Mixed-Modal Early-Fusion Foundation Models.
- TiTok: An Image is Worth 32 Tokens for Reconstruction and Generation.
- SETOKIM: Towards Semantic Equivalence of Tokenization in Multimodal LLM.