概要介绍

首先,做多模态融合前我们可以思考这几个问题

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

带着这几个问题我们开始今天的博客。

融合Fusion做的事情简而言之就是信息整合,将不同模态表示的信息融合为一个信息,得到一个特征向量,然后利用特征向量去做接下来的任务;用黑话讲就是深度挖掘不同模态的信息并对其进行高效融合进而形成最终的representation。怎么挖掘模态信息我们今天暂且不讲,今天我们来讲一下如何对这些信息做融合。

目前主流的融合方式有3种:

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

 1. 基于简单操作的融合

Simple Operation-based Fusion 就是将来自不同模态的特征向量使用简单的方式进行整合,比如:向量拼接,向量加权求和等等。

举个简单的例子,比如我们要做一个基于图像和文本双模态的分类任务,那么我们获取了图像和文本的特征向量之后,我们可以将这两个特征向量进行拼接,从而得到融合向量。

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

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

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

为了解决此问题,我们,退后,我要开始装B了,我们一般在对representations或者说features concat或者求和之前先给它们接几个全连接层,让他们互相学习一下他们之间的关系,这样效果会比较好。

还有一点实操过程中的问题是,对于concat而言,我们最好是保证文本特征向量和图片特征向量的维度是固定的,这样后面接全连接层维度不会出错。

但是有的时候我们输入的图片数量不固定,那么图片特征向量维度不一定,这个时候我们可以对图片的特征向量做max pooling让图片特征向量固定到一个维度再去和文本特征向量做concat。

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

以我自己个人经验来说,在图文多模态分类这个,使用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其实很简单,直接看这个图:

Python实现多模态融合 多模态融合方式_机器学习

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

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

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

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

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

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