传知代码-让机器感受你的情绪!(论文复现)

2024-09-03 22:44

本文主要是介绍传知代码-让机器感受你的情绪!(论文复现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

代码以及视频讲解

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

让计算机理解你的情绪!

随着近年来社交媒体的快速增长,社交媒体上的用户生成内容(例如视频)的量大幅增加。不同模态的自动情感分析有利于人机交互,并吸引了大量的研究兴趣。多模态情感分析(MSA)旨在捕获和整合来自不同相关模态的情感信息,以预测说话者的情感状态或倾向。通常,我们可以从视频中获得三种形式:视觉,声学和文本。情感分析是一个重要的研究领域,旨在从人类话语中提取和融合情感信息。由于人类情感的多样性,多模态分析往往比单一模态分析更准确。为了补充相关模态之间的信息,一种有效的方法是执行跨模态交互。最近,基于transformer的框架已经显示出强大的捕获长范围依赖关系的能力,从而引入了几种基于transformer的多模态处理方法。
在这里插入图片描述

经过我对模型结构的修改和特征提取方法的改进,新模型的性能得到了很大的提升(3.22%)!证明了改进的有效性!

[注]:文中的使用的数据进行了重新提取,以适应当前复现和改进的模型,其中模型文件在附件中,数据、预训练模型在附件中的readme文件中都附上了下载链接,喜欢的朋友可以下载讨论!

一、概述

这篇文章我复现了一篇经典情感计算的论文 ‘TensorFormer: ATensor-Based Multimodal Transformer for Multimodal Sentiment Analysis and Depression Detection’,并加入其他模块进行了优化,以及不同的特征提取方法,获得了不错的效果;

二、主要贡献

  1. 提出TesnorFormer,一种新的基于张量的多模态Transformer,用于MSA任务。与以往的多模态工作相比,TensorFormer可以更有效地交换全局跨模态信息;
  2. 提出了一个注意力张量,基于张量的跨模态注意力机制。注意张量不仅考虑了不同模态的特点,而且同时与所有相关模态进行交互;
  3. 我个人采用了不同的特征提取方式 – SentiLARE;
  4. 加入了Multi-head CrossAttention模块和LSTM模块,增强了交互和模态时间信息的提取。
    在这里插入图片描述

三、模型结构和改进

1. 总体框架
下图为模型总体框架,主要包含特征提取,Global Cross-Modality Interaction(TensorFormer Block,Attention Tenson),Parallel Feed-Forward以及输出层:
在这里插入图片描述

2. Global Cross-Modality Interaction
为了执行全面的跨模态交互,设计了TensorFormer,其基本块结构如下图所示。出于通用性和可扩展性考虑,我们将输入模态特征表示为 X t X_t Xt (text)、 X a X_a Xa (acoustic)和 X v X_v Xv (visual),以说明TensorFormer的结构。在信息交换之前,采用线性变换将特征投影到相同的维度中。TensorFormer块中有两个主要模块,全局交叉注意模块和并行前馈模块。全局交叉注意模块旨在执行完整的模态交互。该模块的核心组件是注意力张量及其相应的查询,旨在全面,同时计算跨模态注意力分数。并行前馈模块由多个分支组成,用于处理相应模态的通道信息。

在这里插入图片描述

3. Attention Tensor
TensorFormer的全局交叉注意力机制的关键思想是注意力张量,一个包含重要信息以及所有模式的相关信息的张量。为了生成注意力张量,我们首先对输入特征执行平均池化,以获得预期特征,然后应用笛卡尔积来生成注意力张量;
在这里插入图片描述

4. Attention forGlobal Cross-Modality Interaction
注意力张量包含来自所有相关模态的综合信息。每个模态都可以从 A A A 查询注意力分数, A A A 包含所有其他模态的信息。在这里,我们首先提出了详细的说明,在传统的QKV方式,然后得出一个更简单的演示查询过程。
在这里插入图片描述

5. Parallel Feed-Forward
TensorFormer块的并行前馈结构由相应模态的三个并行分支组成。对于每个模态,前馈模块旨在按通道方式处理特征,并且由两个线性变换组成;
在这里插入图片描述

6. 主要改进
- SentiLARE: 我采用SentiLARE作为语言模型,其利用包括词性和单词情感极性在内的语言知识来学习情感感知的语言表示。下面是作者根据SentiLARE的设置进行的步骤:

给定一个单词序列,首先通过Stanford Log-Linear词性(POS)标记器学习其词性序列,并通过SentiwordNet学习单词级情感极性序列。然后,使用预训练语言模型的分词器获取词标索引序列。这个序列作为输入,产生一个初步的增强语言知识表示。更新后的文本表示将作为第(i+1)层的输入,并通过SentiLARE中的剩余层进行处理。每一层的输出将是具有视觉和听觉信息的文本主导的高级情感表示。最后,将这些文本表示输入到分类头中,以获取情感强度。

因此,新的模型通过将非语言增强嵌入集成到预训练语言模型中,有助于生成更富有情感感知的语言表示。这种方法能够在文本表示中有效地整合视觉和听觉信息,从而提升情感分析等任务的性能。

- 多头注意力交互: 我在构造 TensorFormer之前,先对uni-modal进行一次交互,对视频和声学特征加入以文本为主导的多头注意力,主要起到一下作用:

  1. 优化信息融合: 多头注意力机制可以帮助模型更有效地整合来自不同模态(如文本、图像、音频等)的信息,特别是在模态间的互动过程中,确保每种信息都得到适当的重视和融合。

  2. 提升文本相关性: 由于文本数据通常提供最直接和详细的情感表达,以文本为主导的多头注意力可以确保模型在情感分析中更准确地捕捉和理解文本内容的情感色彩和情绪。

  3. 增强模型鲁棒性: 通过以文本为中心的多头注意力交互,可以减少其他模态(如视觉或声音)可能受到的信息偏置,从而提高模型在不同数据场景下的鲁棒性和泛化能力。

  4. 解决信息遗漏问题: 有时其他模态的信息可能被文本模态所掩盖或忽视,以文本为主导的多头注意力可以帮助平衡各模态间的贡献,减少信息遗漏和偏置。

综上所述,引入以文本为主导的多头注意力交互有助于在多模态情感分析中充分利用文本信息的优势,并通过有效的信息整合提升模型的性能和鲁棒性。

visual_ = self.cross_ATT_visual(text_embedding, visual_, visual_)acoustic_ = self.cross_ATT_acoustic(text_embedding, acoustic_, acoustic_)

在这里插入图片描述

- LSTM: 在TensorFormer交互之后,我为最终的融合模态加入了LSTM,具有以下几个优点:

  1. 时序建模能力强: LSTM 是一种能够捕捉时间序列信息的循环神经网络(RNN)变种。在多模态情感计算中,不同模态的数据可能存在时间上的依赖关系,比如语音的情感表达可能会受到人脸表情变化的影响,而LSTM能够有效地处理这种时序信息,提高模型对情感变化的准确性。

  2. 处理序列数据: 多模态情感计算中的数据通常是序列数据,例如连续的语音信号或视频帧序列。LSTM能够逐步学习和记忆这些序列数据中的长期依赖关系,从而更好地理解和分析多模态数据的情感表达。

  3. 特征融合与表示学习: 在多模态情感计算中,不同模态的数据往往具有不同的特征表示形式,如文本的词向量、图像的卷积特征、语音的声学特征等。通过LSTM,可以将不同模态的特征有效地融合在一起,学习到更加综合和丰富的表示,有助于提高情感分类或回归任务的性能。

  4. 上下文理解能力: LSTM作为一种能够捕捉上下文信息的模型,可以更好地理解不同模态数据之间的上下文关系。在情感计算中,上下文信息(如对话的历史记录、视频中的动作顺序等)对于情感的理解至关重要,LSTM能够帮助模型更好地从上下文中推断和分析情感表达。

  5. 模型泛化能力: LSTM由于其能够处理变长序列并且有较强的泛化能力,因此在不同场景和数据条件下,都能够比较好地适应和推广。这使得基于LSTM的多模态情感计算模型在实际应用中更为稳健和可靠。

综上所述,将LSTM引入多模态情感计算中,能够充分利用其强大的时序建模能力和特征融合能力,从而提高情感计算任务的精确度和效果,特别是在处理多模态数据时能够更好地捕捉数据之间的复杂关系和动态变化。

四、数据集和预训练模型介绍

1. CMU-MOSI: CMU-MOSI数据集是MSA研究中流行的基准数据集。该数据集是YouTube独白的集合,演讲者在其中表达他们对电影等主题的看法。MOSI共有93个视频,跨越89个远距离扬声器,包含2198个主观话语视频片段。这些话语被手动注释为[-3,3]之间的连续意见评分,其中-3/+3表示强烈的消极/积极情绪;

2. CMU-MOSEI: CMU-MOSEI数据集是对MOSI的改进,具有更多的话语数量,样本,扬声器和主题的更大多样性。该数据集包含23453个带注释的视频片段(话语),来自5000个视频,1000个不同的扬声器和250个不同的主题。

五、性能展示

  1. 原文性能:
    在这里插入图片描述

  2. 在我们的改进后,我们的性能提高了3.22%,这个性能的提升是非常客观的!
    在这里插入图片描述

六、复现过程

1. 数据集准备
下载MOSI和MOSEI数据集已提取好的特征文件(.pkl)。把它放在"./dataset”目录。

2. 下载预训练语言模型
下载SentiLARE语言模型文件,然后将它们放入"/pretrained-model / sentilare_model”目录。

3. 下载需要的包

pip install -r requirements.txt

4. 训练+测试

python train.py

在这里插入图片描述

源码下载

这篇关于传知代码-让机器感受你的情绪!(论文复现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134264

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实