2、多模态基础:文本、图像、音频、视频等模态的表示方法,常见编码器(如CLIP、ViT、BERT、Whisper)的原理与特点
多模态大模型的本质,是让模型能够理解并关联来自不同感官通道的信息——文字、像素、声波和帧序列。在进入微调实战之前,我们必须先建立两个底层认知:第一,每种模态在计算机中如何被“表示”为张量;第二,主流编码器如何将这些原始信号压缩为语义向量。本章将围绕这两个核心问题展开,重点剖析CLIP、ViT、BERT、Whisper四种编码器的设计哲学与适用边界,为后续的多模态对齐与微调打下坚实基础。
2.1 文本模态:BERT与表示体系
文本是当前大模型中最成熟的模态,其核心表示方法经历了从静态词向量到上下文动态向量的演进。BERT(Bidirectional Encoder Representations from Transformers)作为双向Transformer编码器的代表,通过掩码语言模型(MLM)和下一句预测(NSP)两个预训练任务,学习到了深层的双向上下文表示。
核心原理:BERT将输入文本通过WordPiece分词器切分为子词(Subword)单元,每个对应一个唯一的ID。经过嵌入层( Embedding + Segment Embedding + Position Embedding)后,送入多层双向Transformer编码器。每一层通过自注意力机制(Self-Attention)让每个感知全序列的上下文信息,最终输出的[CLS]向量可作为整个句子的语义表示。
- BERT-base:12层Transformer,768维隐藏层,12个注意力头,约1.1亿参数
- BERT-large:24层,1024维,16个注意力头,约3.4亿参数
- 最大输入长度通常为512 ,超出部分需要截断或分段处理
- 微调时通常使用学习率 2e-5 到 5e-5,batch size 16-32
判断方法:在实际微调任务中,选择BERT还是其他文本编码器,需要根据任务类型判断。如果是句子对分类(如语义相似度)、序列标注(如命名实体识别)、抽取式问答,BERT类模型表现优异。如果是生成式任务(如摘要、翻译),则需要使用类或T5类模型。此外,中文场景下可以考虑使用RoBERTa-wwm-ext或MacBERT等优化变体。
实战场景:在多模态大模型中,BERT通常作为文本塔(Text Tower)使用。例如在图文检索任务中,文本描述通过BERT编码为768维向量,再通过一个线性投影层映射到与图像特征相同的维度空间。微调时,BERT的底层参数可以选择冻结或部分解冻,以平衡训练效率和任务适配能力。
| 文本编码器 | 参数量 | 最大长度 | 适用任务 | 微调建议 |
|---|---|---|---|---|
| BERT-base | 110M | 512 | 分类、匹配、抽取 | 全参数微调或LoRA |
| RoBERTa | 125M | 512 | 鲁棒性更强的分类 | 动态掩码,更大batch |
| ALBERT | 12M(共享参数) | 512 | 资源受限场景 | 参数共享,内存友好 |
| DeBERTa | 140M | 512 | 需要细粒度语义 | 解耦注意力,效果更优 |
2.2 图像模态:ViT与Patch Embedding机制
视觉Transformer(ViT)的提出彻底改变了图像特征提取的范式。与传统的CNN(如ResNet)不同,ViT将图像视为一系列Patch的序列,直接应用Transformer架构进行建模,在大型数据集上取得了超越CNN的效果。
核心原理:ViT首先将输入图像(如224×224×3)划分为固定大小的Patch(如16×16),每个Patch展平后通过线性投影得到Patch Embedding。为了保留空间位置信息,需要加入可学习的位置编码(Position Embedding)。此外,在序列开头添加一个可学习的[CLS] ,其最终输出作为图像的全局表示。整个序列送入标准Transformer编码器,通过自注意力机制捕捉Patch之间的全局依赖关系。
# ViT前向传播核心流程(伪代码)
def vit_forward(image):
# image: [B, 3, 224, 224]
patches = extract_patches(image, patch_size=16) # [B, 196, 768]
tokens = linear_projection(patches) # [B, 196, 768]
tokens = tokens + position_embedding # 加入位置信息
tokens = concat([cls_, tokens], dim=1) # [B, 197, 768]
for layer in transformer_layers:
tokens = layer(tokens) # 多层编码
return tokens[:, 0] # 取[CLS]作为图像表示
判断方法:选择ViT还是CNN,需要综合考虑数据规模和计算资源。ViT在ImageNet-21K或JFT-300M等大规模数据集上预训练后,迁移到下游任务效果显著。但如果训练数据有限(少于100万张),ViT容易过拟合,此时ResNet或EfficientNet等CNN模型可能更稳妥。混合架构(如Swin Transformer)通过窗口注意力机制,在保持全局建模能力的同时降低了计算复杂度,是折中的好选择。
实战场景:在CLIP模型中,图像编码器采用ViT架构(如ViT-B/32、ViT-L/14等)。ViT-B/32表示Patch大小为32×32,输入224×224图像产生7×7=49个Patch。微调CLIP时,图像塔通常使用较小的学习率(如1e-6),因为视觉特征已经在大规模图文对上对齐良好,过大的更新步长会破坏预训练学到的语义对齐关系。
| ViT变体 | Patch大小 | 层数 | 隐藏维度 | 参数量 | 适用场景 |
|---|---|---|---|---|---|
| ViT-B/16 | 16×16 | 12 | 768 | 86M | 通用视觉任务 |
| ViT-L/14 | 14×14 | 24 | 1024 | 304M | 高精度图文检索 |
| Swin-B | 窗口4×4 | 24 | 1024 | 88M | 目标检测、分割 |
| ViT-H/14 | 14×14 | 32 | 1280 | 632M | 大规模预训练 |
2.3 音频模态:Whisper与语音表示学习
音频模态的表示方法经历了从手工特征(MFCC、FBank)到深度特征(CNN、Transformer)的演进。的Whisper模型是一个多语言语音识别(ASR)和翻译系统,其编码器部分为音频理解提供了强大的特征提取能力。
核心原理:Whisper采用Encoder-Decoder架构。输入音频首先被重采样为16kHz单声道,然后计算80通道的Log-Mel频谱图(窗口25ms,步长10ms),得到时间帧序列。编码器(类似ViT的Transformer)对频谱帧序列进行建模,输出音频的语义表示。解码器则根据编码器输出和之前的文本,自回归地生成转录文本。Whisper在68万小时的多语言弱监督数据上训练,支持99种语言的识别和翻译。
判断方法:选择Whisper还是其他音频编码器(如Wav2Vec2、HuBERT),取决于任务需求。Whisper适合端到端的语音识别、翻译和语音理解任务,其输出直接是文本。Wav2Vec2和HuBERT更适合作为通用的音频特征提取器,输出特征向量可以接入下游任务(如情感识别、说话人验证)。如果计算资源有限,可以考虑使用Whisper的small或base版本(参数量分别为244M和74M)。
实战场景:在多模态大模型中,Whisper编码器可以将语音转换为文本特征,再与文本模态对齐。例如,构建一个语音问答系统时,用户语音通过Whisper编码器得到语义向量,与图像特征、文本特征一起送入多模态融合模块。微调时,Whisper的编码器部分可以冻结,只训练投影层和融合层,以节省显存并防止灾难性遗忘。
| Whisper版本 | 参数量 | 多语言支持 | 推理速度 | 适用场景 |
|---|---|---|---|---|
| tiny | 39M | 是 | 极快 | 实时语音识别 |
| base | 74M | 是 | 快 | 移动端部署 |
| small | 244M | 是 | 中等 | 通用ASR |
| medium | 769M | 是 | 较慢 | 高精度识别 |
| large-v3 | 1550M | 是 | 慢 | 学术研究、高精度 |
2.4 跨模态对齐:CLIP与对比学习范式
CLIP(Contrastive Language-Image Pre-training)是提出的多模态预训练模型,它通过对比学习将图像和文本映射到同一个语义空间,实现了跨模态的语义对齐。CLIP的核心思想是:对于一批图文对,最大化匹配对之间的相似度,最小化不匹配对之间的相似度。
核心原理:CLIP由两个独立的编码器组成:图像编码器(ViT或ResNet)和文本编码器(Transformer)。训练时,从数据集中采样N个图文对,图像编码器输出N个图像特征,文本编码器输出N个文本特征。通过计算N×N的相似度矩阵,对角线上的元素代表匹配的图文对,使用对称的交叉熵损失(InfoNCE)进行优化。最终,两个模态的特征被投影到同一个维度空间(如512维),并做L2归一化。
# image_features: [N, D], text_features: [N, D]
logits = (image_features @ text_features.T) / temperature # [N, N]
labels = torch.arange(N) # 对角线为正样本
loss = (cross_entropy(logits, labels) +
cross_entropy(logits.T, labels)) / 2
判断方法:CLIP适合需要跨模态语义匹配的任务,如图文检索、零样本分类、图像生成引导(如Stable Diffusion中的文本条件)。但CLIP对细粒度语义的理解有限,例如区分“一只戴红色项圈的白狗”和“一只戴蓝色项圈的白狗”时容易出错。对于这类任务,需要引入更细粒度的对齐机制或使用更大的模型。
实战场景:在微调CLIP时,常见做法是冻结预训练权重,只训练一个轻量级的适配器(Adapter)或使用LoRA(Low-Rank Adaptation)技术。例如,在商品检索场景中,原始CLIP对专业商品术语(如“SKU编号”、“材质成分”)理解不足,可以通过收集领域内的图文对数据,使用LoRA在CLIP的图像和文本编码器上注入领域知识。LoRA通过低秩矩阵分解,只训练少量参数(约0.1%-1%),即可实现有效的领域适配。
| CLIP变体 | 图像编码器 | 文本编码器 | 特征维度 | 参数量 |
|---|---|---|---|---|
| CLIP-B/32 | ViT-B/32 | Transformer-base | 512 | 151M |
| CLIP-B/16 | ViT-B/16 | Transformer-base | 512 | 150M |
| CLIP-L/14 | ViT-L/14 | Transformer-base | 768 | 428M |
| CLIP-H/14 | ViT-H/14 | Transformer-large | 1024 | 958M |
2.5 视频模态:帧序列与时空特征建模
视频模态可以看作图像在时间维度上的扩展,其表示方法需要同时捕捉空间特征(画面内容)和时间特征(运动信息)。目前主流的方法包括:基于帧采样的2D编码器、基于3D卷积的时空编码器、以及基于视频Transformer的时空注意力模型。
核心原理:最简单的视频表示方法是均匀采样N帧(如8帧或16帧),每帧通过ViT或ResNet编码为特征向量,再通过时序池化(平均、最大)或Transformer编码器融合时间信息。更高级的方法如Video Swin Transformer,使用3D窗口注意力同时建模空间和时间维度。在CLIP基础上扩展的VideoCLIP,则通过对比学习将视频片段与文本描述对齐。
判断方法:选择视频编码策略时,需要考虑任务的时间敏感度。对于动作识别(如“跑步”、“游泳”),需要捕捉运动信息,建议使用3D卷积或视频Transformer。对于场景理解(如“会议室”、“海滩”),帧级特征池化可能已经足够。此外,计算资源是重要约束——视频处理的计算量是图像的N倍(N为采样帧数),需要权衡精度与效率。
实战场景:在视频问答(VideoQA)任务中,常见做法是:先将视频均匀采样为8帧,每帧通过CLIP图像编码器得到特征,然后使用一个轻量级的时序Transformer(如2层自注意力)融合帧间信息,最后与问题文本特征做跨模态注意力。微调时,图像编码器通常冻结,只训练时序Transformer和融合层,这样可以大幅减少显存占用。
2.6 编码器选择与微调策略总结
在实际的多模态大模型微调项目中,编码器的选择直接决定了模型的上限和训练成本。以下是一个综合性的决策框架,帮助你在不同场景下做出合理选择。
决策流程:首先明确任务类型(检索、生成、分类、问答),然后评估数据规模(万级、十万级、百万级),接着考虑计算资源(单卡、多卡、显存大小),最后确定模态组合(图文、音文、视频文本等)。基于这些约束,选择预训练编码器并设计微调策略。
| 场景 | 推荐编码器 | 微调方式 | 关键注意事项 |
|---|---|---|---|
| 图文检索(电商) | CLIP-L/14 | LoRA + 投影层 | 领域数据增强,温度参数调整 |
| 语音助手 | Whisper-small + BERT | 冻结Whisper,微调BERT | 音频分段,噪声鲁棒性 |
| 视频内容审核 | VideoCLIP + Swin | 冻结图像塔,训练时序层 | 帧采样策略,多尺度特征 |
| 医疗影像报告 | ViT-L + BioBERT | 全参数微调(小数据) | 数据增强,正则化防过拟合 |
- 参数高效微调(PEFT):优先尝试LoRA或Adapter,参数量少、训练快、不易过拟合
- 分层学习率:编码器底层使用较小学习率(1e-6),顶层和新增层使用较大学习率(1e-4)
- 渐进解冻:先冻结全部编码器,训练投影层;再解冻顶层,最后全参数微调
- 正则化:使用Dropout(0.1-0.3)、权重衰减(0.01-0.1)、标签平滑(0.1)防止过拟合
案例复盘:在一个实际的电商图文检索项目中,我们使用CLIP-B/16作为基础模型,收集了10万条商品图文对数据。初始阶段直接全参数微调,发现训练损失下降缓慢且验证集准确率仅提升2%。分析后发现,商品图片背景复杂、文本描述包含大量专业术语,与CLIP预训练数据分布差异较大。调整策略为:冻结CLIP底层12层,只微调顶层6层和投影层,学习率设为1e-5,并引入Focal Loss处理类别不平衡。经过3个epoch的训练,检索Recall@10从68%提升至83%。复盘经验:对于领域差异大的任务,全参数微调并非最优,分层微调结合适当的损失函数设计往往效果更好。