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

news2024/11/17 14:50:13

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

  • 概述
  • Solver 在多模态发言人识别中的作用
    • Solver 在多模态发言人识别中的重要性
    • Solver 的工作原理
  • 二次规划
    • 二次规划的基本形式
    • 二次规划的特点
    • 二次规划在多模态发言中的应用 (我的理解)
  • 代码详解
    • 数据转化
    • 目标函数和约束设定
    • 约束条件的设定
  • CVXPY 和 Gurobi 求解
    • CVXPY
    • Gurobi
    • CVXPY 和 Gurobi 求解优化问题
  • Citation

概述

现今技术日新月异, Artificial Intelligence 的发展正在迅速的改变我们的生活和工作方式. 尤其是在自然语言处理 (Natural Linguistic Processing) 和计算机视觉 (Computer Vision) 等领域.

传统的多模态对话研究主要集中在单一用户与系统之间的交互, 而忽视了多用户场景的复杂性. 视觉信息 (Visual Info) 往往会被边缘化, 仅作为维嘉信息而非对话的核心部分. 在实际应用中, 算法需要 “观察” 并与多个用户的交互, 这些用户有可能不是当前的发言人.

【CCF BDCI 2023】多模态多方对话场景下的发言人识别, 核心思想是通过多轮连续对话的内容和每轮对应的帧, 以及对应的人脸 bbox 和 name label, 从每轮对话中识别出发言人 (speaker).

Baseline 的代码分为三个文件, 分别为convex_optimization.py, dialog_roberta-constrasive.py, finetune_cnn-multiturn.py. 下面小白我就来带大家详解一下 Solver 部分.

Solver 在多模态发言人识别中的作用

求解器 (Solver) 在多模态发言人识别中的作用是整合和分析来自不同模态的数据, 如食品中的视觉信息和剧本中的文本信息. Slover 的任务是从这些复杂的数据中提取有用的信息, 并最终确定每个对话中的发言人 (Speaker).

Solver 求解器

Solver 在多模态发言人识别中的重要性

求解器的三大要点:

  1. 整合多模态数据: Solver 能够处理来自不同源的数据, 在这个赛题中为 CNN 和 NLP 的输出, 为识别提供不同的视角
  2. 优化决策过程: 通过应用数学和统计的方法, Solver 能够在众多潜在的发言人 (Potential) 中找到最优解
  3. 提高准确性:相比单一模态分析 (CNN or NLP or Audio, Solver 可以综合考虑多种信息, 先出提高发言人识别的准确率 (可以理解为类似 Bagging 算法)

Solver 的工作原理

Solver 通常采用数字优化技术, 如这次用到的二次规划 (Quadratic Programming), 来解决发言人识别问题. 首先将两个模型的输出转化为数学问题中的参数, 然后用过优化算法寻找这些参数的最优组合, 从而确定发言人 (Speaker).

二次规划

首先声明一下, 小白我是小学毕业, 数学水平停留在2x + 1 = 5的阶段, 下面的内容是基于网上内容 + 我的粗浅理解, 有不对的地方希望大家指正.

二次规划

二次规划 (Quadratic Programming). 是一种特殊类型的数学优化问题, 涉及到一个二次目标函数和一系列线性约束.

二次规划的基本形式

二次规划问题可以形式化为下面的数学模型:

  • 目标函数: f ( x ) = 1 2 x T Q x + c T x f(x) = \frac{1}{2} x^T Q x + c^T x f(x)=21xTQx+cTx
  • 约束条件: A x ≤ b Ax \leq b Axb

其中, x x x 是需要优化的变量向量, Q Q Q 是一个堆成矩阵, c c c 是一个向量, A A A 是一个矩阵, b b b 是一个向量. 目标是找到 x x x 的值, 使得目标函数 f ( x ) f(x) f(x)最大或最小化, 同时满足所有的线性约束条件.

二次规划的特点

二次规划的特点:

  1. 目标函数的二次性: 二次规划的核心特点是其目标函数是变量的二次函数. 这意味着目标函数可以有一个独特的最大值或最小值, 取决于矩阵 Q 的性质.
  2. 线性约束: 尽管目标函数是二次的, 但所有的约束都是线性的. 这些约束定义了一个可行域, 优化必须在这个域内
  3. 凸性: 如果矩阵 Q Q Q 是半正定的, 哪儿二次规划问题是凸的. 凸二次规划保证了全局最优解的存在

二次规划在多模态发言中的应用 (我的理解)

在多模态发言人识别 (MMSI) 的上下文中, 二次规划 (Quadratic Programming) 用于整合来自不同模型 (CNN & Roberta) 的信息, 并找到最佳的发言人分配方案.

这里的目标函数通常包括两部分:

  1. 基于视觉信息, CNN 输出
  2. 基于文本信息, Roberta 输出

通过优化这个组合目标函数, Solver 能够在满足一定约束条件的情况下, 分配最可能的发言人 (Speaker).

代码详解

主要步骤:

  1. 数据转化: 用与将 CNN 和 Roberta / Deberta 的模型输出转化为优化问题所需的格式
  2. 目标函数和约束的设定
  3. 优化问题的求解: 通过 Gurobi 求解器求解
  4. 优化过程: 确保只有一个发言人被选中
  5. 获取结果

数据转化

def convert_cnn_preds_to_matrix(frame_names_list, cnn_scores, label='pred'):
    matrix_list, mappings_list = [], []
    for frame_names in frame_names_list:
        scores = [cnn_scores.get(frame_name, {}) for frame_name in frame_names]
        speakers = set(sum([list(i.keys()) for i in scores], list()))
        speaker_id_mappings = {speaker: i for i, speaker in enumerate(speakers)}
        matrix = np.zeros((len(frame_names), len(speakers)))
        for i, score_dict in enumerate(scores):
            for speaker, score in score_dict.items():
                matrix[i][speaker_id_mappings[speaker]] = score[label]
        matrix_list.append(matrix)
        mappings_list.append(speaker_id_mappings)
    return matrix_list, mappings_list
  • 输入: frame_names_list (帧名) 和 cnn_scores (CNN 预测分数)
  • 映射: 将每个帧中出现的发言人分配一个索引, 映射到speaker_id_mappings
  • 构建矩阵: 对于每个对话, 初始化一个全 0 矩阵, 行等于帧数, 列等于发言人数量. 遍历每个帧的 score, 根据映射将 speaker 对应的分数放到矩阵对应的位置
  • 输出:
    • 矩阵列表: 每个对话准话后的矩阵
    • 映射列表: 每个对话 speaker 到索引的映射

目标函数和约束设定

def solve(cnn_scores, roberta_scores):
    '''
    cnn_scores: matrix of shape [n, m]
    roberta_scores: matrix of shape [n, n]
    where m = num_speakers, n = num_sents
    '''

    n, m = cnn_scores.shape
    x = cp.Variable(np.prod(cnn_scores.shape), boolean=True)
    constraints = []
    for i in range(n):
        constraints.append(cp.sum(x[i*m: i*m+m]) == 1)

    cnn_objective = cnn_scores.reshape(-1).T @ x.T
    new_roberta_scores = np.zeros((n*m, n*m))
    for i in range(n):
        for j in range(n):
            for k in range(m):
                new_roberta_scores[i*m+k, j*m+k] += roberta_scores[i, j]

    roberta_objecive = cp.quad_form(x, new_roberta_scores) * (1/2)
    objective = cnn_objective + roberta_objecive

    problem = cp.Problem(cp.Maximize(objective), constraints)
    problem.solve(solver='GUROBI')
    return x.value.reshape(n, m), problem.status
  • 变量定义: 定义决策变量x, 是一个布尔型变量的数组, 其余长度等于cnn_scores矩阵的元素总数. 这个变量代表了每个句子选择每个发言人的决策
  • CNN 目标函数: cnn_objective是通过将cnn_scores矩阵展平鱼决策变量x的专职相乘得到的. 这部分代表了选择特定发言人的奖励
  • Roberta 目标函数:
    • new_roberta_scores: n ∗ m × n ∗ m n*m \times n*m nm×nm, 该矩阵是对roberta_scores的扩展, 用于表示不同句子之间的相似度
    • roberta_objective是通过对决策变量x应用二次形式得到的, 代表了选择相同发言人的奖励
  • 总目标函数: 最终的目标函数objective是和cnn_objectiveroberta_objextive的和. 这个函数代表了在满足约束条件的前提下, 我们希望最大化的总奖励

约束条件的设定

constraints = []
for i in range(n):
    constraints.append(cp.sum(x[i*m: i*m+m]) == 1)

约束定义: 对于每个句子 (共n个), 添加一个约束条件, 确保每个句子只能选择一个发言人. 具体实现为:

  1. 初始化约束李彪: 创建一个空列表constraints, 用于存储所有的约束条件
  2. 循环添加约束: 对于每个句子for i in range(n), 执行以下操作:
    • x[i*m: i*m+m]: 是对决策变量x的一个切片操作, 选取与第i个句子相关的部分. 由于x是一个一维数组, 这个切片实际上选取了第i. 即每个句子只能选择一个发言人
  3. 添加到约束列表: 将每个句子的约束条件添加到constraints列表中

CVXPY 和 Gurobi 求解

CVXPY

CVXPY 是 Python 的一个库, 用于构建和求解凸优化问题. 在多模态发言人识别的求解器中, CVXPY 被用来定义二次规划问题. 包括构建目标函数 (RNN 输出 + Roberta 输出), 以及定义约束条件 (一个发言人).

CVXPY

Gurobi

Gurobi 是一个强大的数学优化求解器, 广泛应用于工业和学术界和学术界. Gurobi 能够高效的求解各种类型的优化问题. 包括线性规划, 整数规划, 二次规划等. 在我们的 Solver 中, Gurobi 被用作 CVXPY 的后端求解器. 一单优化问题在 CVXPY 中被定义, Gurobi 就被用来实际求解这个问题, 找到最优解.

Gurobi

CVXPY 和 Gurobi 求解优化问题

定义决策变量:

x = cp.Variable(np.prod(cnn_scores.shape), boolean=True)

构建目标函数和约束:

  • 上面说过了

创建优化问题:

problem = cp.Problem(cp.Maximize(objective), constraints)

求解优化问题:

problem.solve(solver='GUROBI')

处理求解结果:

return x.value.reshape(n, m), problem.status

Citation

Beasley, J. E. (1998). Heuristic algorithms for the unconstrained binary quadratic programming problem. ResearchGate. Retrieved from https://www.researchgate.net/publication/2661228

Vanderbei, R. J. (1999). LOQO: An interior point code for quadratic programming. Optimization Methods and Software, 11(1-4), 451-484. https://doi.org/10.1080/10556789908805759

Axehill, D. (2008). Integer quadratic programming for control and communication. DIVA. Retrieved from https://www.diva-portal.org/smash/record.jsf?pid=diva2:17358

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

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

相关文章

单端反激(离散系统仿真)

单端反激(离散系统仿真) 指令电压为0,电机微速旋转,补足指令电压。 把仿真变成离散的。 最大步长设置方法:如果是对于相控形式的电路,我觉得设置1e-4秒大概就够了,如果是对于斩波形式的电路,设置1e-6或者…

oracle数据恢复—Oracle报错“system01.dbf需要更多的恢复来保持一致性”的数据恢复案例

oracle数据库恢复环境&故障: 一台Windows server操作系统的服务器上部署Oracle数据库。 服务器意外断电导致oracle数据库报错,报错信息:“system01.dbf需要更多的恢复来保持一致性”。由于该oracle数据库并没有备份,仅有一些断…

JS数组与它的42个方法

前言 数组在js中作为一个非常重要的类型之一,在我们对数据处理,存储数据,条件渲染的时候经常会用到,所以随着ES的不断更新,数组的方法也是越来越多,也让我们使用数组对数据操作的时候,越来越简…

WPF实现更加灵活绑定复杂Command(使用Microsoft XAML Behaviors 库)

1、安装NuGet 2、在XAML的命名空间引入&#xff1a; xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 3、使用&#xff1a; <Canvas Background"Aqua"><Rectangle Stroke"Red" Width"{Binding RectModel.RectangleWidth}…

Java数据结构篇——实现顺序表的增删查改

文章目录 1.线性表2. 顺序表2.1 顺序表结构2.2 实现顺序表接口2.3 打印顺序表2.2 实现新增元素2.3 实现查找元素2.3 获取pos位置的值2.4 删除元素2.5 获取顺序表的长度2.6 清空顺序表 3.代码在这 1.线性表 定义&#xff1a;线性表是 n 个具有相同特性的数据元素的有序序列。线…

07.CSS常用样式

CSS常用样式 1.颜色样式 颜色名 介绍 直接使用颜色对应的英文单词&#xff0c;编写比较简单 具体颜色名参考 MDN 官方文档 例子 p {color:red; }缺点 颜色名这种方式&#xff0c;表达的颜色比较单一&#xff0c;所以用的并不多 rgb或rgba 介绍 使用 红、黄、蓝 这三…

【文末送书】以企业架构为中心的SABOE数字化转型五环法

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

JVM对象创建与内存分配机制分析

对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应的类加…

动手学习深度学习-现代循环神经网络

门控循环单元(GRU) 重置门和更新门 重置门&#xff08;Reset Gate&#xff09;和更新门&#xff08;Update Gate&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的变体之一&#xff0c;门控循环单元&#xff08;Gated Recurrent Unit, GRU&…

qiankun中子系统变化透传到主系统调用主系统方法

1、首先在主系统中qiankun启动前把变动的参数初始化 2、初始化之后就可以通过全局状态通信把参数透传为全局 3、在微应用子系统main.js的qiankun的mount中获取到全局设备参数属性并是设置为子系统全局 4、在微应用子系统中需要去调主系统方法时就在那个地方改变透传过来的参数 …

Rust语言基础语法使用

1.安装开发工具: RustRover JetBrains: Essential tools for software developers and teams 下载: RustRover: Rust IDE by JetBrains 下载成功后安装并启动RustRover 安装中文语言包插件 重启RustRover生效

Java毕业设计—vue+SpringBoot图书借阅管理系统

图书管理系统 1. 开发目的 实现图书的智能化、信息化和简单化&#xff1b;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查&#xff1b;提高图书管理员工作信息报送及反馈的工作效率&#xff0c;减轻…

【文末送书】拥抱人工智能

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

vcpkg下载及安装

文章目录 vcpkg是什么vcpkg的优势Windows环境下的下载及安装1.下载 Linux环境下的下载及安装常用命令介绍1.1.1 设置默认安装的平台1.1.2可选步骤&#xff0c;将vcpkg与Visual Studio配合使用&#xff08;需要管理员权限&#xff09;1.1.3 软件包升级1.1.4 查找安装软件包1.1.5…

linux下time与dd命令结合测试存储器速度

在Linux中&#xff0c;"time"和"dd"命令是两个独立的命令&#xff0c;它们可以结合使用来测量"dd"命令执行的时间。 下面是它们的简要说明&#xff1a; time命令&#xff1a; "time"命令用于测量命令执行的时间和资源使用情况。它可以…

数据库传奇:MySQL创世之父的两千金My、Maria

《数据库传奇&#xff1a;MySQL创世之父的两千金My、Maria》 一、前言 MySQL是一款备受欢迎的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;最初由瑞典公司MySQL AB开发&#xff0c;目前隶属于Oracle Corporation。在DB-Engines的排名中&#xff0c;MySQL稳…

计网Lesson9 - 链路协议和网络概述

文章目录 数据链路层协议Ethernet V2标准Ethernet V2帧格式Ethernet V2帧长度标准以太网帧 MAC 帧协议 PPP 协议PPP 概述PPP 帧 网络层网络层的设计选择 数据链路层协议 Ethernet V2标准 Ethernet V2帧格式 以太网帧格式说明&#xff1a; 6 6 6 字节目标地址 6 6 6 字节源地…

【广州华锐视点】物流数字孪生三维可视化系统打造更高效、智能的物流管理体验

在当今快速发展的物流行业中&#xff0c;传统的管理和监控方法往往难以满足复杂运营的需求。为了解决这个问题&#xff0c;广州华锐互动提供物流数字孪生三维可视化系统定制开发服务&#xff0c;打造更为高效、智能的物流管理体验。 物流数字孪生三维可视化系统是一种基于虚拟现…

【算法与数据结构】455、LeetCode分发饼干

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;因为大饼干可以满足大胃口的孩子也必然可以满足小胃口的孩子&#xff0c;如果要尽可能的满足孩子的胃口…

Git篇---第八篇

系列文章目录 文章目录 系列文章目录前言一、如果本次提交误操作,如何撤销?二、你使用过git stash命令吗?你一般什么情况下会使用它?三、如何查看分支提交的历史记录?查看某个文件的历史记录呢?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…