多模态——Deep Multi-Modal Sets
时间:2023-04-21 08:07:00
前言
论文:arxiv
目前,许多视觉任务将利用各种模式的特征来训练鲁棒性高、表征能力强的特征。以往的方法主要是利用特征Concat以及MLP挖掘和训练融合表征的特征。这样,当添加更多模式时,Concat特征纬度会越来越大。
贡献
- 本文为多模态集成提供了灵活处理特征数量和模态数量的结构。
- 这种结构可以方便我们在推理时分析哪种模式对模型的贡献最大/
方法
多模态任务可以理解为在训练任务中使用了不止一种模态的数据,目标是训练得到一个可以表征多个模态信息的embedding,这一特征将用于完成召回排序等下游任务。
传统方法,每个模式的特征Concat起床,用以下公式表示:
X1-I对应I模态的特征,这样XC维度是I特征的维度和,然后连接MLP层可用于预测下游任务。该方法有以下缺点:
- 如果某种模式缺失,则需要暂时使用占位特征,如补充0,但对于某些任务来说,全0的特征可能是一个非常不自然的特征,被人为地强加到训练任务中。
- 然后,对于序列特征,例如用户历史的点击行为,如果使用这些特征的次数不确定concat如果你来处理,你需要一切Padding最大长度会造成很大程度的计算浪费,增加很多无效特征。
- 此外,一些模态特征的维度相对较低,如性别特征可以用2维向量来表示,对于图像特征resnet50提取通常是2048维度的特征,存在模态特征纬度不平衡的问题,可能导致高纬度特征主要影响模型的性能。当然,这个问题可以先进行模态特征encoder处理到一定维度。下图显示了I中的第一个模式Mi纬度编码成D纬度。
- 最后,对于模态较多、某个模态序列长度不确定的情况,使用concat以及concat技术对他们的处理将非常不灵活。
Deepset,论文对deepset主要研究了序列特征的集成sum pool、max pool以及min pool等等,感觉有点落后…attention is all you need…目前主流方法还是基于transformer为了实现,论文的实验没什么好说的,主要介绍我自己的一些理解。
我在业务上实验了几种结构的比较,听了一些同事的技术分享。deepset它应该首先整合序列特征,然后整合整态特征。其优点是可以节省参数和计算量。例如,我的实验deepset结构:
f1-f5对应五个序列特征transformer输出后形状不变,如(bs, n, d)的输入给transformer输出还是(bs, n, d)此时的特征已经学会了序列之间的相互关系,为n的维度做了一个mean pool可以获得相应模态的特征特征(bs, 1, d),然后每个模态的特征concat最后,它被发送到所有模集成中transformer模块后就可以得到全局表征的embdding了。
对比另一种结构:
该方法的结论是参数计算量大,模型效果略差deepset形式模型。然后你可以在图中看到我concat然后绘制更多的渐变色特征,因为所有的特征总结将失去一个模式他输入哪个模式信息,一些方法将添加一个模式代码和序列代码,序列代码是一些序列依赖的特征,如视频图像特征。还有一些方法可以整合这种模式的特征concat可以使用融合特征maxpool或者sumpool来得到,像ECCV MMT。这种结构略显繁琐,需要添加序列位置编码和模态编码,然后参数仍然很大。
其他代码
看到facebook基于模态集成的代码也被开源deepset结构的transformer代码:
https://github.com/facebookresearch/multimodal/blob/main/torchmultimodal/modules/fusions/deepset_fusion.py