type
status
date
slug
summary
tags
category
icon
password
论文地址:
原文摘要翻译
在缺失模态学习领域,恢复丢失模态的做法十分流行,因为这样通常有助于下游任务。然而,目前的方法经常使用深度学习网络直接从观测到的模态估计丢失的模态,忽略了不同模态之间分布的差异,造成了恢复模态与真实数据分布不一致。为了解决这个问题,在这篇工作中,我们提出了一个新颖的模态修复范式——DiCMoR来将可用模态的分布转换为缺失模态的分布,维持了修复模态数据分布的统一。确切的来说,我们设计了一种基于类别特定流的模态恢复方法,以在样本类别的条件下转换跨模态分布,利用正则化流的可逆性和精确密度估计,能够为缺失模态预测出一个分布一致的空间。生成的数据从预测的分布中提取,并与可用模态结合用于分类任务。实验表明,DiCMoR 在各种缺失模式下表现出优越的性能,并且比现有的最先进方法更具鲁棒性。可视化结果显示,恢复模态与缺失模态之间的分布差异有所减小。代码已发布于:https://github.com/mdswyz/DiCMoR。
1. 解决了什么问题?
这篇论文主要解决了缺失模态学习中的一个关键问题:如何在恢复缺失模态时保持与真实数据分布的一致性。传统方法直接从观测模态估计缺失模态,往往忽略了不同模态间的分布差异,导致恢复的模态与实际数据分布不符。该研究提出了一种新的模态恢复范式DiCMoR,通过将可用模态的分布转换为缺失模态的分布,以维持恢复模态数据分布的统一性,从而提高多模态学习的性能和鲁棒性。
2. 核心思想&创新点
发现了“数据分布不一致”这一痛点,用了一个和 Diffusion Model 类似的标准化流来“转换”不同模态之间的数据分布特征。
3. 核心方法

- 三个组件,分别负责提取特征、多模态分布转换和多模态融合
- 特征提取只是用了简单的一维卷积层。给图片也用一维是我没想到的
- 这篇工作前面铺垫了很久的“保持恢复出来的数据和真实数据分布要保持一致”的重要性,但继续读下去,这不过是一个简单的标准化流?
- 多模态融合阶段,是一个现成的多模态 Transformer
4. 启发?
Wang. 等人的这篇工作将标准化流的功能锚定在 “Distribution Consistency”,不为是一个颇好的问题切入点。这篇工作后面也通过可视化的方式展示了在“Distribution Consistency”方面,与state-of-the-art的对比:

5. 实验
5.1 横向对比实验
- 数据集
- CMU-MOSI
- CMU-MOSEI
- 参照组
- DCCA
- DCCAE
- MCTN
- MMIN
- GCNet
- 自变量
- 固定模态缺失情况
- 有L无V、A;有V,无L、A;……
- 随机模态缺失情况
- 缺失率: 取值为0.0到0.7
- 评价标准(因变量)
回顾一下, 是查准率和查全率的调和平均数:


6 代码分析
整体结构十分清晰,作者代码规范程度很高。通过代码分析,作者分别在MOSI和MOSEI两个数据集,以MR=0.0(完整模态)的情况下预训练了两个模型,对后再以MR=0.1、0.2等等数据训练。如果从直接开train的角度来看,整个代码的入口是 train.py ,这个文件只有几行,它调用了 run.py 里面的DICMOR_run( )函数。
6.1 超参数配置
作者采用了一个config文件来配置数据集和模型,后面用一个简单的json.load( )即可。详细的参见config.json,这里只列几个关键的点:
Dataset部分:
featurePath
:指定了特征文件的路径。这里表示对齐后的特征存储在MOSI/aligned_50.pkl
文件中。
feature_dims
:特征的维度,[768, 5, 20]
可能分别表示文本(768维)、音频(5维)、和视觉(20维)的特征。
train_samples
:训练样本的数量,这里是1284
个样本。
num_classes
:表示分类任务中的类别数,这里是3
类(可能是情感分类:积极、中立、消极)。
language
:这是用于处理数据的语言,"en"
表示英文。
KeyEval
:这是一个评价指标的键值,"Loss"
可能表示模型评估时的指标是损失函数(Loss)。
DiCMOR模型部分:
need_data_aligned
和need_model_aligned
:表示是否需要数据和模型对齐(对齐通常指的是不同模态数据在时间序列上的同步)。
early_stop
:早停法的参数,表示如果模型在10
个训练周期内没有改进,则停止训练。
use_bert
:是否使用 BERT 模型。BERT 是一种流行的预训练语言模型。
use_finetune
:是否对预训练的 BERT 模型进行微调。
attn_mask
:是否使用注意力掩码(一般用于处理变长序列)。
update_epochs
:每多少个训练周期更新一次模型。
对于文本,这篇工作采取了预训练的BERT;对于图像,采取了Facet;对于语音则使用了COVAREP。对数据预处理后的文本、图像和语音分别的维度是768、35、74(MOSEI数据集)
模型部分,针对不同的数据集有不同的超参数,下面是MOSI数据集的配置:
attn_dropout_a
和attn_dropout_v
:分别是音频和视觉模态的注意力层的 dropout 比例,用于防止过拟合。
relu_dropout
:ReLU 激活函数的 dropout。
embed_dropout
:嵌入层(embedding layer)的 dropout。
dst_feature_dim_nheads
:特征维度和注意力头数,[32, 8]
表示特征维度为32
,注意力头数为8
。
batch_size
:批处理大小,4
表示每次训练使用 4 个样本。
learning_rate
:学习率,表示模型的梯度更新步长,0.0001
是一个常见的小学习率。
nlevels
:卷积神经网络的层数。
conv1d_kernel_size_l
、conv1d_kernel_size_a
、conv1d_kernel_size_v
:分别指定文本、音频、视觉模态的 1D 卷积核大小。
text_dropout
、attn_dropout
、output_dropout
:文本模态、注意力层和输出层的 dropout 比例,用于防止过拟合。
grad_clip
:梯度裁剪的阈值,防止梯度爆炸。
patience
:早停法的耐心,5
表示模型在 5 个 epoch 内没有改进就停止训练。
weight_decay
:权重衰减,用于正则化,防止过拟合。
transformers
和pretrained
:指定使用bert
作为 transformer 模型,并且使用预训练的"bert-base-uncased"
。
6.2 实际跑一下吧!
我们回到DICMoR的主题逻辑。根据最最开始调用的train( )中提供的seed数量,每一个seed训练出一个模型,并用测试集测试。最后求出这若干个模型的各项指标的均值和标准差。最后将数据做成dataframe存到一个.csv文件里面。
开始跑这篇Paper的实验,结果老是报错:
搜了下,结果居然是实验室服务器连不上huggingface的网站(可恶!)
每次都会遇到各种版本不兼容。为何机器学习领域要用python?用C++不好吗(
6.3 模型分析
整体结构为:
BERT/Facet/COVAREP——Convolution Layer——Normalizing FLow——Multimodal Transformer
6.3.1 多模态 Dataloader
- 作者:CrystalPuNK
- 链接:https://crystalpunk.top/article/Papers/DiCMoR
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章
【nature】Accurate predictions on small data with a tabular foundation model

【ICLR 2024】A Flexible Generative Model for Heterogeneous Tabular EHR with Missing Modality
【ML】队列数据 Cohort Data

【ML】扩散薛定谔桥&扩散模型

Cross Domain Skeleton-based Action Recognition by Using Parameter-free Similarity Matching
【NIPS2017】Attention Is All You Need