多模态:Vary


前言

目前大型视觉语言模型(LVLMs)在视觉处理方面通常使用CLIP来完成的。通过CLIP对图像进行编码,可以涵盖大多数常见的视觉语言任务。然而,对于一些需要密集和细粒度视觉感知的特殊视觉任务,例如文档级OCR或图表理解,尤其是在非英语场景中,CLIP风格的词汇在标记视觉知识方面可能会遇到效率低的问题,甚至会出现词汇外问题。因此,文章提出了一种有效扩展LVLMs视觉词汇的方法Vary。

github: https://github.com/Ucas-HaoranWei/Vary.git

一、Vary算法概述

1.出发点

CLIP-VIT是一个庞大的通用视觉词汇模型,它是通过对超过400M的图像-文本对进行对比学习来训练的,涵盖了大多数自然图像和视觉任务。然而,对于一些特殊场景,如高分辨率感知、非英语OCR、文档/图表理解等,CLIP-VIT可能会将其视为“外语”。尽管mPlug-Owl和Qwen VL通过解冻其视觉词汇网络(CLIP-L或CLIP-G)来缓解上述问题,但这种方式可能会带来如下问题:
1)更新CLIP会覆盖原始词汇的知识;
2) 在相对大的LLM(7B)上更新视觉词汇的训练效率低;
3) 它不能允许视觉词汇网络多次“看到”图像

2.算法思想

Vary的整体思想很简单,主要分为两个阶段,Vary-tiny和Vary-base:
Vary-tiny:设计了一个词汇表网络和一个小型的仅解码器的转换器,通过自回归生成所需的新视觉词汇表。这个词汇表会和OPT-125M模型一起训练。
Vary-base:将新的视觉词汇表与原始词汇表(CLIP)合并,扩展了vanilla(原始的)视觉词汇表。联合LLM-7B模型进行训练。请添加图片描述
新的视觉词汇可以有效弥补旧的视觉词汇。这种方法旨在提高LVLM在特殊任务和非英语环境下的效率和适应性,避免了视觉知识标记化方面的一些问题。同时在扩展视觉词汇后,LVLM可以实现更细粒度的视觉感知,如文档级的中文/英文OCR、书籍图像标记或LATEX、中文/英文图表理解等,同时确保其原始功能(对话、VQA、字幕等)。

另外Vary也是一种增强LVLM视觉词汇的有用策略,可以用于CLIP不擅长的任意下游视觉任务,使其不再局限于CLIP的词汇限制。

3.算法细节

整体结构细节:

如上面所说,Vary-tiny被设计用于生成新的视觉词汇,而Vary-base则用于利用这些新词汇。**具体而言,Vary-tiny由一个词汇网络和一个微型的OPT-125M组成,没有文本输入分支。为了对齐通道尺寸,两个模块之间添加了一个线性层。**作者期望新的视觉词汇网络在处理人工图像(例如文档和图表)时能够表现出色,以弥补CLIP的不足。同时,在生成过程中,将手动文档和图表数据作为正样本,将自然图像作为负样本训练Vary-miny,避免新词汇网络在处理自然图像时成为原始CLIP的噪声。
完成上述过程后,作者提取了词汇网络并将其添加到一个大型模型中,以构建Vary-base。新旧词汇网络具有独立的输入嵌入层,并在LLM之前进行集成。在此阶段,冻结新旧视觉词汇网络的权重,解冻其他模块的权重。这一阶段的目标是在更大的模型中利用新的视觉词汇,以提高模型的性能和适应性。

两个视觉词汇都有一个单独的输入嵌入层,即简单的线性。线性的输入通道为1024,输出为2048,确保级联后的图像标记通道为4096,这与LLM(Qwen-7B[3]或Vicuna-7B[8])的输入完全对齐。请添加图片描述

新词汇网络细节:

作者使用了由SAM预训练的ViTDet图像编码器作为Vary新词汇网络的主要组成部分。由于SAM-base的输入分辨率为(1024×1024),而输出步幅为16,因此最后一层的特征形状为(H×W×C为64×64×256),与CLIP-L的输出(N×C为256×1024)无法对齐。为了解决这个问题,作者在SAM初始化网络的最后一层后面添加了两个卷积层,这被称为一个有效的 token 合并单元
请添加图片描述

二、数据工程

1.文档数据

1)高分辨率文本图像对
2)英文部分从arXiv和CC-MAIN-2021-31-pdf-UNTRUNCATED上获取pdf文章
3)中文部分从互联网电子书中获取

使用pyMuPDF提取pdf中页面文本信息,然后通过pdf2image将页面转为png图像,构建1M个中文和1M个英文文档图像。

2.图表数据

当前的大型视觉语言模型(LVLMs)在图表理解方面表现不佳,特别是在处理中文图表时。因此,他们选择图表作为另一个需要"写"入新词汇表的主要知识。他们根据图表的渲染方式选择了matplotlib和pyecharts作为渲染工具。对于matplotlib风格的图表,他们构建了25万个中英文版本。对于pyecharts,分别为中文和英文创建了50万个图表。此外,作者将每个图表的文本基础真值转换为Python字典形式。图表中使用的文本,如标题、x轴和y轴,是从互联网上下载的自然语言处理(NLP)语料库中随机选择的。

3.负面自然图像

因为原本的CLIP主要对自然图像进行编码,需要确保新引入的词汇不会引起噪音。构建了负面自然图像-文本对,确保新词汇编码器在看到自然图像时能够正确编码。所以对于自然图像,将其定义为“这是一张自然图像”。提取了COCO120k个图像,对应的文本随机选择:“这是大自然的图像”;“这是一张大自然的照片”;“这是一张自然的照片”;“这是一个自然的图像”;“这是大自然的杰作”。

4.输入格式

在对Vary-tiny进行自回归训练时,作者使用了图像-文本对,其中输入格式符合流行的大型视觉语言模型(LVLMs)的规范,即图像token以前缀形式与文本token打包在一起。

具体而言,作者使用两个特殊的标记“<img>”和“</img>”来指示图像标记的位置,用于指示图像标记在输入中的位置。这些标记是为了插入OPT-125M(4096个标记)的输入。在训练过程中,Vary-tiny的输出仅为文本,并将 “ < /s >”视为表示序列结束的特殊令牌(eos令牌)。这种方式的训练允许Vary-tiny学习生成新的视觉词汇,以适应特定任务和场景。

5.统一数据格式

作者认为数据需要具有一定的格式,例如支持公式和表格。为了满足这个需求,他们通过LATEX渲染创建文档数据。具体步骤如下:
收集.tex源文件 ——> 正则表达式提取表格,公式,文本等 ——> 使用pdflatex准备新的模版,重新渲染成pdf

通过这个流程,作者创建了具有统一格式的文档数据。为了统一文本的格式,他们将每个文档页面的文本ground truth转换为mathpix markdown样式。

整个建设过程使作者得到了50万英文页面和40万中文页面。这样的数据集不仅包含了纯文本信息,还包括了公式和表格等复杂结构,为模型提供了更具挑战性的任务。
请添加图片描述

三、训练策略

作者通过批量渲染图表数据来训练新的词汇网络。然而,由于这些图表中的文本(标题、x轴值和y轴值)是随机生成的,它们之间的语义关联性较低。在词汇表生成阶段,这并不是问题,因为只需要关注新的词汇表是否能够有效地压缩视觉信息。但是在Vary-base的训练阶段,由于LLM的解冻,作者希望使用更高质量(强相关内容)的数据进行训练。

在这一阶段,作者使用GPT-4生成了一些图表,并利用高质量的语料库添加渲染了200,000个图表数据,以用于Vary-base的训练这样的做法有助于提高图表中文本之间的语义关联性,使得模型在训练中能够更好地理解和捕捉图表的内容。

总的来说,训练Vary-base的过程遵循流行的大型视觉语言模型(LVLMs)的方法,如LLaVA。这包括预训练和SFT(Supervised Fine-Tuning)阶段。不同之处在于,作者冻结了所有的词汇网络,并解冻了输入嵌入层和LLM,使得它更类似于一个纯LLM的预训练设置。在SFT阶段,使用了LLaVA-80k或LLaVA-CC665k以及DocVQA和ChartQA的训练集作为微调数据集。此外,一般概念的引入也通过使用自然图像-文本对数据从LAION-COCO中随机抽取,数量为400万

四、实验结果

Vary-base(以Qwen-7B为LLM)在DocVQA上取得了78.2%(测试集)和76.3%(验证集)的ANLS(Answer Normalized Levenshtein Similarity)。在使用LLaVA-665k的SFT数据的情况下,Vary-base在ChartQA上的平均性能达到了66.1%。

在这两个具有挑战性的下游任务上,Vary-base的表现与Qwen-VL相当甚至更好。这说明了所提出的视觉词汇量扩展方法在下游任务中具有很大的潜力,能够有效地提高模型性能。

使用相同的LLM(Vicuna-7B)和SFT数据(LLaVA-CC665k),Vary相对于LLaVA-1.5提高了总度量2.4%(32.9%对30.5%),证明了Vary的数据和训练策略不会损害模型的一般能力。

此外,Vary在与Qwen-7B和LLaVA-80k的性能相比时,表现出了更高的性能,达到了36.2%。这进一步证明了Vary的视觉词汇扩展方法的有效性。
![请添加图片描述](https://img-blog.csdnimg.cn/direct/71cd80f56e9a4848924a6962575bcd39.png请添加图片描述
请添加图片描述

五、应用

请添加图片描述
请添加图片描述

六、fp16加载

vary-base的基础推理要36G显存左右,而且默认模型为bfp16格式,基本只有A100能够支持。对于V100,4090显卡可以将模型调至fp16运行,fp16效果相比bfp16还是差了一些的。
(这部分代码为多卡推理,但是多卡推理会报错,目前未发现原因)

################指定卡
os.environ["CUDA_VISIBLE_DEVICES"]="0, 1"
##############导入accelerate
from accelerate import init_empty_weights, infer_auto_device_map, load_checkpoint_and_dispatch
'''
源代码
'''
    # model = varyQwenForCausalLM.from_pretrained(model_name, low_cpu_mem_usage=True, device_map='auto', trust_remote_code=True)
    # model.to(device='cuda',  dtype=torch.bfloat16)
'''
替换为
'''
    config = varyConfig.from_pretrained(model_name, trust_remote_code=True)
    with init_empty_weights():
        model = varyQwenForCausalLM._from_config(config, torch_dtype=torch.float16)
        no_split_modules = model._no_split_modules
        print(f"no_split_modules: {no_split_modules}", flush=True)
        map_list = {0:"30GB", 1:"30GB"}
        device_map = infer_auto_device_map(model, max_memory=map_list, no_split_module_classes=no_split_modules)
        ######### 通过device map加载模型
        model = load_checkpoint_and_dispatch(model, checkpoint=model_name, device_map=device_map)

# ————————————————————''
model.generate上方替换
'''
    #with torch.autocast("cuda", dtype=torch.bfloat16):
    with torch.autocast("cuda", dtype=torch.float16):


总结

Vary展示了很大的潜力,可以直接端到端输出结果。Vary可以根据用户的提示(prompt)直接输出不同格式的结果,如LaTeX、Word、Markdown等。另外Vary的思想破除了CLIP的限制。

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值