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

ZhouWJ

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

  • 算法原理梳理

    • 几种PLDA模型探究
    • PRML|高斯分布
    • PRML|概率图模型(贝叶斯网络)
    • 几种PLDA自适应算法
      • 域差异(t-SNE)
      • CORAL
        • feature-based
        • model-based
      • CORAL+
      • Kaldi-APLDA
      • Deep-CORAL(×)
      • NPLDA+(CORAL Loss)
      • 实验设计
        • 数据准备
        • 工具包
        • Kaldi
        • ASV-Subtools
        • 特征预处理
        • 自适应算法
        • 去均值+长度归一化
        • 去均值
        • 长度归一化
        • 无预处理
        • APLDA VS CORAL+
        • 后续改进
        • 其他
      • 参考资料
    • 矩阵相关基础知识
    • 深度学习基础知识
    • 微分方程相关基础知识
    • 泛函梯度下降
  • 文献记录

  • 我的工作

  • 声纹识别
  • 算法原理梳理
xugaoyi
2021-04-24
目录

几种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$$

# 域差异(t-SNE)

域适应是特殊的迁移学习,两个域的边缘概率$p(X^s )$ 及 $p(X^t )$是不同的,但是存在这样的假设:两个条件概率$p(Y^s |X^s )$ 及$p(Y^t |X^t )$是相同的。

紫色部分表示TIMIT中男性特征,黄色表示Aishell中作为域内数据的男性特征

数据集域差异(男性)

  • TIMIT中男女标签在spkID中,开头M表示男性,F表示女性
  • Aishell有单独的文本文件保存性别等信息

我们还可以顺便考察2个数据集中男女性别的域差异:

性别差异可视化

显然,同一数据集中,性别导致的域差异也是不容小视的,因此应用场景中经常分别训练男女模型

参考资料:

  • TSNE高维数据降维可视化工具 入门到理解 + python实现 (opens new window)
  • 数据降维与可视化——t-SNE (opens new window)

# CORAL

相关性对齐(CORelation ALignmnet),不需要说话人标签,包含两个步骤:Whitening 和Re-coloring。将out-domain的协方差通过变换使其接近in-domain的协方差。

# feature-based

步骤 处理方式 数学表达
1 分别计算OOD和InD的总协方差 $\Psi_o=W_o+B_o$
$\Psi_I=E(\phi^2)-E(\phi)^2$
2 将总协方差矩阵用特征值和特征向量矩阵表示 $\Psi_{O}^{-\frac{1}{2}}=Q_{O} \Lambda_{O}^{-\frac{1}{2}} Q_{O}^{t}$
$\Psi_{I}^{\frac{1}{2}}=Q_{I} \Lambda_{I}^{\frac{1}{2}} Q_{I}^{t}$
3 对iVector $\phi$白化 $\phi_{w}=\Psi_{O}^{-\frac{1}{2}} \phi$
4 对iVector重上色 $\phi_{r}=\Psi_{I}^{\frac{1}{2}} \phi_w$

# model-based

基于特征进行转换的话,在每一对utts打分的时候都需要进行白化和重上色操作,而通常trials中一句话需要进行多次匹配。而在线性高斯模型中,正太分布的数据经过线性变换$y=Ax$后,其方差会由$\Sigma$变为$A\Sigma A^T$。由于PLDA是在协方差层面的操作,因此可以直接在PLDA中修改模型参数,即修改类内外协方差。此时$A=\Psi_{I}^{\frac{1}{2}}\Psi_{O}^{-\frac{1}{2}}$

$$\Phi_{W, C}=A^{T} \Phi_{W, O} A$$

$$\Phi_{B, C}=A^{T} \Phi_{B, O} A$$

# CORAL+

相比于CORAL,CORAL+进行了2点改进:1)线性插值;2)参数规整;

  • 线性插值

    $$\Phi_{b}^{+}=(1-\beta) \Phi_{b, o}+\beta A^{T} \Phi_{b, o} A$$

    $$\Phi_{w}^{+}=(1-\lambda) \Phi_{w, o}+\lambda A^{T} \Phi_{w, o} A$$

    重新规整后,可得到:

    $$\Phi_{b}^{+}=\Phi_{b, o}+\beta\left(A^{T} \Phi_{b, o} A-\Phi_{b, o}\right)$$

    $$\Phi_{w}^{+}=\Phi_{w, o}+\lambda\left(A^{T} \Phi_{w, o} A-\Phi_{w, o}\right)$$

  • 参数规整

    最本质的目标:利用少量域内数据,尽可能地覆盖未知说话人的特征分布,而不是尽可能地准确表示已知说话人的特征分布。将协方差矩阵进行特征值分解,可以得到主要变化方向上的变化值,因此需要将域内外数据投影到同一个空间【通过 合同对角化 实现】,在这个空间里比较某个方向上的特征值大小。只有当域内数据特征值大于域外数据时,才用线性插值法更新参数。

具体流程如下:

步骤 处理方式 数学表达
1 对转换后的OOD参数$A^{T} \Phi A$及原参数$\Phi$进行合同对角化 $B^{T} \Phi_{b, o} B=I$
$B^{T}\left(A^{T} \Phi_{b, o} A\right) B=E_{b}$
$B^{T} \Phi_{w, o} B=I$
$B^{T}\left(A^{T} \Phi_{w, o} A\right) B=E_{w}$
2 取各方向上的最大特征值 $\max \left(E_{b}, I\right)$,$\max \left(E_{w}, I\right)$
3 将调整后的方差值还原回原始空间,进行插值 $\Phi_{b}^{+}=\Phi_{b, o}+\beta B_{b}^{-T} \max \left(E_{b}, I\right) B_{b}^{-1}$
$\Phi_{w}^{+}=\Phi_{w, o}+\beta B_{w}^{-T} \max \left(E_{w}, I\right) B_{w}^{-1}$

# Kaldi-APLDA

该算法借鉴了CORAL+中的插值和规整技术。已知由OOD训练得到的PLDA模型中,经过转换矩阵$A$后,类内协方差$W_o=1$,类间协方差为$B_o=\Psi_o$。对InD数据计算均值和总方差,计总方差为$\Psi_I$,【有前期处理过程,略】。

步骤 处理方式 数学表达
1 通过A*变换至空间 I ,OOD的总协方差从$1+\Psi$变为1.0 $A^*=\frac{A}{\sqrt{1+\Psi_o}}$
$W_o^I=\frac{I}{1+\Psi_o}$
$B_o^I=\frac{\Psi_o}{1+\Psi_o}$
2 InD在空间 I 差变换为$\Psi_I^I$ $\Psi_I^I=A^*\Psi_IA^{*T}$
3 对$\Psi_I^I$进行特征值分解,根据实对称矩阵性质,得到矩阵表示 S, P=Eig($\Psi_I^I$)
$\Psi_I^I=P\Lambda(s)P^T$
4 应用$P^T$投影,将InD从空间 I 投影到空间 II 中;
注意:$P$为单位正交矩阵
$\Psi_I^{II}=P^TP\Lambda(s)P^TP=\Lambda(s)$
5 计算空间 II 中OOD的类内和类间协方差,此时总协方差依旧是单位阵【❗为什么?】 $W_o^{II}=P^TW_o^IP$
$B_o^{II}=P^TB_o^IP$
$\Psi_o^{II}=W_o^{II}+B_o^{II}=I$
6 在空间 II 中,对OOD类内外协方差进行线性插值 if S[i] > 1:
$W_{o-mod}^{II}+=\alpha_w(S[i]-1)$
$B_{o-mod}^{II}+=\alpha_b(S[i]-1)$
7 将插值后的OOD类内外协方差投影回原始空间,即变换矩阵$W^{-1}=(P^TA^*)^{-1}$ $W_{o-mod}=W^{-1}W_{o-mod}^{II}W^{-T}$
$B_{o-mod}=W^{-1}B_{o-mod}^{II}W^{-T}$
8 将类内协方差还原回1.0,需要对$W_{o-mod}$进行Cholesky分解;
进行变换后,可看做将OOD通过$C^{-1}$投影到空间 III 中,将$W_{o-mod}$对角化了
$W_{o-mod}=CC^T$
$C^{-1}W_{o-mod}C^{-T}=I=W_o^{III}$
$B_o^{III}=C^{-1}B_{o-mod}C^{-T}$
9 将类外协方差也进行对角化,相当于通过$Q^T$进行投影,此时类外协方差是投影前的特征值矩阵;
此时,类内协方差保持为单位阵
$\Psi_{new}, Q$=Eig($B_o^{III}$)
$B_o^{III}=Q\Lambda(\Psi_{new}Q^T)$
$Q^TB_o^{III}Q=\Lambda(\Psi_{new})$
10 PLDA参数更新:此时从原始空间到新空间的变换为$Q^TC^{-1}$ 均值:InD全局均值
转换矩阵:$Q^TC^{-1}$
类间协方差:$\Psi_{new}$
  • $\Lambda(s)$表示将向量$s$扩展为对角矩阵

  • 下标表示数据属性,上标表示空间记号

  • 特征值分解后,均有特征值排序过程

  • 为什么OOD的类内协方差$W_o=1$,类间协方差为$B_o=\Psi_o$?

    因为PLDA中的变换矩阵使得类内协方差单位化,类间协方差对角化

与CORAL+的区别与联系:

  • 对OOD的总协方差进行归一化【❗为什么?有待实验】

  • 在投影后的新空间进行插值,而CORAL+是还原回原始空间再插值的

  • 还原回原始空间后,又将类内协方差还原回1,类外协方差还原为对角阵

    为了以相同的格式进行存储,这样可以使得保留的模型参数最小化,适合工程应用

# Deep-CORAL(×)

将线性变换转为非线性变换。将OOD协方差与InD协方差的差异作为神经网络的损失函数【⚠️为什么损失函数是这样的形式?】:

$$\mathcal{L}{C O R A L}=\frac{1}{4 d^{2}}\left|C{S}-C_{T}\right|_{F}^{2}$$

其中,$C_{S}(C_{T})$是特征协方差矩阵:

$$C_{S}=\frac{1}{n_{S}-1}\left(D_{S}^{\top} D_{S}-\frac{1}{n_{S}}\left(\mathbf{1}^{\top} D_{S}\right)^{\top}\left(\mathbf{1}^{\top} D_{S}\right)\right)$$

$$C_{T}=\frac{1}{n_{T}-1}\left(D_{T}^{\top} D_{T}-\frac{1}{n_{T}}\left(\mathbf{1}^{\top} D_{T}\right)^{\top}\left(\mathbf{1}^{\top} D_{T}\right)\right)$$

其中,$\mathbf{1}$是所有元素为1的列向量,根据链式法则可以求得梯度:

$$\frac{\partial \mathcal{L}{C O R A L}}{\partial D{S}^{i j}}=\frac{1}{d^{2}\left(n_{S}-1\right)}\left(\left(D_{S}^{\top}-\frac{1}{n_{S}}\left(1^{\top} D_{S}\right)^{\top} 1^{\top}\right)^{\top}\left(C_{S}-C_{T}\right)\right)^{i j}$$

$$\frac{\partial \mathcal{L}{C O R A L}}{\partial D{T}^{i j}}=-\frac{1}{d^{2}\left(n_{T}-1\right)}\left(\left(D_{T}^{\top}-\frac{1}{n_{T}}\left(\mathbf{1}^{\top} D_{T}\right)^{\top} \mathbf{1}^{\top}\right)^{\top}\left(C_{S}-C_{T}\right)\right)^{i j}$$

最小化分类损失本身就可能导致对源域的过拟合,从而降低对目标域的性能。另一方面,单纯减少CORAL的损失,可能会导致CORAL性能退化。例如,该网络可以将所有的源数据和目标数据投影到一个点上,使CORAL的损失近乎为零。然而在这样的特征上,没法训练很好的分类器。因此损失函数需要是两者的结合:

$$\mathcal{L}=\mathcal{L}{C L A S S}+\sum{i=1}^{t} \lambda_{i} \mathcal{L}_{C O R A L}$$

❗注意事项:

  • 两个网络共用网络参数
  • 本文在最后一层计算CORAL loss,但是可以从其它任意层中计算
  • 最后一层的参数进行随机初始化,学习率也设置得高一些,因为该层需要重新训练,其他层沿用预训练模型参数
  • ⛔不具有可行性,该网络必须是端到端的

参考资料:

  • Deep CORAL: Correlation Alignment for Deep Domain Adaptation (opens new window)
  • Domain Adaptation Project (opens new window)

# NPLDA+(CORAL Loss)

由于Deep-CORAL适用于1:N,不适用于1:1,但是其对抗式网络的思想可以借鉴,应用到PLDA的神经网络版本——NPLDA (opens new window)中。

# 实验设计

# 数据准备

使用voxceleb提供的预训练网络:

  • TIMIT:共630人,用于训练PLDA模型
  • Aishell:共400人,3000utts/300spk作为域内数据,100人用于打分测试,注册使用3 utts,验证使用1 utt【后期再修改】
  • 域内数据无标签,只能使用预训练的LDA模型
  • 去均值——降维(暂不考虑)——归一化
  • Kaldi中二进制PLDA文件转为txt文件:ivector-copy-plda

# 工具包

# Kaldi

  • PLDA相关代码详解 (opens new window)

  • 使用预训练Xvector模型进行测试 (opens new window)

# ASV-Subtools

  1. 计算得到PLDA的类内外协方差后,通过合同对角化得到转换矩阵及残差项
    • 将类内协方差对角化为单位阵(Cholesky分解)$W=CC^T$
    • 将类间协方差投影到该空间中,并进行特征值分解:$s,U=eig(B^{new})$,类内协方差保持为单位阵
    • 经过$U^TC^{-1}$变换,类内协方差为单位阵,类间协方差为对角阵,对角元素为s
    • PLDA模型:全局均值,转换矩阵$U^TC^{-1}$,类间协方差对角元素s

# 特征预处理

通常在进行PLDA打分前,会进行LDA降维操作,这可以使数据被映射到这样一个空间,该空间能使得类内协方差最小,类外协方差最大,使数据的差异性变大。由于需要spk labels,为了尽可能减少域外数据的影响,暂不考虑。【伪标签】

🚩使用OOD得到的预训练模型进行实验,此时全局均值只能从OOD set获取

预处理流程 EER(%) minDCF1 minDCF2
去均值+长度归一化 15.14 0.9497 0.9943
去均值 10.86 0.8490 0.9523
长度归一化 9.143 0.8909 0.9421
无 4.857 0.5189 0.7018

⛔做预处理的效果反而下降,且下降严重,违反常识。注意:{OOD, InD, enroll, eval}数据必须做同样的处理

预处理流程 Mean EER(%) minDCF1 minDCF2
去均值+长度归一化 OOD 6 0.6300 0.8000
去均值 OOD 6 0.5800 0.7200
长度归一化 —— 5 0.6000 0.7300
无 —— 6 0.5800 0.7200
  • 在去均值的情况下,长度归一化对EER影响不大,但是对不同的代价函数稍有优化
  • 因为预训练PLDA中,全局使用的是OOD set的均值,即便是无操作,各数据集间减去的均值是相同的,无法验证均值的影响
  • ❗ 为什么去均值+长度归一化的结果不如只去均值或者长度归一化好?

# 自适应算法

# 去均值+长度归一化

模型 Mean EER(%) minDCF1 minDCF2
Baseline OOD 6 0.6300 0.8000
InD 3 0.3900 0.5209
NPLDA InD 2.3 0.2800 0.5000
NPLDA+ InD
APLDA InD 2 0.2300 0.5309
CORAL InD 5 0.3200 0.4600
CORAL+ InD 1 0.1800 0.3909
  • 只改变均值性能就能有大幅的提升,说明均值统计量对数据分布有很好的描述能力
  • 性能:CORAL+ > APLDA > NPLDA > Baseline > CORAL

# 去均值

模型 Mean EER(%) minDCF1 minDCF2
Baseline OOD 6 0.5800 0.7200
InD 2 0.3500 0.5309
NPLDA InD 2 0.2113 0.6734
NPLDA+
APLDA InD 2 0.2000 0.5000
CORAL InD 4 0.3200 0.3900
CORAL+ InD 1 0.1700 0.3909
  • 域内均值的意义很重大
  • APLDA算法中,虽然EER并没有降低,但是minDCF1与minDCF2均有所改善
  • CORAL+算法依然坚挺

# 长度归一化

模型 EER(%) minDCF1 minDCF2
Baseline 5 0.3200 0.4600
NPLDA 4 0.5667 0.4200
NPLDA+
APLDA 2 0.2100 0.4500
CORAL 6 0.3500 0.4709
CORAL+ 1 0.1400 0.3309
  • CORAL很大程度上只是依靠了均值的变化,只长度归一化时,性能反倒更差了

# 无预处理

模型 EER(%) minDCF1 minDCF2
Baseline 6 0.5800 0.7200
NPLDA 4 0.5667 0.4600
NPLDA+
APLDA 4 0.4300 0.5700
CORAL 6 0.5700 0.8309
CORAL+ 4 0.4000 0.6909

综上所述:

  • 性能:CORAL+ > APLDA ≥ NPLDA > Baseline > CORAL
  • CORAL没有考虑未知数据的分布,因此性能始终很差
  • APLDA对类内外协方差进行了合同对角化处理,以便用更少的元素保存参数,对数据有些压缩,使得效果比CORAL+差【有待验证】

# APLDA VS CORAL+

在实际应用场景中,保存PLDA模型时,通常对类内外协方差进行合同对角化处理,减少保存的元素。本节考虑在此情况下两个较优秀算法的性能

# 后续改进

  • [ ] NPLDA+CORAL loss是否可行?
  • [ ] 考虑性别的均衡
  • [ ] 增加iVector对比实验
  • [ ] 可否直接改进评估指标?
  • [ ] 除了性别这个隐藏属性带来域差异,一个数据集中有几个未知域呢?【非监督聚类】

# 其他

  • NumPy:linalg.eig()和linalg.eigh()之间的区别(NumPy: difference between linalg.eig() and linalg.eigh()) (opens new window)

  • python把txt中字符串数据提取为numpy数组 (opens new window)

# 参考资料

  • 说话人识别中的PLDA自适应_周健峰
  • 《Machine Learning for Speaker Recognition》
#PLDA
上次更新: 2024/04/10, 22:12:29
PRML|概率图模型(贝叶斯网络)
矩阵相关基础知识

← PRML|概率图模型(贝叶斯网络) 矩阵相关基础知识→

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