Github: https://github.com/MengLcool/DeepStack-VL
Paper: https://arxiv.org/abs/2406.04334
摘要
看惯了切patch输入做到的高分辨率,让我们看一篇不一样的方法:《DeepStack: Deeply Stacking Visual Tokens is Surprisingly Simple and Effective for LMMs》:保持相同的视觉上下文长度,通过从下到上堆叠视觉token到transformer不同层,来提供丰富的视觉信息。
大多数多模态大模型(MLLM)是通过将视觉token作为一个序列送到大型语言模型(LLM)的第一层来实现的。由于高分辨率图像通常会切成非常多的patches,增加了序列输入长度,这极大增加了计算和内存成本(attention是n方复杂度)。
本文提出了一种新的LMM体系结构DeepStack。考虑到MLLM有N层,我们也可以将视觉token堆叠成N组,并将每组从下到上馈送到对应的transformer层。令人惊讶的是,这种简单的方法大大增强了MLLM高分辨率视觉能力,且开销很小。
方法
DeepStack的框架非常简单:将视觉token注入不同的transformer层中。
对于LLM的DeepStack-L,给定一个输入图像,从低分辨率图像中提取的token送到LLM的输入层。考虑到图像的2D性质,我们从高分辨率输入中增加了token,并将其重组为DeepStack,然后将其送到LLM中的后续层。
对于ViTs的DeepStack-V,应用了类似的采样策略,但将视觉token输入ViT视觉编码器的transformer层。
评测
文中也做了一系列ablation study
论文将默认高分辨率图像分组策略与另外两种组织视觉token的变体进行了比较。如下图所示,2d Grid 将每个局部裁剪作为一个层,而 1d Sequence 则将视觉token简单地展平为一维。而如论文的默认设置中的 2d Spatial(类似pixel unshuffle的操作),能够实现最佳结果。
放开微调图像编码器同样十分重要:
DeepStack的idea虽然不错,但是毕竟输入长度不变,数据也局限于LCS-558k和LLaVA-mixed-665k,所以性能提升并不是非常显著。指标相比于同期工作,即先前推送的一些高分辨率VLM而言没啥优势,可能还得是一寸长一寸强(输入长度和训练数据规模)。但仍不失为一个非常好的低成本提升输入分辨率的思路。
[高分辨率VLM系列解读]
通向高分辨率VLM (3): mPLUG-DocOwl 1.5
通向高分辨率VLM (5): InternLM-XComposer-4KHD
点击👇关注 “思源数据科学”
👇点个“赞”和“在看”吧