Zhou's home Zhou's home
首页
说话人识别
算法题库
编程相关
语音识别
关于
  • 分类
  • 标签
  • 归档
  • 常用工具
  • 友情链接

ZhouWJ

吾生也有涯,而知也无涯
首页
说话人识别
算法题库
编程相关
语音识别
关于
  • 分类
  • 标签
  • 归档
  • 常用工具
  • 友情链接
  • Kaldi Toolbox

  • 算法原理梳理

  • 文献记录

  • 我的工作

    • 跨语种域适应
      • 问题定位
      • Neural PLDA
      • Deep Coral
      • 判别损失
        • Contrastive Loss
        • Triple Loss
      • 数据及文件准备
      • 实验结果
        • Baseline
        • 🚩NPLDA
        • 没有直接优化的能力
        • 有监督式迁移的能力
        • 没有对异域的鲁棒性
        • 总结
        • NPLDA+Coral Loss
        • 特征构造
        • 🚩对比损失
        • 🚩分类器优化
      • 知识积累
    • Fit-DNN在声纹识别的应用
    • Fit-DNN机理研究
    • Fit-RNN原理及应用
    • 论文写作相关
    • 动态储油池计算原理及应用
    • 动力系统相关分析
    • folded-based网络稀疏研究
    • 组会汇报20210828
    • 专业英语_中文综述大纲
    • 专业英语_英文报告大纲
    • 一些ChatGPT的回答
  • 声纹识别
  • 我的工作
xugaoyi
2021-07-31
目录

跨语种域适应

# 问题定位

  • 域失配:源域数据远多于目标域数据,目标域数据没有任何label信息;
  • zero-shot domain adaptation:测试数据的标签在训练数据中从未出现过;
  • pairwise loss:说话人识别域迁移当前主要是1:N识别,每个域输入的是单条语音,但是1:1识别需要输入一对语音

# Neural PLDA

PLDA模型为$p(\phi \mid \mathbf{h}, \mathbf{x})=\mathcal{N}(\phi \mid \mu+\mathbf{F h}+\mathbf{G} \mathbf{x}, \mathbf{\Sigma})$,其中$F$和$G$分别为说话人和信道载荷矩阵,$h$和$x$分别为说话人因子和信道因子,向量$\phi$的边缘概率为$p(\phi)=\mathcal{N}\left(\phi \mid \mu, \Phi_{\mathrm{b}}+\Phi_{\mathrm{w}}\right)$:

$$\Phi_{\mathrm{b}}=\mathrm{FF}^{\top}$$

$$\Phi_{\mathrm{w}}=\mathrm{GG}^{\top}+\Sigma$$

传统打分流程:长度归一化+LDA降维+PLDA,使用两个与类内外协方差矩阵相关的矩阵P与Q进行打分

$$s\left(\boldsymbol{\eta}{e}, \boldsymbol{\eta}{t}\right)=\boldsymbol{\eta}{e}^{\top} \boldsymbol{Q} \boldsymbol{\eta}{e}+\boldsymbol{\eta}{t}^{\top} \boldsymbol{Q} \boldsymbol{\eta}{t}+\boldsymbol{\eta}{e}^{\top} \boldsymbol{P} \boldsymbol{\eta}{t}$$

其中:

$$\mathbf{Q}=\Sigma_{t o t}^{-1}-\left(\Sigma_{t o t}-\Sigma_{a c} \Sigma_{t o t}^{-1} \Sigma_{a c}\right)^{-1}$$

$$\mathbf{P}=\boldsymbol{\Sigma}{t o t}^{-1} \boldsymbol{\Sigma}{a c}\left(\boldsymbol{\Sigma}{t o t}-\boldsymbol{\Sigma}{a c} \boldsymbol{\Sigma}{t o t}^{-1} \boldsymbol{\Sigma}{a c}\right)^{-1}$$

其中,tot下标即为类内方差,ac即为类间方差

  • 用GPLDA训练得到的模型初始化网络,才可以保证该网络稳定收敛
  • 将阈值作为模型参数进行训练
  • 损失函数由minDCF函数演变得到,将阶跃函数调整为平滑的Sigmoid函数

# Deep Coral

  • source和target共享网络参数
  • $\mathcal{L}=\mathcal{L}{C L A S S}+\sum{i=1}^{t} \lambda_{i} \mathcal{L}_{C O R A L}$,通过_lambda在两个损失函数间做平衡

# 判别损失

# Contrastive Loss

主要作用:使得同一类样本更加靠近,不同类样本更加远,详见:ASV中的度量学习 | Zhou's Home (opens new window)

# Triple Loss

同类样本对的距离需要始终小于异类样本对的距离,每个类确定一个锚点,一般是类的质心

# 数据及文件准备

dataProcess.py:音频划分、trials文件准备、划分训练模型时的训练集与验证集

dataProcessDomain.sh:提取xVector等特征、准备常用表单、划分注册与测试集

  • 所有数据集中,男女比均衡
数据集 spks utts 划分 作用
timit_train 306 10 train/valid = 0.95 训练NPLDA(+CORAL loss)模型
timit_test 78 10 enroll: 8utts
eval: 2utts
验证NPLDA模型
aishell_train 296 10 train/valid = 0.95 训练NPLDA(+CORAL loss)模型
aishell_test 76 10 enroll: 8utts
eval: 2utts
测试最终结果

# 实验结果

# Baseline

source data为timit,这里的PLDA和LDA用timit直接训练,还是用sre16预训练模型,还是从sre16预训练模型用APLDA自适应得到?下面进行实验,同时考察直接作用于target data和由APLDA得到target data模型的准确率

方案 LDA trial EER minDCF1 minDCF2
直接训练 直接训练 timit 1.282 0.0568 0.0641
- - aishell 0.9868 0.1311 0.2258
+APLDA(aishell) - aishell 0.6579 0.0850 0.2105
预训练(sre16) sre16预训练 timit 2.564 0.3040 0.4678
- - aishell 2.961 0.2779 0.4297
+APLDA(aishell) - aishell 1.974 0.1966 0.2850
预训练+APLDA sre16预训练 timit 2.564 0.2106 0.3011
- - aishell 1.974 0.2579 0.3487
+APLDA(aishell) - aishell 1.974 0.1774 0.2982
预训练+APLDA 直接训练 timit 1.282 0.0760 0.1026
- - aishell 1.316 0.2037 0.3047
+APLDA(aishell) - aishell 0.9868 0.0918 0.2608

注:

  1. "-"表示同上
  2. Kaldi中LDA与PLDA模型所用数据集一致
  • 直接监督训练得到的LDA和PLDA模型识别效果是最好的
  • aishell与timit的EER没有可比性!均可以看出,aishell在进行域适应后性能有所提升
  • ✔️LDA在提取有效特征方面很有用,不可以丢弃
  • 验证kaldi_io的有效性:用kaldi_io重新读写scp文件并保存为ark文件,实验表明结果一致
  • 基线系统:从timit直接得到plda后,用kaldi的aplda更新,得到eer=0.6579,minDCF1=0.0850,minDCF2=0.2105

# 🚩NPLDA

# 没有直接优化的能力

不考虑域适应问题,此时的基线为eer=1.282,minDCF1=0.0852,minDCF2=0.0962(timit直接训练)

  • 以softcdet为损失函数,初始学习率:需要设置为0.0001,否则结果就会很动荡;迭代次数:50次,eer在iter=56左右直线上升也管不着
  • 学习不到什么,eer始终为1.282,但minDCF就会左右动荡,总的来说性能比gplda略差
  • 当把softcdet中的$P_{taregt}$修改为0.5时【⚠️还需要验证是否可以表示FAR=FRR时的EER】,初始学习率设置为0.001,迭代次数:>100次;
  • 学习不到什么,eer在80次左右稳定为1.282,并保持不变,但minDCF就会左右动荡,总的来说性能比gplda略差

# 有监督式迁移的能力

不考虑域适应问题,此时的基线为eer=2.564,minDCF1=0.2106,minDCF2=0.3011(sre16+aplda),初始学习率为0.001

先验 迭代次数 LDA EER minDCF1
0.5 200 sre16 1.9231 0.1932
0.01 200 sre16 2.5641 0.3132
0.012 200 直接训练 1.2821 0.1291
  • 基于minDCF的损失函数确实使得minDCF一直下降,但是EER却在下降后呈上升趋势
  • 性能比直接用aplda好,因为aplda是无监督式迁移,自然性能会差一些
  • 与直接训练LDA的模型作比较,EER刚好达标,但是minDCF性能依旧略差
  • ✔️训练的时候保持了正负样本均衡,所以先验设置为0.5合理,测试的时候用实际情况中的0.01或是0.001

# 没有对异域的鲁棒性

直接用于target data时,基线系统eer=0.9868,minDCF1=0.1311,minDCF2=0.2258

学习率 迭代次数 EER minDCF1
0.001 200 1.9737 0.3042

# 总结

  • 训练结果很不稳定,一直在震荡
  • 没有直接优化的能力,有监督式迁移的能力,没有对异域的鲁棒性
  • NPLDA很鸡肋,实际上是PLDA的非线性微调,提升效果不明显,超参太多,收敛困难

# NPLDA+Coral Loss

预训练模型为通过timit_train训练得到的GPLDA模型

data _lambda trials EER minDCF1 minDCF2 备注
timit_train - timit 1.282 0.0641 0.0641
timit_aishell - aishell 0.9868 0.1861 0.3442
timit_aishell epoch / n_epochs aishell 0.9868 0.1861 0.3442
timit_aishell 100 * epoch / n_epochs aishell 0.6579 0.1729 0.2784
timit_aishell 200 * epoch / n_epochs aishell 0.6579 0.1523 0.2521 100
  • 进行监督训练时,EER结果与GPLDA一致,minDCF还略有所上升,与论文中的结果不一致【可能是数据量不够】

  • 加入Coral Loss后,_lambda的取值对结果的影响很大,minDCF略有所下降,性能提升并不明显

  • 200 * epoch / n_epochs部分可以增加epoch试试

  • 网络中的均值参数是人为固定的,后期是否可以改为模型训练参数?

  • 网络需要较多epoch才收敛,分类损失与coral损失如何平衡?如何更好地设定学习率?

  • Coral Loss按道理是要下降的,但图中出现了问题

  • 并没有根据coral loss动态调整学习率,验证的时候也没有验证coral loss

# 特征构造

目标:构造特征提取器+域判别器,特征提取器需要找到了域不变的部分,使得域判别器不能判断出准确的域标签,而域判别器需要尽可能判断准确

  • 为什么不采用数据分布对齐?对齐两个已知域使得模型对未知域的鲁棒性会下降,不符合实际应用
  • 为什么做特征构造?因为NPLDA是对识别模型的改进,缺失特征构造部分,后续也可以做网络级别的融合
  • 特征提取器采用简单的3层DNN网络,两个域共享网络参数(孪生网络),因为只是对xvector进行修正,而xvector是从12层大型网络中提取得到的

基线:Kaldi工具包提供的GPLDA得到的EER=1.31579,自适应函数APLDA得到的EER=0.6579

mean EER minDCF1 minDCF2
timit_train 4.60526
aishell_train 1.31579 0.1684 0.2982
+aplda 0.6579 0.0526 0.0526
  • 尽管验证集均值效果最好,根据实际场景,以后使用训练说话人的均值向量

实验1:说话人识别器

属于1:N识别中的网络融合,但由于是对特征提取器的改进,考察能否提取出更鲁棒的说话人特征

后端 GPLDA APLDA NPLDA
EER 0.8633 0.6287 0.6287

实验2:说话人判别器NPLDA

  • 单独训练
后端 GPLDA APLDA NPLDA
EER 0.8467 0.6234 0.6234
  • 1:1识别与域适应的网络级融合,即域判别器和说话人判别器对特征提取器都有影响,目前能实现EER=0.6347

实验3:域判别器+说话人识别器

网络:3层全连接层,学习率0.001

输入数据:随机打乱源域与目标域的样本,成对输入,正负标签数量一致

标签:同域标为0,反之为1

损失函数:Contrastive loss(对比损失)

iter EER minDCF1 minDCF2
1 0.657895 0.1287 0.2258
2 0.657895 0.1005 0.1579
3 0.657895 0.0963 0.1382
  • EER与APLDA持平,但是minDCF始终比较差

实验4:域分类器+说话人识别器

输入数据:单条样本

标签:源域即[1,0],目标域即[0,1]

损失函数:二元交叉熵损失

后端 GPLDA APLDA NPLDA
EER 1.4258 0.8334 0.8334
  • 域分类器没能学到域不变部分,可能是正负样本失衡导致的

  • 域判别器可以较快地扩充训练样本对,减少数据量失衡的问题

  • 域判别器优于域分类器

先训练说话人相关的模型,再训练域相关的模型:

域分类器 域判别器
说话人分类器 1.0215 0.6234
说话人判别器 1.0334 0.6287
  • 说话人分类器+域判别器效果是最好的,即强说话人信息+弱域信息
  • 虽然可以实现1:1识别与域适应的网络级融合,但识别性能略有所下降,需要加入更多的说话人信息

# 🚩对比损失

对域判别器(1:1)进行优化

损失函数 EER minDCF
Contrastive Loss 0.6438 0.0737
加权Contrastive Loss 0.6332 0.0774
Triple Loss 0.6093 0.0713
加权Triple Loss 0.5437 0.0684
Baseline 0.6579 0.0850
  • 直接根据负样本对的距离进行加权,重视边界的距离

# 🚩分类器优化

特征处理 EER minDCF
- 3.9474 0.2982
softmax 1.9737 0.14
arcface 0.6579 0.1026
arcface+边界样本硬分类m = [0, 0.5] 0.3289 0.0895
arcface+边界样本软分类m = [0, 0.25, 0.5] 0.6579 0.0811
LDA 0.3289 0.0589
  • $$L_{arcface}=-\frac{1}{N} \sum_{i=1}^{N} \log \frac{e^{s\left(\cos \left(\theta_{y_{i}}+m\right)\right)}}{e^{s\left(\cos \left(\theta_{y_{i}}+m\right)\right)}+\sum_{j=1, j \neq y_{i}}^{n} e^{s \cos \theta_{j}}}$$​
  • 网络的改进还不如直接使用传统的线性判别分析,训练出投影矩阵,使得类间距离增大,类内距离减小
  • ⚠️尝试全连接层部分进行特征降维,再与LDA比较性能
  • 前15%与后15%分别属于难以分类和完美分类的部分,但是实验效果不理想?
  • 网络的最终结果不一定是最稳定的时候,此时就不满足径向分布了,加入高斯分布效果如何?
  • PLDA自身也具有增大类间距离的能力,查看算法在余弦相似度上的效果

# 知识积累

  • train loss 和 test loss的关系与作用(总结) (opens new window)
  • 神经网络,分类和回归问题,在网络结构上的区别是什么?分类比回归多一层softmax吗?诚心求教? (opens new window)
  • 根据标签分布来选择损失函数 (opens new window)
#Nnet
上次更新: 2024/04/10, 22:12:29
一些参考图表及表述
Fit-DNN在声纹识别的应用

← 一些参考图表及表述 Fit-DNN在声纹识别的应用→

最近更新
01
方言语音识别综述
04-05
02
主流ASR模型概述
03-26
03
一些参考图表及表述
05-28
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式