跨语种域适应
# 问题定位
- 域失配:源域数据远多于目标域数据,目标域数据没有任何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即为类间方差
![](https://i.loli.net/2021/04/24/UD72gGVrKXhk6Od.png)
- 用GPLDA训练得到的模型初始化网络,才可以保证该网络稳定收敛
- 将阈值作为模型参数进行训练
- 损失函数由minDCF函数演变得到,将阶跃函数调整为平滑的Sigmoid函数
# Deep Coral
![](https://i.loli.net/2021/04/24/HqSItKvRMOLeGQB.png)
- 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)
![](https://i.loli.net/2021/06/08/Vxph6lCq8w4fZWP.png)
# 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 |
注:
- "-"表示同上
- 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层大型网络中提取得到的
![](https://i.loli.net/2021/05/22/tGrERCSajuh7UgZ.png)
基线: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 |
- 直接根据负样本对的距离进行加权,重视边界的距离
# 🚩分类器优化
![](https://i.loli.net/2021/07/31/eOMABJQRLzUZ1g7.png)
特征处理 | 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%分别属于难以分类和完美分类的部分,但是实验效果不理想?
![](https://i.loli.net/2021/07/31/31SoTuNjenbRF9x.png)
- 网络的最终结果不一定是最稳定的时候,此时就不满足径向分布了,加入高斯分布效果如何?
- PLDA自身也具有增大类间距离的能力,查看算法在余弦相似度上的效果