基于VisualBERT的掩码图文建模如何提升目标词cat预测得分
问题描述
当前代码实现大量参考Huggingface Transformers库中视觉问答任务的VisualBERT官方示例,实现流程如下:
- 文本侧:向BERT输入序列时使用
[MASK]令牌完成输入掩码操作,为掩码位置配套对应监督标签 - 视觉侧:通过RCNN提取视觉嵌入,共得到36个ROI特征向量,对36个向量取均值聚合,聚合代码如下:
features = torch.mean(output_dict.get("roi_features"), axis=1).reshape(1,1,2048)
- 建模推理:将聚合后的特征输入预训练VisualBERT模型完成掩码图文建模,模型输出
prediction_logits。对预测logits在最后一个维度取argmax的结果如下:
prediction_logits[0].argmax(-1) # 输出 >> tensor([1012, 1037, 6302, 1997, 1037, 5723, 1012, 2003])
结合分词器词表将上述预测ID转换为对应词汇,输出为:
. a photo of a bathroom . is
掩码位置的预期预测结果应为cat或语义相近词汇,但实际预测得分最高的词汇为bathroom(得分9.5069),cat的预测得分仅为6.3830,二者分差明显,需要通过调整让cat成为掩码位置的最优预测结果。
可行调整方案
- 第一优先级修正视觉特征聚合逻辑:绝对不要对36个ROI特征做全局均值池化。预训练VisualBERT的训练范式是接收全量36个ROI区域特征,搭配每个区域对应的位置编码作为视觉侧输入,从来不是单个均值向量。均值池化会把猫、浴室墙面、地板、洁具的所有特征混合抹平,模型根本无法定位到猫对应的视觉信息,自然会优先预测图像里占比更大的场景类词汇。直接把原始形状为
(batch_size, 36, 2048)的ROI特征输入模型即可,不需要做均值和reshape操作。 - 核对视觉特征提取器匹配度:确认用来提取ROI特征的RCNN模型,和当前使用的VisualBERT预训练权重配套的视觉特征提取器完全一致。如果用了不同训练数据集、不同输出逻辑的RCNN提取特征,视觉嵌入和预训练的文本嵌入空间不对齐,模型无法正确理解视觉内容。
- 对齐预训练文本输入格式:VisualBERT做掩码图文预训练时的通用文本模板是
"a photo of a [MASK].",当前预测结果末尾多了is,说明文本输入拼接逻辑和预训练时的输入分布不一致,会直接干扰预测结果,需要删掉多余拼接的token。 - 过滤无效背景ROI:如果36个ROI里大部分是墙面、地面、洁具这类浴室背景区域,猫对应的区域特征占比太低,会被背景信息稀释。可以先根据RCNN输出的区域类别置信度,过滤掉背景类ROI,只保留实体类区域特征再输入模型,降低背景干扰。
- 核对掩码位置是否错位:确认最终取预测结果的索引位置,确实对应
[MASK]令牌的位置,避免错位取到其他token的预测结果。
内容的提问来源于stack exchange,提问作者lazytux
相关产品推荐
相关产品推荐

