多模态中各种Fusion方式汇总

多模态中各种Fusion骚操作

大噶好,我是DASOU;

今天继续写多模态系列文章,对多模态感兴趣的可以看我之前的文章:

其实对于多模态来说,主要可以从三个部分去掌握它:

  1. 如何获取多模态的表示【learning multimodal representations】
  2. 如何做各个模态的融合【fusing multimodal signals at various
    levels】
  3. 多模态的应用【multimodal applications】

今天我主要放在第二个部分,也就是各个模态的Fusion方式汇总;

Fusion做的事情简单来说就是把不同模态的信息整合为一个信息,得到一个特征向量,然后利用这个特征向量再去做下游任务;

所以它的任务就是更深的挖掘不同模态信息同时更好的融合进最终的representation;

我们可以把Fusion分为三种融合方式:

  1. 基于简单操作的融合
  2. Attention-based Fusion
  3. 双线性池化融合

1. 基于简单操作的融合

Simple Operation-based Fusion 就是说来自不同模态的特征向量可以使用很简单的方式进行整合,比如多个模态的特征向量的拼接,加权和;

举个简单的例子,比如我们现在做一个图文双模态的分类任务,我们获取了文本特征向量和图片特征向量,那么我们可以把两个特征向量直接拼接,就当做是融合后的向量了;

如果我认为文本的包含的信息更加的重要,图片包含的信息不是那么重要,我完全可以自定义文本特征向量权重为0.7,图片特征向量权重为0.3,然后两者的向量再concat或者做加权的和;

其实如果我们自己最开始做一个多模态任务,最先想到的方式就应该是这种基于简单操作的方式;

但是这个方式存在一个问题,就是两个模态之后没有做足够的交互,两者之间的联系比较弱一点;

针对这个,我们一般会在得到concat features之后,不会直接去做分类任务,而是再接一个或者几个全连接层,让模型自动的去学习两个模态之间的关系,这样效果会更好;

这里还有一点需要注意的是,对于concat方式,我们最好是确保文本特征向量和图片特征向量维度是固定的,这样后面接全连接层维度不会出错;

但是有些时候我们输入的图片数量不固定,那么图片特征向量维度不一定,这个时候操作比较多,举个简单例子可以先做一个max pooling到固定维度再去和文本拼接;

如果做加权和,我们需要确保文本和图片特征维度是相同的,这个就不多说,很好理解;

以我自己个人经验来说,在图文多模态分类这个,使用concat这种方式,能比单一的使用文本效果提升不到2个点左右,当然case by case;

2. Attention-based Fusion

第一种方式我一般是在任务中作为基线,简单粗暴有提升;之后任务迭代的时候,一般都会往attention上靠一靠;

因为concat虽然后面加上了全连接层学习两者之间关系,但是在两者的交互上来说还是有点弱的;

对于attention的操作可以简单分为:1.Image attention;2. Symmetric attention for images and text;3. Attention in a bimodal transformer; 4. Other attention-like mechanisms;

我详细说一下第三点,就是基于TRM的attention,因为TRM太火了;

基于TRM的attention这块,从两个类别去理解它,一个是基于TRM的多模态预训练模型,一个是基于TRM的微调模型;

基于TRM的多模态预训练模型,就是所借助TRM,输入是图片和文本信息,然后做预训练任务,从大量数据中学习到信息,然后得到多模态预训练模型,然后放入到下游任务中去;

但是这些有个问题,很多人都没有大量的图文平行无监督数据,相反大家一般都有图文平行的标注数据;

所以我们可以直接借助TRM的结构,直接做下游任务的微调就可以,这一块有个论文是facebook的MMBT;

MMMBT其实很简单,直接看这个图:MMBT结构图

就是借助bert做初始化,然后图片从resent得到向量输出,一般是三个,然后拼接文本,输入到bert,直接在下游任务做微调;

在这里我想多说几句,其实还可以直接对文本和图片之间做attention,多头或者单头都可以,其实单头就够了;

在写代码的时候,我在遇到一个问题,就是文本和图片之间attention的矩阵化,我踩了下坑~~~;

3. 基于双线性池化的融合办法

双线性池化也是一个比较受重视的融合方法,不过它的问题就是在于会把n为变成n的平方,复杂度大大提升,后续的改进一般都是在降低复杂度这一块;

双线性池化最初的操作,就是做向量的外积,获得一个矩阵,然后对矩阵做sum池化,得到特征向量,然后再去做分类;

如果是在实际业务,大家还是优先考虑前两种吧,双线性池化这个放后一点;

先写这么多,后续会写一个MMBT论文的解读;

参考论文:Multimodal Intelligence: Representation Learning, Information Fusion, and Applications

https://arxiv.org/pdf/1911.03977.pdf

### 多模态目标检测中的数据融合方法 #### 不同层次的融合技术 在多传感器环境中,数据处理过程通常涉及多个步骤,包括但不限于特征提取、模式识别以及最终的信息关联与合成。对于3D物体检测而言,存在三种主要的数据融合级别:数据级融合、特征级融合和决策级融合[^1]。 - **数据级融合**是指直接对原始感知数据进行组合操作,在这一层面上实施融合可以保留尽可能丰富的细节信息,但也因此带来了较高的计算成本。 - **特征级融合**是在完成各自独立的预处理之后再将各路信号转换成抽象表示形式后再加以综合分析。此级别的优势在于降低了后续处理的工作量并提高了效率。 - **决策级融合**发生在较高语义层面之上,当各个单独渠道都已经形成了各自的判断结论时才予以汇总考虑。这种方式能够有效减少错误传播的风险,不过可能会损失部分底层细粒度特性。 #### 融合策略的具体实现案例 针对自动驾驶场景下的三维空间内的障碍物探测任务,有研究提出了基于Transformer架构优化后的跨模态交互机制来提升模型性能表现[^2]。此外还有其他工作专注于设计轻量化且高效的网络结构用于实时环境监测应用场合——比如通过引入注意力机制增强点云卷积运算效果从而改善整体精度水平的同时兼顾速度需求[^3]。 #### 主要挑战之一—视差校正难题 值得注意的是,在实际部署过程中会遇到诸如不同种类传感设备之间存在的视角差异等问题给系统带来额外复杂性。这些因素不仅影响到输入端的一致性和同步性,同时也制约着后期高级别推理能力的发展潜力[^4]。 ```python import numpy as np def data_level_fusion(sensor_data_list): """模拟简单加权平均作为最基础的数据级融合""" weights = [0.5, 0.5] # 假设有两个传感器提供相同权重的数据 fused_result = sum([w * d for w,d in zip(weights,sensor_data_list)]) return fused_result if __name__ == "__main__": sensor_inputs = [ np.array([[1., 2.], [3., 4.] ]), np.array([[0.8, 2.2],[3.2, 3.9]]) ] result = data_level_fusion(sensor_inputs) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onnx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值