简单聊聊多模态大语言模型MLLM
阅前声明:
本文是笔者阅读相关文章后,按个人理解的总结。如有不正之处,欢迎指正!
参考文章:
https://zhuanlan.zhihu.com/p/674698482
https://zhuanlan.zhihu.com/p/1903914328081540180
MLLM经典综述:A Survey on Multimodal Large Language Models
MLLM的训练过程:
MMLLM训练过程中,主要包含三个步骤:预训练->指令微调->对齐微调
这三个步骤的主要功能分别是:
预训练:基于一般的LLM模型,模态编码器,模态接口,这一步主要的功能实现MLLM对多模态的通用世界知识的认识;
指令微调:区别于一般的SFT(有监督微调)方法,使用“指令”辅助训练(也即类似提示词工程),提升MLLM的泛化能力。实现zero-shot的能力(即零样本性能,在没有经历过训练的数据上也能有较好的表现)。
对齐微调:这一步相当于对MLLM模型能力的进一步修正,约束模型的输出范围,让模型的输出更加规范,符合人类社会的伦理要求之类。换言之,就是要让模型的输出符合人类偏好,修正模型的不良行为。
个人理解,对齐微调有点类似LLM中的RAG功能,让MLLM只输出某个范围内的知识。
下面进一步介绍一下这三个步骤的主要内容:
预训练:
预训练过程主要包含三个结构:LLM模型,模态编码器,模态接口
LLM:
传统的LLM只有文本输入文本输出的功能,输入端和输出端的数据类型都是文本。LLM作为MLLM的关键结构之一,如何让LLM能够理解其他类型的数据,这是关键的一步,这一步的实现主要依靠模态编码器。
另外,关于LLM,这里有一点就是LLM的架构问题。一般分为密集型模型架构和稀疏模型架构。这两种架构的区别在于:“训练时有多少比例的模型参数会被激活参与计算”。有点类似于传统神经网络中的drop_out操作。主流的稀疏模型架构就是混合专家模型(MoE),其主要还是基于Transformer架构。具体这种模型是什么原理,如何实现稀疏训练的,读者可自行了解。使用稀疏模型的一个好处就是:可以选择性的激活参数来扩展总参数大小,而不会增加计算成本。这种架构貌似正成为主流。
模态编码器:
这个模型的结构其实就是将不同类型的数据进行转化。一般是通过向量化,映射到语义空间的方式,然后通过训练,尽可能将其他数据类型的语义向量和文本向量在语义空间进行对齐。这部分可以参考我的另外一篇关于“语义空间”的介绍。
这里有非常多的经典模态编码器,如CLIP等。许多MLLM都是直接使用这些经典的预训练模态编码器的。
模态接口:
前文提到,模态编码器是将具有相同含义的不同类型数据映射到一个语义空间,让这些数据所对应的语义向量尽可能的接近。但这还并不能将其他数据类型和文本数据类型衔接起来,然后输入到LLM中训练。比如,“一张画有猫的图片”和“这是一只猫的文本”,尽管通过模态编码器,这两个数据所对应的语义向量在语义空间非常接近,但他们仍无法重合,无法关联起来。虽然他们很近,但MLLM并不知道这二者可以是等同。此时,就需要模态接口,模态接口就相当于将这两个向量进行映射,使他们一一对应起来。让“一张画有猫的图片”和“这是一只猫的文本”所对应的两个语义向量具有等同关系。
模态编码器经过大量的训练,就能够知道该将哪些语义向量关联起来。这样,就实现了其他类型数据到文本类型数据的转化。
最后,关联起来之后,一种常见的处理方式就是将模态编码器输出的特征转化为token和文本token连接在一起,输入给LLM进行下一步的处理。
指令微调:
这里的“指令”其实是一种标准结构化的数据类型,也即是一些模版数据,数据集就是许多条指令。用这些数据去进行微调训练,这种训练方式有点类似于提示词功能。这里需要介绍一下传统的SFT(监督微调)和指令微调训练的区别,以及为什么在MLLM的训练中使用这种微调方式。
指令数据具有类似这样的结构:
介绍:<用户的问题>
输入:{<图片>,<文本>...}
输出:<...>
首先,这里需要注意的一点是,指令微调也是一种监督学习策略。只不过他和一般的监测学习策略有些不同。
比如,对于一条指令训练数据,假设指令的问题部分是:“将这段文本分类为消极或积极”,另外一个指令数据的问题部分是:“判断这段文本的情感倾向”。通过提供大量这种表达方式不同,但含义相同的句子,模型通过学习就能够自动总结出这些句子的核心要点,当出现一个含义相同即使陌生的问题时,MLLM也能够题解“问题”是什么,这就显著提高了模型的泛化能力和Zero-Shot能力。这里和一般的监督学习不同的点在于,通过指令这种数据格式,训练的过程其实是利用LLM对自然语言的理解能力的。这就像在训练一个已经掌握知识的学生,老师只需要通过指令的形式进行点拨,就能理解和完成新的任务。
而传统的监督学习,需要在大量的数据和标签中,进行一一映射的关系学习,这个过程往往是从空白开始的,且在训练的过程中,并没有对模型本身能力的复用。此外,传统监督模型,本质上是模型在记忆许多输入和输出关系的映射,当训练数据不足时,模型的泛化能力往往很差。而指令微调训练的模型,可以根据语义和逻辑,结合自身知识进行推理和响应,泛化能力更前。
对齐微调:
关于对齐微调,主要的方法有:强化学习与人类反馈(RLHF)和直接偏好优化(DPO)。
对于对齐微调这一步的目的并不难理解,再具体实现上,归根到底还是有奖有罚类的监督学习,让模型的输出符合人类要求规范,在此不做进一步的介绍。
写在最后:
在简单了解了MLLM的原理后,笔者其实对于现有的传统神经网络算法产生了一定担忧。在最初,原以为多模态大语言模型是采用传统视觉模型/音频模型等+LLM的方式实现。但现实是:其将数据采取了新的利用方式,将多模态的数据token化了去处理。这种处理方式和传统的神经网络算法是完全不同的。
笔者近期也测试了豆包的MLLM,发现其对数字识别,图像分类,危险检测等这些粗粒度领域的视觉问题,有非常高的准确度,而且对图片的质量要求,鲁棒性,域自适应能力都非常强。这对于该领域的传统神经网络方法是一个巨大的打击。也无法否认,现在大模型方向越来越主流。
但值得庆幸的是,对于一些细粒度问题,以及生成需求上,现阶段的MLLM还不能够很好的胜任。比如一个非常简单的任务:利用红色检测框,圈出图片中的某个物体,返回处理后的图像。MLLM不仅无法准确圈出目标对象,甚至还会修改原始输入的图片。
究其原因,现阶段的大模型对于多模态->文本的理解,这一步已经做的越来越好了;但是对于文本理解->多模态,仍有较大的提升空间。且本质上,这是一个将图片数据打散又重新还原的过程,目前还存在较大问题。