九:多模态大模型微调
多模态大模型的典型架构有哪几部分?¶
一个典型的多模态大模型(MLLM)通常包含三个核心组件,它们各司其职,协同完成跨模态理解与生成任务。
| 组件 | 功能 | 代表模块 |
|---|---|---|
| 视觉编码器(Vision Encoder) | 将输入的图像或视频转化为富含语义的视觉特征(一系列向量)。 | ViT(Vision Transformer)、SigLIP、OpenCLIP ConvNext |
| 跨模态连接器(Connector / Projector) | 将视觉特征从视觉编码器的“语义空间”映射到语言模型能够理解的“词嵌入空间”,起到“翻译”或“对齐”的作用。 | 线性投影(LLaVA)、MLP、Q-Former(BLIP-2)、感知重采样器(Flamingo) |
| 语言模型(LLM Backbone) | 接收对齐后的视觉token和文本token,进行多模态理解和文本生成。通常是预训练的通用大语言模型。 | LLaMA、Vicuna、Qwen、Mistral |
核心工作流:图像 → 视觉编码器 → 视觉特征向量 → 跨模态连接器 → 视觉token(与文本token同维) → 与文本指令的token拼接 → 输入LLM → 生成文本回答。
这个架构设计的精妙之处在于,它允许LLM在几乎不修改自身结构的情况下,“看到”了图像,并将视觉信息作为生成文本的上下文。
LLaVA的架构是怎样的?视觉信息如何注入到LLM中?¶
LLaVA(Large Language and Vision Assistant)是MLLM的经典代表,以其简洁高效的架构设计著称。它将视觉信息注入LLM的方式可以概括为:将图像“翻译”成LLM能读懂的“外语单词”。
LLaVA架构:
-
视觉编码器:使用预训练的CLIP ViT-L/14。将输入图像分割为patch并编码为一系列特征向量。
-
跨模态连接器:一个简单的单层线性投影层(或2层MLP)。它将ViT输出的每个图像patch的特征向量,直接映射到与LLM词嵌入维度相同的向量。
-
语言模型:使用Vicuna等预训练LLM。
视觉信息注入流程:
-
图像token化:图像经过ViT后,被转换为 NN 个特征向量(例如 N=256N=256)。每个向量通过线性投影层,被映射为一个与LLM词嵌入维度(如4096)相同的视觉token。
-
序列拼接:将映射后的 NN 个视觉token,直接作为“前缀”插入到文本指令的token序列之前。最终输入LLM的序列变为:
[视觉token_1, ..., 视觉token_N, 文本指令token_1, ...]。 -
统一自回归生成:LLM以标准的自回归方式处理这个混合序列。由于视觉token和文本token已经处于同一嵌入空间,LLM可以通过自注意力机制,让文本token关注到相关的视觉token,从而理解图像内容,并生成回答。
LLaVA的巧妙之处在于其极简的投影层设计,证明了即便是最简单的线性变换,也足以在对齐良好的视觉和语言模型之间架起桥梁。
什么是“视觉编码器”?常用的有哪些(ViT、SigLIP等)?¶
视觉编码器是多模态模型的“眼睛”,其任务是将原始的、像素构成的图像,转化为富含语义信息的特征向量序列。这些特征向量捕捉了图像中的物体、场景、属性等信息,是后续跨模态理解的基础。
常用视觉编码器:
-
ViT(Vision Transformer):将图像分割成一系列固定大小的块(patches),然后将这些块序列输入标准的Transformer编码器中进行处理。它通过自注意力机制捕获全局上下文,效果优异,是现代MLLM的基石。CLIP的视觉部分就是基于ViT。
-
SigLIP:是对CLIP的改进,其核心创新在于将CLIP中的对比学习损失函数由softmax-based改为sigmoid-based,这使得模型在更大batch size和更噪声的数据上训练更稳定。SigLIP模型在多项视觉-语言基准上表现出色,常被用作更强的基础视觉编码器。
-
OpenCLIP:是OpenAI CLIP的开源复现和改进版本,在更大规模的数据集(如LAION-2B)上训练,性能强大。
-
ConvNeXt:一种现代化的卷积神经网络架构,融入了Transformer的设计思想,在保持CNN效率优势的同时,达到了与ViT相媲美的性能。Flamingo模型就是用它作为视觉编码器。
这些编码器通常在海量的图文对数据上通过对比学习进行预训练,使得图像和其对应文本描述的向量表示在嵌入空间中彼此靠近。这个预训练过程是它们能被用于MLLM的前提,因为此时它们的视觉特征已经与语言有了初步的语义对齐。
在多模态微调中,为什么通常先对齐视觉和语言,再进行指令微调?¶
将多模态微调分为两个阶段——“模态对齐”和“指令微调”——是一种稳定、高效且性能最优的策略,背后有深刻的技术原因。

-
特征空间的分裂与鸿沟:预训练好的视觉编码器和LLM,其内部表征分别位于完全不同的向量空间。视觉编码器输出的特征代表的是图像的视觉语义,而LLM的输入要求的是在语言分布上的词嵌入。如果直接进行指令微调,LLM需要同时完成两个任务:①学习如何理解输入的“外语”(视觉token);②学习如何遵循指令。这会导致优化过程极不稳定,难以收敛。
-
先“翻译”后“交流”:“对齐阶段”的目标非常纯粹——训练跨模态连接器,学会将视觉特征“翻译”成LLM能理解的“语言”。这一阶段,视觉编码器和LLM均被冻结,只训练中间那层小小的投影层。这相当于在两种语言之间先训练一个“同声传译员”。当翻译建立好后,LLM在指令微调阶段就可以专注于“如何根据内容回答问题”,而不需要分心去“学习外语”。
-
防止灾难性遗忘:视觉编码器和LLM都是在各自领域海量数据上预训练的珍宝。如果在指令微调初期就解冻它们,随机初始化的连接器会产生巨大的误导性梯度,严重破坏其原有知识。分阶段训练可以完美保护这些预训练能力。
实践案例(LLaVA):¶
-
阶段一(对齐):使用大量“图像-简短标题”对,冻结视觉编码器和LLM,只训练线性投影层。这一阶段让LLM初步“看见”并描述图像。
-
阶段二(指令微调):使用多样化的“多模态指令-回答”对,冻结视觉编码器,但解冻投影层和LLM进行联合训练。这一阶段赋予了模型视觉指令遵循和多轮对话的能力。
多模态对齐阶段,一般训练哪些参数?为什么要冻结视觉编码器和LLM?¶
在多模态对齐阶段,标准做法是:只训练跨模态连接器(投影层),而将视觉编码器和LLM完全冻结。
为什么要冻结?
-
保护预训练知识的完整性:视觉编码器的视觉理解能力(识别物体、场景、文字等)和LLM的语言能力(语法、知识、推理)都极其宝贵且训练成本高昂。在训练的初始阶段,连接器还未收敛,如果此时解冻两边,其产生的噪声梯度会像锤子一样重击这些已训练好的参数,造成不可逆的灾难性遗忘。
-
聚焦于“翻译”任务:对齐阶段的目标非常单一——让连接器学会将视觉特征映射到语言空间。冻结视觉编码器和LLM,使得所有反向传播的梯度都集中在连接器上,训练信号极其集中,收敛速度极快。这保证了连接器能以最高效的方式完成它的唯一使命。
-
训练稳定性:只训练一个极小的连接器(参数量通常为几百万),意味着优化问题极其简单和稳定。可以使用较大的学习率,训练过程平滑,几乎不会出现损失震荡。
一旦这个“翻译官”训练好了,在随后的指令微调阶段,我们通常会解冻LLM(有时也会解冻连接器,视策略而定),让整个模型在高质量多模态指令数据上进行深度适配。
LLaVA-1.5中的MLP投影层是怎样的?它有什么作用?¶
LLaVA-1.5对其原始架构进行了关键升级,其中最重要的一项就是将简单的线性投影层替换为一个2层的多层感知机(MLP)投影层。
LLaVA-1.5的MLP投影层结构:
-
它由两个线性层和一个GELU激活函数组成。
-
作用:它将视觉编码器(CLIP ViT-L)最后一层输出的每个图像patch的特征向量(维度为1024),映射到与LLM(Vicuna)词嵌入维度相同的空间(维度为4096)。
从线性到MLP的升级意义:
-
更强的非线性拟合能力:一个简单的线性投影矩阵只能学习一种“旋转和缩放”的映射关系。而2层MLP引入了非线性,使得连接器能够学习更加复杂的特征变换。它可以将视觉编码器中较为扁平的、关注整体语义的特征,更好地映射为LLM所需的、带有更强序列化信息的token表示。
-
提升了模型性能上限:LLaVA-1.5通过这个简单的改进,在多项基准上取得了显著提升。它使得视觉信息在注入LLM时损失更小,让LLM能够更精细地“看清”图像中的细节,从而给出更准确的回答。这证明了更强的连接器对提升多模态模型最终性能的重要性。
Q-Former(BLIP-2)是如何桥接视觉和语言的?与线性投影相比有何优势?¶
Q-Former(Querying Transformer) 是BLIP-2模型提出的跨模态连接器。它不是简单地将所有视觉特征压缩,而是通过一种可学习的查询向量来主动“询问”图像中的关键信息,实现更高效的、更语义化的桥接。
工作原理:
-
可学习的查询向量(Learnable Queries):Q-Former内部维护一组固定数量(如32个)的、随机初始化的查询向量。
-
交叉注意力提取:这些查询向量作为Q,输入自注意力层。同时,冻结的视觉编码器输出的图像特征作为K和V,输入Q-Former的交叉注意力层。查询向量通过与图像特征的交互,主动地从图像中提取出与文本最相关的信息。
-
输出压缩的视觉token:经过Q-Former处理后,这32个查询向量的输出,就成为了压缩后的视觉token。这个数量(32)远小于原始ViT输出的patch数量(如256)。这些token随后被映射并输入到LLM中。
与线性投影相比的优势:
-
信息压缩,效率更高:线性投影(如LLaVA)保留了所有图像patch的视觉token(通常256个或更多),导致输入LLM的序列极长,计算开销巨大。Q-Former通过交叉注意力机制,将海量的视觉信息压缩进极少数的查询向量中(如32个),极大缩短了LLM需要处理的序列长度,推理速度更快、显存更省。
-
更“智能”的特征提取:线性投影是对所有patch进行的无差别维度映射。而Q-Former的查询向量通过交叉注意力,可以学会根据上下文动态地关注图像中的不同区域,提取出对理解当前任务最关键的语义信息,而不是事无巨细地编码每个像素块。
-
多任务预训练:Q-Former本身可以在冻结视觉和语言模型的情况下,通过多种预训练任务(图文匹配、图文对比学习、图像描述生成)进行训练,从而具备了更强的语义对齐能力。
Flamingo模型的感知重采样器(Perceiver Resampler)是如何工作的?¶
Flamingo(DeepMind)采用了另一种精巧的视觉信息压缩与注入机制:Perceiver Resampler(感知重采样器)。它的设计初衷和Q-Former类似:将变长的、数量庞大的视觉特征,压缩为固定数量的、可供LLM消费的视觉token。
工作原理:
-
处理变长视觉输入:Flamingo不仅可以处理单张图片,还能处理视频(多帧图像)。因此,输入的视觉特征数量可能极其庞大且不固定。
-
固定大小的学习查询(Learned Latent Queries):感知重采样器也维护一组固定数量(如64个)的可学习潜在查询向量。这些向量的数量是恒定的,不受输入图像/视频帧数的影响。
-
交叉注意力压缩:这组查询向量作为Q,所有输入图像的视觉特征(展平后)作为K和V,在感知重采样器内部进行交叉注意力操作。
-
重采样输出:通过交叉注意力,所有视觉信息被“重采样”并压缩到这64个查询向量的输出中。这64个输出向量就作为最终的视觉token。
关键优势:
-
固定长度的视觉上下文:无论输入多少张图片或视频帧,输入给LLM的视觉token数量始终固定(如64个)。这使得LLM的计算图是静态的,非常利于优化和部署,且不会因为输入过多图像而导致显存溢出。
-
时序信息的隐式融合:当处理视频时,多帧图像的特征被一同输入,查询向量在交叉注意力中能够自然地捕获帧与帧之间的时序动态信息,并将它们压缩进固定长度的token中。
-
解耦视觉与语言:通过这种压缩,它优雅地将视觉输入的变长问题与LLM的固定计算范式解耦,是实现“Any-to-Any”多模态交互的关键技术。
多模态指令微调数据如何构造?一般包含哪些格式?¶
多模态指令微调数据的目标是教会模型根据图像/视频内容,执行用自然语言描述的多样化任务。它不再是简单的“图像-标题”对,而是更复杂的多轮、多任务、带约束的对话。
数据构造方法:
-
自动生成(主流):利用现有强大的纯文本LLM(如GPT-4),将图像的内容表示(如物体检测框、密集描述、OCR文字)作为上下文提供给LLM。然后,让LLM扮演“用户”和“助手”的角色,围绕这张图片进行有深度的、多样化的对话,从而自动生成高质量的指令-回答对。LLaVA和ShareGPT4V的早期数据都是这样构造的。
-
人工精写:对于安全性要求极高的场景或复杂推理任务,由人工专家直接看图编写指令和回答。质量最高,但成本高昂。
-
从现有数据集转换:将传统的视觉问答(VQA)、图像描述(Captioning)、指代表达(Referring Expression)等学术数据集,通过设计模板,转换为统一的指令-回答格式。
一般包含的格式:
-
单轮视觉对话:
<image> 这张图片里有什么?→一位女士在公园里遛狗。 -
多轮视觉对话:
<image> 图中的狗是什么品种?→看起来是一只金毛寻回犬。/它大概多大了?→从体型判断,可能还是一只幼犬。 -
视觉推理:
<image> 这个人为什么会笑?→因为他刚刚收到了礼物。 -
视觉+文本约束任务:
<image> 用JSON格式输出图中所有水果的名称和数量。→{"苹果": 3, "香蕉": 2} -
OCR与文字理解:
<image> 这家餐厅的招牌菜是什么?→从菜单上看,招牌菜是黑椒牛排。 -
多图/视频理解:
<image1> <image2> 比较这两张图,指出有什么不同。
数据集必须与对话模板(如ChatML)结合,使用<image>等特殊token标记图片的位置。
如何处理多模态数据中图片分辨率不一致的问题?¶
图片分辨率不一致是MLLM面临的核心挑战之一。直接将所有图片缩放(Resize)到统一尺寸,会破坏原始图片的宽高比,导致物体变形,或丢失关键细节信息。现代MLLM采用了多种技术来解决此问题。
- 动态分块(Dynamic Patches / AnyRes):这是LLaVA-1.6(LLaVA-NeXT)等模型采用的核心技术。
- 做法:不再将整张图片强制缩放到固定尺寸,而是根据图片原始分辨率,将图片切分成若干个小图块,每个图块的尺寸是视觉编码器训练时的标准尺寸(如336x336)。例如,一张1000x700的图片可能被切成2x2=4个图块。
- 处理流程:除了这些高分辨率的分块外,还会生成一张全局缩略图(overview)。将所有分块和缩略图分别独立地通过视觉编码器,得到各自的特征。将这些特征序列直接拼接,作为视觉token输入给LLM。
-
优势:既能保留原始图片的高分辨率细节(通过分块),又能提供全局视野(通过缩略图)。输入LLM的token数量会随图片分辨率动态变化,但计算量是可控的。
-
保持宽高比的缩放(Aspect Ratio Preserving Resizing)与填充(Pad):将图片的最长边缩放到指定大小,保持宽高比不变,然后用固定像素值(如黑色)填充短边至目标尺寸。这是最传统的方法,简单但会引入无效的填充区域,浪费算力。
-
自适应位置编码:使用2D-RoPE(旋转位置编码)或其变体,为每个图像patch赋予其在原始图像中的2D坐标作为位置信息。这样即使图片被分块或处理,模型也能通过位置编码感知到patch在原始图像中的相对位置,有助于理解空间关系。
-
感知重采样器(Perceiver Resampler):如前所述,无论输入多少视觉特征,最终都被压缩为固定数量的token。这使得分辨率变化最终对LLM是透明的,但压缩过程本身可能丢失细粒度信息。
总结:当前最主流、效果最好的方法是动态分块,它在保留高分辨率细节和控制计算量之间取得了最佳平衡。
什么是“dynamic high resolution”技术?LLaVA-NeXT中如何切分图片?¶
动态高分辨率(Dynamic High Resolution) 是一种在保持原始图像宽高比的同时,让多模态大模型能够处理任意分辨率图像的技术。它的核心思想是:不再将所有图片暴力缩放(Resize)到一个固定的小尺寸,因为这会导致图像变形或丢失细节;而是根据图片的原始大小,动态地将其切分为若干个符合视觉编码器标准输入尺寸的分块(patches),让模型能够以“原生分辨率”理解图像细节。
LLaVA-NeXT(LLaVA-1.6)的图片切分流程:
-
确定切分网格:LLaVA-NeXT会根据图像原始分辨率,计算出一个最优的切分网格(如
2×2、3×2等)。计算原则是在不超过预设总分块数上限的前提下,选择最能匹配原始宽高比的网格。 -
生成分块与缩略图:
- 高分辨率分块:将图像按照计算出的网格进行划分,每个网格单元被独立裁剪出来,并缩放至视觉编码器的标准输入尺寸(如336×336)。
-
全局缩略图:同时,整张图像也被缩放至标准尺寸,作为一个“概览视图”保留全局信息。
-
独立编码与特征拼接:
- 将所有的高分辨率分块和全局缩略图,分别送入视觉编码器(如CLIP ViT),得到各自的特征向量序列。
- 将这些特征向量序列直接拼接起来,并在序列中插入一个特殊标记(如
<image_separator>)来分隔不同分块的特征。 - 最终,这个拼接后的大序列作为该图像的视觉token,与文本指令的token一同输入LLM。
优势:
-
保留原始宽高比:避免了因强制缩放导致的物体形变。
-
捕获高分辨率细节:能清晰识别图像中的小物体、文字和精细纹理。
-
灵活性与效率:输入LLM的token数量会随图像分辨率动态变化,但通过控制最大分块数,可以有效控制计算成本的上限。
视频多模态大模型微调时,如何处理时序信息?¶
视频相比图像增加了时间维度,处理时序信息是视频多模态微调的核心难点,主要挑战在于如何在有限的计算资源下,有效地让模型理解“发生了什么”和“事件的先后顺序”。
常见处理方法:
- 稀疏帧采样与特征聚合:
- 均匀采样:从视频中按固定间隔(如每1秒)抽取关键帧,或均匀采样固定数量(如8/16/32帧)的帧。这是最简单也最常用的方法。
- 基于场景的采样:通过检测视频的镜头切换,在每个镜头中采样关键帧,确保捕捉到不同的视觉内容。
-
特征聚合:将采样的各帧独立通过视觉编码器,得到各帧的特征后,再进行拼接或使用Transformer等结构进行时序建模。
-
显式时序建模:
- 时序位置编码:为每帧的特征向量增加一个可学习的或固定的时序位置编码(如1D RoPE),让模型知道这些帧的先后顺序。
-
时序Transformer / 感知重采样器:在视觉编码器之后,接入一个小的Transformer或感知重采样器。它可以接收所有帧的特征,通过自注意力或交叉注意力来建模帧与帧之间的动态变化,并最终将整个视频的信息压缩为固定数量的视频token。这是目前较先进的方案。
-
时空联合建模:
- 3D视觉编码器:直接使用3D卷积或Video ViT,将视频切分为时空patches(一个立方体),同时提取空间和时间特征。这种方式能更好地捕捉局部运动信息,但计算量非常大,较少用于大规模微调。
微调实践:
在SFT阶段,视频数据通常以“帧序列+文本”的形式组织。指令和回答中常常包含对时序的显式要求,如“描述视频中发生的第一个事件”、“当XX出现时,发生了什么?”,以此来训练模型对时序信息的关注。
常用的视频多模态微调数据有哪些?如何采样帧?¶
常用数据集:
-
MSR-VTT:包含1万条视频,每条配有20句人工描述的标题,是最经典的视频描述数据集。
-
ActivityNet Captions:包含2万个长视频,关注动作和事件的描述,语句更长、更复杂。
-
YouCook2:烹饪教学视频,带有分步骤的指令和描述,适合训练模型的过程性理解能力。
-
WebVid-2M:一个大规模弱标注数据集,包含200万个视频-文本对,文本来自网页的alt-text,规模大但噪声较多,适合预训练或对齐阶段。
-
EgoSchema:第一人称视角的长视频问答数据集,要求模型进行长时间的时序推理,难度很高。
帧采样策略:
-
固定帧数均匀采样:从视频中均匀抽取K帧(如8、16、32)。这是最通用的策略。K的选取需要平衡信息充分性与计算开销。微调时通常8-16帧。
-
关键帧/镜头采样:通过分析视频的像素变化,检测出镜头切换点,在每个镜头内采样1帧。这样可以避免冗余,用更少的帧代表整个视频。
-
自适应动态采样:根据任务的复杂度和视频长度动态决定采样帧数。例如,对短视频采更多帧,长视频则适当减少帧率。
实践中,通常会在数据预处理阶段将视频预先抽帧并存储为图片序列,训练时直接加载图片。
语音大模型微调,语音信号通常如何输入到LLM?¶
语音是连续的模拟信号,无法直接输入给基于离散token的语言模型。因此,语音大模型的核心挑战在于将连续的语音波形转换为LLM能消费的离散token序列。
主流方法分为两类:
- 基于离散化语音Token的方法(主流):
- 神经语音编解码器:使用预训练的语音Tokenizer(如EnCodec, SpeechTokenizer, HuBERT + k-means),将语音波形直接转换为离散的语音token序列。这些token就像文本的单词一样,每个token代表一个极短时间段(如20ms)的语音特征,包含内容、音色、情感等信息。
- 与文本Token混合:将这个语音token序列与文本token序列进行混合或交错。例如,用户语音输入被转为
[audio_start] audio_token_1, audio_token_2, ... [audio_end],然后模型直接以自回归方式生成文本回答,或进一步生成代表助手回答的语音token。 -
多任务训练:SFT数据中包含
(语音token序列, 文本回答)或(语音token序列, 文本回答, 语音token序列),让模型学会语音到文本、文本到语音以及语音到语音的任务。这是目前Sora、GPT-4o语音能力背后的核心技术路线之一。 -
基于连续特征投影的方法:
- 语音编码器+投影层:使用一个预训练的语音编码器(如Whisper的Encoder部分)提取连续的特征向量,再通过一个投影层映射到LLM的词嵌入空间。类似于视觉编码器的处理方式。
- 优势:保留了更丰富的语音信息,信息损失小。缺点是占用大量token,训练和推理成本极高。
微调实践:
在SFT阶段,语音数据通过语音Tokenizer预先离线转化为token序列,与文本SFT数据按一定比例混合。这种格式统一,完全兼容标准的文本LLM训练流程,只需扩展词表以包含新的语音token。
多模态微调时,使用LoRA与全参微调的差异?通常对哪些模块加LoRA?¶
差异对比:
| 维度 | 全参数微调 | LoRA微调 |
|---|---|---|
| 参数量 | 更新全部参数(视觉编码器+连接器+LLM) | 仅训练极少量低秩矩阵(适配器) |
| 显存占用 | 极高,需要存储所有参数的梯度和优化器状态 | 极低,仅适配器部分需要梯度 |
| 灾难性遗忘 | 风险高,容易破坏预训练的视觉和语言知识 | 极低,因为原始参数完全冻结 |
| 训练速度 | 慢 | 快 |
| 适用场景 | 数据量巨大、领域差异极大 | 数据量中等或较少,资源受限,快速实验 |
通常对哪些模块加LoRA:
在多模态LoRA微调中,最核心的注入点是LLM的注意力投影层(Q, V)。这与纯文本SFT一致,因为LLM是所有模态信息汇聚和推理的最终处理器。
-
LLM部分(推荐):对LLM的
q_proj,v_proj(有时也包括k_proj,o_proj)注入LoRA。这是改变模型行为、遵循指令最有效、最安全的方式。这是当前最主流的做法。 -
跨模态连接器:通常冻结,但有时也会对连接器(投影层)进行全参微调,因为其参数量极小,全参微调也几乎没有负担。
-
视觉编码器:强烈建议永远冻结。视觉编码器的预训练知识极其宝贵且脆弱,微调极易导致视觉基础能力退化。给视觉编码器加LoRA的实践较少,风险较高。
因此,“LoRA on LLM only”是多模态微调中性价比最高、最稳健的配置。
如何使用QLoRA微调多模态大模型?基座模型量化注意事项。¶
QLoRA在多模态大模型中的应用,是在LoRA的基础上,将LLM主干量化为4-bit(NF4),从而在极低显存(如单张24GB GPU)下微调多模态模型。
使用方法:
-
量化LLM:使用
bitsandbytes库将LLM部分加载为4-bit NF4格式。 -
配置LoRA:按常规方式配置LoRA,仅将其应用于LLM的线性层。
-
冻结视觉编码器和连接器:保持它们为原始精度(FP16/BF16),因为量化它们会导致显著的视觉特征损失。
-
训练:使用Paged AdamW优化器,仅更新LoRA适配器的参数。
基座模型量化注意事项:
-
LLM量化即可,勿量化视觉部分:视觉编码器和连接器对精度极其敏感,量化会严重损害其对图像细节的感知能力,导致回答质量大幅下降。QLoRA节省的显存已足够,无需再冒险量化视觉模块。
-
数据类型一致:确保量化后的LLM计算时使用的数据类型(如BF16)与视觉特征的数据类型一致,避免不必要的类型转换开销。
-
双重量化:在量化LLM时,启用QLoRA的“双重量化”选项,进一步压缩显存,将量化常数的开销也压到极低。
-
梯度检查点:对于多模态输入,激活显存(尤其是大量视觉token)是主要瓶颈之一。必须开启梯度检查点,将激活占用降至最低。
通过QLoRA,可以在单张RTX 4090等消费级显卡上,微调带有7B LLM的多模态大模型,极大降低了门槛。
多模态微调中,如何处理图文不对齐的数据?¶
图文不对齐是指数据中图像与文本描述不匹配、不相关或描述存在错误。这种噪声会严重误导模型,必须进行清洗。
处理策略:
- 直接过滤(最安全):
- CLIP Score / SigLIP Score:使用一个高质量的预训练图文对齐模型(如CLIP或SigLIP),计算图像与文本的余弦相似度。设定一个阈值,过滤掉所有低于阈值的样本。这是最常用、最有效的方法。
-
基于强模型的判断:对于高价值数据,使用一个强大的多模态模型(如GPT-4V)进行审查。指令可设为“请判断这张图片是否与这段文字描述一致。回答是或否”。这种方法更精准但成本高。
-
重写修正(更灵活):
- Image-to-Text Re-captioning:使用一个优秀的图像描述模型(如BLIP2, LLaVA),为不对齐的图像重新生成一个准确的描述文本,然后用新文本替换旧的、不对齐的文本。
-
Text-to-Image Retrieval & Rewrite:如果可能,用错误的文本去图像库中检索最相关的图片来替换,但成本极高,不常用。
-
训练时忽略:
- 在损失计算时,对低置信度样本的损失进行降权,减轻其影响。但这种方式治标不治本,不如直接过滤。
实践建议:在数据预处理阶段,对所有多模态数据进行一次CLIP Score扫描,是确保数据质量、提升模型最终效果的必要步骤。
在多模态SFT数据中,loss masking通常如何处理图像token?¶
Loss masking(损失掩码)在多模态SFT中同样遵循“只对需要模型生成的部分计算损失”的原则。由于图像token是输入条件的一部分,而不是模型需要生成的输出,因此它们在labels中应全部被掩码。
标准做法:
-
图像token位置:在
input_ids序列中,所有代表图像token的位置,其在labels中的对应值被设为-100(忽略)。 -
文本部分:与纯文本SFT一致,
system和user部分的文本token被掩码,只有assistant部分的文本token才计算损失。 -
特殊标记:用于标记图像位置的特殊token(如
<image>),通常也被掩码,因为它只是占位符而非生成目标。但有时保留也影响不大。
示例:
指令:<image> 描述这张图片。
回答:一位女士在公园里遛狗。
输入序列:[<image>_token_1, ..., <image>_token_N, "描述", "这", "张", "图", "片", "。", "一", "位", "女", "士",...]
labels序列:[-100, ..., -100, -100, -100, -100, -100, -100, -100, "一", "位", "女", "士",...]
这种处理方式确保了模型只学习如何根据输入的视觉和文本信息生成回答,而不是学习如何生成图像。
图像token数量对训练显存和速度影响有多大?如何优化?¶
图像token的数量直接决定了输入LLM的序列长度,对显存和计算速度有平方级(注意力机制)和线性级(FFN)的影响,是多模态微调中最大的开销来源。
影响:
-
激活显存:Q、K、V等中间激活与总token数(图像token + 文本token)成正比。对于一张使用ViT-L/14(14x14 patch, 256 tokens)的图像,其token数可能相当于一段数百字的文本。
-
计算速度:自注意力计算复杂度为 O(N2)O(N2),总token数翻倍会导致注意力计算时间翻四倍。
优化方法:
- 减少图像token数量:
- 使用更强的压缩连接器:如Q-Former(压缩到32 tokens)、Perceiver Resampler(压缩到64 tokens)。这是最根本的优化。
- 增大patch size:使用更大的patch size(如16x16)的ViT,直接减少token数,但会损失分辨率。
-
动态分块+缩略图:在需要高分辨率的场景下,虽然总token数增加,但保证了信息密度,是必要的开销。
-
使用Flash Attention:这是大模型训练的标配。它能将自注意力的显存复杂度从 O(N2)O(N2) 降为 O(N)O(N),并极大加速计算。在多模态微调中,必须开启。
-
序列并行(Sequence Parallelism):当图像和文本的总token数极长时,可以将序列维度切分到多个GPU上,降低单卡显存。
-
梯度检查点:用来控制激活显存的峰值,以时间换空间。
-
使用更小的视觉编码器:如使用ViT-Base代替ViT-Large,权衡视觉能力和效率。
如何评估多模态微调模型?有哪些常用基准?¶
评估多模态微调模型需要覆盖其各种能力,包括识别、推理、OCR、幻觉抵抗等。常用基准按能力分类如下:
| 能力维度 | 常用基准 | 说明 |
|---|---|---|
| 综合能力 | MMBench, MME | 大规模、多维度(20个子类)的综合性基准,覆盖感知、推理等。 |
| 视觉问答 (VQA) | VQA-v2, GQA, OK-VQA, TextVQA | 评估对图像进行自然语言问答的能力,TextVQA特别关注图像中的文字理解。 |
| 视觉推理 | ScienceQA, MMMU | 需要结合科学知识、数学、图表等进行多步推理。MMMU是极具挑战性的大规模多学科多模态推理基准。 |
| 幻觉评估 | POPE, CHAIR | 专门评估模型是否会产生“无中生有”的描述(幻觉)。POPE通过构造不存在物体的提问来检测。 |
| OCR与文档理解 | DocVQA, ChartQA | 评估对扫描文档、图表、表格的信息提取和问答能力。 |
| 指令遵循(多模态) | LLaVA-Bench, MME-RealWorld | 评估模型在真实世界多模态对话场景中的综合表现,常使用GPT-4V作为评判。 |
| 视频理解 | MSVD-QA, MSRVTT-QA, ActivityNet-QA | 评估对视频内容的问答能力。 |
评估方法:
-
自动化指标:对于VQA等多选或简答任务,直接与标准答案进行精确匹配或计算F1。
-
GPT-4V-as-Judge:对于开放式生成任务,使用GPT-4V对模型回答进行多维度评分(准确性、详细度、有用性等),是目前最主流的高质量评估方式。
-
人工评估:在涉及主观性、安全性等关键维度上,依然是黄金标准。
评估时需注意测试集与SFT训练集的严格隔离,防止数据污染。
MMBench、SEED-Bench等评测主要考察什么能力?¶
这些基准旨在系统性地量化多模态大模型的通用视觉理解与推理能力,评估维度往往超过数十项,远超简单的图像描述或视觉问答。
MMBench (Multi-Modal Benchmark)
-
整体设计:包含约 3000 道多选题,覆盖 20 个能力维度,每个维度又细分出多个子任务。所有题目均由人类标注,答案唯一且干扰项经过精心设计。
-
核心考察能力:
- 底层感知:物体识别、属性(颜色、材质、纹理、形状)判别、空间关系、场景分类。
- 高级认知:常识推理、因果推断、图像-文本对齐、跨模态匹配、社会关系推理、物理规律判断。
-
领域知识:艺术、地标、Logo、名人、OCR 等特定领域的知识。
-
评估方式:计算各维度及总体的准确率,并生成详细的雷达图,直观展示模型的长短板。MMBench-Dev 是公开测试集,MMBench-Test 则为盲测排行榜。
SEED-Bench
-
整体设计:包含约 1.9 万道多选题,分为 12 个评估维度,涵盖图像和视频两大部分。所有题目均由人类专家基于真实图像和视频精细标注。
-
核心考察能力:
- 空间理解:细粒度物体属性、空间位置关系、二维和三维结构的推理。
-
时间理解:视频中的动作识别、事件顺序、时序因果、状态变化预测。
-
突出特点:特别强调细粒度识别和动态场景下的推理,要求模型能从细微的视觉线索中得出正确结论。
共同考察的关键能力:两者都深入考察模型的视觉基础能力、常识推理、泛化能力,以及对复杂干扰的抵抗能力。它们不仅要求模型“看见”,更要求模型“看懂”和“想通”。
文档理解(DocVQA)微调,数据有什么特殊要求?¶
DocVQA 微调旨在让模型理解扫描文档、发票、表格等富含文字和复杂版式的图像。与自然图像数据相比,其数据有极高的专业要求。
-
高分辨率与无损处理:文档中的文字通常密集且字号极小,必须保留原始分辨率或采用 AnyRes 等动态分块技术,确保文字清晰可读。任何下采样或过度压缩都会造成关键信息丢失。因此数据预处理往往需要额外存储高分辨率版本或切分后的子图。
-
OCR 文本与位置坐标的融合:文档理解的核心是文字信息。高质量的 DocVQA 数据通常包含对文档的 OCR 结果——不仅有转录文本,还有每个词/行的边界框坐标。这些信息可作为 “视觉提示” 直接拼入指令,或作为 LLM 的附加输入,帮助模型建立视觉像素与文字内容的精准映射。
-
版式结构理解:文档存在段落、标题、表格、列表等逻辑结构。指令必须设计为需要模型进行跨段落、跨表格的信息提取、比较和推理。例如,“根据发票底部的税号和右上角的金额,填写报销单”这类指令要求模型理解文档的结构逻辑。
-
精确简洁的回答格式:回答通常是从文档中直接提取的关键信息,如“总金额:$100.00”。数据中答案往往附带引用出处(如“根据表格第三行第二列”),以训练模型的可解释性。
-
多样化的文档类型与噪声:数据应覆盖扫描件、手机拍摄件、有印章/水印/折痕的文档等,以提升模型在真实世界应用中的鲁棒性。
多模态模型幻觉如何体现?如何评估和缓解?¶
多模态幻觉是指模型输出的文本描述与图像内容不一致,即“睁眼说瞎话”。主要体现在三个层面:
-
物体幻觉:描述或回答中出现了图像中根本不存在的物体。
-
属性幻觉:物体的颜色、大小、材质、数量等属性被错误描述。
-
关系/场景幻觉:错误地描述了物体间的空间关系、交互关系,或对整个场景进行了臆想性补充(如添加不存在的上下文背景)。
评估方法:
-
POPE (Polling-based Object Probing Evaluation):将评估转化为二分类问题——“图中是否存在[物体]?”。通过精心构造的平衡样本(存在/不存在物体各半),可计算出准确率、召回率、F1-Score,并发现模型对哪些类别的物体容易产生幻觉。
-
CHAIR (Caption Hallucination Assessment with Image Relevance):将模型生成的描述分解为原子短语,利用物体检测模型检查每个短语所指的物体是否真实存在于图像中,从而计算幻觉句子比例和幻觉短语比例。
-
MMHal-Bench:专门设计的基准,通过构造诱导性、开放性的问题来刺激模型产生幻觉,并由 GPT-4 进行评分,考察信息性、真实性等多个维度。
缓解措施:
-
数据端:加入反幻觉数据,如“图中没有猫,所以这个问题无法回答”这类正确拒绝的示范;同时强化图文严格对齐。
-
训练策略:使用 RLHF/DPO 将“忠实于图像”的回答设为偏好回答,惩罚编造行为;或在损失函数中加重与图像相关的 token 权重。
-
推理时:利用自一致性(Self-Consistency)生成多个回答并交叉验证;或要求模型先定位相关视觉证据再作答。
多模态微调能否提升模型的 OCR 能力?需要什么样的数据?¶
可以。微调是将通用多模态模型适配到特定 OCR 场景(如手写体、多语言、复杂版式)的最有效手段。
所需数据类型:
-
图像-文本转录对:包含文字图像的图片及其精确的文本转录。这是最基础的数据。对中文 OCR 来说,需要覆盖简繁体、不同字体(楷、行、草)、不同排版(横排、竖排、弯曲)、不同背景和光照条件。
-
OCR-VQA 数据:基于图像中的文字内容进行问答。例如,“发票上的税号是多少?”“菜单中最贵的菜是什么?”。答案可直接从文字中提取,但要求模型正确识别并关联多处文本信息。
-
端到端定位转录数据:提供文字行的包围框坐标及其转录文本。将坐标转化为文本 token(如
<box>[[x1,y1,x2,y2]]</box>),让模型学会同时输出定位和文字内容,这对信息提取和文档解析至关重要。 -
富文本格式描述数据:指令中包含对文字格式的查询,如“请用 JSON 输出第三行加粗文字的内容”,训练模型对字体、颜色等富文本特性的敏感性。
数据构造要点:图像必须保持原始高分辨率;转录文本要精确无误;QA 对的问题需确保无法从图像标题或上下文推测出答案,必须依靠真正的文字识别。
如何微调多模态模型使其具备“定位”(grounding)能力?数据中需要坐标吗?¶
定位能力是指模型能根据语言描述在图像中精确指出目标位置,或为指定区域生成自然语言描述。微调赋予模型定位能力,绝对需要包含位置坐标信息的数据。
坐标表示方法:
-
文本化坐标:将归一化的边界框坐标
[x1, y1, x2, y2](值域 [0,1] 或 [0,1000])直接转化为文本,如<box>[[200,150,400,500]]</box>。LLM 像生成普通单词一样预测这些数字 token。这是最通用的方法。 -
离散化坐标token:将坐标量化为整数 bins(例如 0~999),并作为特殊 token 加入词表。例如,
<x_200><y_150><x_400><y_500>。这能缩短序列长度,并让模型以分类方式预测坐标,训练更高效。 -
采样点坐标:用物体轮廓上的关键点坐标表示更精细的形状信息。
微调数据构造:
- 数据格式为
(图像, 区域描述, 坐标)。例如: - 指代理解:指令:“穿红色衣服的男人在哪里?” 回答:“
<box>[[120,80,350,400]]</box>”。 -
指代生成:指令:“请描述
<box>[[120,80,350,400]]</box>区域。” 回答:“一个穿着红色夹克、戴着帽子的年轻人。” -
数据来源:现有定位数据集(RefCOCO, Visual Genome)转换、人工标注、或利用强模型自动生成(如 GPT-4V)后进行人工校验。
训练要点:坐标 token 同样参与交叉熵损失,迫使模型学习精确的位置预测。微调时通常冻结视觉编码器,更新投影层和 LLM。
什么是“region-level”理解?微调数据如何标注?¶
区域级理解是指模型能够聚焦于图像中的某个特定区域(由边界框、多边形、中心点等标识),并对该区域进行细粒度的识别、描述、属性判断或关系推理。这是实现精细化视觉对话和交互式理解的基础。
微调数据的标注方式:
-
区域定位信息:每个关注区域必须提供其精确的空间范围。常用边界框(左上角和右下角坐标)或多边形(一系列顶点坐标)表示。坐标通常归一化到 [0,1] 区间。
-
区域文本描述:对框选区域的内容进行详细描述。例如:“这是一个放在白色陶瓷盘上的牛角面包,表面呈金黄色,旁边有几颗蓝莓和一簇薄荷叶。”
-
区域问答对:围绕特定区域设计问答。问题可以是关于区域的物体属性、与其他区域的关系,或需要推理的问题。回答必须基于该区域的内容。例如:问:“这个牛角面包看起来烤得怎么样?” 答:“看起来很酥脆,表皮颜色较深,应该是烤了较长时间。”
标注流程:
-
人工标注(金标准):标注员使用工具框选区域,同时编写描述和问答。
-
自动生成+人工修正(主流):先用预训练模型(如Grounding DINO)自动检测物体并生成候选框,再用图像描述模型生成初步描述,最后由人工审核、修正和完善。
-
数据集转换:将Visual Genome等已有数据集中的物体、属性、关系标注,通过模板转换为自然语言形式的区域级指令数据。
通过这种数据训练,模型能将视觉注意力动态地聚焦于局部,极大地提升了回答的精确性和细节丰富度。
多模态对话中,如何保持多轮图片对话的上下文?¶
多轮图片对话的上下文保持,依赖于将所有历史视觉和文本信息完整地序列化,并利用 Transformer 的自注意力机制进行条件生成。
实现机制:
-
对话历史序列化:将当前轮次之前的所有交互(用户图片、用户文本、模型回答)按照时间顺序拼接成一个长序列。每一轮的用户图片会被转换为视觉 token 序列,并放置在对应文本之前。
-
统一模板:使用 ChatML 等标准化模板,为每条消息添加角色标记。例如:
<|im_start|>user
<image_tokens_1> 这张图片里有什么?<|im_end|>
<|im_start|>assistant
这是一只猫。<|im_end|>
<|im_start|>user
<image_tokens_2> 那这个呢?它和刚才的猫有什么不同?<|im_end|>
- 注意力回溯:LLM 的自回归因果注意力机制,使得模型在生成当前回答时,可以关注到序列中所有在前面的 token,包括之前所有图片的视觉 token。因此,模型能够“回忆”起前面轮次的图片内容,实现跨图片的指代消解和对比推理。
实践挑战与对策:
-
序列长度爆炸:多图多轮会导致输入序列极长。需使用 Flash Attention、量化、KV Cache 等优化技术。
-
显存压力:可通过限制最大历史轮次、对旧的视觉 token 进行压缩(如只保留 CLS token)或摘要化来缓解。
-
Loss Mask:训练时只对当前轮次的助手回复计算损失,所有历史和用户输入均被掩码。
多模态微调时,如果文本能力下降,如何平衡?¶
多模态微调导致纯文本能力下降(灾难性遗忘)是常见挑战。核心对策是在学习新模态的同时,持续巩固语言能力。
平衡策略:
-
混合纯文本 SFT 数据:在多模态训练批次中,按比例混入高质量的纯文本指令数据(占比 20%~50%)。这是最直接有效的方法,相当于用纯文本数据作为“锚点”,防止语言分布漂移。
-
调整采样权重:为纯文本数据设置较高的采样权重,或通过温度采样策略动态调整其在每个训练步骤的出现频率。
-
参数高效微调(PEFT):优先使用 LoRA 等方法,冻结 LLM 的原始参数,只训练极少量适配器。这从根本上杜绝了对语言知识的大规模覆盖。
-
课程学习:训练初期,主要使用纯文本或多模态对齐数据,确保语言能力稳固;中后期再逐渐引入复杂的多模态指令数据。
-
后训练修复:若文本能力已下降,可在多模态微调结束后,单独使用纯文本数据对模型进行少量步数的“回火”训练,帮助模型恢复。
-
分阶段解冻:先冻结 LLM 大部分层,只训练视觉投影层和顶层;后期再逐步解冻更多 LLM 层,并以指数衰减的学习率进行微调。
监控:在微调过程中,定期在独立的纯文本基准(如MMLU)上评估,一旦分数出现显著且持续的下降,应立即调整数据配比或停止训练。
解释“visual instruction tuning”的基本流程。¶
视觉指令微调是将多模态对齐模型转化为能遵循多样化视觉指令的对话助手的核心阶段。流程如下:
-
模型初始化:从一个完成了模态对齐的预训练多模态模型出发。该模型已具备基本的图像描述能力(视觉编码器 + 投影层 + LLM)。
-
数据集构建:创建包含大量
<图像, 指令, 回答>三元组的数据集。指令类型需极具多样性:视觉问答、图像描述、推理、OCR、定位、创意写作等。数据来源包括现有数据集转换、模型自动生成(如 GPT-4V)和人工精写。 -
输入序列化:将图像通过视觉编码器和投影层转化为视觉 token。将视觉 token 与指令的文本 token 按照对话模板拼接,形成模型输入。回答部分的 token 作为
labels,其余部分(视觉 token、指令 token)的labels设为 -100。 -
训练设置:
- 参数更新:通常冻结视觉编码器(保护视觉预训练知识),更新投影层和 LLM。
- 优化目标:标准自回归交叉熵损失,仅计算在回答 token 上。
-
工程优化:混合精度、Flash Attention、梯度检查点、ZeRO/FSDP 等。
-
迭代与评估:在多个多维度的多模态基准(如MMBench, SEED-Bench)上进行评估,根据结果分析失败案例,调整数据配比或补充特定类型数据,形成闭环迭代。
在多模态微调中,如何进行数据增强?¶
多模态数据增强旨在提升模型鲁棒性,但必须时刻确保图文对齐关系不被破坏。
图像层面:
-
几何变换:随机水平翻转、小角度旋转、裁剪。须注意:如果指令涉及空间位置(如“左边的人”),翻转会破坏语义,此时需同步修改指令或禁用翻转。
-
色彩与光照:调整亮度、对比度、饱和度,模拟不同拍摄环境。
-
噪声注入:轻微的椒盐噪声或高斯模糊,模拟低画质。
文本层面:
-
指令改写:用同义表达替换原始指令,如将“描述这张图片”改写为“这张图片里有什么?”。可使用大语言模型批量生成。
-
回译增强:将指令翻译成其他语言再译回,产生自然措辞变化。
图文协同与质量控制:
-
维持对齐:任何增强后,必须用 CLIP-Score 等对齐模型校验增强样本的图文匹配度,过滤掉匹配度过低的样本。
-
负例增强:对于幻觉或错误回答,构造“错误-修正”对话对,训练模型自我纠错。
-
定位数据增强:对图像进行增强时,必须同步变换坐标信息(如翻转、裁剪后坐标需重新映射)。
如何处理多模态微调数据中的多种图像宽高比?¶
处理多种宽高比的核心是在不丢失关键信息和不过度形变的前提下,将图像转化为模型可接受的输入。主要策略有:
-
保持宽高比缩放+填充:将长边缩放到目标尺寸,保持宽高比,短边用纯色填充。简单但会引入无效的填充区域,浪费算力。
-
中心裁剪:缩放后从中心裁剪出固定尺寸。简单但可能丢失图像边缘的重要信息。
-
动态分块(AnyRes):这是当前最优方案。根据图像宽高比,动态决定将其切分成多少个符合视觉编码器输入尺寸的分块。例如,一张宽图可能被切成 2×1 或 3×1 的网格。同时会保留一张全局缩略图。所有分块和缩略图分别编码后,其特征被拼接为一个长序列输入 LLM。该方案既能保留高分辨率细节,又能提供全局视野,且不浪费算力。
-
自适应位置编码:为每个图像 patch 赋予其在原始图像中的 2D 坐标(如 2D-RoPE),让模型在特征层面感知到 patch 的相对位置,即使被分块处理也能理解空间关系。
实践中,动态分块结合自适应位置编码已成为处理任意宽高比图像的标准技术。
如何使用“AnyRes”技术处理高分辨率图像?¶
AnyRes(Any Resolution) 技术的核心是自适应图像分块,使模型能处理任意宽高比的高分辨率图像。以 LLaVA-NeXT 为例,其流程如下:
-
网格计算:根据原始图像尺寸和预设的最大分块数(如 4 或 9),计算一个最优的切分网格(如
2×2、3×2),使分块的宽高比总和尽可能匹配原始图像。 -
图像分块与缩放:
- 高分辨率分块:按照网格将原图裁剪为多个子图,每个子图缩放到视觉编码器的标准输入尺寸(如 336×336)。
-
全局缩略图:整张原图也被缩放到标准尺寸,作为一张全局概览图。
-
独立编码与特征拼接:所有高分辨率子图和缩略图分别独立地通过视觉编码器,生成各自的视觉 token 序列。将这些序列在“序列长度”维度上直接拼接,中间插入
<image_separator>等分隔标记,形成一个长的视觉 token 序列。 -
输入 LLM:该长序列与文本 token 一同输入 LLM。LLM 通过自注意力机制可自由关注不同分块的细节以及全局概览图,从而在高分辨率下同时获得局部细节和全局上下文。
关键参数:最大分块数控制着计算成本。例如设最大分块为 4,则处理一张超大图时最多切成 2×2 个子图(加上缩略图共 5 组视觉 token),保证了显存和推理时间的可控性。
对比 LLaVA 和 Qwen-VL 的微调方法异同。¶
两者都是多模态大模型的代表作,微调范式都遵循“对齐→指令微调”两步走,但在架构和数据处理上存在显著差异。
相同点:
-
两阶段训练:第一阶段用大量图文对训练跨模态连接器(对齐),第二阶段用指令数据微调连接器和 LLM。
-
损失掩码:指令微调时只对助手的回答部分计算损失。
-
视觉编码器:均使用基于 ViT 的预训练视觉编码器(如 CLIP ViT)。
不同点(核心差异见下表):
| 维度 | LLaVA | Qwen-VL |
|---|---|---|
| 跨模态连接器 | 极简设计,简单的线性投影或 2 层 MLP。 | 复杂的单层交叉注意力模块(QFormer-like Resampler),用一组可学习的查询向量压缩视觉特征。 |
| 视觉特征处理 | 不压缩,保留所有 patch 特征(LLaVA-1.5),或通过动态分块增加特征(LLaVA-1.6)。 | 压缩,通过 Resampler 将变长的视觉特征压缩为固定长度(如 256 个 token)。 |
| 高分辨率策略 | LLaVA-1.5 使用填充,LLaVA-1.6 采用动态分块 (AnyRes)。 | 原生支持任意分辨率,通过动态输入视觉特征和 2D-RoPE 实现。 |
| 定位与 OCR 能力 | 基础版本不具备,需额外设计或微调。 | 原生支持,通过在训练数据中加入坐标 token,模型可直接输出定位框和 OCR 信息。 |
| 训练数据 | 以自动生成的多模态对话数据为主(如 LLaVA-Instruct)。 | 数据更丰富,除对话外,还包含文档 QA、表格理解、定位、OCR 等任务,进行多任务学习。 |
| 语言模型 | 早期基于 Vicuna,后续扩展至 Mistral 等。 | 使用自研的 Qwen 系列 LLM,并在预训练阶段就进行了视觉-语言联合训练。 |
| 微调侧重点 | 侧重于通过简洁框架验证视觉指令微调的有效性,易上手,社区生态丰富。 | 侧重于打造全能型、开箱即用的视觉助手,功能更全面,但微调流程和数据组织更复杂。 |
总之,LLaVA 追求简洁与高效,是学术探索和快速原型验证的理想选择;Qwen-VL 则追求工程化与全能性,更适合需要多样化视觉能力的实际应用场景。
微调InternVL这类模型时,视觉编码器参数量很大,如何高效微调?¶
InternVL 等现代多模态大模型通常采用大规模视觉编码器(如 InternViT-6B,参数量可达 60 亿),其参数量甚至超过部分语言模型。全参数微调如此庞大的视觉编码器会带来巨大的显存和计算开销。高效微调策略如下:
-
分层冻结与差异化学习率:视觉编码器的底层通常提取通用特征(如边缘、纹理),高层提取语义特征。底层可以被完全冻结,只微调顶层及跨模态连接器。即便微调高层,也可为其设置远小于 LLM 的学习率(例如 1/10),以保护预训练知识。
-
参数高效微调 (PEFT) 应用于视觉编码器:LoRA 不仅适用于 LLM,同样可注入视觉编码器的线性层(如 Q, V 投影矩阵)。对于 ViT 结构,可在多头注意力 (MHA) 和 FFN 层应用 LoRA,冻结原始权重,仅训练极少量低秩适配器。这可将可训练参数量降至百万级别,显存节省 80% 以上。
-
视觉编码器完全冻结,强化连接器:一种极端高效的策略是冻结整个视觉编码器,将所有微调能力集中于跨模态连接器。升级连接器为更强大的结构(如 Q-Former、Perceiver Resampler 或带有交叉注意力的模块),使其能够从冻结的视觉特征中动态提取与任务相关的信息。这种方法完全规避了视觉编码器的训练成本。
-
动态分辨率下的分块处理:InternVL 支持动态高分辨率(如 AnyRes),会将图像切分为多个分块。训练时可采取“分块独立编码 + 特征拼接”的方式,并通过梯度检查点和激活卸载技术来管理峰值显存,避免因分辨率提高而导致 OOM。
-
混合精度与量化训练:使用 BF16/FP16 混合精度训练是标配。若显存仍不足,可将视觉编码器权重量化为 8-bit 或 4-bit(类似 QLoRA),进一步压缩其显存占用,同时保持 LoRA 适配器的全精度训练。
多模态微调中,如何融合多个视觉编码器?¶
融合多个视觉编码器(如 CLIP 擅长语义,ConvNeXt 擅长纹理,DINOv2 擅长局部特征)可以互补它们的优点,提升模型的综合视觉理解能力。融合的关键在于将不同编码器输出的、位于不同特征空间的视觉表示进行对齐和整合。
常见融合方法包括:
-
特征拼接 (Concatenation):最直接的方法。将不同编码器对同一图像提取的特征向量在序列或特征维度上拼接起来,形成一个更长的视觉 token 序列,然后通过一个投影层(或 MLP)映射到统一的维度后输入 LLM。这种方法保留了全部信息,但 token 数量翻倍,计算量显著增加。
-
多头交叉注意力融合 (Multi-Head Cross-Attention Fusion):引入一个 Transformer 模块(如 Q-Former 结构),定义一组可学习的查询向量(Queries)。不同编码器的输出作为不同的 Key-Value 对,查询向量通过交叉注意力同时与它们交互,动态地、有选择地提取融合信息。最终输出固定数量的融合 token,可以有效控制 token 数量。
-
门控机制 (Gating Mechanism) 或加权融合:为每个编码器的输出学习一个标量权重或门控向量,在特征层级进行加权求和。权重可以根据输入图像内容动态生成(例如通过一个轻量级 MLP 计算),实现内容感知的自适应融合。
-
投影对齐 + 特征叠加:为每个编码器配置独立的投影层,将它们映射到统一维度,然后进行特征叠加(如相加或平均)。这种方法假设它们的信息是互补的,但可能因未对齐而造成信息混淆,通常需要在对齐阶段用大量图文数据进行充分训练。
在实际微调中,通常冻结所有视觉编码器,只训练融合模块(交叉注意力或门控网络)和 LLM 适配器,以高效利用不同视觉骨干的特征。
什么是“interleaved”图文数据?微调时如何组织?¶
“Interleaved”(交错的)图文数据是指文本与图像在文档中自然穿插、交替出现的数据,例如图文并茂的网页、教程、带有截图的博客文章。这与“图文对”数据(Image-Text Pairs)不同,后者是一张图片对应一段独立描述。
微调时的组织方式:
-
序列化表示:将整个文档视为一个长序列。文本 token 和图像 token 按照它们在原文中出现的顺序依次排列。例如:
[文本: 首先,我们需要准备以下材料。] [图像: 材料列表的截图] [文本: 接下来,按照以下步骤操作:] [图像: 步骤1示意图] [文本: ...] -
特殊 token 标记位置:使用特殊 token(如
<image>)在序列中标记每张图片的确切位置,模型需要学会根据上下文理解该处图像的意义。 -
自回归生成任务:训练目标可以设定为给定前面的图文上下文,预测下一个 token(可以是文本 token,也可以是图像 token)。但对于 LLM,更常见的任务是给定交错上下文,生成后续的纯文本(如文章的下一段)。
-
Loss Masking:在微调时,通常只对需要模型生成的文本部分计算损失,所有图像的视觉 token 和历史上下文均被掩码。
-
序列长度挑战:由于包含多张图片,交错数据的序列长度可能极长。需要配合 Flash Attention、KV Cache 压缩、图像 token 重采样等技术来控制显存和计算成本。
这种数据能训练出真正的“多模态文档理解”能力,模型可以像人类一样综合阅读图文并茂的材料,并进行总结、推理和问答。
视频理解微调中,如何平衡帧数和计算成本?¶
视频包含的时间维度导致输入 token 数量成倍增长,是计算成本与模型能力之间的核心矛盾。
平衡策略:
-
稀疏帧采样与自适应采样:不是均匀采样,而是根据视频内容的动态程度自适应采样。例如,通过计算相邻帧的光流或特征差异,在变化剧烈的时段密集采样,在静态场景稀疏采样,在信息量和计算量之间取得更优平衡。
-
层次化处理:首先对所有帧应用一个轻量级视觉编码器,提取低级特征;然后通过一个重采样模块(如 Perceiver Resampler)选择最关键的特征,再送入重型 LLM。这避免了将所有帧的高维特征全部输入 LLM。
-
Video Token Merging (ToMe):在视觉编码器内部或输出后,将相邻帧中相似度高的视觉 token 进行合并。例如,相邻两帧中代表相同背景的区域 token 可以被合并为一个,从而减少总 token 数。
-
离线预提取特征与在线微调解耦:在微调前,先用冻结的视觉编码器将所有视频帧的视觉特征提取并存储到磁盘。在线微调时直接加载这些特征,仅训练连接器和 LLM。这虽牺牲了视觉编码器的微调可能性,但极大降低了训练时的计算和存储瓶颈。
-
固定 Token 预算:使用 Q-Former 或 Perceiver Resampler 等结构,将变长的视频帧特征强制压缩为固定数量(如 64 或 256 个)的视频级 token,无论输入帧数多少,输入 LLM 的 token 数恒定。
-
课程学习:训练初期使用短片段(如 8 帧 5 秒视频),在模型建立基本能力后,再逐步引入长片段(如 128 帧 2 分钟视频)。
如何使用“video token merging”等技术减少计算量?¶
Video Token Merging (ToMe) 是一种在 Transformer 推理过程中动态减少 token 数量的技术,其核心思想是识别并合并冗余的、相似的 token。
在视频处理中的应用:
-
帧内与帧间合并:视频不仅同一帧内部存在大量冗余(如纯色背景),相邻帧之间也存在时间上的高度冗余。ToMe 可以同时在帧内和帧间进行 token 合并。通过计算 token 之间的余弦相似度,将最相似的 token 对合并,用它们的加权平均值作为新 token,从而逐步减少 token 总数。
-
插入位置:该操作通常插入在视觉编码器的多个中间层之后,而不是仅在输入端或输出端。随着网络层数的加深,token 数量逐渐减少,使得后层的计算量显著下降。
-
动态速率:可以根据视频内容的复杂度动态调整合并的 token 数量。在静态或慢速场景中合并更多,在剧烈运动场景中保留更多 token,实现内容感知的计算量分配。
微调实践:
-
ToMe 本身是一个无参数的、纯推理时的优化技术。但在微调阶段,开启 ToMe 并进行训练,可以让模型在训练过程中就适应这种“有损”的输入表示,从而在推理时获得更好的鲁棒性和更低的计算开销。这相当于一种数据增强或正则化手段。
-
也可将其视为一种结构,在预训练时即引入,使模型原生支持稀疏化的视觉表示。
多模态微调后,模型能否学会“看图写代码”?需要什么数据?¶
可以。多模态模型经过微调,可以学会根据软件界面截图、UI 设计稿、图表或手绘草图直接生成对应的前端代码(HTML/CSS/JS)、后端逻辑或数据可视化代码。
所需数据类型:
-
设计稿-代码对:这是最核心的数据。包含一张 UI 设计稿的截图,以及实现该设计稿的完整前端代码。为了保证训练质量,截图与代码必须是精确对应的,即代码渲染后应与截图一致。
-
图表-可视化代码对:数据包含柱状图、折线图、流程图等图像,以及生成该图表的代码(如 Python 的 Matplotlib/Plotly 代码,或 Mermaid 语法)。这能训练模型将视觉信息转换为数据可视化指令。
-
文档-配置代码对:例如,一张复杂表单的截图,对应一段用于创建该表单的 YAML 或 JSON 配置文件。
-
手绘草图-代码对:粗糙的白板草图或线框图,对应实现其功能的结构化代码。这能极大提升模型的创意辅助能力。
-
错误截图-修复代码对:展示一个包含 bug 的网页截图(如布局错乱、元素重叠),以及修复该问题的代码 diff。这能训练模型的 UI 调试能力。
数据构造要点:代码必须可执行且无语法错误;截图分辨率要高;需使用特殊的 Markdown 代码块包裹代码,并在指令中明确要求“生成实现该界面的代码”等。
如何评估多模态模型的“幻觉”问题?有哪些针对性基准?¶
多模态幻觉的评估需要专门设计的基准,以量化模型“无中生有”或“张冠李戴”的程度。
核心评估基准:
-
POPE (Polling-based Object Probing Evaluation):将评估转化为判断题——“图中是否存在[物体]?”。通过精心构造的平衡样本,可精确评估模型的物体幻觉率。它是目前最广泛使用的幻觉评估框架。
-
MMHal-Bench:专门设计用于评测多模态幻觉的基准,包含大量诱导性问题。它使用 GPT-4 进行多维评分,包括信息性、真实性和幻觉比例。
-
CHAIR (Caption Hallucination Assessment with Image Relevance):评估图像描述任务。它将生成的句子拆解为原子短语,然后利用物体检测模型检查每个短语所指的物体是否真实存在于图像中,计算幻觉句子和幻觉短语的比例。
-
HallusionBench:聚焦于需要高级推理和常识的场景,通过构造视觉上相似但语义不同的图像对,考察模型是否会被视觉相似性误导而产生幻觉。
-
Bingo:通过构建“图中不存在物体”的否定性查询,直接测试模型是否敢于说“不”,是评估拒答幻觉的有效工具。
评估指标:准确率、精确率、召回率、F1-Score(POPE)、幻觉率(CHAIR)、GPT-4 评分等。
在多模态 RLHF/DPO 中,偏好数据如何构造?图片怎么处理?¶
多模态 RLHF 或 DPO 的偏好数据构造核心是获得对同一指令、同一图片/视频的两个回复之间的人类偏好排序。
数据构造流程:
-
指令与图像准备:准备多样化的多模态指令和对应的图像/视频。
-
回复生成:使用当前微调模型(或其他模型)对每个
(指令, 图像)生成多个不同的回复(如通过调整温度、Top-P 等方式生成 2-4 个)。 -
人类标注偏好:将图像、指令和两个随机排序的回复呈现给标注员。标注员依据有用性、真实性、流畅度、安全性等标准,选出哪个回复更好,或判定平局。标注时,图像必须是可见的,以确保评判是基于图文一致性。
-
构造偏好对:将标注结果转换为
(图像, 指令, 胜出回复, 失败回复)的四元组。
图片处理:
-
在 DPO 训练时,图片作为输入的一部分被保留。对于偏好对中的两个回复,它们共享同一张图片。
-
图片在前向传播时被编码为视觉 token,并作为历史条件同时用于计算胜出回复和失败回复的似然比。DPO 损失函数将直接优化模型,使其在给定图像和指令的条件下,增大胜出回复的相对概率。
-
在实现上,通常只需要在原有的多模态 LLM 训练流程中,将损失函数替换为 DPO 损失,并将数据加载器改造为同时输出
(图像, 指令, chosen_response, rejected_response)即可。
多模态模型是否也能进行工具调用?微调数据格式是怎样的?¶
可以。多模态工具调用是构建多模态 Agent 的基础,模型需要能根据图像内容决定何时调用何种外部工具(如搜索引擎、计算器、OCR API、图片编辑工具等)。
微调数据格式:
采用扩展的对话模板,在标准多模态对话中加入工具调用的特殊标记和角色。例如,在 ChatML 格式上增加 tool_call 角色。
数据示例:
<|im_start|>system
你是一个智能助手,可以调用以下工具:
{
"name": "ocr",
"description": "识别图片中的文字",
...
}
<|im_end|>
<|im_start|>user
<image> 这张发票的总金额是多少?
<|im_end|>
<|im_start|>assistant
<tool_call>{"name": "ocr", "arguments": {"image_index": 0, "region": "all"}}</tool_call>
<|im_end|>
<|im_start|>tool_response
{"text": "... 总金额: $100.00 ..."}
<|im_end|>
<|im_start|>assistant
这张发票的总金额是 $100.00。
<|im_end|>
关键要素:
-
工具定义放在 system prompt 中。
-
模型输出工具调用时,需包裹在
<tool_call>特殊标记内,并遵循 JSON Schema。 -
工具返回结果以
tool_response角色插入对话。 -
训练时,对 system、user、tool_response 部分的 token 进行 loss masking,只对 assistant 的文本和工具调用部分计算损失。
如何微调多模态模型成为一个“GUI agent”?需要哪些数据?¶
GUI Agent 能根据屏幕截图自主地操作图形用户界面,完成复杂任务。
所需数据类型:
-
GUI 截图-动作对:这是最核心的数据。包含一张 GUI 界面截图,以及模型应执行的下一步操作。动作通常表示为结构化的
(动作类型, 参数),如(CLICK, [x, y]),(TYPE, "hello"),(SCROLL, down)。动作可通过坐标 token 或文本描述来表示。 -
任务轨迹数据:为了完成一个多步任务(如“预订一张机票”),需要一系列截图-动作对的序列。完整的轨迹展示了模型如何根据当前界面状态进行决策。这是训练长期规划和状态追踪能力的关键。
-
错误恢复数据:当模型执行了一个错误操作,导致界面跳转到预期之外的状态时,如何识别错误并回退或修正。这类数据能极大提升 Agent 的鲁棒性。
-
动作指令数据:自然语言指令与对应的动作序列配对,让模型学会将模糊的高级目标(如“把页面调成夜间模式”)分解为具体的 GUI 操作。
-
移动端与 Web 端数据:分别覆盖 Android、iOS 和 Web 环境的 GUI,包括不同分辨率和组件样式。
微调时坐标表示:将归一化的点击坐标(值域 [0,1])转为文本 token 预测,是当前主流的做法。
使用多模态大模型进行医学影像分析微调,需要注意什么?¶
医学影像微调是高风险、高专业壁垒的领域,必须极度严谨。
核心注意事项:
-
数据隐私与合规(HIPAA/GDPR):必须对医学影像进行彻底的去隐私化处理,移除所有患者身份信息(如姓名、ID)。最好使用已公开的合规数据集或在严格受控的私有环境中进行训练。
-
专业知识的准确性:必须由放射科医生或相关医学专家参与数据标注和模型评估。任何回答中的事实错误都可能造成严重后果。SFT 数据中应包含专家写的详细且准确的报告。
-
不确定性表达:必须在数据中大量训练模型在不确定时诚实地说“无法确定”或“建议进行X光确认”,并附上免责声明,强调其辅助性角色,绝不能替代医生诊断。
-
多模态数据融合:除了影像,还应融合电子健康记录(EHR)文本、病人主诉、检验报告等,进行多源信息综合推理。SFT 数据需包含这类多模态融合的指令。
-
领域标准化与报告格式:回答应遵循医学报告的结构化格式(如“检查所见”、“诊断意见”),使用规范的医学术语。
-
图像预处理与窗宽窗位:对于 CT 等 DICOM 影像,需要正确处理窗宽窗位调整,以突出不同组织。数据中应包含不同窗宽窗位下的影像及其对应的解读。
-
类别不均衡与长尾问题:罕见病的数据极度稀缺,需通过数据增强、合成数据或专门的采样策略来缓解,但必须保证医学有效性。
多模态微调中的数据隐私问题,例如人脸、文档信息。¶
多模态数据中的隐私信息是潜在的“地雷”,必须在数据预处理阶段彻底排除。
具体风险与应对:
-
人脸信息:使用成熟的人脸检测模型自动定位并模糊化或替换人脸。对于非公开人物,必须进行匿名化处理。对于公开人物,需在法律允许范围内使用。
-
文档信息:使用 OCR 和正则表达式自动检测并脱敏邮箱、电话、身份证号、地址、银行卡号等个人身份信息(PII)。对于机密商业文档,不应进入训练集。
-
车牌、证件等:类似地,使用目标检测模型定位并用掩码覆盖。
-
医疗数据:如前所述,必须去隐私化,遵循 HIPAA 等法规。
-
数据来源合规:确保使用的图像数据有合法授权(如 Creative Commons),未侵犯版权和隐私。对于网络爬取数据,必须进行严格的隐私扫描。
-
差分隐私训练:在微调时采用 DP-SGD,在模型梯度中加入噪声,从数学上保证个体的隐私。
-
模型记忆风险:即使在数据端做了脱敏,模型仍可能“记住”罕见样本。需通过评估来检测模型是否泄露了训练数据中的隐私信息,并采取措施(如通过 RLHF 惩罚记忆行为)。
如何利用合成数据(如使用DALL·E生成图片)来微调多模态模型?¶
利用 DALL·E、Stable Diffusion 等生成式 AI 来合成图像,可以低成本、高覆盖地扩充多模态微调数据,尤其在长尾场景、罕见物体、特定组合和风格方面具有优势。
应用策略:
-
定向扩充长尾类别:对于训练数据中稀缺的物体、场景或概念(如“一只穿宇航服的柴犬在金字塔前”),使用文本描述直接生成图像。这能极大增强模型对组合性概念和开放域视觉的理解。
-
构建反事实与对抗样本:生成与文本描述故意不符的图像(如图中有猫却描述为狗),用于训练模型的鲁棒性和事实一致性识别能力,即反幻觉训练。
-
风格与领域迁移:将真实照片转换为素描、油画、极简风格,或生成具有特定文化元素的图像,训练模型的视觉风格适应能力。
-
数据增强:对现有图像进行条件生成,如“将这张日景照片变为夜景”,在保持构图不变的情况下改变属性,丰富数据多样性。
质量控制与注意事项:
-
真实性过滤:合成图像可能存在伪影、不合理光影或解剖学错误。使用预训练的真实图像质量评估模型(如 CLIP Score、美学评分模型)进行过滤,剔除低质量生成图。
-
图文对齐保真:必须确保生成的图像与文本描述高度吻合。使用 CLIP Score 或 SigLIP Score 计算图文匹配度,丢弃不达标的合成图像。
-
避免模型偏见循环:不能只生成同质化、符合模型偏见的图像。Prompt 的设计需要多样化,涵盖不同文化、年龄、性别、场景。
-
明确标识:在 SFT 数据中可以通过 system prompt 或指令明确告知模型“这是一张由 AI 生成的示例图”,或完全不区分,取决于训练目标。通常在训练通用模型时,混合真实与合成数据并让模型不可区分即可。
-
版权与伦理:使用商用 AI 生成的图像需遵守相应模型的服务条款,并确保生成内容不侵犯第三方版权或包含有害、偏见内容。