Multimocal_Fusion
主流融合方法
多模态融合指:让图像、文本,视频和音频等不同模态的信息在模型的某个层级发生交互,从而形成“联合表征”或“联合决策”。
通常包含三个关键问题:
- 融合发生在哪里;输入/特征/决策/模型内部多层
- 怎么让两种模态相互影响:拼接、门控、注意力、双线性、MoE等
- 融合后的表示拿来干什么:分类、检索、问答、生成
分成三大类:基于简单操作的融合、基于注意力的融合、基于双线性池化的融合。
图像编码器得到:
融合块要做的就是:构造一个联合表示
简单操作融合
很多时候编码器本身已经提取了高度抽象的语义,两个全局语义向量合起来已经能解决一大类任务。
拼接
其中
这里拼接负责“信息并置”, MLP 负责怎么组合这些信息。
MLP 的每一层只做线性变换,还没实现复杂交互,真正的交互来自非线性激活和多层MLP。
信息保留完整,参数少,训练稳定,适合全局语义型任务(图文而分类,多模态情感分析,用户画像判断)而不是精细对齐。
加权和(整体)
先把维度投到同一维:
再做线性加权:
真是多模态数据里可能两个模态的信息量并不总是一样的,可靠性也不一定一样,故加权和可以在更早阶段就做出一个整体判断。能提供一定自适应能力。
但是粒度不够细,因为所有维度都使用同一个比例,所有的语义子空间都按照同一规则融合。
门控融合(逐维)
让模型自己决定“更信谁”:
注意力融合
从“把向量合在一起”(简单融合)→ 到“让一个模态去选择另一个模态的关键信息”(注意力融合)。
核心公式:
| 组件 | 含义 |
|---|---|
| q(query) | “我现在想找什么信息?” |
| k(key) | “每个候选信息的标签” |
| v(value) | “真正的信息内容” |
图像注意力(Image Attention)
用文本语义去图像中找“最相关的区域”。
如果问题是“狗在做什么?”
模型应该关注“狗所在的区域”
机理是给定:
- 图像区域特征:
- 文本表示:
计算:
Up-Down Attention
先用检测器把图像拆成一组“语义区域候选”,再用语言去选择当前任务最相关的区域。
Bottom-up:从图像里提取出一组可能重要的对象/区域。 Top-down:根据问题或已生成的词,对这些候选区域分配注意力权重。
在该视觉注意力方法出现之前,一般是用CNN提取一张 featrue map,把feature map 上每个网格位置当成一个候选,文本去给这些位置分权重,但存在三个问题:一是候选单位不一定对应完整物体,语义不清晰,二是搜索空间太大,三是缺少对象层语义,很多视觉任务不是问哪个像素重要,而是问哪个物体重要。因此与其让注意力在低级网格上乱搜,不如先把图像分解成有语义的对象区域,再让语言去选,这是 Up-Down Attention 的出发点
通常做法是:
- 用 Faster R-CNN 一类检测器
- 在图像上得到若干个 region proposals
- 每个 proposal 对应一个边界框和一个区域特征向量
设一张图像被检测器提取出 K 个区域:
K 是候选区域数,比如 36 个,
这些
Up-Down Attention 的逻辑链是:
第一步:Bottom-up
图像先给出候选对象集合
第二步:Top-down
语言状态 q 对候选对象打分
第三步:归一化得到注意力
第四步:聚合区域
第五步:和语言一起做预测
例如在 VQA:
再送去分类器输出答案。这里的
SAN(Stacked Attention Network)
也是文本找图像,不过一次attention不够,会多次refine。
第一步粗看找到相关区域,第二步在这些区域中筛选,第三步精细确认。
在典型 VQA 场景中:
- 图像被表示为一组区域特征:
- 问题(文本)编码为一个向量:
计算注意力 logits
对每个图像区域
这是在做:文本
softmax 得到注意力权重
对应每个区域的重要性分布
加权得到图像表示
根据问题,选出“最相关的图像信息”
更新 Query(SAN的核心)
不是简单加法,而是在把“当前看到的图像信息”融入问题表示,可以理解为:
- 初始
:原始问题 - 更新后
:已经结合图像理解后的问题
DAN(Dual Attention Network)
双向注意力,引入memort vector进行迭代更新。
attention 计算:
图像 attention
协同注意力(Co-Attention)
不只是文本看图像,图像也反过来看文本,两个模态互相决定彼此的“重要部分”。
协同注意力的统一数学框架
输入表示
设:
- 图像区域特征:
- 文本 token 特征:
构造相似度矩阵(核心)
这是协同注意力的核心,它显式建模:所有 图像区域 × 所有文本词 的两两关系。
双向注意力计算(Co-Attention)
文本引导图像(Text → Image)
对每个图像区域:
或:
得到图像注意力:
图像引导文本(Image → Text)
对每个文本 token:
得到文本注意力:
本质上,
Transformer 融合
这是现代主流结构,双模态 Transformer 融合的本质,是把不同模态都表示成一串 token,然后用 self-attention / cross-attention 让它们在多层网络里不断交换信息,形成联合表征。
在单模态中:
在文本里每个词是一个 token,self-attention 让每个词看到其他词。
在图像里每个patch / regin 是一个 token,self-attention 让每个视觉 token 看其他视觉 token。
在多模态中:
Transformer 可以做模态间的交互 cross-modal modeling,也可以做模态内的交互 intra-modal modeling,还可以多层迭代融合,不只是交互一次,而是多层不断更新。
- 输入表示
设:
图像 token 序列
文本 token 序列
这里图像 token 可以来自:patch,检测框 region,CNN 网格特征。
文本 token 一般来自:WordPiece / BPE,LSTM 输出,embedding + positional encoding。
- Self-Attention
对于任意一组 token X,标准多头注意力先省略多头,写成单头:
- Cross-Attention
如果文本去看图像:
每个文本 token 从图像 token 中取信息。
反过来图像看文本:
ViLBERT
双流结构(vision stream + language stram),先个自己做自己的 self-attention,中间用 co-attention / cross-attention 交换信息。两条路中间搭桥。
图像和文本的结构差异很大,文本有强语法顺序,图像 token 更偏空间/对象分布,如果一开始就把两者混在一起,可能会破坏各自内部建模。
数学形式
设第 l 层时:
- 图像表示为
- 文本表示为
(1)先做模态内 self-attention
图像流:
文本流:
这一步表示:图像区域之间先互相交流,文本 token 之间先互相交流。
(2)再做 co-attention / cross-attention
文本从图像读信息:
图像从文本读信息:
(3)残差 + FFN 更新
OmniNet
使用gated multi-head attention,不仅要让模态之间交换信息,还要控制交换多少,哪些头更可信,哪些模态该被抑制。
普通 cross-attention 默认一个前提:只要算出来了 attention,得到的信息都应该被用上。
但现实里这不总对,例如:
- 文本描述很模糊,图像信息反而误导
- 图像有噪声,某些 attention 头学到伪相关
- 某一模态当前不可靠,不该强行融合
标准多头注意力
单个 head:
加门控后的形式
一种典型 gated attention 写法可以理解为:
先算普通注意力输出:
DrFuse
不是直接融合模态,而是先拆分“共享信息 vs 模态特异信息”,再在“疾病级别”动态决定融合权重,从而同时解决模态缺失与模态冲突问题。
该论文的模型将每个模态拆分为两部分,共享 shared 和 特异 distinct,前者跨模态一致,后者模态独有。
对于两个模态:
在融合阶段,
若 CXR 缺失:
这是在embedding空间做线性插值,先转成“概率语义”,再融合,再映射回特征空间。因为 shared 表示本质是“跨模态一致的预测倾向”,sigmoid 后更接近“概率解释”,在概率空间平均,比在特征空间平均更稳健。尤其在模态分布差异大(EHR vs 图像),数值尺度不一致的情况下更有效。
DrFuse 不直接融合两个模态,而是构造三类信息源:
疾病感知注意力融合(Disease-aware Attention)
- 定义
对于每个疾病标签
- Attention 计算
query(患者表示):
若 CXR 缺失:
- 机制解释
与普通 attention 不同,这里有两个关键点:
- disease-specific
每个疾病一套权重:
- 肺炎 → 更依赖 CXR
- 代谢异常 → 更依赖 EHR
- patient-specific
同一疾病,不同患者权重也不同:
- 有明显影像征象 → CXR 权重大
- 无明显影像 → EHR 权重大
- 为什么这样有效
传统融合:固定权重 / 全局 attention
DrFuse: 权重 = f(患者, 疾病)
- Attention Ranking Loss(最关键的监督机制)
定义:让 attention 权重的排序,与各信息源的“预测能力”一致。
辅助预测:分别计算三个表示的预测损失:
如果:
则应满足:
损失形式(示意)
机制解释:
普通 attention:权重是“学出来的”,不一定可信
DrFuse: 用“谁预测得更好”来监督 attention
为什么这样有效:
解决了 attention 的核心问题:attention ≠ importance
通过 ranking loss: 让 attention ≈ 实际贡献,从“相关性权重” → “可靠性权重”
- 最终表示(针对疾病
):
双线性池化融合
不是只把两个模态特征拼起来,而是显式建模“一个模态的每一维”和“另一个模态的每一维”之间的乘性交互。
相比于 concat、加权和、普通的 MLP 融合更强的地方在于:双向性池化融合直接做到 “视觉第 i 维和文本第 j 维同时出现,会产生什么联合语义”。
适合图文匹配、VQA,多模态分类,细粒度跨模态对齐。
若输出是一个标量:
,通常为视频模态 ,通常为文本模态
把它展开:
这里的每一项都是:
MCB(Multimodal Compact Bilinear)
用随机映射近似外积,计算效率高。原始目标是近似:
常见形式可以概括成:
是 Count Sketch 随机映射随机映射(Random Projection / Random Mapping)
在 MCB 里,随机映射
是把原始向量映射到一个更低维的空间。这里常见的实现就是 Count Sketch。- 随机映射
有两个向量:
如果直接做外积: , 结果会是一个 的矩阵。如果 都很大,这个矩阵就会非常大,计算和存储都很贵。于是就有一个想法:不直接在原空间里做这个超大的交互,而是先把原始向量压缩到一个较低维空间,再在低维空间里做近似计算。
这个“先压缩”的过程,就是随机映射。
- 为什么叫“随机”
因为它不是按“语义”或“人工规则”去压缩,而是用随机规则来决定:
- 原向量的第
个分量被扔到低维向量的哪个位置 - 它是加进去还是减进去
这种随机性看起来很“粗暴”,但它有理论保证:
JL 引理保证“结构不变”,Count Sketch 保证“统计不偏”,Tensor Sketch 保证“外积可近似” ,只要维度选得合适,整体统计性质(内积)能保留得不错,所以可以近似原本的双线性交互。
- Count Sketch 随机映射怎么做
设原始向量:
我们想把它压到长度为 DDD 的向量里(通常 )。需要两个随机函数:
(1)哈希函数
它决定原始维度 iii 被映射到压缩向量的哪一个“桶”里。(2)符号函数
它决定原始分量加进去还是减进去。(3)构造压缩向量
定义压缩后的向量
,它的第 个元素为: 意思是:所有被哈希到桶 的原始元素按照各自的正负号累加到 里- 一个小例子
假设原向量:
要压缩到长度设随机函数给出:
那么:
第1桶:来自
第2桶:来自
第3桶:来自
所以:
这就是一次 Count Sketch 压缩。- 为什么这种方法有用
虽然多个原始维度会“撞到”同一个桶里,产生信息混叠,但:
- 正负号随机化可以减少系统性偏差
- 哈希散列能把信息比较均匀地分布
- 在足够维度下,整体统计关系仍能保留
所以它适合做“近似”,尤其适合 MCB 这种不追求精确恢复外积、而追求高效表示交互的任务。
- 在 MCB 里随机映射的作用
它的核心作用是:
把高维外积问题,转化为低维空间中的近似问题。
也就是先把
和 各自压缩成: 接着利用卷积和 FFT 去近似原本的双线性交互。 是逐元素乘法FFT是快速傅立叶变换
卷积乘法(Convolution)
- 卷积是什么
对两个向量
,离散卷积记作:a*b它的第 k 个元素定义为:
- 卷积的直觉
卷积不是简单地“对应位置相乘”,而是:
一个向量在另一个向量上滑动,每次对齐后做乘积求和。
所以卷积体现的是一种“局部组合”“平移匹配”“聚合交互”。
- 和逐元素乘法的区别
逐元素乘法
要求同位置相乘,结果还是同样长度的向量。卷积
是“很多位置之间的组合求和”。所以卷积比逐元素乘法更能表达“交互组合”。
- 一个简单例子
设:
普通离散卷积结果为长度 3:第0项:
第1项:
第2项:
所以:
你可以看到,中间项是多种组合累加出来的,这正是卷积的特点。
为什么卷积能和外积联系起来
外积本质上保留了所有成对乘积:
而卷积则会把某些成对乘积,按照某种规则“折叠汇总”到一起。MCB 利用了 Count Sketch 的随机哈希机制,把原本的二维外积项随机地聚合到一维压缩表示中。 这个“聚合结果”可以用两个 sketch 向量的卷积来表示。
也就是说:
外积的压缩 sketch,大致等于两个输入 sketch 的卷积。
这就是 MCB 的关键数学桥梁。
更形式化一点地说,Tensor Sketch 有一个重要性质:
这里右边的卷积,就是 MCB 真正计算的东西。- MCB 里为什么不是直接算卷积
因为直接算长度
的卷积,复杂度通常是: ,还是不够快。于是就引出第三个核心工具:快速傅里叶变换 FFT。
快速傅里叶变换(FFT)
- 傅里叶变换是什么
傅里叶变换的核心思想是:
任何复杂信号,都可以表示成很多不同频率的正弦波、余弦波的叠加。所以它是一种“换坐标系”的方法。
原来的表示,我们通常在“时域”或“原始坐标”里看一个向量:
变换后的表示,傅里叶变换把它改写成“频域表示”: 这里每个 表示原信号在某个频率上的强度和相位。- 离散傅里叶变换(DFT)
对于长度为
的离散向量 ,DFT 定义为: 其中: 是虚数单位 表示复指数基函数 表示不同频率分量
- 直觉理解 FFT/DFT
可以把它理解成:
用一组不同频率的“标准波形”去投影原向量,看原向量里包含多少这些频率成分。
所以傅里叶变换本质上是:
- 一种基底变换
- 一种频率分解
- 一种更适合做卷积的表示方式
- 为什么需要“快速”傅里叶变换
直接按 DFT 定义计算,每个
都要累加 项,总共 个 ,复杂度是: 。FFT(Fast Fourier Transform)是一类高效算法,可以把这个复杂度降到:
。这就是它“快”的地方。- FFT 做了什么优化
FFT 利用了复指数的对称性、周期性,把一个大规模 DFT 递归拆成若干个小规模 DFT 来算。
最经典的是 Cooley-Tukey 算法,它把长度
的变换拆成:- 偶数位置部分
- 奇数位置部分
递归计算,从而显著减少重复运算。
你可以先把它理解为:
FFT 不是改变傅里叶变换本身,而是更聪明地计算它。
四、为什么 FFT 能用来算卷积
这是 MCB 里最关键的一步。
- 卷积定理
傅里叶分析里有一个非常重要的结论:
也就是:时域里的卷积,等于频域里的逐元素乘法。
反过来:
这就是MCB的公式来源。- 为什么这很重要
因为:
- 直接算卷积:复杂度高
- 先做 FFT,再逐元素相乘,再做逆 FFT:复杂度低
即:
- a 做 FFT
- b 做 FFT
- 对应位置相乘
- 做逆 FFT 得到卷积结果
复杂度大致变成:
,比直接卷积快得多。
MLB(Multimodal low-rank Bilinear)
保留双线性融合“乘性交互”的优势,但不用完整的大矩阵去建模所有维度对之间的关系,而是先把两个模态映射到一个低维共享空间,再做逐元素乘法。
- 先从“完整双线性”说起
假设两个模态特征分别是:
- 视觉特征:
- 文本特征:
标准双线性形式
如果输出一个标量:
展开来看
- 视觉第
维 - 文本第
维
会通过参数
如果输出是向量
若输出维度为
- MLB 的基本思想:对双线性做低秩分解
核心想法是把原来的大矩阵/大张量,用低秩结构近似。先看最简单的标量输出情形。
若:
我们希望把
其中:
这里的
代入原式
那么:
- MLB 的常见向量输出形式
在实际多模态模型里,我们通常不是只输出一个标量,而是输出一个融合向量。
于是 MLB 常写成:
表示逐元素乘法
然后再接一个线性层:
MFB(Multi-modal Factorized Bilinear Pooling)
它仍然属于低秩双线性融合,但不像 MLB 那样每个输出维度只对应一组交互因子,而是为每个输出维度分配多个因子,再通过池化把这些因子聚合起来。
MLB 是“一个输出维度对应一个乘性因子”,MFB 是“一个输出维度对应 k 个乘性因子,然后再把这 k 个因子汇总”。
- 先说 MFB 想解决什么问题
MFB 是在 MLB 的基础上发展出来的,所以先要明白:MLB 虽然好,但仍然有一个表达瓶颈。
MLB 的核心公式通常写成:
- 两个模态都被映射到一个
维共享空间 - 然后逐元素乘法
- 得到一个
维输出
也就是:
这样做的含义是:
- 第 1 个输出维度,只由第 1 个潜在因子决定
- 第 2 个输出维度,只由第 2 个潜在因子决定
- ……
换句话说,每个输出维度只有“一次乘性交互机会”。
这会带来一个问题:
如果某个输出语义本身很复杂,只靠一个乘性因子可能不够表达。
例如,一个输出维度如果对应的是某种复杂语义,它可能需要同时整合:属性因子、对象因子、位置因子、语境因子。
而 MLB 给它的只是“一对相乘”的通道,表达能力就偏弱。
- MFB 的基本思想:每个输出维度不只用 1 个因子,而是用 k 个因子
所以 MFB 的想法非常自然:
不要让每个输出维度只绑定一组交互,而是给它分配多个低秩因子,再把这些因子汇聚起来。
- MFB 的标准计算过程
设:
- 模态 1 特征:
- 模态 2 特征:
目标输出维度是
第一步:映射到
不是像 MLB 那样映射到
第二步:逐元素乘法
第三步:reshape 成矩阵
把长度为
- 每一行对应一个最终输出维度
- 每一行里有
个因子
第四步:sum pooling
对每一行做求和池化:
把 MFB 写成更直观的形式
如果我们把第
是模态 在第 个输出维度、第 个因子上的投影向量 是模态 在对应位置上的投影向量
机制解释
可以把 MFB 理解成:
对每个输出维度,使用 k 个双线性基来逼近原始双线性交互。
而那个 sum pooling,并不是随便设计的池化,而是在实现:
把同一输出维度下的多个低秩交互基进行聚合。
MFH(High-order)
MFB 只做一层 factorized bilinear 交互,本质仍偏二阶;MFH 通过级联多个 MFB 模块,让融合表示包含更高阶的跨模态组合关系。
MFB = 多因子双线性;MFH = 堆叠多个 MFB,形成高阶因子化池化。
- MFH 想解决什么问题
先从 MFB 的局限说起。MFB 已经比 MLB 更强
MFB 的形式是:
但 MFB 仍然主要是“二阶”
虽然 MFB 比 MLB 更丰富,但它本质上仍然围绕:一个模态特征,另一个模态特征,二者之间的一次乘性交互。
也就是说,核心仍是:
即便做了多因子求和,本质还是“若干二阶项的组合”。
为什么还要更高阶
现实中的跨模态关系,往往不是简单的二阶配对就够了,而是更复杂的组合:
- 文本里的属性词 × 图像里的对象 × 图像里的上下文
- 问题语义 × 区域语义 × 全局场景
- 多个属性和多个局部证据共同决定答案
所以研究者会进一步问:
能不能在保留 MFB 低秩高效的前提下,让融合表示拥有更高阶交互能力?
这就是 MFH 的出发点。
- MFH 的基本思想
MFH 的思想非常直观:
不要只做一个 MFB,而是做多个 MFB block,并让后面的 block 继续乘上前面的交互结果。
这样一来,交互不再只是:
- 模态 A × 模态 B
而是会逐步变成:
- (模态 A × 模态 B) × (模态 A × 模态 B) × …
于是得到更高阶的组合表达。
- 先回顾 MFB 的一个 block 形式
为了方便理解 MFH,先把 MFB 写成 block 形式。
设第一个 block 的投影结果为:
- MFH 的核心结构:级联多个 block
MFH 的关键不在于单个 block,而在于:
后一个 block 不再独立地产生交互,而是和前一个 block 的展开交互结果继续逐元素相乘。
两层 MFH 的典型形式
第一层:
如果有
- 为什么这叫 High-order
这个名字不是随便起的,它对应的是交互项阶数的提升。
一层时:二阶交互
第一层:
两层时:更高阶交互
第二层:
更高层时
如果堆更多层,就会形成更复杂的乘积链条。 因此 MFH 建模的不是简单“一个视觉因子 × 一个文本因子”,而是:多个视觉-文本子因子的联合乘积结构所以叫 High-order。
- MFH 的详细计算流程
下面按一步一步的网络实现来写。
假设输入为:
设:
- 输出维度:
- 每层 factor 数:
- block 数:
第一步:第 1 层投影
把所有层拼接:
无参数合集(待完善)
在多模态场景下,源对目标的信息可以被分解为 unique、redundant 和 synergistic 三类互斥成分。然而,这些成分在结构和统计性质上具有显著差异:unique information 是模态特有且分散的,redundant information 是跨模态共享的,而 synergistic information 则依赖于多模态联合才能显现。因此,如何在不引入额外可学习参数的前提下,对这三类结构异质的信息进行有效融合,是一个关键问题。
- 拼接
优点:三类信息结构保留完整
缺点:维度会变大
- 求和
- Mean或者Max
取平均数值更平滑(求和前也可以归一化)。
取max能保留最强响应的信息来源。
- 范数加权
利用向量本身进行范数加权
模态数为二时
权重由样本自身动态决定,不过范数大的不一定代表信息有用,只是表征响应更强。
- 基于差异性的softmax融合公式
首先利用余弦相似度度量不同信息成分之间的表征接近程度,并将每个成分相对于其他成分的总差异性定义为