多模态大模型: 盘点&Highlights part1——从BLIP到LLaVA

前言

Hi大家好,我叫延捷,是一名计算机视觉算法工程师,也是叉烧的老朋友了。我们计划发布一系列关于多模态大模型的文章,帮助大家快速、精准地了解多模态大模型的前世今生,并且深入各个多模态大模型领域优秀的工作,希望能给大家一个脉络性的盘点,一起学习,共同进步。

Instruction

多模态大模型当前的发展如火如荼,随着LLM技术的不断发展、完善,把图像、视频、语音、遥感等多模态信息和文本结合在一起成了当前的一大热点。这里我将发表一系列关于多模态大模型的技术文章,我并不会过多列举一些不必要的论文细节和指标,而是会着重讲述:

  1. “心路历程”:一个系列工作逐步发展的路径,作者是如何根据当前工作的缺点一步步优化的,并且会总结出每篇工作的highlight,在精而不在多;

  2. “数据细节”:各个工作中对数据处理的细节,包括但不限于数据的收集,采样时的分布,如何清洗/重建noisy数据,如何进行数据预处理,视频抽样的方案等,这些对算法工程师来说是同样重要的一环;

  3. “前人肩膀”:各个工作中隐藏着一些非常值得盘的消融实验,站在前人的肩膀上,使用这些已有的消融实验结论,不仅能帮助我们更好地理解论文,更能在实际工作中少做些不必要的实验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的精华,非常优雅地联合建模了多个视觉语言任务,比起这俩拥有了文本生成能力

da333a6ed0251595a4e1902ab639ac36.png


ALBEF和VLMO的模型示意草图(来自https://www.youtube.com/watch?v=S1le41J76lQ)

针对3个任务,在文本端共享了大量参数,损失函数分别为:

  1. ITC(Image-Text Contrastive):类似CLIP,取所有img tokens与[CLS] token点乘最大值,来计算交叉熵损失;

  2. ITM(Image-Text Matching):一个二分类损失,针对输入图像和文本,分别取当前batch中ITC最大的负样本(hard-neg mining),加上本身图文对作为正样本来计算损失;

  3. LM(Language-Modeling):GPT的损失,autoregressive loss,引入Casual Self-Attn Mask;

由于每次计算这几个Loss时都要进行好几次的模型推理,所以训练还挺耗时的

b32cef5cba49e9e69434730426172013.png

BEIT模型结构,充分体现了标题中的"Unified",并且加入的Decoder+LM Loss的分支

Highlights:

  1. 把ALBEF和VLMO结合了起来,Unified建模多个图文任务,同时引入Decoder分支,赋予了图像caption的能力,为此带来了BLIP第二个highlight;

  2. 提出了CaptionFilter的思想,Dataset Bootstrapping的策略有效清洗了网上爬取的Noisy数据集,也从侧面说明在大模型时代,哪怕我们只需要进行sft或者lora,对数据集的理解、收集、清洗、过滤、重建,依然是十分重要且不可或缺的一环。

4c6e1610075ba71b239eceddf0d553b9.png

Dataset Bootstrapping策略流,Caption+Filter的方案为noisy的数据集生成了质量更好的pseudo-labelling

5743bcdffcf35a8e58ba0256ed6ce1d6.png

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任务做了微调),既缺乏上下文场景的学习,也没有学会指令跟随的能力。

67c32ebdff33862e2849be538f27604e.png

整体模型结构图,后续大量MLLM都沿用了该结构的思想

Stage1: 训练Q-Former(用来根据Text Prompt,从图像中抽取需要用到的压缩信息)

沿用BLIP的训练策略,ITC+ITM+LM组合成损失函数,用DETR的思路引入Img Queries来压缩图像信息;亮点是针对三个不同任务所设计的Attn-Mask

f9a0fde53d82c01da4214b1b68215a29.png

BLIP-2的Q-Former结构,总体上看就是BLIP+img queries,训练策略&Loss沿用BLIP,亮点是针对不同任务的Attn-Mase设计

Stage 2: 训练Q-Former+Linear Projector,依然冻结ImgEnc和LLM,沿用BLIP用上了【Bootstrapping】策略

81a037d32b201a91fcc744e13a44dd19.png

BLIP-2的stage 2,引入了Linear Projector,依然冻结LLM;沿用Bootstrapping策略

Highlights:

  1. 提出ImgEnc+(Q-Former)+Projector+LLM的模型框架+二阶段训练策略,后续大量MLLM的工作沿用了类似的方案,细节参考前文此处不再赘述

  2. 实验发现,使用经过Instruction Tuning的LLM效果比单纯unsupervised的LLM效果来得更好,也为后续Instruct-BLIP埋下了伏笔,同时也证实了Instruction Tuning在多模态大模型中依然很重要

8015370efb9feb41da37014560349620.png

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

280ccb1ab653cbfaaff38d71caabe50a.png

Instruct-BLIP模型结构,沿用Q-Former

f5fc0cdeb9448f50e7efd85dd5358953.png

InstructBLIP所使用的Instruction模板

Highlights:

  1. 对视频QA任务的处理:每个视频均匀采样,每一帧独立过ImgEncoder+Q-Former得到img queries,最后把img queries拼接到一起和Instruct Prompt输入到LLM

9ed6825ee7363690933a0ed4d6129cbd.png

  1. 数据集平衡:a-使用平方根平滑增加小数据采样概率,降低大数据集采样概率,b-还给一些数据集加入额外调整权重;第一个直觉上挺合理值得借鉴,第二个有强行提点的嫌疑

55a0143bc9eb3b894e2bfc8e3b771381.jpeg

使用平方根平滑来平衡数据集内的采样

  1. Instruction Tuning的消融实验:做了跟FLAN同样的关于Instrction有效性的实验,在Held-in上结果类似,在Held-out上体现出设计合理Instruction的重要性

ac8bab09b3062824347acd3875c2acc4.jpeg

论证【Plain】【+DatasetName】【+Instuction】对效果的影响

不足之处

BLIP系列的改进层层递进,每一版本都解决了上一版本的痛点,可以说是非常优秀的一系列工作。站在后人的角度来看,我说几个BLIP系列的缺陷点

  1. Q-Former并不是一个很好的方案,作为模态间的连接器来对齐图像和文本,Q-Former使用了img queries来对图像进行抽取,希望基于给定的text prompt来精炼图像信息。但当今从理论和实验角度都证明,这样做实为有损压缩,这会导致:

    1. 视觉信息不足,不利于细粒度识别任务。比如DocVQA;

    2. 有损压缩后,对视觉信息识别不够丰富,会强化模型的幻觉,有时候会按照LLM中的先验知识胡说八道了;

作为图像-文本信息的对齐层,Projector使用MLP或者cross attention都会比Q-Former来得更好。

LLaVA系列

LLaVA

《Visual Instruction Tuning》(Large Language and Vision Assistant)(2023)

核心是采用了BLIP类似的Image Encoder+Projector+LLM的模型架构,并且使用GPT4/ChatGPT构造了精细化的Instruction Prompt

c14c9fad64cdaf999c3e581077e46fbb.png

LLaVA的模型架构,Projector使用了朴素的linear层(比复杂Q-Former是更好的选择)

fab7d230c6b347c83370b96f74abc63f.png

LLaVA的训练,也是很朴素的LM Loss+Casual Mask的Decoder范式

训练上同样采取了2阶段训练,第一阶段仅训练Projector用来对齐image-text特征,二阶段指令微调Projector和LLM

9ad47b1407f94832561cd7eeb4cf7e95.png

Highlights:

  1. 精细化地设计了三种Instruction问题,并且也很好地设计了使用GPT4/ChatGPT构造Instruction的Prompt,站在“巨人“的肩膀上,这个方法在后续的工作中被大量借鉴。

c3c3acdcf93fbd278534cbe064e91c9c.png

LLaVA的Instruction示例,包含了3个类型的问题

e8a33dcde5a1cca7a06f31a234ecd744.png

让GPT4生成Instruction-tuning data的prompt

  1. Stage1图文对齐预训练中,对数据集(CC3M)做了过滤+手动构建Instruction

过滤具体方案是使用Spacy库统计每个唯一的名词短语的频数,删除频数小于3的数据,以及对于频数超过100的,随机选择一个数量为100的子集,过滤前后的数据分布如下图

8c5c19354b26ec66c877649f0c888675.png

21a9a8a1fa1ed9b768124af15937eca9.png

同时也通过消融实验证实Stage-1对齐预训练对最终效果的帮助

6d6b9a6e1551f0ba749e3ec43e0cc179.png

LLaVA-1.5

《Improved Baselines with Visual Instruction Tuning》(2023)

核心为LLaVA的全方面优化版,包括但不限于:Projector从linear升级为MLP,增加图像分辨率,更多丰富&质量更高的数据集(instruct tuning数据集158K -> 665K),更大的视觉编码器,更好的LLM

e362ad61c66621d1fd34996ca52c3601.png

单层linear替换为MLP带来的效果提升还不赖

8195cfc589dcabf0532fd6d1dad2d6db.png

大模型时代三个绝学:【增加数据】,【scaling】,【更高的分辨率】

Highlights:

  1. 提出了任意分辨率(AnyRes)技术,支持更高分辨率图像输入的方案,使用split+img-encode,并且和resize后的img-encode拼接起来,如下图所示

e4609adbf20a14c1e57858be1c734a54.png

进一步提高输入图像的分辨率的方案

7d2c4d527fb1f9129221c6fdd79759b1.png

证实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
  1. 更加精细化地处理训练数据,LLaVA-1.5中,针对不同类型的数据集,提出了各类处理方案,往往能为我们自己sft时的数据处理&分布提供思路

f3885467077cf268f94b708c0267ce90.png

推理时针对不同任务所添加的Instruction Prompt

7f02e9a3a469eec9ba1a49473e65b2ab.png

959a9f0ba9d19171565844beaa1d548e.png

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

https://zhuanlan.zhihu.com/p/695100288

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值