前言
Hi大家好,我叫延捷,是一名计算机视觉算法工程师,也是叉烧的老朋友了。 我们计划发布一系列关于多模态大模型的文章,帮助大家快速、精准地了解多模态大模型的前世今生,并且深 入各个多模态大模型领域优秀的工作,希望能给大家一个脉络性的盘点,一起学习,共同进步。
Instruction
多模态大模型当前的发展如火如荼,随着LLM技术的不断发展、完善,把图像、视频、语音、遥感等多模态信息和文本结合在一起成了当前的一大热点。这里我将发表一系列关于多模态大模型的技术文章,我并不会过多列举一些不必要的论文细节和指标,而是会着重讲述:
- “心路历程”:一个系列工作逐步发展的路径,作者是如何根据当前工作的缺点一步步优化的,并且会总结出每篇工作的highlight,在精而不在多;
- “数据细节”:各个工作中对数据处理的细节,包括但不限于数据的收集,采样时的分布,如何清洗/重建noisy数据,如何进行数据预处理,视频抽样的方案等,这些对算法工程师来说是同样重要的一环;
- “前人肩膀”:各个工作中隐藏着一些非常值得盘的消融实验,站在前人的肩膀上,使用这些已有的消融实验结论,不仅能帮助我们更好地理解论文,更能在实际工作中少做些不必要的实验and少走弯路。
说回多模态大模型,我们很自然地从BLIP和LLaVA中盘起,本文会以我个人的视角介绍下BLIP到LLaVA的一系列工作。
BLIP系列
BLIP
《Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation》(2022)
核心一是使用了Unified方式同时建模了多个Vision-Language任务,二是使用Bootstrapping策略优化了网上爬取的Noisy的图文pair数据(个人非常欣赏这个策略思路)。
模型结构方面汲取了ALBEF和VLMO的精华,非常优雅地联合建模了多个视觉语言任务,比起这俩拥有了文本生成能力
ALBEF和VLMO的模型示意草图(来自https://www.youtube.com/watch?v=S1le41J76lQ)
针对3个任务,在文本端共享了大量参数,损失函数分别为:
- ITC(Image-Text Contrastive):类似CLIP,取所有img tokens与[CLS] token点乘最大值,来计算交叉熵损失;
- ITM(Image-Text Matching):一个二分类损失,针对输入图像和文本,分别取当前batch中ITC最大的负样本(hard-neg mining),加上本身图文对作为正样本来计算损失;
- LM(Language-Modeling):GPT的损失,autoregressive loss,引入Casual Self-Attn Mask;
由于每次计算这几个Loss时都要进行好几次的模型推理,所以训练还挺耗时的
BEIT模型结构,充分体现了标题中的"Unified",并且加入的Decoder+LM Loss的分支
Highlights:
- 把ALBEF和VLMO结合了起来,Unified建模多个图文任务,同时引入Decoder分支,赋予了图像caption的能力,为此带来了BLIP第二个highlight;
- 提出了CaptionFilter的思想,Dataset Bootstrapping的策略有效清洗了网上爬取的Noisy数据集,也从侧面说明在大模型时代,哪怕我们只需要进行sft或者lora,对数据集的理解、收集、清洗、过滤、重建,依然是十分重要且不可或缺的一环。
Dataset Bootstrapping策略流,Caption+Filter的方案为noisy的数据集生成了质量更好的pseudo-labelling
Caption-Filter的Dataset Bootstrapping策略消融实验,证实该方案作为一个通用的策略,确实能提升最终性能
BLIP-2
《Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models》(2023)
核心是全程冻结了Image Encoder和LLM,并且提出ImgEnc+Q-Former+Projector+LLM的模型框架,可以很灵活且方便的使用性能更强的ImageEncoder和LLM
在该模型结构的基础上,提出了二阶段训练,一阶段训Q-Former二阶段微调LLM(BLIP-2中二阶段冻结了LLM,只训练Q-Former和Projector)大大加强了模型文本生成的效果;但需要指出,由于参与训练的绝大部分数据都是图像-文本对,所以BLIP-2在VQA这样的任务中zero-shot表现不佳(论文中对VQA任务做了微调),既缺乏上下文场景的学习,也没有学会指令跟随的能力。
整体模型结构图,后续大量MLLM都沿用了该结构的思想
Stage1: 训练Q-Former(用来根据Text Prompt,从图像中抽取需要用到的压缩信息)
沿用BLIP的训练策略,ITC+ITM+LM组合成损失函数,用DETR的思路引入Img Queries来压缩图像信息;亮点是针对三个不同任务所设计的Attn-Mask
BLIP-2的Q-Former结构,总体上看就是BLIP+img queries,训练策略&Loss沿用BLIP,亮点是针对不同任务的Attn-Mase设计
Stage 2: 训练Q-Former+Linear Projector,依然冻结ImgEnc和LLM,沿用BLIP用上了【Bootstrapping】策略
BLIP-2的stage 2,引入了Linear Projector,依然冻结LLM;沿用Bootstrapping策略
Highlights:
- 提出ImgEnc+(Q-Former)+Projector+LLM的模型框架+二阶段训练策略,后续大量MLLM的工作沿用了类似的方案,细节参考前文此处不再赘述
- 实验发现,使用经过Instruction Tuning的LLM效果比单纯unsupervised的LLM效果来得更好,也为后续Instruct-BLIP埋下了伏笔,同时也证实了Instruction Tuning在多模态大模型中依然很重要
Instruction Tuning的Flan比单纯Unsupervised Learning的OPT效果明显更好
Instruct-BLIP
《Towards General-purpose Vision-Language Models with Instruction Tuning 》(2023)
核心就是在BLIP-2基础上,加入在llm证明十分有效的Instruction Tuning
模型结构跟BLIP-2保持一致,vision-text projector沿用了Q-Former,区别就是把text改成了instruction prompt,在训练好的BLIP-2基础上再做instruction Tuning
Instruct-BLIP模型结构,沿用Q-Former
InstructBLIP所使用的Instruction模板
Highlights:
- 对视频QA任务的处理:每个视频均匀采样,每一帧独立过ImgEncoder+Q-Former得到img queries,最后把img queries拼接到一起和Instruct Prompt输入到LLM
- 数据集平衡:a-使用平方根平滑增加小数据采样概率,降低大数据集采样概率,b-还给一些数据集加入额外调整权重;第一个直觉上挺合理值得借鉴,第二个有强行提点的嫌疑
使用平方根平滑来平衡数据集内的采样
- Instruction Tuning的消融实验:做了跟FLAN同样的关于Instrction有效性的实验,在Held-in上结果类似,在Held-out上体现出设计合理Instruction的重要性
论证【Plain】【+DatasetName】【+Instuction】对效果的影响
不足之处
BLIP系列的改进层层递进,每一版本都解决了上一版本的痛点,可以说是非常优秀的一系列工作。站在后人的角度来看,我说几个BLIP系列的缺陷点
- Q-Former并不是一个很好的方案,作为模态间的连接器来对齐图像和文本,Q-Former使用了img queries来对图像进行抽取,希望基于给定的text prompt来精炼图像信息。但当今从理论和实验角度都证明,这样做实为有损压缩,这会导致:
- 视觉信息不足,不利于细粒度识别任务。比如DocVQA;
- 有损压缩后,对视觉信息识别不够丰富,会强化模型的幻觉,有时候会按照LLM中的先验知识胡说八道了;
作为图像-文本信息的对齐层,Projector使用MLP或者cross attention都会比Q-Former来得更好。
LLaVA系列
LLaVA
《Visual Instruction Tuning》(L arge La nguage and V ision A ssistant)(2023)
核心是采用了BLIP类似的Image Encoder+Projector+LLM的模型架构,并且使用GPT4/ChatGPT构造了精细化的Instruction Prompt
LLaVA的模型架构,Projector使用了朴素的linear层(比复杂Q-Former是更好的选择)
LLaVA的训练,也是很朴素的LM Loss+Casual Mask的Decoder范式
训练上同样采取了2阶段训练,第一阶段仅训练Projector用来对齐image-text特征,二阶段指令微调Projector和LLM
Highlights:
- 精细化地设计了三种Instruction问题,并且也很好地设计了使用GPT4/ChatGPT构造Instruction的Prompt,站在“巨人“的肩膀上,这个方法在后续的工作中被大量借鉴。
LLaVA的Instruction示例,包含了3个类型的问题
让GPT4生成Instruction-tuning data的prompt
- Stage1图文对齐预训练中,对数据集(CC3M)做了过滤+手动构建Instruction
过滤具体方案是使用Spacy库统计每个唯一的名词短语的频数,删除频数小于3的数据,以及对于频数超过100的,随机选择一个数量为100的子集,过滤前后的数据分布如下图
同时也通过消融实验证实Stage-1对齐预训练对最终效果的帮助
LLaVA-1.5
《Improved Baselines with Visual Instruction Tuning》(2023)
核心为LLaVA的全方面优化版,包括但不限于:Projector从linear升级为MLP,增加图像分辨率,更多丰富&质量更高的数据集(instruct tuning数据集158K -> 665K),更大的视觉编码器,更好的LLM
单层linear替换为MLP带来的效果提升还不赖
大模型时代三个绝学:【增加数据】,【scaling】,【更高的分辨率】
Highlights:
- 提出了任意分辨率(AnyRes)技术,支持更高分辨率图像输入的方案,使用split+img-encode,并且和resize后的img-encode拼接起来,如下图所示
进一步提高输入图像的分辨率的方案
证实AnyRes下半分支的第二步resize重要性
# ====== ResAny代码示意 ======
# 选择当前图像对应的上限分辨率
best_resolution = select_best_resolution(image.size, possible_resolutions)
# 图像resize到上限分辨率
image_padded = resize_and_pad_image(image, best_resolution)
# 切分patch
patches = divide_to_patches(image_padded, processor.crop_size["height"])
# resize到输入分辨率
image_original_resize = image.resize((shortest_edge, shortest_edge))
# 拼接resize后的原图和切分后的小图
image_patches = [image_original_resize] + patches
- 更加精细化地处理训练数据,LLaVA-1.5中,针对不同类型的数据集,提出了各类处理方案,往往能为我们自己sft时的数据处理&分布提供思路
推理时针对不同任务所添加的Instruction Prompt
LLaVA-1.5对数据集处理
LLaVA-NeXT
《Improved reasoning, OCR, and world knowledge》(2024)
由于LLaVA-NeXT并没有论文,只有一篇技术报告,并且使用的技术跟LLaVA-1.5几乎完全一致(只是实装了AnyRes,并且支持的上限分辨率更大),剩下就是简单说了下使用了更多更好的数据,以及更加多样性的指令以应对更复杂多变的现实场景。并且对OCR和TextVQA任务针对性收集了更多的数据,具体可参考LLaVA-NeXT的技术文档:
https://llava-vl.github.io/blog/2024-01-30-llava-next/
Reference
多模态论文串讲·下【论文精读·49】_哔哩哔哩_bilibili:https://www.bilibili.com/video/BV1fA411Z772/?spm\_id\_from=333.788&vd\_source=cfffab083d9722d06835ed2331876487
AI论文精读之多模态大模型BLIP-2_哔哩哔哩_bilibili:https://www.bilibili.com/video/BV18u4y137ZV/?spm\_id\_from=333.999.0.0&vd\_source=cfffab083d9722d06835ed2331876487
InstructBLIP 利用指令微调训练的多模态大模型_哔哩哔哩_bilibili:https://www.bilibili.com/video/BV1Le41167DX/?spm\_id\_from=333.999.0.0&vd\_source=cfffab083d9722d06835ed2331876487