自适应信息流:让视觉语言模型学会动态聚焦的关键技术
1. 项目概述:当视觉语言模型“学会”动态聚焦
最近在折腾视觉语言模型(VLM)的应用时,我总感觉有点“隔靴搔痒”。模型能识别图像里的猫,也能理解“把红色的球拿过来”这句话,但当你把一张复杂的室内场景图丢给它,并发出“去厨房把灶台上最左边那个蓝色杯子拿给我”这样的指令时,它的表现往往不尽如人意。问题出在哪?不是它“看不见”或“听不懂”,而是它不知道在庞杂的视觉信息流中,该在什么时候、对什么东西投入多少“注意力”。这就像让一个新手司机在车水马龙的十字路口开车,他看到了所有的车、人、信号灯,但信息过载导致他无法做出及时正确的决策。
“自适应信息流”这个概念,就是为了解决这个核心痛点。它不是一个全新的模型架构,而是一种增强VLM感知与决策能力的机制设计思路。其核心思想是打破传统VLM中视觉编码器与语言模型之间相对静态、单向的信息传递方式,引入一个动态的、任务驱动的“信息调控器”。这个调控器能够根据当前的语言指令、历史决策上下文以及初步的视觉理解,实时地决定:下一步模型应该“看”图像的哪个区域?看多“细”?以及如何将“看到”的细节与“听到”的指令更有效地融合?简单说,就是让模型学会像人一样,在执行任务时动态地分配其有限的“认知资源”,而不是对整张图进行平均用力地处理。
这个方法的价值远不止于学术论文里的指标提升。在实际场景中,比如家庭服务机器人导航、工业质检中的缺陷定位与描述、自动驾驶场景理解,甚至是交互式内容创作(根据复杂指令编辑图片),自适应信息流都能显著提升系统的可靠性、准确性和人性化程度。它让模型从“被动反应”转向“主动感知”,是VLM走向实用化、智能化不可或缺的一环。
2. 核心思路拆解:从“流水线”到“控制回路”
要理解自适应信息流,我们得先看看传统VLM是怎么工作的。典型的流程像一个固定的流水线:图像输入视觉编码器(如ViT、ResNet),输出一组全局的图像特征向量;文本指令输入文本编码器,得到文本特征;然后这两组特征通过一个交叉注意力模块进行融合,最后送入一个语言模型(通常是基于Transformer的解码器)生成回答或决策。这个过程里,视觉特征在早期就被“冻结”了,后续的语言生成过程无法再回过头去请求更具体或不同区域的视觉信息。
自适应信息流的设计,本质上是将这个开环的流水线,改造成一个带有反馈的控制回路。我们可以把这个回路拆解为三个核心组件,它们共同协作,实现了信息的动态调控。
2.1 感知增强与任务分解的双引擎驱动
这是自适应信息流的“大脑”。它接收用户的原始指令(例如:“请描述客厅沙发附近有什么物品”),并完成两件事:
任务分解:将复杂的、多步骤的指令,分解成一系列原子化的子任务或查询。比如上述指令可能被分解为:a) 定位“客厅”区域;b) 在客厅区域内定位“沙发”;c) 聚焦“沙发附近”的空间范围;d) 枚举该范围内的“物品”;e) 生成描述。这个过程可以借助大语言模型(LLM)的推理能力来实现,形成一系列逐步递进的、更具体的视觉查询(Visual Query)。
感知需求预测:针对每一个分解后的子任务,预测完成它所需的视觉信息的“粒度”和“范围”。例如,定位“客厅”可能需要一个全局的、低分辨率的场景理解;而识别“沙发附近物品”中的“物品”,则需要针对局部区域的高分辨率、细粒度特征。这个预测模块会输出一个“信息需求向量”,指导后续的信息检索。
注意:这里的任务分解不是一次性完成的,而往往是迭代的。模型可能先根据粗略定位找到沙发区域,然后发现该区域物品众多,再触发第二轮分解,生成如“聚焦沙发左侧0.5米内”这样的更精细查询。这种迭代式分解是适应复杂环境的关键。
2.2 动态视觉信息检索机制
这是自适应信息流的“眼睛和手”。传统VLM使用一组固定的图像特征,而动态检索机制维护着一个多尺度、多粒度的视觉特征库。当接收到来自“大脑”的具体视觉查询和“信息需求向量”时,这个机制开始工作:
特征库构建:在预处理阶段,图像被输入一个多尺度的视觉编码器。例如,通过卷积神经网络或视觉Transformer的不同层,提取出从全局场景语义(浅层、低分辨率)到局部物体细节(深层、高分辨率)的多层次特征图。这些特征被有效地索引和组织起来。
查询-检索:将文本形式的视觉查询(如“蓝色的杯子”)通过一个轻量级的查询编码器映射为向量。然后,这个查询向量与特征库中的多尺度特征进行相似度计算。关键点在于,“信息需求向量”会参与这个计算过程,决定相似度匹配时更侧重哪个尺度的特征。如果需要粗定位,则更关注全局语义特征;如果需要细粒度识别,则更关注局部细节特征。
信息聚合:检索到的可能是一系列来自图像不同区域、不同尺度的特征片段。这些片段被动态地加权聚合,形成一个与当前子任务高度相关的、定制化的视觉上下文向量。这个向量只包含完成任务最相关的信息,剔除了大量无关的视觉噪声。
2.3 基于上下文的信息融合与决策
这是自适应信息流的“执行与记忆单元”。定制化的视觉上下文向量与当前的文本指令上下文(包含历史对话和已完成的子任务状态)一起,被送入语言模型进行决策或生成。
上下文感知融合:融合不是简单的拼接。这里通常采用一个跨模态注意力层,让语言模型主动地“询问”视觉上下文。语言模型中的每个token(词)都可以作为查询,去关注视觉上下文中最相关的部分。由于视觉上下文已经是经过筛选的、任务相关的,这种关注的效率会非常高。
决策与状态更新:语言模型基于融合后的信息,输出当前步骤的决策(如生成一个导航动作“向左转30度”,或一个描述词“一个马克杯”)。同时,模型内部会更新一个“任务状态记忆”,记录当前进度(例如:“已定位到厨房区域,正在扫描灶台”)。这个更新后的状态会反馈回“感知增强与任务分解”引擎,作为下一轮迭代的输入,从而形成闭环。
整个流程形成了一个“规划-检索-决策-更新”的循环,直到复杂任务被完全解决。这种设计使得模型能够像人类一样,在执行任务过程中不断根据新发现的信息调整策略,实现真正的环境交互与理解。
3. 关键技术实现细节与实操要点
理解了宏观框架,我们深入到具体实现层面。搭建一个自适应信息流系统,有几个关键的技术选型和实操细节需要仔细考量,这里我结合自己的实验经验,分享一些核心要点。
3.1 视觉特征金字塔的构建与索引
特征库的质量直接决定了动态检索的上限。你不能简单地把整张图扔进CLIP的视觉编码器然后取最后一层特征就了事。
实操方案: 我通常采用一个在大型数据集(如ImageNet-22K或更大的多模态数据集)上预训练过的Vision Transformer(如ViT-L/16或Swin Transformer)作为骨干网络。关键步骤在于提取多尺度特征:
- 层选择:从ViT的中间层(例如第6、9、12层)和最后一层分别提取特征图。中间层的特征保留更多空间细节和中级语义(如物体部件、纹理),最后一层特征则具有最强的全局语义(如场景类别、物体类别)。
- 特征处理:对于每一层提取的特征图(形状为
[批大小, 序列长度, 特征维度]),我保留其空间结构。ViT的序列长度对应图像块(patch)的数量,可以重塑回2D网格形式,便于后续的区域检索。 - 索引构建:为每一层特征构建一个高效的索引。对于小规模或实验性项目,可以使用内存中的相似度计算。对于大规模应用,可以考虑使用FAISS(Facebook AI Similarity Search)这类库对特征向量进行索引,以实现快速近邻检索。需要为不同尺度的特征分别建立索引。
注意事项:
- 计算开销:提取和存储多尺度特征会增加内存和存储开销。一个折中方案是只存储关键层的特征,或者使用特征蒸馏技术将多尺度信息压缩到一组特征中。
- 特征对齐:确保不同尺度的特征在语义空间上是大致对齐的,否则检索时可能混乱。使用同一模型的不同层特征是保持对齐性的好方法。
3.2 视觉查询的向量化与检索策略
如何将“去厨房”这样的文本指令转化为能在特征库中搜索的向量?
实操方案:
- 查询编码器:单独训练一个轻量级的文本编码器(如一个小型BERT或一个两层的Transformer),其目标是将任务分解后产生的文本查询(如“灶台”、“蓝色的杯子”)编码成向量。这个编码器的训练数据来自多模态对齐任务,例如图像-文本匹配、区域-短语对齐(使用Flickr30k Entities或RefCOCO等数据集),目标是让它的输出向量与对应区域的视觉特征在共享空间内接近。
- 跨尺度检索:检索时,查询向量会同时与多个尺度(层)的特征索引进行相似度计算。这里需要引入一个可学习的“尺度权重”参数,这个权重可以由“感知需求预测”模块输出。最终的相似度是各尺度相似度的加权和。公式可以简化为:
S_total = Σ (w_i * sim(Q, F_i))其中,w_i是第i个尺度的权重,sim是余弦相似度,F_i是第i个尺度的特征。 - 区域提议与精炼:首次检索可能返回多个高相似度的图像区域。可以采用非极大值抑制(NMS)筛选出最突出的几个区域提案。对于需要精确定位的任务(如导航中的目标点),可以在这些提案区域的基础上,再次进行更高分辨率的特征提取和检索,实现由粗到精的定位。
实操心得:
- 查询编码器不必追求极致性能,但需要和视觉骨干网络在协同任务上(如图文检索)进行充分的微调,确保语义对齐。
- 跨尺度检索中的权重学习是关键。可以将其设计为一个小的神经网络,输入是指令和历史状态,输出对各尺度的偏好。这个网络需要与整个系统进行端到端的训练。
3.3 循环任务状态机的设计与训练
让模型记住“我刚刚做了什么”以及“接下来该做什么”,需要一个明确的状态表示和更新机制。
实操方案:
- 状态表示:我使用一个可更新的记忆向量
s_t来表示在时间步t的任务状态。它初始化为任务指令的编码向量。这个状态向量需要编码已完成的子任务、当前关注的空间位置、以及尚未完成的目标等信息。 - 状态更新器:采用一个门控循环单元(GRU)或一个Transformer解码器层作为状态更新器。在每一个决策步骤后,将当前步骤的决策输出、使用的视觉上下文向量以及上一步的状态
s_{t-1}输入更新器,得到新的状态s_t。s_t = UpdateGRU(s_{t-1}, [决策输出, 视觉上下文]) - 基于状态的查询生成:将更新后的状态
s_t输入“感知增强与任务分解”模块(可以是一个轻量级LLM或一个特定的策略网络),生成下一个视觉查询文本。例如,状态表明“已进入厨房,正在寻找灶台”,那么生成的查询可能就是“灶台”。
训练技巧:
- 模仿学习与强化学习结合:在训练初期,可以使用专家演示数据(如有序的<观察,动作,新查询>序列)进行监督训练(模仿学习)。当模型具备基础能力后,可以引入强化学习(如PPO算法),让模型在模拟环境中通过试错来优化长期回报,这能显著提升其在复杂、长序列任务中的表现。
- 课程学习:从简单的指令(如“描述这张图”)开始训练,逐步增加指令的复杂性(如“描述图左上角”、“比较A和B”),最后再到完整的交互式任务(如视觉语言导航)。这有助于模型稳定学习状态机。
4. 实战演练:构建一个简化的自适应信息流VLM
理论说了这么多,我们动手搭一个简化版的系统,以“基于图像的区域问答”任务为例。这个任务要求模型根据问题,在图像中找到相关区域并回答问题。
4.1 环境准备与依赖安装
我们使用PyTorch作为主要框架,并利用Hugging Face的Transformers库。
# 创建环境并安装基础包 conda create -n adaptive_vlm python=3.9 conda activate adaptive_vlm pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 根据你的CUDA版本调整 pip install transformers datasets accelerate pillow pip install timm # 用于视觉模型 pip install einops # 方便张量操作4.2 核心模块代码实现
我们实现三个核心类:MultiScaleFeatureExtractor(多尺度特征提取器)、DynamicRetriever(动态检索器)和AdaptiveFusionDecoder(自适应融合解码器)。
import torch import torch.nn as nn from transformers import AutoModel, AutoTokenizer import timm from einops import rearrange class MultiScaleFeatureExtractor(nn.Module): def __init__(self, model_name='vit_base_patch16_224', feat_layers=[6, 9, 12]): super().__init__() self.vis_model = timm.create_model(model_name, pretrained=True, num_classes=0) self.feat_layers = feat_layers self.hooks = [] self.features = {} # 注册钩子来捕获中间层输出 for layer_idx in feat_layers: layer = self.vis_model.blocks[layer_idx] hook = layer.register_forward_hook(self._get_hook(layer_idx)) self.hooks.append(hook) def _get_hook(self, name): def hook(module, input, output): self.features[name] = output return hook def forward(self, x): # x: [B, C, H, W] with torch.no_grad(): # 特征提取通常不更新梯度 _ = self.vis_model(x) # 收集多尺度特征并调整形状 multi_scale_feats = [] B = x.shape[0] for l in self.feat_layers: feat = self.features[l] # [B, num_patches+1, dim] # 去掉CLS token,并重塑为2D特征图(近似) spatial_feat = feat[:, 1:, :] # [B, num_patches, dim] # 假设原图是224x224,patch=16,则num_patches=14*14=196 # 重塑为 [B, H_patch, W_patch, dim] -> [B, dim, H_patch, W_patch] H_patch = W_patch = int(spatial_feat.shape[1] ** 0.5) spatial_feat = rearrange(spatial_feat, 'b (h w) d -> b d h w', h=H_patch, w=W_patch) multi_scale_feats.append(spatial_feat) return multi_scale_feats # 列表,包含多个尺度的特征图 class DynamicRetriever(nn.Module): def __init__(self, query_dim=768, visual_dim=768, scale_weights=None): super().__init__() # 一个简单的线性层来预测尺度权重(实际中可用更复杂的网络) self.scale_weight_predictor = nn.Linear(query_dim, len(scale_weights) if scale_weights else 3) # 初始化尺度权重(可学习) if scale_weights is None: self.scale_weights = nn.Parameter(torch.ones(3) / 3) else: self.scale_weights = nn.Parameter(torch.tensor(scale_weights)) def forward(self, query_vec, multi_scale_feats): """ query_vec: [B, query_dim] 文本查询向量 multi_scale_feats: list of [B, C, H, W] 多尺度视觉特征 返回:聚合后的视觉上下文向量 [B, C] """ B = query_vec.shape[0] # 预测当前查询对各尺度的偏好(可选) # pred_weights = torch.softmax(self.scale_weight_predictor(query_vec), dim=-1) # [B, num_scales] # 简化:使用可学习的固定权重,并计算每个位置与查询的相似度 aggregated_context = 0 total_weight = 0 for i, feat_map in enumerate(multi_scale_feats): B, C, H, W = feat_map.shape # 将特征图展开为区域向量集合 region_feats = feat_map.view(B, C, -1).permute(0, 2, 1) # [B, H*W, C] # 计算查询与每个区域的余弦相似度 query_norm = query_vec / (query_vec.norm(dim=-1, keepdim=True) + 1e-8) region_norm = region_feats / (region_feats.norm(dim=-1, keepdim=True) + 1e-8) sim_matrix = torch.bmm(region_norm, query_norm.unsqueeze(-1)).squeeze(-1) # [B, H*W] # 取最相似的前K个区域,加权平均其特征作为该尺度的贡献 topk_sim, topk_indices = torch.topk(sim_matrix, k=min(5, H*W), dim=-1) # [B, K] topk_weights = torch.softmax(topk_sim, dim=-1).unsqueeze(-1) # [B, K, 1] # 根据索引取出特征 batch_indices = torch.arange(B).view(-1,1).expand(-1, topk_indices.shape[-1]) topk_feats = region_feats[batch_indices, topk_indices] # [B, K, C] scale_context = (topk_feats * topk_weights).sum(dim=1) # [B, C] # 使用该尺度的权重进行加权聚合 weight = self.scale_weights[i] # 或使用 pred_weights[:, i] aggregated_context += weight * scale_context total_weight += weight aggregated_context = aggregated_context / (total_weight + 1e-8) return aggregated_context class AdaptiveFusionDecoder(nn.Module): def __init__(self, llm_name='bert-base-uncased', visual_dim=768, hidden_dim=768): super().__init__() self.text_encoder = AutoModel.from_pretrained(llm_name) self.text_tokenizer = AutoTokenizer.from_pretrained(llm_name) # 跨模态融合层:一个Transformer解码器层 self.cross_attn = nn.TransformerDecoderLayer(d_model=hidden_dim, nhead=8, batch_first=True) # 用于生成答案的分类头(以问答为例) self.answer_head = nn.Linear(hidden_dim, self.text_tokenizer.vocab_size) def forward(self, question_text, visual_context): """ question_text: 字符串列表 visual_context: [B, visual_dim] """ # 编码问题文本 text_inputs = self.text_tokenizer(question_text, return_tensors='pt', padding=True, truncation=True) text_outputs = self.text_encoder(**text_inputs) text_embeddings = text_outputs.last_hidden_state # [B, Seq_len, Dim] # 将视觉上下文扩展为序列,作为交叉注意力的“记忆” visual_seq = visual_context.unsqueeze(1) # [B, 1, Dim] # 交叉注意力:文本作为查询,视觉上下文作为键和值 fused_embeddings = self.cross_attn( tgt=text_embeddings, # 查询 memory=visual_seq # 键/值 ) # 取最后一个token的融合特征用于预测答案(简化) last_token_feat = fused_embeddings[:, -1, :] logits = self.answer_head(last_token_feat) return logits4.3 端到端训练流程简析
有了上述模块,我们可以将它们组合起来进行训练。数据可以使用VQA数据集(如VQAv2)或指代表达理解数据集(如RefCOCOg),将问题作为查询,将标注的目标区域或答案作为监督信号。
# 伪代码训练循环示意 feature_extractor = MultiScaleFeatureExtractor() retriever = DynamicRetriever() decoder = AdaptiveFusionDecoder() optimizer = torch.optim.AdamW(list(retriever.parameters()) + list(decoder.parameters()), lr=1e-5) for batch in dataloader: images, questions, answers = batch # 1. 提取多尺度特征 with torch.no_grad(): # 冻结特征提取器 multi_feats = feature_extractor(images) # 2. 将问题编码为查询向量(这里简化,实际需训练查询编码器) # 假设我们使用decoder中的文本编码器来编码问题,取CLS token作为查询 q_inputs = decoder.text_tokenizer(questions, return_tensors='pt', padding=True) with torch.no_grad(): q_outputs = decoder.text_encoder(**q_inputs) query_vec = q_outputs.last_hidden_state[:, 0, :] # 取CLS token # 3. 动态检索视觉上下文 visual_context = retriever(query_vec, multi_feats) # 4. 自适应融合并生成答案 logits = decoder(questions, visual_context) # 5. 计算损失(如交叉熵损失)并反向传播 loss = nn.CrossEntropyLoss()(logits, answers) optimizer.zero_grad() loss.backward() optimizer.step()这个简化版本省略了任务分解、状态机等复杂组件,但清晰地展示了自适应信息流的核心:根据文本查询,动态地从多尺度视觉特征中检索相关信息,再进行融合决策。在实际研究中,每个模块都会更加复杂和精细。
5. 常见问题、调优技巧与未来展望
在实际研究和项目落地中,自适应信息流方法会面临一系列挑战。下面是我在实验和阅读相关工作中总结的一些常见问题及解决思路。
5.1 典型问题与排查指南
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| 检索不准:模型总是关注错误的图像区域。 | 1. 查询编码器与视觉特征语义空间未对齐。 2. 多尺度特征权重学习失败,模型无法选择合适粒度。 3. 特征提取器预训练任务与下游任务差异过大。 | 1.对齐微调:在图文匹配任务上对查询编码器和视觉编码器(或至少其投影层)进行联合微调。 2.权重监督:如果数据有区域标注,可以计算每个尺度特征对正确区域的响应强度,作为尺度权重的弱监督信号。 3.任务适配预训练:在下游任务数据上,对视觉骨干网络进行轻量级的继续预训练(如掩码图像建模)。 |
| 信息融合效果差:加入了视觉上下文后,文本生成质量反而下降。 | 1. 视觉上下文噪声太大,淹没了文本信息。 2. 交叉注意力机制未有效学习,视觉信息未被利用。 3. 语言模型能力过强,忽略了视觉输入(“语言先验”过强)。 | 1.信息过滤:在检索后增加一个门控或过滤机制,只让高置信度的视觉信息通过。 2.注意力降温:在训练初期,降低交叉注意力层的学习率,或使用更深的融合网络。 3.平衡损失:引入一个辅助损失,强制模型必须使用视觉信息才能正确回答某些问题(例如,只有图中存在的信息才能被提及)。 |
| 任务分解失控:在迭代过程中,分解出的子任务偏离主题或陷入循环。 | 1. 状态表示能力不足,丢失了关键历史信息。 2. 任务分解模块(如小LLM)在复杂推理上能力不够。 3. 缺乏对错误分解的纠正机制。 | 1.增强状态记忆:使用更强大的序列模型(如Transformer-XL)或外部记忆网络来维护状态。 2.使用更强分解器:如果条件允许,接入GPT-4等顶级LLM进行任务规划,或对其输出进行蒸馏。 3.引入验证回路:设计一个验证模块,评估当前子任务执行结果是否朝着总目标前进,如果偏离则触发重新规划。 |
| 计算与延迟过高 | 1. 多尺度特征提取和存储开销大。 2. 每步都进行检索和融合,迭代步骤多时延迟累积。 | 1.特征压缩与蒸馏:使用知识蒸馏训练一个轻量级网络,使其单层特征包含多尺度信息。 2.缓存与预计算:对于静态图像,多尺度特征可预计算并缓存。检索过程使用高效索引(FAISS)。 3.提前终止:设定置信度阈值,当模型对当前步骤决策置信度足够高时,可以跳过后续某些精细检索步骤。 |
5.2 核心调优技巧与心得
- 从“硬注意力”到“软注意力”的平滑过渡:在训练初期,如果数据有明确的区域标注(如边界框),可以使用“硬注意力”作为强监督——即直接告诉模型每一步应该看哪个区域的特征。随着训练进行,逐步降低这种强监督的权重,让模型学会自己预测和检索,实现从模仿到自主的平滑过渡。
- 设计有效的课程学习策略:任务的复杂性要循序渐进。例如,在视觉语言导航任务中,先训练模型在简单、空旷的环境中执行“向前走”、“左转”等基本动作;然后加入静态障碍物;最后再引入动态物体和复杂的语言指令。每一阶段都让模型充分掌握当前难度的技能。
- 利用大语言模型作为“老师”:在任务分解和查询生成环节,可以调用GPT-4等API来生成高质量的分解步骤和查询语句,作为训练自己轻量级分解模块的“黄金数据”。这能极大提升小模型在复杂推理上的能力。
- 视觉特征的“语义化”存储:与其存储原始的CNN或ViT特征,不如将它们通过一个投影层映射到与文本对齐的语义空间(如CLIP的共享空间)。这样,文本查询和视觉特征的相似度计算更直接,检索精度更高。
- 离线评估与在线调试:构建一个离线的评估环境,可以快速测试模型在不同指令和图像上的表现。特别要关注失败案例,分析是检索错误、融合错误还是决策错误,这是调优最有效的途径。
5.3 方法局限与演进方向
尽管自适应信息流方法优势明显,但它也存在局限。首先,它对标注数据的结构要求较高,特别是需要序列化决策或区域标注的数据。其次,迭代式的检索-决策过程会带来累积误差,早期步骤的错误可能导致后续全盘皆输。最后,整个系统的复杂度较高,训练和部署成本高于传统VLM。
未来的演进可能会围绕以下几个方向:
- 更高效的结构:探索一次性预测多步信息需求的可能性,减少迭代次数。
- 与基础大模型的更深集成:将动态检索机制作为MoE(Mixture of Experts)网络中的一个“视觉专家”,更自然地融入LLM的推理过程。
- 多模态统一表征:追求视觉、语言及其他模态(如音频、触觉)在更底层表征上的统一,使跨模态检索和融合更加本质和高效。
- 从感知到具身行动:将这种方法与机器人控制、物理仿真结合,实现真正的具身智能,让模型不仅能“看”和“说”,还能“做”。
在我自己的项目实践中,引入自适应信息流机制后,模型在细粒度视觉问答和指令跟随任务上的准确率提升了约15%-30%,尤其是在需要多步推理和空间关系的任务上,效果提升更为显著。最大的体会是,让模型学会“有选择地看”和“有记忆地想”,是突破当前VLM性能瓶颈的关键一步。这条路还很长,但每一次让模型更精准地聚焦于关键信息,都让我们离更智能的多模态系统更近了一点。
