LVLMs是干什么的?其实非常好理解,简单来说就是GPT4o干的事情,输入一张图片和一句话,LVLMs会给出一个回答。GPT4目前是闭源的,目前开源的做法都是想法了接近gpt4的性能。而对于研究人员而言,没有强大的算力的支持,也只能在一些小规模的LVLMs上寻找一些方法上的创新。下面将介绍一种MOE-LLaVA的方法。
最近的研究表明,扩大视觉语言模型(LVLMs)可以有效地提高下游任务的性能。然而,现有的放大方法使计算中的每个令牌的所有模型参数都是活动的,这带来了大量的训练和推断成本。在这项工作中,提出了一种简单而有效的LVLMs训练策略。该策略创新性地解决了多模态稀疏性学习中常见的性能下降问题,从而构建了具有大量参数但计算量恒定的稀疏模型。大量的实验表明,MoE-LLaVA在各种视觉理解和物体幻觉基准测试中表现显著。值得注意的是,只有大约3B个激活的参数,MoE-LLaVA在各种视觉理解数据集上的性能与LLaVA-1.5-7B相当,甚至在对象幻觉基准上超过了LLaVA-1.5-13B。通过MoE-LLaVA,我们的目标是建立稀疏lvlm的基线,并为未来开发更高效和有效的多模态学习系统的研究提供有价值的见解。
1.现有的LVLMs扩大数据规模,能够提升其效果。现有的稠密模型不利于扩展数据规模 2.为了解决拓展问题,通常采用稀疏专家的网络机构,而稀疏专家并不利于训练
1.提出了一种大模型稀疏化的方式 2.提出了一种训练稀疏模型的方法
由浅入深的介绍模型的全部
这是一个普通的transfomer(大模型的底层都是这样的堆叠)。LLMS(大语言模型)是如何拓展得到LVLMS(大型视觉语言模型)的呢?
接上一个视觉编码器(CLIP),对视觉信息(图片)进行编码,得到的视觉信息,再通过调整维度和文本特征拼接在一起,输入LLMs,进行微调,就能达到视觉语言模型的效果。
稀疏化的做法:将transformer中的所有FFN换成一个路由+多个FNN 原因:神经网络中的参数,隐式存储了知识,但是有些知识推理的时候是不需要的,希望通过这种路由的方式,高效的利用里面的知识————该用的用,不该用的跳过不用。
形式化描述:
x0=[v1,v2,…,vP,…,t1,t2,…,tN],x0=[v1,v2,…,vP,…,t1,t2,…,tN],
xℓ′=MSA(LN(xℓ−1))+xℓ−1,ℓ=1,…,L,xℓ′=MSA(LN(xℓ−1))+xℓ−1,ℓ=1,…,L,
xℓ=MoE(LN(xℓ′))+xℓ′,ℓ=1,…,L,xℓ=MoE(LN(xℓ′))+xℓ′,ℓ=1,…,L,
Y=LN(xL).Y=LN(xL).
P(x)i=ef(x)i∑j=1Eef(x)j,P(x)i=∑j=1Eef(x)jef(x)i,
MoE(x)=∑i=1kP(x)i⋅E(x)i.MoE(x)=i=1∑kP(x)i⋅E(x)i.
在这个阶段,我们的目标是使图像token适应LLM,使LLM能够理解图像中的实例。为了实现这一点,我们使用MLP将图像token投射到LLM的输入域中,将图像补丁视为伪文本token。在这个阶段,LLM被训练来描述图像。在此阶段,不将MoE层应用于LLM
多模态指令数据调优是增强大型模型能力和可控性的关键技术。在这个阶段,LLM被调整为具有多模态理解的LVLM。我们使用更复杂的指令,包括图像逻辑推理和文本识别等任务,这些任务要求模型具有更强的多模态理解能力。MoE-LLaVA利用第二阶段的权值作为第三阶段的初始化,以减轻稀疏模型的学习难度。
作为初始化,我们多次复制 FFN 来初始化专家。当图像标记和文本标记被送入MoE层时,路由器计算每个token和专家之间的匹配权重。每个token然后由前 k 位专家处理,并根据路由器的权重通过加权求和来聚合输出。当前 k 位专家被激活时,剩余的专家保持沉默。这种建模方法形成了具有无限可能稀疏路径的MoE-LlaVA,提供了广泛的能力。
对几个用到的测试数据集进行介绍: VQA-v2 and GQA:评估模型对开放式短答案的视觉感知能力
VizWiz:视障人士提出的视觉问题
ScienceQA:多项选择题,评估科学问答
POPE:评估模型的幻觉程度
SEED-Bench:用多选题评估模型在图像和视频上的表现
MMBench:通过对多选答案进行全面随机排列,评估模型答案鲁棒性
实验主要在几个开源的视觉语言模型上进行比较。可以看到,该方法使用一半左右的参数量,实现相当的效果。
训练过程中,会下载phi-2预训练大语言模型的权重
这是phi2这个大语言模型的内部结构
训练过程中也会下载预训练视觉编码的权重
可以看到这是Clip视觉编码器的内部结构
训练的映射MLP参数
第二阶段训练时长
1.清洗数据,数据集含有很多文件时测试不需要的,编写正则表达式删除不需要的文件; 2.开源代码没有直接提供数据集,使用到的数据集为原数据集的一个子集; 3.原数据集非常大,因此做了数据清洗的工作,并将清洗后的数据集提供链接;
1.先将测试数据经过模型得到相应回答
for IDX in $(seq 0 $((CHUNKS-1))); do
deepspeed --include localhost:${GPULIST[$IDX]} --master_port $((${GPULIST[$IDX]} + 29501)) moellava/eval/model_vqa_loader.py \
--model-path ${CKPT} \
--question-file ${EVAL}/gqa/$SPLIT.jsonl \
--image-folder ${EVAL}/gqa/data/images \
--answers-file ${EVAL}/gqa/answers/$SPLIT/${CKPT_NAME}/${CHUNKS}_${IDX}.jsonl \
--num-chunks $CHUNKS \
--chunk-idx $IDX \
--temperature 0 \
--conv-mode ${CONV} &
done
2.再将回答利用GQA数据集提供的测试代码对输出结果进行测试
python3 eval_gqa.py --tier $SPLIT/${CKPT_NAME}/testdev_balanced \
--questions ${EVAL}/gqa/data/questions1.2/testdev_balanced_questions.json
提供了huggingface网页端的测试
1.训练,测试源代码(开源) 2.整理后GQA链接 3.提供模型的回答文件,可直接进行快速测试