多模态语言模型解释:视觉指令调整

Multi-modal language model interpretation visual instruction adjustment

从单模态到多模态LLMs的核心思想和方法介绍

LLMs在许多自然语言任务上展示了令人期待的零样本和少样本学习结果。然而,当涉及到需要视觉推理的任务时,LLMs处于劣势。与此同时,像SAM这样的大型视觉模型在感知方面取得了与LLMs在文本推理方面相同的进展。

Photo by Anne Nygård on Unsplash

将LLMs与感知推理能力相结合正朝着一种称为MLLM的新兴领域发展。这个领域有一个很有说服力的观点,即通过以多种感觉为补充的方式进行学习,可以增强LLMs的稳健性。就用户体验而言,多模态可以带来更高的简洁性。用户只需提供一张图像作为模型的输入,而不需要用一段长篇来描述,就能更有效地表达他们的意图。

一图胜千言 — 亨利克·易卜生

作为这些令人兴奋的新兴用例的示例,MiniGPT-4 [1]可以根据手写的文本说明创建网站,或者通过观察诱人的食物照片生成详细的菜谱。同样,MM-ReAct [2]在提示中加入了图像标题、密集标题、图像标记等形式的视觉信息,输入到LLM中。通过这种技术,现有的LLM可以增强对以视觉为条件的笑话和表情包的理解,视觉数学和文本推理以及空间和坐标理解,视觉规划和预测。

本系列文章将涵盖通过指令调优进行多模态零样本学习,以及使用多模态上下文学习进行少样本学习。之后还将介绍多模态CoT和视觉推理。

在本文中,我将介绍在多模态情境下指令调优的含义,下一篇文章中,我将讨论使用上下文学习进行少样本学习的MLLM。

使用指令调优的多模态零样本学习

经过微调的LLMs在未知任务上展现出有限的性能,尤其是在分布转移下。然而,为了更好地泛化到这些下游任务,我们可以使用指令调优。指令调优是一种使用增强学习对预训练的LLM进行微调的技术。相比之下,常见的做法是在通用数据集(如C4)上对预训练的LLMs进行掩码任务的预训练,然后在任务特定的数据集上进行微调,如翻译(Bart)[5]、代码生成(CodeT5)[4]和解析(ReportQL,HydraNet)[6, 7]。

T5的预训练目标。[3]

指令调优学习了一个广义的理解,即如何按照指令来实现任务,而不是将其拟合到特定任务上。这使得模型在为每个任务提供足够的指令的情况下具有更高的泛化能力。

将指令调优与预训练-微调和提示进行比较。[20]

另一方面,微调语言模型需要大量数据,这使得这种方法在领域特定数据有限的情况下不太适用。尽管合成数据用于微调似乎很有前途,但许多研究表明,这种方法容易受到偏见,并且缺乏对未知样本的泛化能力[8]。提示可以提高少样本学习的性能,尤其是在低数据情况下。

多模态指令数据集生成

在扩展指令调优到多模态的过程中,一个主要问题是缺乏数据。为了提供一个多模态指令数据集,研究人员要么改进现有的基准数据集,要么进行自我指令。Zhu等人在他们的工作“MiniGPT-4:利用先进的大型语言模型增强视觉语言理解”中发现,使用公开可用的图像-文本数据集会导致性能不佳。他们认为不连贯、重复和碎片化的句子会影响语言模型的对话表现。因此,MiniGPT-4采用了两步对齐过程。在第一阶段,他们使用从第一次预训练阶段得出的模型提示生成图像的详细描述。他们专门为对话使用情况设计了一个提示来生成描述。

###人类:<Img><ImageFeature></Img> 请详细描述这张图片。尽可能多地提供细节。说出你看到的一切。###助手:

这里的图像特征包括来自线性投影层的特征。当输出长度低于80个标记的阈值时,他们在对话之前加上继续

###人类:继续 ###助手:

按照这种方法,他们为Conceptual Caption数据集[10]中的约5000张图像生成了全面的描述。

生成的数据集仍然存在噪音并需要后处理。作者使用ChatGPT消除了不连贯的句子和词语重复等问题。

修正给定段落中的错误。删除任何重复的句子、无意义的字符、非英语句子等。删除不必要的重复。重新书写任何不完整的句子。如果输入段落已经正确,直接返回结果,不解释。如果输入段落已经正确,直接返回输入段落,不解释。

为了验证正确性,他们手动评估了图像描述并完善了生成的标题。最后,他们从生成的5000对中筛选出了近3500个满足质量标准的对。

与MiniGPT-4不同,Liu等人[11]只利用ChatGPT/GPT-4来提供多模态指令数据集。ChatGPT的上下文包括由标题和边界框组成的符号表示。

上下文类型1:标题一群人站在一辆黑色车旁,车上有各种行李。行李围绕在地下停车场里的一辆车周围。人们试图把所有的行李塞进一辆SUV里。这辆运动型多功能车停在公共车库里,正在为一次旅行打包行李。附近有一些带行李的人,他们正在用一辆面包车运送行李。上下文类型2:边界框人:[0.681, 0.242, 0.774, 0.694],人:[0.63, 0.222, 0.686, 0.516],人:[0.444, 0.233,0.487, 0.34],背包:[0.384, 0.696, 0.485, 0.914],背包:[0.755, 0.413, 0.846, 0.692],手提箱:[0.758, 0.413, 0.845, 0.69],手提箱:[0.1, 0.497, 0.173, 0.579],自行车:[0.282, 0.363,0.327, 0.442],汽车:[0.786, 0.25, 0.848, 0.322],汽车:[0.783, 0.27, 0.827, 0.335],汽车:[0.86, 0.254,0.891, 0.3],汽车:[0.261, 0.101, 0.787, 0.626]

标题从不同的角度描述了场景,而边界框则提供了关于对象的空间信息。利用这个上下文,他们生成了3种类型的指令数据集。首先是对话,其中包括生成一组关于图像内容的多样化问题。提示还考虑将问题限制为在给定上下文的情况下可以自信回答的问题。

messages = [ {"role":"system", "content": f"""你是一个视觉AI助手,你正在看到一张单独的图片。你看到的是由五个句子描述的相同的图片。将所有问题回答得像一个视觉AI助手正在看到图片并回答问题的语气。提出多样化的问题,并给出相应的答案。包括关于图片视觉内容的问题,包括对象类型、对象数量、对象动作、对象位置、对象之间的相对位置等。只包括那些可以自信回答的问题:(1) 可以在图片中看到问题所询问的内容并且可以自信回答;(2) 可以从图片中确定问题所询问的内容不在图片中。不要问任何不能自信回答的问题。还包括与图片内容相关的复杂问题,例如询问图片中对象的背景知识,询问讨论图片中发生的事件等。同样,不要询问关于不确定的细节。当回答复杂问题时,提供详细的答案。例如,给出详细的示例或推理步骤,使内容更有说服力和组织良好。如果需要,可以包含多个段落。"""})for sample in fewshot_samples:messages.append({"role":"user", "content":sample[‘context’]})messages.append({"role":"assistant", "content":sample[‘response’]} )messages.append({"role":"user", "content":‘\n’.join(query)})

下一个类型被称为“详细描述”,旨在为图像生成全面的解释。给定一张图像,他们从预定义问题列表中随机抽取一个问题,生成详细的描述。

• "详细描述下面的图像"• "提供给定图像的详细描述"• "对您看到的图像进行详细解释"• "对呈现的图像进行全面的概述"• "对图像进行彻底分析"• "在详细的方式下解释图像的各个方面"• "以详细的方式澄清显示图像的内容"• "使用详细的描述来表征图像"• "详细分解图像的元素"• "详细介绍图像的重要细节"• "用丰富的描述性叙述描绘图像"• "以精确的方式讲述图像的内容"• "全面详细地分析图像"• "通过描述性解释来说明图像"• "仔细检查图像并分享其细节"• "为给定的图像写一个详尽的描写"

最后,“复杂推理”在这里指的是回答需要遵循逻辑的逐步推理过程的深入问题。为此,他们使用类似于“对话”的提示,但更加强调推理。

你是一个可以分析单个图像的AI视觉助手。你会收到五个句子,每个句子都描述了你正在观察的同一图像。此外,还会给出图像中特定对象的位置,以及详细的坐标。这些坐标以边界框的形式表示,表示为(x1,y1,x2,y2),其中的浮点数范围从0到1。这些值对应于左上角的x,左上角的y,右下角的x和右下角的y。任务是使用提供的标题和边界框信息,创建一个关于图像的合理问题,并详细提供答案。创建超越描述场景的复杂问题。要回答这样的问题,首先需要理解视觉内容,然后根据背景知识或推理,解释为什么事物会以这种方式发生,或者提供指南和帮助用户的请求。通过不在问题中直接包含视觉内容细节来使问题具有挑战性,以便用户需要首先进行推理。不要直接提及边界框坐标,而是利用这些数据用自然语言解释场景。包括对象计数、对象位置、对象之间的相对位置等细节。在使用标题和坐标的信息时,直接解释场景,并不提及信息来源是标题还是边界框。始终以你直接查看图像的方式回答。

通过这种方法,他们生成了总共158K的语言-图像多模态数据集,其中包括58k个对话样本,23k个详细描述样本和77k个复杂推理样本。

另一种提供多模态指令数据集的方法是将指令模板应用于已有的语言-图像数据集。Xu等人的MultiInstruct[12]使用已有的超过47个任务的基准测试集来创建一个新的多模态指令数据集,以使LLMs学习基本技能,如对象识别、视觉关系理解、文本-图像对应等。

MultiInstruct数据集覆盖了11个广泛的类别。 [12]

正如你可能猜到的,这些基准测试集中的一些可能会重叠,因此作者考虑了将复杂任务分解为简单任务的可能性。

例如,视觉对接要求模型为给定图像中的某个区域生成标题。我们派生了另外两个与这个复杂技能相关的任务:固定标题选择,它是一个更简单的技能,要求模型从多个候选标题中选择相应的标题,以及视觉对接选择,它要求模型基于给定的标题从提供的候选区域中选择相应的区域[12]。

然后,为每个任务分配2-3个人工标注员,为训练和评估编写5个特定任务的说明。指导以统一的格式形成,使用<TEXT>、<REGION>和<OPTION>作为占位符。这里,<TEXT>是指令的占位符,<REGION>是区域特定信息的占位符,<OPTION>仅用于分类任务[12]。

Otter [13],另一方面,从MMC4开始,其动机是在数据集中使用上下文。MMC4由从网页派生的图像文本对和页面的“上下文”作为剩余文本组成。类似的例子被分组形成一个上下文示例集。

MMC4和MIMIC-IT数据集中的数据格式。[13]

简而言之,文献中常见的为多模态指令数据集进行提供的方法是自我指导,其中涉及使用预训练网络生成指令数据。相反,其他人已经适应了现有的视觉和多模态学习基准。

继数据集适应和生成用于微调LLMs的视觉指令数据集之后,我们需要创建一个接口来向LLMs注入多模态。

适应LLMs以进行多模态提示

由于大幅改变LLMs的架构并从头开始训练具有挑战性且成本高昂,我们可以看到类似于参数高效微调[14]的方法在注入视觉嵌入方面的占主导地位。

软提示与投影层是MiniGPT-4 [11]中用于嵌入视觉信息的PEFT方法之一。MiniGPT-4利用Vicuna作为语言解码器,并采用了与预训练的Q-Former相结合的ViT。

一般而言,软提示是指在模型的输入嵌入之前添加一个可训练张量,以便使用反向传播进行特定任务的优化。这个张量的长度大致可以为1到150个标记。

def soft_prompted_model(input_ids):    x = Embed(input_ids)    x = concat([soft_prompt, x], dim=seq)    return model(x)

软提示的另一个变体是前缀微调。与前一种方法不同,可训练张量将被预先添加到所有层的隐藏状态之前。由于直接操纵所有层,Li和Liang [15]发现优化预添加张量时存在不稳定性。因此,他们在直接将张量预添加到网络之前使用了一个中间FFN。

def transformer_block_for_prefix_tuning(x):    soft_prompt = FFN(soft_prompt)    x = concat([soft_prompt, x], dim=seq)    return transformer_block(x)
MiniGPT-4的架构。[9]

回到MiniGPT-4,作者通过一个FFN将预训练的视觉编码器的输出作为软提示注入到Vicuna中。在他们的训练的第一阶段,视觉编码器和语言解码器网络被冻结,而只有一个投影层被训练。

@registry.register_model("mini_gpt4")class MiniGPT4(Blip2Base):    def __init__(...):        self.llama_proj = nn.Linear(            self.Qformer.config.hidden_size, self.llama_model.config.hidden_size    )  def encode_img(self, image):          ...      with self.maybe_autocast():          image_embeds = self.ln_vision(self.visual_encoder(image)).to(device)          image_atts = torch.ones(image_embeds.size()[:-1], dtype=torch.long).to(device)            query_tokens = self.query_tokens.expand(image_embeds.shape[0], -1, -1)          query_output = self.Qformer.bert(              query_embeds=query_tokens,              encoder_hidden_states=image_embeds,              encoder_attention_mask=image_atts,              return_dict=True,          )          inputs_llama = self.llama_proj(query_output.last_hidden_state)          atts_llama = torch.ones(inputs_llama.size()[:-1], dtype=torch.long).to(image.device)      return inputs_llama, atts_llama  def forward(self, samples):        image = samples["image"]        img_embeds, atts_img = self.encode_img(image)        if hasattr(samples, 'question_split'):  # VQA dataset            print('VQA Batch')            vqa_prompt = '###Human: <Img><ImageHere></Img> '            img_embeds, atts_img = self.prompt_wrap(img_embeds, atts_img, vqa_prompt)        elif self.prompt_list:            prompt = random.choice(self.prompt_list)            img_embeds, atts_img = self.prompt_wrap(img_embeds, atts_img, prompt)              ...        to_regress_embeds = self.llama_model.model.embed_tokens(to_regress_tokens.input_ids)        inputs_embeds = torch.cat([bos_embeds, img_embeds, to_regress_embeds], dim=1)        attention_mask = torch.cat([atts_bos, atts_img, to_regress_tokens.attention_mask], dim=1)        with self.maybe_autocast():            outputs = self.llama_model(                inputs_embeds=inputs_embeds,                attention_mask=attention_mask,                return_dict=True,                labels=targets,            )        loss = outputs.loss        return {"loss": loss}

为了对齐投影层,他们使用了图像-文本配对数据集,例如Conceptual Caption、SBU和LAION,进行了近20,000个训练步骤,批量大小为256,覆盖了约500万个样本[9]。

类似地,X-LLM[16]将多个冻结的单模态编码器(用于图像、语音和视频)和一个冻结的LLM通过专用接口对齐。此外,他们不使用软提示,而是使用Q-Former将视觉信息转换为具有准语言嵌入的序列,作为提示的一部分。

X-LLM网络架构。[16]

BLIP-2中的Q-Former被用作图像和视频模态的接口,并需要进行调整以将上述模态转换为语言。这是在训练的第一个阶段完成的,他们在此阶段使用了图像-标题对和视频-标题对对模块进行预训练。由于这两种模态相似,他们重用了图像接口的参数,但在视频-文本数据上进一步微调[16]。对于语音接口,他们使用了[17]中介绍的CIF机制将语音话语转换为语言。然而,他们发现尽管BLIP2使用英文数据进行了预训练,但在第二阶段仍然表现良好。因此,作者选择重用Q-Former的预训练参数,并仅训练一个基于CIF的ASR模型作为语音编码器。

Q-former模块配备了一个适配器模块,用于对齐准语言嵌入的维度和LLM的嵌入维度[16]。

在第二阶段,通过1400万个中文图像-文本对、AISHELL-2和VSDial-CN数据集作为ASR训练数据集,进一步将每个接口模块与冻结的LLM对齐。

相反,Otter通过几个交叉门控注意力层来连接视觉和语言信息,并在上下文示例之间建立注意力,同时保持视觉编码器和语言解码器冻结[13]。

OpenFlamingo架构。[18]

在Flamingo中,LLM解码器生成的文本是基于Perceiver Resampler生成的视觉信息嵌入进行条件化的。它接受从视觉编码器模型中编码的任意数量的图像或视频特征,并生成一个固定大小的输出,以帮助减少交错冻结的LM块的视觉-文本交叉注意力模块的复杂性。

def gated_xattn_dense(  y, # 输入语言特征  x, # 输入视觉特征  alpha_xattn, # xattn门控参数-初始为0  alpha_dense, # f fw门控参数-初始为0.):    # 1. 门控交叉注意力    y = y + tanh(alpha_xattn) * attention(q=y, kv=x)    # 2. 门控前馈(密集)层    y = y + tanh(alpha_dense) * ffw(y)        # 语言上的常规自注意力 + FFW    y = y + frozen_attention(q=y, kv=y)    y = y + frozen_ffw(y)return y # 输出带有视觉信息的语言特征

上述门控密集交叉注意力模块使用了LSTM中使用的tanh门控机制[19]。它通过学习的alpha_xattn参数控制将注意力结果添加到来自残差连接的y中。在初始化时,注意力和ffw的输出仅仅是随机的,并且可能导致训练不稳定。而门控机制中的alpha在训练开始时初始化为0,没有任何效果。

回顾一下,PEFT的痕迹是适应LLMs进行多模态的主要方法。在某些情况下,视觉嵌入直接表示在提示中,或者与Flamingo一样,LLM的架构更加灵活以换取更好的准确性。这个领域相对较新,还有许多尚未探索的研究方向。

在系列的下一篇文章中,我将专注于使用上下文学习的多模态少样本学习。

我将在计算机科学领域撰写更多文章。如果你对这个行业和我一样热情,并且觉得我的文章有价值,请务必点击VoAGI上的关注按钮,并在评论中继续交流💬。请随时在LinkedIn上直接联系我!

[1] Zhu, D., Chen, J., Shen, X., Li, X., & Elhoseiny, M.(2023)。Minigpt-4:利用先进的大型语言模型增强视觉语言理解。arXiv预印本arXiv:2304.10592。

[2] Yang, Z., Li, L., Wang, J., Lin, K., Azarnasab, E., Ahmed, F., … & Wang, L.(2023)。Mm-react:为多模态推理和操作促使ChatGPT。arXiv预印本arXiv:2303.11381。

[3] Raffel, C., Shazeer, N., Roberts, A., Lee, K., Narang, S., Matena, M., … & Liu, P. J.(2020)。探索使用统一的文本对文本转换器进行迁移学习的极限。机器学习研究杂志,21(1),5485–5551。

[4] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A., Levy, O., … & Zettlemoyer, L.(2019)。Bart:用于自然语言生成、翻译和理解的去噪序列到序列预训练。arXiv预印本arXiv:1910.13461。

[5] Lewis, M., Liu, Y., Goyal, N., Ghazvininejad, M., Mohamed, A., Levy, O., … & Zettlemoyer, L.(2019)。Bart:用于自然语言生成、翻译和理解的去噪序列到序列预训练。arXiv预印本arXiv:1910.13461。

[6] Moezzi, S. A. R., Ghaedi, A., Rahmanian, M., Mousavi, S. Z., & Sami, A.(2023)。基于Transformer的深度学习在生成结构化放射报告方面的应用。数字成像杂志,36(1),80–90。

[7] Lyu, Q., Chakrabarti, K., Hathi, S., Kundu, S., Zhang, J., & Chen, Z.(2020)。用于文本到SQL的混合排名网络。arXiv预印本arXiv:2008.04759。

[8] Ravuri, S., & Vinyals, O.(2019)。用于条件生成模型的分类准确率评分。神经信息处理系统的进展,32。

[9] Zhu, D., Chen, J., Shen, X., Li, X., & Elhoseiny, M.(2023)。Minigpt-4:利用先进的大型语言模型增强视觉语言理解。arXiv预印本arXiv:2304.10592。

[10] Changpinyo, S., Sharma, P., Ding, N., & Soricut, R.(2021)。Conceptual 12m:推动面向长尾视觉概念的Web规模图像-文本预训练。在IEEE/CVF计算机视觉与模式识别会议论文集中(pp. 3558–3568)。

[11] Liu, H., Li, C., Wu, Q., & Lee, Y. J.(2023)。视觉指导调整。arXiv预印本arXiv:2304.08485。

[12] Xu, Z., Shen, Y., & Huang, L.(2022)。Multiinstruct:通过指令调整改进多模态零样本学习。arXiv预印本arXiv:2212.10773。

[13] Li, B., Zhang, Y., Chen, L., Wang, J., Yang, J., & Liu, Z.(2023)。Otter:一种具有上下文指导调整的多模态模型。arXiv预印本arXiv:2305.03726。

[14] Lialin, V., Deshpande, V., & Rumshisky, A.(2023)。从大到小:参数高效微调指南。arXiv预印本arXiv:2303.15647。

[15] 李晓亮,梁平(2021)。前缀调优:优化生成任务的连续提示。arXiv预印本arXiv:2101.00190。

[16] 陈锋,韩敏,赵慧,张强,石静,徐松,许彬(2023)。X-llm:将多模态视为外语进行高级大型语言模型的引导。arXiv预印本arXiv:2305.04160。

[17] 董亮,徐彬(2020年5月)。连续的集成-火力模型用于端到端语音识别。在ICASSP 2020–2020 IEEE国际声学、语音和信号处理大会(ICASSP)(第6079-6083页)。IEEE。

[18] Anas Awadalla, Irena Gao, Josh Gardner, Jack Hessel, Yusuf Hanafy, 朱婉蓉(2023)。OpenFlamingo:用于训练大型自回归视觉-语言模型的开源框架。

[19] Hochreiter, S., & Schmidhuber, J.(1997)。长短时记忆。神经计算,9(8),1735–1780。

[20] 魏晋,Bosma, M., 赵炜翌,Guu, K., 余爱文,Lester, B., … & Le, Q. V.(2021)。微调语言模型是零样本学习器。arXiv预印本arXiv:2109.01652。