0. 写在前面
盲人眼镜是不是离我们越来越近了?是不是可以用一句描述就能从人像库中找到嫌疑犯?能不能根据一张图表就解析出对应的全部结构化数据?大模型与图像处理、计算机视觉结合又会擦出怎样的火花?相信你能从图文理解大模型中找到一些灵感。
本文主要介绍的多模态大模型主要是做图文理解的,即只是在编码时考虑对图片的理解,并不包含直接生成图片的部分。
1. LLAVA系列
1.1 LLAVA:图生文的先导工作之一
LLAVA的相关论文(Visual Instruction Tuning)最早是23年4月挂在ArXiv上的,那个时候GPT-4开放的功能基本只是text-only的,而具备类似功能的MiniGPT-4也比它稍晚几天,所以说LLAVA是图生文的先导工作之一也不为过。那LLAVA到底能做什么呢?可以从它论文中的示例一窥究竟。
图1 LLAVA论文中的Visual QA示例
这时候大家就会好奇,为什么大模型能够具有这种基于图片的问答能力呢?首先我们先看下LLAVA的基本结构。
图2 LLAVA模型结构
除了大语言模型(绿色)之外,它还增加了另外两个结构:图像编码器(蓝色)和特征映射层(橙色)。这里的图像编码器选择的是CLIP中的图像编码器ViT。这里的图片编码器的选择作者应该也是有考虑在里面的。这里笔者稍微岔开话题展开介绍下CLIP中ViT的模型结构和训练方式,毕竟后面这个结构会持续出现在后续的LMMs中,当然,如果大佬您已经了解CLIP和ViT的话,可以直接跳过1.2节。
1.2 CLIP中的ViT
ViT是Vision Transformer的缩写,是谷歌团队21年在论文An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale中提出的。这篇论文的重要贡献在于提出图片特征提取并不总是需要依赖CNN,Transformer结构也可以。那图片特征是怎么用Transformer提取的呢?先看下ViT的结构图。
图3 Vision Transformer结构图
笔者假定大佬们已经了解Transformer结构了哈,这里就不再展开详述了。主要再介绍下ViT在原来的Transformer基础上做了什么改动:1)将图片以指定大小分片,就可以获取N片,每片大小相同,平摊开后的向量维度就一样了,每片图就像文本中的一个token,最后输入Transformer的就是N+1块(包含cls位);2)为了不损失每片的位置信息,还设计了单独的图片位置信息编码方式,将每片图片的特征向量与位置信息编码一起输入到Transformer中进行计算。论文的实验证明这种方式在图片分类等任务中可以替代传统的CNN编码方式。
截止到目前,ViT还是用于纯图片类任务,和文本还没有挂上钩。接下来,OpenAI提出的CLIP(Learning Transferable Visual Models From Natural Language Supervision)则将图片和文本联系了起来。CLIP将图片编码器与文本编码器用一个任务来做特征的对齐:图片和文本匹配的任务。如下图所示,CLIP任务使用了对比学习的思想,就是希望图片和其真实的标题的特征之间尽量接近,其余的尽量远离。OpenAI采用了一贯的"大力出奇迹"的作风,构造了400M对图片-标题对来做预训练。训练之后,在zero-shot的设置下,也能在图片分类等任务上的效果也可比拟有监督训练的模型。
图4 CLIP的训练和使用步骤
1.3 LLAVA的数据和训练
相信到这里,大佬们已经大概搞清楚CLIP是什么,以及为什么LLAVA等一众多模态大模型都喜欢挑CLIP的ViT来做多模态大模型的vision encoder了吧?对,就是因为其具备了一定的图文对齐的能力。搞清楚了LLAVA的基本结构,接下来我们再看看它的数据和训练方式吧。
1.3.1 训练数据的构造
LLAVA的训练包含预训练和微调两部分,所以它的训练数据也就包含两部分。预训练和CLIP类似,也是选了开源的图片和图片标题对来做预训练,但是它的预训练任务不再是CLIP的对比损失,而是直接构造多种生成图片标题的指令文本,和图片一起作为输入,然后ground truth就是图片的标题。
除了预训练之外,LLAVA的难点在于构造微调语料,因为这种基于图片的问答等任务的开源数据集少之又少,再加上当时GPT-4的多模态能力还未开放,所以LLAVA采用了一种"曲线救国"的方法来构造数据。
图5 LLAVA的微调语料
LLAVA的作者把图片的标题(Captions)和检测到的目标的位置数据(Boxes)作为输入,希望GPT-4(text-only)能够产生图中所示的3种类型的语料(对话、详细描述、复杂推理)。当然,为了让GPT-4生成的更符合需求,作者会在输入中增加few shots作为生成内容的示范。
1.3.2 训练过程
训练分为两阶段:预训练和微调。预训练的任务是基于图片的标题生成任务,LLAVA在这一阶段会固定住图2中的Vision encoder和LLM部分,只是改变映射层W的参数,希望通过这个任务来对齐图片和文本的特征;微调则是上节提到的3类训练任务,其中复杂推理任务除了用GPT-4构造外,还增加了一些科学题问答语料,提升模型的逻辑推理能力。
1.4 LLAVA 1.5
上面几小节,LLAVA初代版本已经基本讲的差不多了。因为是23年上半年的工作,下半年LLAVA的作者又推出了LLAVA 1.5版本,模型的基本结构没变,但是在上面做了优化:
- 训练任务增加了;
- Vision encoder换了用更高分辨率训练的;
- 大语言模型换成了参数更大的Vicuna 13B;
- 映射层从单W矩阵换成了两层MLP结构。
目前LLAVA 1.5可以在huggingface上在线试用,各位感兴趣的大佬可以去体验下~不过因为不管是训练语料、图片编码器还是vicuna,基本都是英文,所以中文可能效果不太理想。
1.5 ChartLlama
不论是LLAVA还是LLAVA 1.5,训练语料中的图片基本都是通用图片,比如猫猫狗狗啦,衣食住行啦等等,所以对于一类特殊的图片------图表类图片其实支持的不太好,比如柱状图啦,折线图啦等等。图表类图片的理解更加有难度,更注重逻辑,图片的知识密度高;而恰恰这类图片具有的商业价值更高。所以有作者提出了ChartLlama(ChartLlama: A Multimodal LLM for Chart Understanding and Generation),在LLAVA 1.5的基础上,增加了图表类数据的lora微调过程。具体ChartLlama增加的训练语料可以从它论文首页展示的支持样例中可见一斑(如下图)。
图6 ChartLlama支持的任务示例
ChartLlama支持的图表类任务包括但不限于:基于图表的问答、图表信息抽取成结构化的表格、图表生成图表、文本和数据生成图表等。其中,上述任务中的最后两个生成图表的任务并不是直接生成图片,因为没有"vision decoder"结构,而是生成能够画图的python代码,巧妙地覆盖了由表到图的需求。
2. 支持中英文的图文理解大模型
2.1 Qwen-VL
第一节中概述的LLAVA系列模型由于缺乏中文相关语料,所以在中文上的表现较差,所以从中学习一下人家的模型结构和训练思路即可,如果真的想在中文场景下使用,阿里的Qwen-VL(Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond)是目前来看做的比较好的开源多模态大模型了。可以在网页上试用Qwen-VL plus版本,笔者用下来的感觉就是,对图片的简单问答效果还不错,各位大佬可以去体验体验。
图7 Qwen-VL结构和训练过程
Qwen-VL的结构和LLAVA有点像,也是3段式的,ViT+对齐层+LLM,ViT也是用的CLIP中的vision encoder,LLM用的是自家Qwen,对齐层和LLAVA的W或者MLP不太一样,这里用的是cross-attention、。注意,这里的交叉注意力并不是和输入的文本交叉,而是和指定数量的初始化query向量交叉。论文中特别解释了,这样设计是为了能够兼容超大图像,这样就可以将所有图像的转化成的序列长度固定在指定数量(与query数量相同)。为了不损失各个图片片段的位置信息,会在cross-attention里增加对其位置信息的编码。
Qwen的训练过程与LLAVA的也存在一定的区别。首先,训练过程分为3个阶段:预训练、多任务预训练和微调。预训练任务是根据图片生成标题的任务,与LLAVA一致,但是这里不止对齐层的参数可变,ViT的参数也是可变的,估计是为了增加对中文图片和文本的处理能力。多任务训练过程则是把预训练任务进行了扩充,除了有基本的QA任务外,还有基于图片片段与指定文本对齐的任务、OCR任务等。此外,2、3阶段因为没有固定LLM的模型参数,所以都在训练语料里增加了一部分纯文本训练语料,来保持LLM的能力。
2.2 Vary
Qwen-VL虽然支持中文,但是对图表类的数据依然支持的不太好,最近旷视团队提出了双vision encoder的多模态大模型Vary(Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models)。
图8 Vary的框架
Vary在之前模型的3段式结构之外,增加了一个vision encoder和一个映射层,专门单独用高信息密度的图片去预训练(如上图的上半部分所示)。这里的训练数据基本都是中英文论文和电子书以及图表类数据转换成的图片,与之前模型预训练的通用图片不太一样。而且,新的vision encoder用到的不是CLIP的ViT,而是SAM的ViT+两层CNN。SAM和CLIP的区别在于预训练任务不同。CLIP主要是分类任务,而SAM则是图片分割任务。SAM预训练中包含一类子任务就是根据文本描述,分割出图片中符合条件的物体。具体大家可以深究一下Meta发表的SAM原论文Segment Anything,这里就不再展开了。
新的vision encoder预训练好之后,在微调时,Vary是把两个vision encoder的特征向量拼接到一起之后再输入大模型中。作者这样做估计是为了保护CLIP中对通用图片的编码能力不被破坏,又能通过新的vision encoder引入对高密度图片的编码能力。
这样训练下来,Vary支持的图片类型和任务类型就都比较广泛了,除了能对通用图片进行问答外,还能将图表数据进行结构化的解析,甚至支持LaTeX公式的解析,感觉功能挺强大的。目前还没有试用过,目前(2024.01.13)模型参数下载链接在修复中,试用链接也暂不可用,期待试用效果。
3. 除此之外
除了上面介绍的LLAVA系列和Qwen-VL及Vary,还有MiniGPT-4、BLIP2等开源模型的原理还未介绍,大佬们感兴趣可以自行扩展阅读。
- 封神榜团队提出首个引入视觉细化器的多模态大模型Ziya-Visual-Lyrics (基于vicuna-13b,对中文支持一般) mp.weixin.qq.com/s/7YzOwsj_a...
- MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models
- BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models