记忆注意力用于多模态情感计算!

news2024/9/19 9:48:45

记忆注意力用于多模态情感计算!

目录

情感计算

一、概述

二、研究背景

三、模型结构和代码

六、数据集介绍

七、性能展示

八、复现过程

九、运行过程

模型总结

本文所涉及所有资源均在传知代码平台可获取。

情感计算

近年来,社交媒体的快速扩张推动了用户生成内容的大幅增加,特别是视频。跨不同模态的自动情感分析已成为旨在增强人机交互的关键研究领域。情感分析最初专注于提取和分析通过文本传达的情感。然而,随着计算能力的提高和视听通信的兴起,多模态情感分析(MSA)已经出现。这种方法集成了文本,音频和视觉输入,以加深对人类情感的理解。MSA在教育、客户反馈分析、心理健康监测和个性化广告等多个领域都有应用,显著增强了我们在各种沟通形式中解释和应对情感线索的能力。多模态情感分析(MSA)试图整合来自视觉,听觉和文本来源的情感线索来预测说话者的情感状态或倾向。然而,这些模式的情绪信号可能会有微妙的变化。下图示出了MSA的好处,展示了添加视觉和音频信息可以提高在歧义句和不同上下文中情感极性预测的准确性。

此外,由于现如今大多数的情感计算数据集都是基于英文语言开发的,所以我加入了中文数据集(SIMS, SIMSv2)应用在模型中,以开发适用于国人的情感计算分析模型,在未来,我也计划加入更多小众数据集,以便检测更隐匿的情感,如嫉妒、嘲讽等,使得AI可以更好的服务于社会。

【注】 我们文章中所用到的数据集,模型,checkpoint 下载链接都放在了附件的readme文件中,喜欢的同学可以下载;谢谢支持!

一、概述

本文在提出了两个新的模块,文本增强和记忆模块,应用在多模态情感计算中;这篇文章对两个模块进行讲解和手把手复现教学,解决当下热门的多模态情感计算问题,并展示在MOSI和MOSEI两个数据集上的效果

二、研究背景

随着多模态数据量的迅速增加,多模态情感分析(MSA)越来越受到关注。该方法通过整合不同数据模态间的信息,提高了情感极性提取的准确性,从而实现了信息的全面融合,提高了情感分析的精度。然而,当前的深度模型往往忽视了全局记忆信息,无法有效地辅助情感分析,因此我将介绍一种新的记忆注意力模块;此外现如今的研究表明,文本模态相对于其他模态拥有更丰富和准确的情感信息,因此,我提出了一个新的文本增强模块。

三、模型结构和代码

多模态情感分析是指从视频片段中的多个人体信号中判断人物的情感状态。对于视频片段XX,它通常由三个部分组成,包括 tt(文本)、aa(声学)和 vv(视觉),它们是由二维张量 Xt={Xm1,Xm2,...,XmLm},m∈{t,a,v}Xt ={Xm1 ,Xm2 ,...,XmLm },m∈{t,a,v} 表示。𝐿𝑚Lm 表示模态m的序列长度,xti,xai,xvixti ,xai ,xvi 表示每一帧视频、音频和第ii 个字。对于视觉序列,我们使用Facet或Pyfeat获取其原始特征。对于文本序列,我们使用来自预先训练的语言模型的标记器来获得其对应的标记序列 It∈RLtIt RLt 。另一方面,声学序列通过COVAREP处理以获得原始特征。其中,Sa∈RLa×daSa RLa ×da 和 Sv∈RLv×dvSv RLv ×dv 表示原始的声学和视觉特征序列。在这里,dvdv 和 dada 分别是视觉和声学向量维度。具体来说,受CENet的启发,我们采用kmeans算法将视觉和声学数据的真实的向量序列转换为索引,建立不同的“声学词汇”和“视觉词汇”,以减轻异构模态之间的初始分布差异。随后,我们使用Im={lm0,lm1,...,lmLm−1}Im ={lm0 ,lm1 ,...,lmLm −1 }表示模态m∈{a,v}m∈{a,v}.

1. 记忆注意力模块(EM)

记忆模块在多模态情感计算中起着关键作用,它允许模型通过注意机制根据查询动态地访问和整合记忆中的信息,从而增强特征的表达能力,使模型能够更准确地理解和捕捉复杂的情感内容。此外,EM可以存储和检索多模态数据中的关键信息,帮助模型减少噪声或不完整数据的不确定性,并提高情感分析任务的准确性和效率,并且通过动态更新和学习如何整合不同模态数据之间的关系,还使模型能够在训练后通过推广到以前看不见的数据来表现良好,保持高效和准确。同时,EM模块应用于所有三种模式(文本、视觉和声学)。

首先初始化一个可学习的记忆矩阵Et∈Rde×dvEt Rde ×dv ,其中 dede 表示记忆矩阵的维数,它可以根据模型的训练过程动态地更新参数,用于存储和检索模型的关键信息。之后,我们将对输入的视觉特征的查询 QvQv 、键 KvKv 和值 VvVv 进行线性更改,以保留输入维度;

Qv=Linear(dv)∈RB×dvQv =Linear(dv )∈RB×dv

Kv,Vv=Linear(de,dv)∈Rde×dvKv ,Vv =Linear(de ,dv )∈Rde ×dv

然后,在我们转移特征维度之后,我们可以使用Q和K计算注意力得分。

ATT_Sv=Qv⋅kv⊤dvATT_Sv =dv Qv kv

其中,ATT_SvATT_Sv 表示注意力得分,我们使用 SoftmaxSoftmax函数来获得注意力权重,并结合 VV进行加权求和,得到最终结果;

ATT_Wv=softmax(ATT_S)ATT_Wv =softmax(ATT_S)

Sum_Wv=ATT_Wv⋅VvSum_Wv =ATT_Wv Vv

在这个阶段,我们拥有包含关键记忆信息的特征,用于后续的特征交互。

下面是该模块的代码实现

class ExternalMemory(nn.Module):
    def __init__(self, text_dim, mem_size):
        super(ExternalMemory, self).__init__()
        self.text_dim = text_dim
        self.mem_size = mem_size
        
        # 外部记忆矩阵
        self.memory = nn.Parameter(torch.randn(mem_size, text_dim))
        
        # Linear transformations
        self.query_transform = nn.Linear(text_dim, text_dim)
        self.key_transform = nn.Linear(text_dim, text_dim)
        self.value_transform = nn.Linear(text_dim, text_dim)
        
    def forward(self, query):
        # 将输入的查询向量query进行线性变换,得到变换后的查询向量。这个变换的目的是将查询向量调整到与记忆矩阵相同的维度,以便进行后续的注意力计算。
        query = self.query_transform(query)  # (batch_size, text_dim)
        # 使用self.key_transform(self.memory)和self.value_transform(self.memory)分别对外部记忆矩阵进行键和值的线性变换,
        # 得到变换后的键矩阵和值矩阵。这些变换将外部记忆中的每个条目映射到与查询向量相同的空间。
        key = self.key_transform(self.memory)  # (mem_size, text_dim)
        value = self.value_transform(self.memory)  # (mem_size, text_dim)
        
        # 通过矩阵乘法torch.matmul(query, key.t())计算查询向量与每个键之间的点积注意力分数。
        # 这里使用了缩放点积注意力机制,通过除以math.sqrt(self.text_dim)来缩放注意力分数,其中self.text_dim是查询和键的维度大小
        scores = torch.matmul(query, key.t()) / math.sqrt(self.text_dim)  # (batch_size, mem_size)

        # 对注意力分数应用softmax函数F.softmax(scores, dim=-1),得到注意力权重,表示每个外部记忆条目对查询的重要性。
        attention_weights = F.softmax(scores, dim=-1)  # (batch_size, mem_size)
        
        # 使用注意力权重对值矩阵进行加权求和,计算加权平均值。weighted_sum表示基于注意力机制加权后的记忆信息.
        weighted_sum = torch.matmul(attention_weights.unsqueeze(1), value.unsqueeze(0))  # (batch_size, 1, text_dim)
        weighted_sum = weighted_sum.squeeze(1)  # (batch_size, text_dim)
        
        return weighted_sum

2. 文本增强模块

模块的核心组件是跨模态嵌入单元。该单元利用跨模态注意力机制捕捉长程非文本情感信息,并生成基于文本的非语言嵌入。嵌入层的参数是可学习的,用于将经过特征转换策略处理后的非文本索引向量映射到高维空间,进而生成文本模态对非文本模态的注意力权重矩阵。换句话说,这一单元通过复杂的神经网络结构,有效地整合了不同模态之间的信息交互,从而提升了情感分析任务的多模态处理能力。训练开始阶段,由于语言表征和非语言表征处于不同的特征空间,它们之间的相关性通常较低。因此,注意力权重矩阵中的元素可能较小。为了更有效地学习模型参数,研究者在应用 softmax 函数之前使用超参数来缩放这些注意力权重矩阵。

基于注意力权重矩阵,可以生成基于文本的非语言向量。将基于文本的声学嵌入和基于文本的视觉嵌入结合起来,形成非语言增强嵌入。最后,通过整合非语言增强嵌入来更新文本的表示。因此,该模块的提出旨在为文本提供非语言上下文信息,通过增加非语言增强嵌入来调整文本表示,使其在语义上更加准确和丰富。

六、数据集介绍

1. CMU-MOSI: 它是一个多模态数据集,包括文本、视觉和声学模态。它来自Youtube上的93个电影评论视频。这些视频被剪辑成2199个片段。每个片段都标注了[-3,3]范围内的情感强度。该数据集分为三个部分,训练集(1,284段)、验证集(229段)和测试集(686段)。

2. CMU-MOSEI: 它类似于CMU-MOSI,但规模更大。它包含了来自在线视频网站的23,453个注释视频片段,涵盖了250个不同的主题和1000个不同的演讲者。CMU-MOSEI中的样本被标记为[-3,3]范围内的情感强度和6种基本情绪。因此,CMU-MOSEI可用于情感分析和情感识别任务。

3. SIMS/SIMSV2: CH-SIMS数据集是一个中文多模态情感分析数据集,为每种模态提供了详细的标注。该数据集包括2281个精选视频片段,这些片段来自各种电影、电视剧和综艺节目,每个样本都被赋予了情感分数,范围从-1(极度负面)到1(极度正面)

七、性能展示

● 在情感计算任务中,通过对比实验和消融实验,可以看到我们的模块使得模型性能明显提高,证明了其有效性;

1. 对比实验:

MOSI数据集:

MOSEI数据集:

2. Case Study:

八、复现过程

在准备好数据集并调试代码后,进行下面的步骤,附件已经调通并修改,可直接正常运行;

1.  数据集准备

2.  下载MOSI和MOSEI数据集已提取好的特征文件(.pkl)。把它放在"./dataset”目录。下载预训练语言模型

3.  下载SentiLARE语言模型文件,然后将它们放入"/pretrained-model / sentilare_model”目录。下载需要的包

pip install -r requirements.txt

九、运行过程

1.  训练过程

2.  最终结果

模型总结

我们的模型适用于多模态情感分析场景,特别是在需要同时处理文本、声音和视觉信息的任务中表现突出。以下是模型的项目特点和适用场景总结:

适用场景:

● 社交媒体监控与分析: 模型能够有效地从社交媒体上的多模态数据中提取情感信息,帮助分析用户在言语、音频和视频内容中的情感表达,用于品牌监控、舆情分析等。

● 视频内容理解: 在视频内容分析中,可以同时处理视频中的语言文本、音频和视觉信息,提升对视频内容情感和情绪的理解能力,适用于视频推荐系统、内容审核等应用。

● 电影和电视节目评价: 通过结合电影或电视节目中的对话文本、声音和场景图像,可以更全面地分析观众对作品的情感反应,用于市场调研、口碑分析等。

● 心理健康监测与干预: 模型的能力使其在心理健康领域具有潜在应用,例如通过分析患者的语音、文本和面部表情数据来识别抑郁症或其他情感健康问题的迹象,为个性化的干预和治疗提供支持。

项目特点:

● 多模态信息融合: 采用记忆注意力机制,能够有效地整合文本、声音和视觉信息,提升情感分析的准确性和丰富性。

● 自适应学习策略: 模型内部使用超参数来调节注意力权重矩阵,从而在初始训练阶段优化不同模态信息之间的关联性,提升模型性能和参数学习效率。

● 非语言信息增强: 模块引入了非语言增强嵌入和记忆模块,通过结合基于文本的声学和视觉嵌入来丰富和调整文本的语义表示,提高文本表达的准确性和情感丰富度。

● 应用领域广泛: 不仅适用于情感分析,CENet还可扩展到其他需要综合多模态信息的任务,如智能会话系统、娱乐内容推荐和情感驱动的虚拟助理等领域。

综上所述,我们的模型以其能够处理多种模态信息并提升情感分析精度的特性,在多个现实世界的应用场景中展现了广泛的潜力和价值。

感觉不错,点击我,立即使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨境电商独立站:Shopify/Wordpress/店匠选哪个?

在面对不断增加的平台运营压力时,不少跨境电商的商家逐渐将注意力转向建立自己的独立站。据《中国跨境出口电商发展报告(2022)》所示,中国拥有的独立站数量在2022年已接近20万个,这表明独立站已成为卖家拓展海外市场的…

构建现代数据湖

现代数据湖是一半数据仓库和一半数据湖,对所有事情都使用对象存储。使用对象存储来构建数据仓库是通过 Open Table Formats OTF) 实现的,例如 Apache Iceberg、Apache Hudi 和 Delta Lake,这些规范一旦实现,就可以无缝…

800以内的蓝牙耳机推荐有哪些?四款优选精品百元蓝牙耳机推荐

面对市场上琳琅满目的品牌和型号,如何选择一款性价比高、功能全面的蓝牙耳机成为了一个让人头疼的问题,尤其是在众多的百元价位段的蓝牙耳机,800以内的蓝牙耳机推荐有哪些?作为一个选蓝牙耳机的过来人,我总结了四款优选…

一个极简的 vuedraggable 示例

https://andi.cn/page/621613.html

代码随想录算法训练营第 25 天 | LeetCode491.递增子序列 LeetCode46.全排列 LeetCode47.全排列ii

代码随想录算法训练营 Day25代码随想录算法训练营第 25 天 | LeetCode491.递增子序列 LeetCode46.全排列 LeetCode47.全排列ii 目录 代码随想录算法训练营前言LeetCode491.递增子序列LeetCode46.全排列LeetCode47.全排列ii 一、LeetCode491.递增子序列1.题目链接2.思路3.题解 …

React Native在移动端落地实践

在移动互联网产品迅猛发展的今天,技术的不断创新使得企业越来越注重降低成本、提升效率。为了在有限的开发资源下迅速推出高质量、用户体验好的产品,以实现公司发展,业界催生了许多移动端跨平台解决方案。这些方案不仅简化了开发流程&#xf…

轻松学EntityFramework Core--模型创建

一、使用代码优先(Code-First)创建模型 Code-First 方法是 EF Core 提供的一种用于定义模型的方式,它允许开发人员通过编写 C# 类来定义数据库模式,再通过迁移命令生成数据库表。下面我们来一起看一下代码优先如何使用。 1.1、创…

Collention集合基础知识

Array 数组是一种连续的内存空间存储相同数据类型数据的线性数据结构 数组获取其他元素的地址值 寻址公式 a[i] baseaddress i*datatypesize 为什么数组索引从0开始 从1开始不行吗 从0开始寻址公式 a[i] baseaddress i*datatypesize 从1开始寻址公式 a[i] baseadd…

利用GPT4o Captcha工具和AI技术全面识别验证码

利用GPT4o Captcha工具和AI技术全面识别验证码 🧠🚀 摘要 GPT4o Captcha工具是一款命令行工具,通过Python和Selenium测试各种类型的验证码,包括拼图、文本、复杂文本和reCAPTCHA,并使用OpenAI GPT-4帮助解决验证码问…

yolov5-7在opencv里跑自己的onnx模型

先把模型放在如下目录 运行如下代码 import cv2 import numpy as npclass Onnx_clf:def __init__(self, onnx:strdnn_model1/plane02.onnx, img_size640, classlist:list[plane]) -> None: func: 读取onnx模型,并进行目标识别para onnx:模型路径img_size:输出图片大小,和模…

Codeforces Round 962 (Div. 3) D. Fun (数学,暴力枚举)

非常好题目,使我思考良多。 经典的数学问题,题目给出了两道数学式子,当然就是要让我们推啊。 首先纠正一个错误,当我发现了这两个式子能凑出来平方式的时候我就想着去用两个式子来互相简化,但其实这样存在以下一个错误…

数据增强和数据平衡

数据增强(Data Augmentation) 数据增强是一种通过对数据进行变换来增加数据多样性的方法。它可以提高模型的泛化能力,特别是在图像和文本处理任务中。 原理 通过数据增强技术,生成更多样本,提高模型的泛化能力。例如…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

chrome浏览器驱动(所有版本)

chrome浏览器驱动 114之前版本 https://chromedriver.storage.googleapis.com/index.html 125以后 125以后版本下载链接在此,只有后面status是绿色对勾的才可以下载,驱动大版本一致就可以使用,不需版本号一模一样;下载所需版本只…

STM32智能工业监控系统教程

目录 引言环境准备智能工业监控系统基础代码实现:实现智能工业监控系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:工业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能工业监控系统通…

Java集合框架2024最通俗易懂(图片超全)

集合 1.1、定义 集合就是类型统一的数据组合而成的数据结构,该数据结构可以任意的改变长度。 1.3、Set Set数据存储结构,无序,且不可以重复,元素可以为null,但是也只能出现一次,如下图: 1.3.1、HashSe…

2. 卷积神经网络无法绕开的神——LeNet

卷积神经网络无法绕开的大神——LeNet 1. 基本架构2. LeNet 53. LeNet 5 代码 1. 基本架构 特征抽取模块可学习的分类器模块 2. LeNet 5 LeNet 5: 5 表示的是5个核心层,2个卷积层,3个全连接层.核心权重层:卷积层、全连接层、循环层&#xff…

从零开始学习网络安全渗透测试之基础入门篇——(二)Web架构前后端分离站Docker容器站OSS存储负载均衡CDN加速反向代理WAF防护

Web架构 Web架构是指构建和管理Web应用程序的方法和模式。随着技术的发展,Web架构也在不断演进。当前,最常用的Web架构包括以下几种: 单页面应用(SPA): 特点:所有用户界面逻辑和数据处理都包含…

Apache Nifi挂接MQTT与Kafka实践

目录 1. 说明: 2. 方案设计: 2.1 资源配置: 2.2 交互Topics: 3. 实现步骤 3.1 Nifi 桌面 3.2 MqttToKafka 3.2.1 配置 3.2.2 测试 3.2.3 结果 3.3 KafkaToMqtt 3.3.1 配置 3.3.1 测试 3.3.1 结果 ​编辑 4. 总结&#xff…

web学习笔记(八十三)git

目录 1.Git的基本概念 2.gitee常用的命令 3.解决两个人操作不同文件造成的冲突 4.解决两个人操作同一个文件造成的冲突 1.Git的基本概念 git是一种管理代码的方式,广泛用于软件开发和版本管理。我们通常使用gitee(码云)来云管理代码。 …