【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline

模型简介

本基线模型共分为三个部分:

  • 基于CNN的判断每张人脸是否是说话人的模型;
  • 基于Transformer-Encoder的判断同一段对话中不同轮次的说话人关系的模型;
  • 和使用上述两个预测结果求解二次型优化问题的说话人识别求解器。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于CNN的判断每张人脸是否是说话人的模型

我们微调 CNN 模型 M 1 M_1 M1 以预测每帧中每张人脸是说话人的概率:$p_{face} = M_1(face) \in (0,1) $ ,其中 f a c e face face 是通过使用bounding box b b b 裁剪图像 i m g img img 获得的图像区域。如果此人脸的角色名称与说话人姓名相同,则此人脸 y f a c e y_{face} yface 的说话标签设置为 1 1 1,否则设置为 0 0 0 y f a c e = m a t h b f 1 [ c = y ] y_{face} = mathbf{1}[c = y] yface=mathbf1[c=y]。使用交叉熵分类损失作为训练目标。

基于Transformer-Encoder的判断同一段对话中不同轮次的说话人关系的模型

我们微调一个Transformer-Encoder模型作为 M 2 M_2 M2,以预测对话中的每 2 个轮次是否由同一说话人说出。给定一个由 m m m 语句组成的示例,我们使用 <eos> u 1 ⋯ <eos> u m \texttt{<eos>}u_1 \cdots \texttt{<eos>}u_m <eos>u1<eos>um作为 M 2 M_2 M2 的输入。我们使用每个 texttt{} 的最后一层的表示 h i h_i hi 作为每个轮次的表示来计算每 2 个表示的相似性: p s i m i j = σ ( W 2 GeLU ( W 1 [ h i ; h j ; ∣ h i − h j ∣ ] + b 1 ) + b 2 ) p_{sim}^{ij} = \sigma(W_2 \text{GeLU}(W_1[hi; hj; |hi - hj|] + b_1) + b_2) psimij=σ(W2GeLU(W1[hi;hj;hihj]+b1)+b2), 其中 i , j = 1 , c d o t s , m i, j = 1, cdots, m i,j=1,cdots,m ( W 1 , b 1 , W 2 , b 2 ) (W_1, b_1, W_2, b_2) W1,b1,W2,b2 是可学习的参数, σ \sigma σ 是 sigmoid 激活函数, p s i m i j ∈ ( 0 , 1 ) p_{sim}^{ij} \in (0, 1) psimij(0,1) 是一个标量,表示这两个轮次是同一个人说的的概率。损失函数定义为:

L M 2 = M S E ( p s i m , y s i m ) + M S E ( p s i m , p s i m T ) \mathcal{L}_{M_2} = MSE(p_{sim}, y_{sim}) + MSE(p_{sim}, p_{sim}^T) LM2=MSE(psim,ysim)+MSE(psim,psimT)

其中 y s i m ∈ { 0 , 1 } m × m y_{sim} \in \{0, 1\}^{m \times m} ysim{0,1}m×m 是两个轮次的对话是否是同一个人说的的正确标签。

说话人识别求解器

为了利用视觉信息和上下文信息,我们需要结合上述两个模型的输出来进行说话人识别。
对于数据集中的每个条数据,我们首先通过记录每帧中出现的所有面孔来获得候选说话人集: m a t h b f C = c 1 , c d o t s , c l mathbf{C} = {c_1, cdots, c_{l}} mathbfC=c1,cdots,cl
我们构造一个奖励矩阵 m a t h b f B ∈ R l × m mathbf{B} \in \mathbb{R}^{l \times m} mathbfBRl×m ,表示选择一个角色 c i c_i ci 作为轮次 u j u_j uj 的说话人的奖励。如果 c i c_i ci 的人脸出现在帧 v j v_j vj 中,则 b i j b_{ij} bij M 1 M_1 M1 预测出的概率,否则 b i j = 0 b_{ij} = 0 bij=0

随后我们构建另一个奖励矩阵 A ∈ R m × m \mathbf{A} \in \mathbb{R}^{m \times m} ARm×m,以表示将相同的说话者分配给两个轮次 u i u_i ui u j u_j uj的奖励。如前文所述,我们首先将整个对话传递到模型 M 2 M_2 M2 中以获取相似性矩阵 $p_{sim} \in \mathbb{R}^{m \times m} $。然而,如果我们直接使用相似性矩阵 p s i m p_{sim} psim 作为奖励矩阵 A \mathbf{A} A,因为 p s i m p_{sim} psim 中的所有元素都大于 0,优化求解器倾向于将相同的说话者分配给每个轮次,以获取所有奖励。为了避免这种情况,我们将相似性矩阵减去其元素的平均值, A = p s i m − mean ( p s i m ) \mathbf{A} = p_{sim} - \text{mean}(p_{sim}) A=psimmean(psim)

有了 A \mathbf{A} A B \mathbf{B} B,多模态多轮次说话人识别任务就可以用二次二进制优化问题来表示了:

Maximize f ( X ) = ( 1 − α ) X T A X + α X B s.t. X ∈ { 0 , 1 } m × l , ∑ j = 1 l X i j = 1 , i = 1 , 2 , … , m \begin{align} \text{Maximize} \quad & f(X) = (1-\alpha)X^TAX + \alpha XB \\ \text{s.t.} \quad & X \in \{0, 1\}^{m \times l}, \\ \quad & \sum_{j=1}^{l} X_{ij} = 1, \quad i = 1, 2, \ldots, m \end{align} Maximizes.t.f(X)=(1α)XTAX+αXBX{0,1}m×l,j=1lXij=1,i=1,2,,m

其中 α \alpha α 是一个超参数,用于控制 2 个奖励的权重。最后这个问题就可以使用像Gurobi这样的优化问题求解软件解决。

文件结构

注意:代码仅供参考,您可能需要进行一些修改才能正确运行它们

  • finetune_cnn-multiturn.py: 微调cnn模型的代码

  • dialog_roberta-contrastive.py: 微调deberta模型的代码

  • convex_optimization.py: 将两个模型产出的结果组合在一起,并通过gurobi优化器求解出每个句子最适合的说话人

如何运行代码(以5 turns为例)

可以在百度网盘下载数据集中的图片,和我们提供的基线模型训练完成后的checkpoint:

  1. 下载数据集,并保存在 $base_folder/5_turns文件夹下

  2. 训练cnn模型

python ./finetune_cnn-multiturn.py \
    --data_base_folder $base_folder/5_turns --output_path $cnn_output_path \
  1. 用cnn模型在测试集上生成结果
output_path=./snap/multiturn/cnn/0920-ft_cnn-8_turns-lr_${lr}
CUDA_VISIBLE_DEVICES=7 python ./finetune_cnn-multiturn.py --func test \
    --data_base_folder $base_folder/5_turns \
    --output_path $cnn_output_path --model_ckpt $cnn_output_path/best_model.pth

然后可以在$cnn_output_path/test_output.json$cnn_output_path/test-hard_output.json文件中找到cnn模型的预测结果。

  1. 训练deberta模型

先在ijcai2019数据上预训练(大约需要1天时间)。这个数据集的预处理方式和MPC-BERT相同,详见论文 MPC-BERT: A Pre-Trained Language Model for Multi-Party Conversation Understanding 和代码

python ./dialog_roberta-contrastive.py --func train --sim_func linear \
    --dataset ijcai2019 --data_base_folder $base_folder/ijcai2019 \
    --model_type deberta --roberta_model microsoft/deberta-v3-base \
    --output_path $deberta_output_path_pretrain \
    > $output_path/train.log 2>&1 &

然后在本数据集上微调(大约需要2小时)

python ./dialog_roberta-contrastive.py --sim_func linear --weight_decay 0.02 \
    --model_type deberta --roberta_model $deberta_output_path_pretrain/checkpoint-valid \
    --data_base_folder $base_folder/5_turns --output_path $deberta_output_path
  1. 用deberta模型在测试集上生成结果。(需要自己先根据训练过程选择合适的$ckpt)
python ./dialog_roberta-contrastive.py --func test \
    --model_type deberta --roberta_model $deberta_output_path/checkpoint-$ckpt \
    --data_base_folder $base_folder/5_turns --output_path $deberta_output_path \

然后可以在$deberta_output_path/test_output.pkl文件中找到deberta模型的预测结果。

  1. 根据上述两个模型输出的reward,求解优化问题,并得到最终答案。(可以先在验证集上运行并筛选合适的alpha超参数)。注意:需要先正确安装gurobi求解器,cvxpy包才能正常运行

for split in test test-hard
do
    python convex_optimization.py --alpha $alpha \
        --test_metadata_fname $base_folder/5_turns/${split}-metadata.json \
        --test_cnn_pred_fname $cnn_output_path/${split}_output.json \
        --test_roberta_pred_fname $deberta_output_path/test_output.pkl \
        --output_fname $final_output_path/${split}_output.json
done

然后可在$final_output_path中找到最最终预测结果。将test_output.json, test-hard_output.json中的内容合并在同一个list后即可提交。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode 好用的插件分享

文章目录 Introlistcode runner 【在文本编辑器中编辑好各类语言的源代码&#xff0c;然后一键运行】gitlens - 【git提交信息即时查看&#xff0c;类似IDEA中的 show annotation】还有更多&#xff0c;会日常补充。 Intro 大四毕业前&#xff0c;我只有一台dell latitude 455…

瑞萨e2studio(29)----SPI速率解析

瑞萨e2studio.29--SPI速率解析 概述视频教学时钟配置解析RA4M2的BRR值时钟速率7.5M下寄存器值3K下寄存器值 概述 在嵌入式系统的设计中&#xff0c;串行外设接口&#xff08;SPI&#xff09;的通信速率是一个关键参数&#xff0c;它直接影响到系统的性能和稳定性。瑞萨电子的…

No200.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了&#xff0c;笔者解析过glide的源码&#xff0c;也是因为觉得自己熟悉一些&#xff0c;也就没太关注过项目里glide的具体使用对当前业务的影响&#xff1b;主要是自负&#xff0c;还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…

点大商城V2版 2.5.3全插件开源独立版 百度+支付宝+QQ+头条+小程序端+unipp开源端安装测试教程

点大商城V2是一款采用全新界面设计支持多端覆盖的小程序应用&#xff0c;支持H5、微信公众号、微信小程序、头条小程序、支付宝小程序、百度小程序&#xff0c;本程序是点大商城V2独立版&#xff0c;包含全部插件&#xff0c;代码全开源&#xff0c;并且有VUE全端代码。 适用范…

Java17新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Matlab论文插图绘制模板第126期—分组三维气泡图

在之前的文章中&#xff0c;分享了Matlab三维气泡图的绘制模板&#xff1a; 特征渲染的三维气泡图&#xff1a; 进一步&#xff0c;再来分享一下分组三维气泡图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋…

手机能做静态二维码吗?用手机做二维码的教程

现在手机上有很多的功能&#xff0c;能够帮助我们应对日常生活中的各种问题&#xff0c;那么如果我们想要在手机上生成一个静态二维码&#xff0c;大家知道该怎么来操作吗&#xff1f;一般制作二维码需要专业的二维码生成工具才可以完成制作&#xff0c;那么下面小编来给大家分…

RabbitMQ-基础篇-黑马程序员

代码&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1nQBIgB_SbzoKu_XMWZ3JoA?pwdaeoe 提取码&#xff1a;aeoe 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调…

2023年亚太杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 赛题思路算法介绍FP树表示法构建FP树实现代码 建模资料 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#…

Maya v2024(3D动画制作软件)

Maya 2024是一款三维计算机图形动画制作软件。它被广泛应用于电影、电视、游戏、动画等领域中&#xff0c;用于创建各种三维模型、场景、特效和动画。 以下是Maya的主要特点&#xff1a; 强大的建模工具&#xff1a;Maya提供了各种建模工具&#xff0c;如多边形建模、NURBS建模…

lamp环境搭建(kali,docker,ubuntu)

学了微专业,然后第一节课是学的搭建自己的环境,这里记录一下吧。 搭建一个lamp环境 (因为本人使用的是kali而且还带有集成环境的xampp,本身就自带了apache2,mysql和php。)后面有用ubuntu从0开始搭建的。 在kali环境下: 1.首先查看apache2和mysql和php 查看apache2 where…

Python中的数据增强技术

使用imgaug快速观察Python中的数据增强技术 在本文中&#xff0c;我们将使用imgaug库来探索Python中不同的数据增强技术 什么是图像增强 图像增强是一种强大的技术&#xff0c;用于在现有图像中人为地创建变化以扩展图像数据集。这是通过应用不同的变换技术来实现的&#xf…

矩阵置零00

题目链接 矩阵置零 题目描述 注意点 使用 原地 算法 解答思路 思路是需要存储每一行以及每一列是否有0&#xff0c;因为要尽可能使用更少的空间&#xff0c;且新设置为0的格子不能对后续的判断产生影响&#xff0c;所以要在原有矩阵上存储该信息先用两个参数存储第一行和第…

飞天使-django创建一个初始项目过程

创建django项目 运行项目 运行命令 pyhont manage.py runserver 然后访问 http://127.0.0.1:8000/&#xff0c; 则可以打开本地新建的项目 虚拟环境的部署-mac 在一台计算机上可以通过虚拟环境实现多个版本Django的开发环境 安装虚拟环境工具&#xff1a;如果你的系统中没有安…

properties文件乱码

出现如下乱码&#xff1a; 按照步骤修改编码方式就可以解决啦 修改之后结果就是下面这样~

搜索引擎项目

认识搜索引擎 1、有一个主页、有搜索框。在搜索框中输入的内容 称为“查询词” 2、还有搜索结果页&#xff0c;包含了若干条搜索结果 3、针对每一个搜索结果&#xff0c;都会包含查询词或者查询词的一部分或者和查询词具有一定的相关性 4、每个搜索结果包含好几个部分&…

微软允许OEM对Win10不提供关闭Secure Boot

用户可能将无法在Windows 10电脑上安装其它操作系统了&#xff0c;微软不再要求OEM在UEFI 中提供的“关闭 Secure Boot”的选项。 微软最早是在Designed for Windows 8认证时要求OEM的产品必须支持UEFI Secure Boot。Secure Boot 被设计用来防止恶意程序悄悄潜入到引导进程。问…

Android framework添加自定义的Product项目,lunch目标项目

文章目录 Android framework添加自定义的Product项目1.什么是Product&#xff1f;2.定义自己的Product玩一玩 Android framework添加自定义的Product项目 1.什么是Product&#xff1f; 源码目录下输入lunch命令之后&#xff0c;简单理解下面这些列表就是product。用于把系统编…

docker基础使用

简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱机…