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

news2024/12/26 10:57:17

模型简介

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

  • 基于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后即可提交。

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

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

相关文章

OpenAI调查ChatGPT故障;向量搜索的优势与局限

&#x1f989; AI新闻 &#x1f680; OpenAI调查ChatGPT故障&#xff0c;发布新AI产品GPTs和GPT-4 Turbo 摘要&#xff1a;OpenAI的ChatGPT和其他服务出现故障&#xff0c;经过调查后发现是由于DDoS攻击导致的异常流量模式。OpenAI在首届开发者大会上发布了新的AI产品GPTs&am…

Seaborn数据可视化综合应用Basemap和Seaborn在线闯关_头歌实践教学平台

Seaborn数据可视化综合应用Basemap和Seaborn 第1关 Seaborn第2关 Seaborn图形介绍第3关 Basemap 第1关 Seaborn 任务描述 本关任务&#xff1a;编写一个绘制每个月销售总额的折线图。 编程要求 本关的编程任务是补全右侧上部代码编辑区内的相应代码&#xff0c;根据输入文件路…

Maven 插件统一修改聚合工程项目版本号

目录 引言直接修改 pom.xml 的版本号的问题Maven 插件修改版本号开源项目微服务商城项目前后端分离项目 引言 在Maven项目中&#xff0c;我们通常有两种常见的方式来修改版本号&#xff1a;直接在pom.xml文件中手动编辑和利用Maven插件进行版本号调整。 本文将比较这两种修改…

如何用Python实现图像拼接画(把一堆小图拼成大图)

诸神缄默不语-个人CSDN博文目录 在这里的图像拼接画指的是一张大图由很多小图组成&#xff0c;效果就像这样&#xff1a; 原理&#xff1a;将大图拆成很多小块&#xff0c;每一块计算平均颜色&#xff0c;用平均颜色最相近的小图来替代&#xff0c;就可以。 直接遍历就可以&…

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

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

雷达波形及MATLAB仿真

文章目录 前言一、雷达波形二、Matlab 仿真1、SFW 的距离分辨率和距离模糊①、MATLAB 源码②、仿真结果 三、资源自取 前言 本文对雷达波形的内容以思维导图的形式呈现&#xff0c;有关仿真部分进行了讲解实现。 一、雷达波形 思维导图如下图所示&#xff0c;如有需求请到文章…

C#中.NET 6.0控制台应用通过EF访问已建数据库

目录 一、新建.NET 6.0控制台应用并建立数据库连接 二、下载并安装EF程序包 三、自动生成EF模型和上下文 1.Blog类模型 2.Post类模型 3.数据库上下文 四、设计自己的应用 VS2022的.NET6.0、.NET7.0框架下默认支持EF7&#xff08;版本号7.0.13&#xff09;&#xff0c;除…

《QT从基础到进阶·二十五》界面假死处理

假如有这样一种情况&#xff0c;我们在主线程写了一个死循环&#xff0c;当程序运行到主线程的死循环代码后界面便卡死点了没有反应&#xff0c;这里提供几种方法处理界面假死的情况&#xff0c;保证比如主线程在执行死循环没有退出的时候点击界面不会卡死能继续执行其他功能。…

【c++】——类和对象(中)——实现完整的日期类

作者:chlorine 专栏:c专栏 我的花一定会开。 【学习目标】 拷贝复制——赋值运算符重载 目录 &#x1f393;运算符重载(-><...) &#x1f393;日期&天数 &#x1f393;前置和后置重载 我们完成了赋值运算符重载章节的学习&#xff0c;对operator关键字的使用有…

wpf devexpress项目中添加GridControl绑定数据

本教程讲解了如何添加GridControl到wpf项目中并且绑定数据 原文地址Lesson 1 - Add a GridControl to a Project and Bind it to Data | WPF Controls | DevExpress Documentation 1、使用 DevExpress Template Gallery创建一个新的空白mvvm应用程序&#xff0c;这个项目包括了…

算法笔记-第七章-队列

算法笔记-第七章-队列 队列的相关知识点c中队列queue用法队列的操作序列求和队列约瑟夫环-队列匹配队列 队列的相关知识点 大佬的讲解 c中队列queue用法 一&#xff1a;queue是一种容器转换器模板&#xff0c;调用#include< queue>即可使用队列类 二&#xff1a;使用q…

Python--集合----无序,去重,空集合只能用set()方法

集合&#xff08;set&#xff09;是一个无序的不重复元素序列。 特点&#xff1a;天生去重 无序 集合定义&#xff1a;在Python中&#xff0c;我们可以使用一对花括号 {} 或者 set()方法 来定义集合&#xff0c; 但是如果你 定义的集合是一个 空集合&#xf…

SpringCloud Alibaba(上):注册中心-nacos、负载均衡-ribbon、远程调用-feign

Nacos 概念&#xff1a;Nacos是阿里巴巴推出的一款新开源项目&#xff0c;它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助用户发现、配置和管理微服务&#xff0c;它提供了一组简单易用的特性集&#xff0c;包括动态服务发现、服务配置…

线性代数本质系列(二)矩阵乘法与复合线性变换,行列式,三维空间线性变换

本系列文章将从下面不同角度解析线性代数的本质&#xff0c;本文是本系列第二篇 向量究竟是什么&#xff1f; 向量的线性组合&#xff0c;基与线性相关 矩阵与线性相关 矩阵乘法与复合线性变换 三维空间中的线性变换 行列式 逆矩阵&#xff0c;列空间&#xff0c;秩与零空间 克…

P6入门:项目初始化9-项目详情之资源 Resource

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS&#xff0c;这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

cocosCreator 之内存管理和释放

版本&#xff1a; 3.4.0 语言&#xff1a; TypeScript 环境&#xff1a; Mac 回顾 前面有两篇博客说明了&#xff1a; cocosCreator 之 resources动态加载、预加载 讲述了静态引用资源&#xff0c;动态加载和预加载相关cocosCreator 之 Bundle 讲述了AssetManager关于对内置…

将随机数设成3407,让你的深度学习模型再涨一个点!文再附3种随机数设定方法

随机数重要性 深度学习已经在计算机视觉领域取得了巨大的成功&#xff0c;但我们是否曾想过为什么同样的模型在不同的训练过程中会有不同的表现&#xff1f;为什么使用同样的代码&#xff0c;就是和别人得到的结果不一样&#xff1f;怎么样才能保证自己每次跑同一个实验得到的…

技术管理责任制度《一》

一、技术管理机构责任制 (1) 按各级技术人员的职责范围&#xff0c;分工负责&#xff0c;做好经常性的技术业务工作。 (2) 组织贯彻执行国家有关技术政策和上级办法的技术标准、规定、规程、和各项技术管理制。 (3) 负责收集和提供技术情报、技术资料、技术建议和技术措施等。 …

什么是状态机?

什么是状态机&#xff1f; 定义 我们先来给出状态机的基本定义。一句话&#xff1a; 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型。 先来解释什么是“状态”&#xff08; State &#xff09;。现实事物是有不同状态的&#xff0c;例…