热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多模态特征融合机制(含代码):TFN(TensorFusionNetwork)和LMF(LowrankMultimodalFusion)

文章目录写在前面简单的concatTFN融合策略LWF融合策略论文全称:《TensorFusionNetworkforMultimodalSentimentAnaly


文章目录

    • 写在前面
    • 简单的concat
    • TFN融合策略
    • LWF融合策略


论文全称:
《Tensor Fusion Network for Multimodal Sentiment Analysis》
《Efficient Low-rank Multimodal Fusion with Modality-Specific Factors》



写在前面

最近在做一个分类的比赛,想要用上数据中的多模态信息(主要是文本和图像特征),因此探索了一些多模态特征的融合机制,并记录下来。

下文中均以3种不同模态下的特征融合为例。并设A模态特征维度为512,B模态特征维度为1024,C模态特征维度为32

import torch
A = torch.randn(16, 512)
B = torch.randn(16, 1024)
C = torch.randn(16, 32)

简单的concat

concat既是最简单也是最常用的一种方式,直接在特征维度将不同模态特征进行拼接后,再送入后续的推理模块。

fusion_feature = torch.cat([A, B, C], dim=1)

TFN融合策略

原理简述

TFN来自17年EMNLP会议论文《Tensor Fusion Network for Multimodal Sentiment Analysis》,其主要考虑了inter-modalityintar-modality两个方面。也就是要求既能考虑各模态之间的特征融合,也要有效地利用各特定模态的特征。

在这里插入图片描述
图左为Early Fusion策略,其实就是之前提到的concat方法,图右展现了作者提出的TFN模块(Tensor Fusion Network)。具体做法就是首先对每个模态用1进行维度扩充,然后对不同模态求笛卡尔积

以两个模态为例,对zv,zlz_v,z_lzv,zl1先扩充一维,得到后的特征再进行outer product(外积,张量积)。可以看到,用1扩充后,即计算了两个模态间的特征相关性,又保留了特定模态的信息。
在这里插入图片描述
同理,对三个模态求得了笛卡尔积后([za;1]⨂[zb;1]⨂[zc;1][z_a; 1] \bigotimes [z_b; 1] \bigotimes [z_c; 1][za;1][zb;1][zc;1]),即计算了两两模态间的特征、三模态间的特征,又保留了各特定模态中的特征(见上图的Tensor Fusion细节)。

n = A.shape[0]
# 用 1 扩充维度
A = torch.cat([A, torch.ones(n, 1)], dim=1)
B = torch.cat([B, torch.ones(n, 1)], dim=1)
C = torch.cat([C, torch.ones(n, 1)], dim=1)
# 计算笛卡尔积
A = A.unsqueeze(2) # [n, A, 1]
B = B.unsqueeze(1) # [n, 1, B]
fusion_AB = torch.einsum('nxt, nty->nxy', A, B) # [n, A, B]
fusion_AB = fusion_AB.flatten(start_dim=1).unsqueeze(1) # [n, AxB, 1]
C = C.unsqueeze(1) # [n, 1, C]
fusion_ABC = torch.einsum('ntx, nty->nxy', fusion_AB, C) # [n, AxB, C]
fusion_ABC = fusion_ABC.flatten(start_dim=1) # [n, AxBxC]
# A, B, C分别代表原来的特征维度nA,nB,nC加上1

需要注意的是,实际编程实现时并未直接计算得到3-D的笛卡尔积,而是分别两两计算outer product



LWF融合策略

上面提到的TFN对计算了两/三模态间的相关性,也保留了单模态的相关性,但同时也大大地增加了特征维度。增加特征维度从而会影响计算效率以及增加内存消耗,并且TFN所增加的时间/空间复杂度都与输入模态数呈指数增加。并且参数量一多,就容易增加过拟合的风险。

LMF是发表于ACL2017年的工作,针对TFN的上述问题,作者采用了low-rank weight进行多模态融合,降低参数量的同时还提升了计算速度。


建议先看看这篇博客:LWF论文解读


TFN中的融合后的特征Z维度为d1xd2xd3x....dm,其中m表示模态数,i模态特征维度为di。后续要将其送入推理模块中,通常需要降到h维的特征F,此时需要一个维度为(d1xd2xd3x....dm)xh的(M+1阶)权重W进行全连接操作。

全连接操作中,W可以视为h个M阶矩阵,每个矩阵与融合特征Z计算后的结果为F中的一维。

LMF要做的是就是将W分解成M组与各模态相关low-rank因子。按照上述的视角,将W视为h个矩阵,每个特征矩阵Wk如下所示,其中使得分解成立的最小R称为秩(Rank)。
在这里插入图片描述
在LMF中,人为设定固定的秩r,得到每个Wk矩阵了,对特征矩阵进行重新排列,使其变为与模态m相关的特征Wm
在这里插入图片描述
为了更好地理解排列过程,我画了一张图,展示了3个模态时,秩为r,期望维度为h的情况:
在这里插入图片描述

在这里插入图片描述

那么对特征变换(Zd维特征)的过程可以拆分为如下过程:
在这里插入图片描述
在这里插入图片描述

Z本身也是由不同模态的外积得到的,那么组合起来可得到下式。
在这里插入图片描述
其中Λ\LambdaΛ表示像素级点乘。这样分解之后,避免了从各模态特征Zm去建模Z,并且可以扩展到不同数量的模态上,大大降低了时间复杂度。以3模态的融合为例,图例如下:

在这里插入图片描述
从上图可知,最后的由多模态特征Zm融合成h维特征的过程就变成了:每个模态分别构建r个权重矩阵,融合后对各模态特征进行矩阵乘法,得到一个h维的特征;然后再将各模态得到的h维特征进行像素级乘法即可。代码如下:

import torch
import torch.nn as nn
from torch.nn.parameter import ParameterA = torch.randn(16, 512)
B = torch.randn(16, 1024)
C = torch.randn(16, 32)n = A.shape[0]
A = torch.cat([A, torch.ones(n, 1)], dim=1)
B = torch.cat([B, torch.ones(n, 1)], dim=1)
C = torch.cat([C, torch.ones(n, 1)], dim=1)# 假设所设秩: R = 4, 期望融合后的特征维度: h = 128
R, h = 4, 128
Wa = Parameter(torch.Tensor(R, A.shape[1], h))
Wb = Parameter(torch.Tensor(R, B.shape[1], h))
Wc = Parameter(torch.Tensor(R, C.shape[1], h))
Wf = Parameter(torch.Tensor(1, R))
bias = Parameter(torch.Tensor(1, h))# 分解后,并行提取各模态特征
fusion_A = torch.matmul(A, Wa)
fusion_B = torch.matmul(B, Wb)
fusion_C = torch.matmul(C, Wc)# 利用一个Linear再进行特征融合(融合R维度)
funsion_ABC = fusion_A * fusion_B * fusion_C
funsion_ABC = torch.matmul(Wf, funsion_ABC.permute(1,0,2)).squeeze() + bias

推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
GYuan83_844
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有