【论文阅读】GCNet: Graph Completion Network for Incomplete Multimodal Learning in Conversation(TPAMI 2023)

【论文链接】https://arxiv.org/abs/2203.02177v2

【代码链接】GitHub - zeroQiaoba/GCNet: GCNet, official pytorch implementation of our paper "GCNet: Graph Completion Network for Incomplete Multimodal Learning in Conversation"

问题动机

        对话已成为社交媒体平台上的重要数据格式。由于其在人机交互中的广泛应用,从情感、内容等方面理解对话也越来越受到研究者的关注。在现实环境中,我们经常会遇到模态不完整的问题,这已经成为对话理解的核心问题。例如,语音可能由于背景噪音或传感器故障而丢失;由于自动语音识别错误或未知单词,文本可能不可用;由于光照、运动或遮挡,可能无法检测到面部。模态不完整的问题增加了准确理解对话的难度。
        一方面,相邻的话语在对话中通常在语义上是相关的。另一方面,每个说话者都有自己的表达方式,在谈话中通常是一致的。然而,现有作品通常无法利用它们,从而限制了它们在会话数据中的性能。

解决方法

        在本文中,提出了一种用于对话中不完整多模态学习的新框架,称为“图补全网络 (GCNet)”。我们的目标是在对话中充分利用时间和说话者信息来处理不完整的模态。具体来说,我们首先随机丢弃多模态特征来模拟真实世界的缺失模式。为了捕捉对话中的说话人和时间依赖性,我们提出了两个基于图神经网络的模块,“说话人 GNN (SGNN)”和“时间 GNN (TGNN)”。这两个模块共享相同的边,但边类型不同。最后,我们以端到端的方式联合优化分类和重建。

         1. 为了模拟现实世界中缺失的场景,我们通过保证每个样本至少有一种模态可用来随机丢弃一些模态。因此,不完整的 M 模态数据集有 (2^m − 1) 个不同的缺失模式。以为本文是3模态的情况,所以,一共有7种确实情况,如图2。

        2. 图补全网络主要由3个模块组成:节点构建、说话者和时间 GNN 以及分类和重建。

  • 节点构建:我们将缺少模态的对话数据作为输入。每个对话包含多个话语,我们将每个话语u_i表示为节点 v_i。为了提取v_i的初始表示,我们首先连接不完整的多模态特征,然后使用双向长短期记忆 (Bi-LSTM) 来捕获上下文信息。
  • 说话者和时间GNN:Speaker GNN (SGNN) 和 Temporal GNN (TGNN) 是捕获对话中说话人和时间依赖性的关键模块。在这些模块中,边衡量节点之间连接的重要性。边类型定义了节点交互中的不同聚合方法。SGNN 和 TGNN 共享相同的边但不同的边类型以捕获不同的依赖关系。
  • 分类和重建:对于每个节点,我们提取其初始表示、考虑说话人信息的表示和考虑时间信息的表示。为了聚合这些表示,我们将它们连接在一起,然后利用 Bi-LSTM 进行上下文敏感建模。

实验结果

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用 TensorFlow 实现的 GCNet 代码示例: ```python import tensorflow as tf def spatial_attention(x, ratio=8): # 获取输入张量的尺寸 W, H, C = x.get_shape().as_list()[1:] # 计算压缩尺寸 squeeze = tf.reduce_mean(x, axis=[1, 2], keepdims=True) # 计算空间注意力张量 excitation = tf.layers.dense(inputs=squeeze, units=C // ratio) excitation = tf.nn.relu(excitation) excitation = tf.layers.dense(inputs=excitation, units=C) excitation = tf.nn.sigmoid(excitation) # 将空间注意力张量广播到原始张量的尺寸 excitation = tf.reshape(excitation, [-1, 1, 1, C]) excitation = tf.tile(excitation, [1, W, H, 1]) # 计算加权后的特征图 return tf.multiply(x, excitation) def channel_attention(x, ratio=8): # 计算平均值和最大值特征图 avg_pool = tf.reduce_mean(x, axis=[1, 2], keepdims=True) max_pool = tf.reduce_max(x, axis=[1, 2], keepdims=True) # 计算通道注意力张量 mlp = tf.layers.dense(inputs=tf.concat([avg_pool, max_pool], axis=-1), units=C // ratio) mlp = tf.nn.relu(mlp) mlp = tf.layers.dense(inputs=mlp, units=C) mlp = tf.nn.sigmoid(mlp) # 计算加权后的特征图 return tf.multiply(x, mlp) def gc_block(x): # 计算空间注意力 x_sa = spatial_attention(x) # 计算通道注意力 x_ca = channel_attention(x) # 将两个注意力加权后相加 x = tf.add(x_sa, x_ca) # 使用 1x1 卷积进行特征压缩 x = tf.layers.conv2d(inputs=x, filters=C, kernel_size=1, strides=1, padding='same') # 应用 BN 和 ReLU 激活函数 x = tf.layers.batch_normalization(inputs=x) x = tf.nn.relu(x) # 返回输出特征图 return x ``` 以上代码实现了 GCNet 中的两种注意力机制(空间注意力和通道注意力),并使用 1x1 卷积进行特征压缩。完整的 GCNet 模型可以使用多个 GC Block 进行堆叠来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值