几种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个数据集中男女性别的域差异:
显然,同一数据集中,性别导致的域差异也是不容小视的,因此应用场景中经常分别训练男女模型
参考资料:
# CORAL
相关性对齐(CORelation ALignmnet),不需要说话人标签,包含两个步骤:Whitening 和Re-coloring。将out-domain的协方差通过变换使其接近in-domain的协方差。
![](https://gitee.com/zhouwenjun2020/blog_pictures/raw/master/20210209122511.png)
# 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}$$
![](https://gitee.com/zhouwenjun2020/blog_pictures/raw/master/20210318105846.png)
最小化分类损失本身就可能导致对源域的过拟合,从而降低对目标域的性能。另一方面,单纯减少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
# ASV-Subtools
- 计算得到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对比实验
- [ ] 可否直接改进评估指标?
- [ ] 除了性别这个隐藏属性带来域差异,一个数据集中有几个未知域呢?【非监督聚类】
# 其他
# 参考资料
- 说话人识别中的PLDA自适应_周健峰
- 《Machine Learning for Speaker Recognition》