Transformer多模态融合:从架构原理到工程实践
1. 项目概述:从“单模态”到“多模态”的认知跃迁
“基于Transformer的多模态先导性工作”这个标题,听起来可能有点学术,但它的内核其实非常贴近我们每天都在经历的事情。想象一下,你刷短视频时,平台不仅分析画面里是猫还是狗,还能理解背景音乐是欢快还是悲伤,甚至结合字幕判断整个视频是搞笑还是科普。这背后,就是多模态技术——让机器能像人一样,同时处理和理解文本、图像、音频、视频等多种信息形式。
而Transformer,这个最初在自然语言处理领域大放异彩的模型架构,正是驱动这场认知革命的核心引擎。所谓的“先导性工作”,指的就是那些最早一批将Transformer成功应用到多模态任务上的开创性研究。它们就像第一批探险家,证明了用同一套强大的模型架构去打通不同感官数据之间的壁垒,不仅是可行的,而且是极具潜力的。这彻底改变了之前“一个任务一个模型”的割裂局面,为构建通用人工智能的感知基础铺平了道路。
这篇文章,我们就来深入拆解这些先导性工作的核心思路、技术实现与深远影响。无论你是AI领域的研究者、工程师,还是对前沿技术充满好奇的爱好者,都能从中看到一条清晰的技术演进脉络,理解为什么今天的AI能“看”懂图、“听”懂话,甚至进行跨模态的创作。我们不会停留在论文摘要的复述,而是会深入到模型设计的取舍、训练过程的“坑”、以及这些工作如何实实在在地影响了后来的产品与应用。
2. 核心思路与架构范式演变
多模态学习并非新概念,但在Transformer出现之前,主流方法通常是“分而治之”。例如,做图文检索,会分别用CNN提取图像特征,用RNN或LSTM提取文本特征,然后设计一个复杂的融合层或损失函数让它们在某个空间中对齐。这种方法的问题在于,特征提取器和融合策略往往是任务特定的,泛化能力差,且模态间的交互通常发生在高层特征层面,属于“晚期融合”,难以捕捉细粒度的跨模态关联。
Transformer的引入,从根本上重塑了多模态处理的范式。其核心思想是:将不同模态的数据,统一转化为一种通用的“序列”表示,然后利用Transformer强大的自注意力机制,在序列内部和序列之间进行全连接、动态的交互。这催生了两种主流的先导性架构范式。
2.1 范式一:单流融合架构(Single-Stream Fusion)
这种范式的代表作是VisualBERT、Unicoder-VL等。其核心设计非常直观:将图像和文本的输入序列拼接成一个长的联合序列,然后送入一个统一的Transformer编码器进行联合编码。
具体来说,对于文本部分,沿用BERT的方式,将句子切分为词元(Token),加上[CLS]和[SEP]等特殊标记。对于图像部分,则需要进行一次关键的“视觉词元化”(Visual Tokenization)。早期工作通常采用预训练好的目标检测模型(如Faster R-CNN),从图像中提取出一系列显著区域的特征(例如,检测出“狗”、“草地”、“飞盘”等区域),每个区域的特征向量就作为一个“视觉词元”。同时,也会为这些视觉词元添加类型嵌入(Type Embedding)和位置嵌入(Position Embedding,可以是检测框的中心坐标归一化后的向量)。
注意:视觉特征提取器的选择:使用Faster R-CNN这类检测器作为视觉编码器,虽然能提供富含语义信息的区域特征,但也引入了几个问题:1) 检测器本身需要大量标注数据预训练;2) 检测到的区域数量不固定,且可能遗漏某些重要但非物体的纹理或背景信息;3) 整个流程不是端到端的,增加了系统复杂性。这是先导性工作在当时技术条件下的一个折中选择。
随后,文本词元序列和视觉词元序列被拼接起来,前面加上统一的[CLS]标记,形成如[CLS], 文本词元1, 文本词元2, ..., [SEP], 视觉词元1, 视觉词元2, ...这样的输入序列。这个序列被送入Transformer编码器。
在编码器内部,自注意力机制会计算序列中任意两个位置(无论是文本-文本、图像-图像,还是文本-图像)之间的关联权重。这意味着,模型在训练过程中,可以自动学习到“飞盘”这个词元与图像中那个橙色圆形区域特征之间的强关联,也能学习到“狗”与“飞盘”在视觉和语义上的共现关系。最终,[CLS]位置输出的向量,被认为聚合了整个跨模态序列的信息,可用于下游分类任务(如图文匹配、视觉问答)。
这种架构的优势在于模型简洁,跨模态交互充分且是深度的(从底层就开始融合)。但其缺点也很明显:由于图像被表示为一系列离散的区域特征,丢失了原始的像素级空间结构信息;并且,文本和图像的序列长度相加后可能很长,导致计算复杂度(O(n²))急剧上升。
2.2 范式二:双流编码架构(Dual-Stream Architecture)
为了克服单流架构的某些短板,另一种范式——双流编码架构应运而生,其典型代表是ViLBERT和LXMERT。
这种架构的核心思想是:先让文本和图像分别在独立的Transformer流中进行自模态编码(Self-Modality Encoding),然后再通过一个额外的、专门的“跨模态注意力”模块,让两个模态的信息进行交互。
具体流程分为三步:
- 模态特定编码:文本流接收文本词元序列,图像流接收视觉特征序列(同样来自检测器),它们分别通过若干层Transformer层,进行模态内的信息整合。例如,文本流会学习到句子中词语的语法和语义依赖,图像流会学习到各个物体区域之间的关系。
- 跨模态注意力交互:这是该架构的精髓。设计了一种交叉注意力(Co-Attention)层。在文本到图像的注意力中,文本序列的每个位置作为“查询”(Query),去图像序列的所有位置中寻找相关的“键-值”(Key-Value)对。反之亦然。这个过程允许信息在两个模态间双向流动。例如,当处理“狗在追什么?”这个问题时,文本流中的“什么”可以通过跨模态注意力,聚焦到图像流中“飞盘”的区域特征上。
- 融合与输出:经过多轮跨模态交互后,两个流的输出可以被拼接或通过池化等方式融合,用于下游任务。
双流架构的优势在于其灵活性:它可以更灵活地设计跨模态交互的层数和方式;两个模态的编码器可以分别预训练(如在大量文本上预训练文本编码器,在图像分类任务上预训练视觉编码器),然后再进行多模态联合微调,这在数据稀缺的早期非常有用。此外,由于在前期进行了模态内编码,一定程度上缓解了长序列问题。
然而,它的计算和参数量通常更大,因为需要维护两套参数,并且交互模块也增加了复杂性。同时,跨模态交互发生在各自模态的高层表示之后,可能不如单流架构的底层融合来得直接。
2.3 范式演进背后的核心洞察
无论是单流还是双流,这些先导性工作都共享几个核心的技术洞察:
- 统一序列表示:将非结构化的图像信息转化为序列,是应用Transformer的前提。这启发了后来更极端的做法,如直接将图像分割成固定大小的图块(Patch)并线性投影为向量(ViT的做法),使得真正的端到端视觉-语言预训练成为可能。
- 注意力即对齐:自注意力机制本质上是在学习输入元素间的软对齐(Soft Alignment)。在多模态语境下,这种对齐就是跨模态的 grounding( grounding)。模型无需显式的对齐标注,就能从海量数据中自动学习到“词”与“物”、“描述”与“场景”的对应关系。
- 预训练-微调范式的迁移:这些工作成功地将BERT在NLP领域的“大规模无监督预训练 + 下游任务微调”范式迁移到了多模态领域。它们设计了诸如“掩码语言建模(MLM)+ 图像区域预测”、“图文匹配(ITM)”等预训练任务,让模型从数以亿计的图文对中学习通用的跨模态表示。
3. 关键技术细节与实操要点解析
理解了宏观架构,我们深入到这些先导性工作的“内脏”,看看它们是如何解决具体工程和算法挑战的。这部分内容对于想要复现或在此基础上进行改进的实践者至关重要。
3.1 视觉特征的提取与表示
这是早期多模态Transformer面临的首要挑战。文本有成熟的词元化(Tokenization)方案,图像呢?
主流方案:基于目标检测的区域特征。如前所述,VisualBERT、ViLBERT等均采用Faster R-CNN(通常是在Visual Genome数据集上预训练的)作为视觉编码器。具体操作如下:
- 输入:一张图像。
- 处理:Faster R-CNN会输出一组候选区域(Region Proposals),每个区域用一个边界框(Bounding Box)和对应的视觉特征向量(通常是RoI池化后的2048维向量)表示。
- 筛选:通常会按目标置信度排序,选取前K个(例如K=36或100)区域作为该图像的视觉词元。
- 特征处理:每个区域的特征向量会通过一个线性层(有时加LayerNorm和激活函数)进行降维,投影到与文本词嵌入相同的维度D(如768维)。这个投影层是可学习的。
- 位置信息:为了保留空间信息,每个视觉词元还会附加上其位置嵌入。通常是将边界框的归一化坐标
[x_min, y_min, x_max, y_max]通过一个小的全连接网络映射成D维向量,与视觉特征向量相加。
实操心得:区域数量K的选择:K值是一个需要权衡的超参数。K太小(如10),可能无法覆盖图像中所有重要信息;K太大(如100),会显著增加序列长度和计算开销,且可能引入大量无关的背景区域。实践中,36-50是一个常用范围。此外,可以考虑使用非极大值抑制(NMS)来减少重叠区域,或者使用基于注意力权重的动态区域选择策略,但这些在最初的先导工作中较少使用。
潜在问题与演进:
- 检测偏差:模型性能受限于检测器的质量。检测器没认出来的物体,多模态模型也无能为力。
- 非端到端:检测器是冻结的(不参与梯度更新),导致视觉特征无法根据多模态任务进行优化。
- 信息损失:区域特征丢失了像素级的细节和全局布局信息。
正是这些痛点,直接推动了后续如ViT、Swin Transformer等视觉Transformer的发展,以及像CLIP那样直接使用原始图像patch作为输入的方法的兴起。
3.2 预训练任务的设计
预训练任务是让模型从海量无标注数据中学习通用知识的“练习题”。多模态预训练任务需要同时涉及两种模态,并促使它们建立联系。
1. 掩码语言建模(Masked Language Modeling, MLM):这是从BERT直接继承的核心任务。随机遮盖输入文本中一定比例(如15%)的词元,让模型根据剩余的文本词元和所有视觉词元来预测被遮盖的词。例如,给定图像和句子“一只狗在草地上追逐一个[MASK]”,模型需要利用图像中“飞盘”的视觉信息来预测出“飞盘”。这个任务强制模型深入理解视觉内容对文本语义的约束。
2. 图像-文本匹配(Image-Text Matching, ITM):这是一个二分类任务。输入一个图像-文本对,模型需要判断这个文本是否描述了该图像。在训练时,会构造正样本(匹配的图文对)和负样本(不匹配的图文对)。负样本的构造有技巧:通常采用“批次内负采样”(In-batch Negative),即同一个批次中的其他图像的文本作为当前图像的负样本,反之亦然。这个任务学习的是图像和文本的整体语义对齐。
3. 掩码区域预测(Masked Region Prediction, MRP)或视觉-语言对比学习:有些工作尝试了与MLM对称的任务,即随机遮盖一部分视觉区域特征(用零向量或特殊标记替换),让模型根据文本来预测被遮盖区域的特征。但直接回归高维视觉特征比较困难。后来,更多工作采用了对比学习的思想(如CLIP),将ITM任务扩展为大规模批次内的多模态对比学习,让匹配的图文对在表示空间中靠近,不匹配的远离,这成为了更强大的预训练目标。
4. 单词-区域对齐(Word-Region Alignment, WRA):一些工作(如UNITER)引入了需要更细粒度监督的任务。例如,利用现成的目标检测器提供的物体标签,或者通过无监督方法(如最优传输)计算单词和图像区域的软对齐矩阵作为弱监督信号,让模型显式地学习局部对应关系。
注意事项:预训练任务的组合与权重:通常不会只使用一个任务,而是多个任务联合训练。这就涉及到任务权重(Loss Weight)的调配。MLM和ITM通常是基础且有效的。在实践中,需要监控每个任务的损失下降情况,如果某个任务损失远大于其他,可能会主导梯度更新,导致模型偏向该任务。动态调整任务权重或采用梯度裁剪、梯度归一化等策略是常见的调优手段。
3.3 模型初始化与训练策略
“站在巨人的肩膀上”在这些工作中体现得淋漓尽致。
- 文本编码器初始化:无一例外地使用预训练的BERT(Base或Large)来初始化文本部分的词嵌入层和Transformer层。这带来了强大的语言先验知识。
- 视觉编码器初始化:视觉部分的投影层和跨模态交互的Transformer层通常是随机初始化的。而视觉特征提取器(Faster R-CNN)在大多数先导工作中是冻结的,即其参数在预训练过程中不更新。这是因为训练检测器需要像素级标注,计算成本高,且当时认为冻结的、在视觉任务上预训练好的特征已经足够通用。
- 训练数据:大规模的网络爬取图文对数据集是关键,如Conceptual Captions、SBU Captions等,数据量可达数百万至数千万对。
- 优化技巧:由于模型参数量大(数亿参数),训练需要使用混合精度训练(AMP)以节省显存和加速。学习率需要精细设计,通常对文本部分采用较小的学习率(以免破坏宝贵的语言知识),对新初始化的部分采用较大的学习率。梯度累积常用于模拟更大的批次大小(Batch Size),这对对比学习任务尤其重要。
4. 典型工作实操过程与核心实现剖析
我们以VisualBERT这个典型的单流架构为例,来模拟一个从零开始复现其核心部分的简化实操流程。请注意,这并非完整的工程代码,而是为了阐明关键步骤和决策点。
4.1 环境准备与数据预处理
假设我们使用PyTorch框架,并准备一个小规模的图文对数据集(如Flickr30k)进行原理验证。
# 环境依赖 pip install torch torchvision transformers pip install pytorch-transformers # 早期BERT实现可能用这个 pip install opencv-python pillow数据预处理流程:
- 文本处理:使用BERT对应的分词器(Tokenizer)对描述文本进行分词,添加
[CLS]和[SEP]标记,并转换为对应的词元ID(token ids)。同时生成注意力掩码(attention mask)和词元类型ID(token type ids,用于区分句子,在多模态中可用于区分文本和图像)。 - 图像处理: a.目标检测:这是最复杂的部分。我们需要运行一个预训练的Faster R-CNN模型(例如,使用
torchvision.models.detection.fasterrcnn_resnet50_fpn,并在Visual Genome上微调过的权重)。输入图像,模型会输出一系列边界框、类别标签和特征向量。 b.区域选择:根据检测置信度对区域进行排序,选择Top-K个。同时记录它们的边界框坐标。 c.特征提取与投影:将选中的区域特征向量(假设是2048维)通过一个可学习的线性层投影到隐藏维度D(如768维)。visual_features = self.visual_projection(detected_features)。 d.位置编码生成:将边界框坐标[x1, y1, x2, y2]归一化到[0, 1],然后通过一个小的全连接网络生成D维的位置嵌入。pos_embeddings = self.bbox_embed(normalized_boxes)。 e.视觉词元构建:最终的视觉输入是投影后的特征加上位置嵌入:visual_tokens = visual_features + pos_embeddings。同时,为所有视觉词元分配一个统一的词元类型ID(如1,以区别于文本的0)。
4.2 模型构建核心代码逻辑
下面是一个高度简化的VisualBERT模型前向传播核心逻辑:
import torch import torch.nn as nn from transformers import BertModel, BertConfig class VisualBertForPreTraining(nn.Module): def __init__(self, config): super().__init__() # 1. 文本编码器:使用预训练BERT self.text_encoder = BertModel.from_pretrained('bert-base-uncased') text_hidden_size = self.text_encoder.config.hidden_size # 通常是768 # 2. 视觉投影层 self.visual_projection = nn.Linear(2048, text_hidden_size) # 假设检测器特征为2048维 # 3. 位置嵌入层(用于视觉框) self.bbox_embed = nn.Linear(4, text_hidden_size) # 输入是4维坐标 # 4. 词元类型和位置嵌入(沿用BERT的,但需要扩展) # BERT本身有token_type_embeddings和position_embeddings # 我们需要确保位置嵌入能容纳文本+图像的总长度 # 通常做法是初始化一个更长的位置嵌入表,或者对视觉部分使用单独的可学习位置嵌入 # 5. 跨模态Transformer编码器(可以是全新的,也可以复用BERT的部分层并扩展) # 这里为了简化,假设我们直接使用一个扩展了最大位置和类型数的BertEncoder bert_config = BertConfig.from_pretrained('bert-base-uncased') bert_config.max_position_embeddings = 512 # 假设扩展总长度 bert_config.type_vocab_size = 2 # 文本和图像两种类型 self.transformer = BertModel(bert_config).encoder # 只使用编码器部分 # 6. 预训练任务头 self.mlm_head = nn.Linear(text_hidden_size, vocab_size) # MLM任务 self.itm_head = nn.Linear(text_hidden_size, 2) # ITM任务,二分类 def forward(self, input_ids, attention_mask, token_type_ids, visual_features, visual_boxes): """ input_ids: 文本词元ID [batch, text_len] visual_features: 检测到的区域特征 [batch, vis_num, 2048] visual_boxes: 区域框坐标 [batch, vis_num, 4] """ batch_size = input_ids.size(0) # --- 文本嵌入 --- text_embeddings = self.text_encoder.embeddings.word_embeddings(input_ids) # 加上位置和类型嵌入(这部分在完整的embedding层中完成更合适,此处为示意) # --- 视觉嵌入 --- # 投影特征 projected_visual = self.visual_projection(visual_features) # [batch, vis_num, hidden] # 生成位置嵌入 bbox_emb = self.bbox_embed(visual_boxes) # [batch, vis_num, hidden] visual_embeddings = projected_visual + bbox_emb # --- 构建联合输入序列 --- # 假设文本序列以[SEP]结尾,我们将视觉序列接在后面 # [CLS] 文本1 文本2 ... [SEP] 视觉1 视觉2 ... sequence_embeddings = torch.cat([text_embeddings, visual_embeddings], dim=1) # --- 构建联合注意力掩码和词元类型ID --- # 注意力掩码:文本和视觉部分都为1 text_mask = attention_mask # [batch, text_len] visual_mask = torch.ones(batch_size, visual_embeddings.size(1), device=input_ids.device) joint_attention_mask = torch.cat([text_mask, visual_mask], dim=1) # 词元类型ID:文本部分为0,视觉部分为1 text_token_type = torch.zeros_like(input_ids) visual_token_type = torch.ones(batch_size, visual_embeddings.size(1), device=input_ids.device, dtype=torch.long) joint_token_type_ids = torch.cat([text_token_type, visual_token_type], dim=1) # --- 通过跨模态Transformer编码器 --- # 需要扩展位置ID,这里简化处理 encoder_outputs = self.transformer( hidden_states=sequence_embeddings, attention_mask=joint_attention_mask, token_type_ids=joint_token_type_ids, ) sequence_output = encoder_outputs[0] # [batch, seq_len, hidden] # --- 预训练任务输出 --- # MLM任务:只预测被遮盖的文本位置 mlm_logits = self.mlm_head(sequence_output[:, :text_embeddings.size(1), :]) # ITM任务:使用[CLS]位置的输出(通常是序列第一个位置) cls_output = sequence_output[:, 0, :] itm_logits = self.itm_head(cls_output) return mlm_logits, itm_logits4.3 训练循环关键步骤
在训练循环中,我们需要计算两个任务的损失并加权求和。
# 假设已获取批次数据 input_ids, attention_mask, visual_feats, visual_boxes, mlm_labels, itm_labels = batch_data # 前向传播 mlm_logits, itm_logits = model(input_ids, attention_mask, visual_feats, visual_boxes) # 计算MLM损失(仅对masked位置计算) mlm_loss_fct = nn.CrossEntropyLoss(ignore_index=-100) # -100为忽略的标签 active_loss = attention_mask.view(-1) == 1 # 只计算有效位置 active_logits = mlm_logits.view(-1, vocab_size)[active_loss] active_labels = mlm_labels.view(-1)[active_loss] mlm_loss = mlm_loss_fct(active_logits, active_labels) # 计算ITM损失 itm_loss_fct = nn.CrossEntropyLoss() itm_loss = itm_loss_fct(itm_logits, itm_labels) # 总损失 total_loss = mlm_weight * mlm_loss + itm_weight * itm_loss # 反向传播与优化 optimizer.zero_grad() total_loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm) # 梯度裁剪 optimizer.step() scheduler.step() # 学习率调度实操心得:梯度裁剪与损失平衡:多任务训练时,梯度爆炸风险增加,梯度裁剪(
clip_grad_norm_)几乎是必须的。max_grad_norm通常设置在0.5到1.0之间。对于损失权重mlm_weight和itm_weight,论文中常设为1:1,但实际需要根据任务难度和损失量级微调。一个技巧是观察最初几个epoch两个损失的数值,如果相差一个数量级以上,可以适当调整权重使其处于同一量级,避免一个任务主导训练。
5. 常见问题、排查技巧与影响分析
即使理解了原理和流程,在实际复现或应用这些先导模型时,依然会遇到诸多挑战。以下是一些常见问题与解决思路。
5.1 显存溢出(OOM)问题
这是训练大型多模态模型时最常遇到的“拦路虎”。
- 问题表现:训练开始不久即报
CUDA out of memory错误。 - 排查与解决:
- 减小批次大小(Batch Size):这是最直接有效的方法。但批次大小过小可能影响优化稳定性,尤其是对比学习任务。
- 梯度累积(Gradient Accumulation):通过多次前向传播累积梯度,再一次性更新参数,可以模拟大批次训练的效果。例如,设置
accumulation_steps=4,实际批次大小为per_gpu_batch_size * 4。 - 混合精度训练(AMP):使用
torch.cuda.amp自动将部分计算转换为半精度(FP16),显著减少显存占用并加速训练。这是现代深度学习训练的标配。 - 检查输入序列长度:视觉区域数量
K是序列长度的主要贡献者。尝试减少K(如从50减到36)。同时,文本长度也可以截断。 - 激活检查点(Gradient Checkpointing):以时间换空间,只保存部分中间激活值,需要时重新计算。对于非常深的模型有效。
- 模型并行/数据并行:当单卡无法容纳时,需使用多卡策略。数据并行最常见,但若模型单卡都放不下,则需要模型并行(如将Transformer层拆分到不同卡上)。
5.2 模型不收敛或效果差
- 问题表现:训练损失震荡不降,或下降缓慢;在下游任务微调时准确率远低于论文报告。
- 排查与解决:
- 数据检查:首先确认数据预处理是否正确。检查视觉特征是否包含大量零值(检测器失效?),图文对是否真的匹配(数据噪声)。可以可视化一些样本,看检测框是否合理,文本描述是否准确。
- 学习率与优化器:使用AdamW优化器,并采用带有热身(Warmup)的学习率调度策略(如线性热身+余弦衰减)。学习率是关键,对于从预训练BERT初始化的部分,学习率应设小(如
2e-5到5e-5),对于新初始化的视觉投影层和跨模态层,可以设大一些(如1e-4)。热身步骤(如总步数的10%)有助于稳定训练初期。 - 损失权重:如前所述,监控各任务损失。如果MLM损失远大于ITM损失,可以尝试降低MLM的权重,或提高ITM的权重。
- 冻结策略:在早期训练阶段,可以尝试冻结文本编码器的前几层,只微调后面几层和新增的模块,防止语言知识被破坏过快。
- 验证集监控:不仅在预训练任务上监控损失,更要在一个小型下游任务(如图文检索)的验证集上定期评估。如果预训练损失下降但下游任务性能不升反降,可能是过拟合或任务设计有问题。
5.3 下游任务微调技巧
预训练好的模型需要在下游任务(如VQA、图文检索、图像描述生成)上微调才能发挥最大价值。
- 任务特定头部:通常需要根据下游任务添加一个新的分类头或生成头。例如,VQA是一个分类问题,需要在
[CLS]输出上加一个MLP分类器;图像描述生成则需要在模型上接一个自回归的解码器(如Transformer解码器或LSTM)。 - 分层学习率:对预训练好的骨干网络采用较小的学习率,对新增的任务特定头部采用较大的学习率。
- 数据增强:对于视觉语言任务,适度的图像增强(如随机裁剪、颜色抖动)和文本增强(如同义词替换、随机删除)可以提升模型的鲁棒性。但要注意,增强不能破坏图文间的语义对应关系。
- 早停(Early Stopping):根据验证集性能决定何时停止训练,避免过拟合。
5.4 先导性工作的深远影响
这些基于Transformer的多模态先导性工作,其影响远远超出了它们在当时取得的SOTA性能。
- 统一架构的可行性证明:它们证明了Transformer能够作为处理多种模态数据的统一骨干网络,这直接启发了后来“大一统”模型的研究热潮,如处理纯图像的ViT,以及处理视频、音频、3D点云等各种数据的Transformer变体。
- 预训练范式的确立:它们成功地将NLP领域的“预训练-微调”范式规模化地迁移到多模态领域,确立了“大规模网络数据 + 自监督预训练任务”是学习通用跨模态表示的有效路径。这为后续如CLIP、ALIGN等十亿级别参数、数十亿数据训练的巨型模型铺平了道路。
- 端到端学习的演进:这些工作暴露了基于检测器的视觉特征的局限性,强烈刺激了社区寻求端到端的视觉表示学习方案。ViT将图像视为序列的简单暴力美学,正是对这一挑战的直接回应,并最终成为主流。
- 应用生态的繁荣:这些技术迅速下沉到工业界,推动了图文搜索、内容审核、智能创作、辅助驾驶、人机交互等众多应用的体验升级。你今天使用的很多AI功能,其底层技术都能追溯到这些先导性工作奠定的基础。
回看这些先导性工作,它们就像在未知海域投下的几枚探针,虽然设备略显笨重,测量范围有限,但却清晰地传回了“此处水深可航”的信号。它们解决具体问题的方法或许已被更优雅的方案替代,但其开创的融合范式、预训练路径和对“统一建模”的坚定信念,至今仍在深刻地塑造着多模态人工智能的发展方向。理解它们,不仅是了解一段历史,更是把握当前诸多SOTA模型思想根源的关键。
