我们常见的PLDA,是出自《Probabilistic Linear Discriminant Analysis for Inferences About Identity》,由Simon J.D. Prince和James H. Elder合著的,我愿称之为 standard PLDA,https://wiki.inf.ed.ac.uk/twiki/pub/CSTR/ListenSemester2201112/prince-iccv07-plda.pdf。

Kaldi所实现的PLDA则是,出自另一篇《Probabilistic Linear Discriminant Analysis》,由Sergey Ioffe所著,https://ravisoji.com/assets/papers/ioffe2006probabilistic.pdf。

除上面两篇之外,还有不少PLDA的变体,例如Kenny提出的HT-PLDA,MAK老师写的Mixture PLDA等。

这些PLDA都是遵循了把向量映射到一个可区分空间中计算相似性,在该空间拉开类间距离和缩小类内距离:


standard PLDA,是生成模型,考虑了eigenvoice、eigenchannels和残差因子,用EM算法训练参数时要依次对本征音和本征信道进行重估。这训练方式类似于联合因子分析(可叫joint-型plda),所以会存在JFA的相似问题,即洗炼后的信道因子会带走了部分说话人因子的信息。而实际上参考minDCF的评价公式,说话人因子信息更为重要,其代表类间信息,能直接降低FAR错误率,提升安全性。兼顾本征音和本征信道的standard PLDA,能有效降低FRR错误率,提升体验性,但低质量的target属实没接受意义,而且FAR不能得到足够的保证。

standard PLDA的映射关系如下:


    其中,

    • [公式]是指PLDA训练集中的第[公式]个说话人的第[公式]条矢量;
    • [公式][公式]是身份空间的低维矩阵,是类间空间,代表EigenVoice本征音,表示各种身份的载荷矩阵,它的每列包含类间子空间的基底;
    • [公式]是说话人因子,是隐变量;
    • [公式]是误差空间的低维矩阵,是类内空间,代表EigenChannles本征信道,表示同一身份不同信道变化的残差载荷矩阵,它的每列相当于类内子空间的基底,是协方差特征向量;
    • [公式]是信道因子,是隐变量;
    • [公式]是残留噪声项,表示尚未解释的部分,该项均值为零,方差为对角矩阵Σ,符合高斯分布;
    • [公式]是对角矩阵;
    • [公式],代表了信号成分,描述了个体间的差异,对应着FAR;
    • [公式],代表了噪声成分,描述了个体内的差异,对应着FRR。


    simplified PLDA和standard PLDA挺相似的,也具有对向量作降维映射能力。虽然simplified PLDA增强对类间空间进行优化,但是simplified PLDA在跨信道上的同一说话人收敛能力下降了。

    以上的PLDA,能被称之为standard PLDA系列,因子之间存在较强的相关性,需要联合看待处理。而对于Kaldi的PLDA,则是跳出了说话人因子和信道因子的范式,而是采用类间因子和类内因子,分别对应类间方差和类内方差,所以能称之为two-covariance PLDA。


    Kaldi的PLDA是so-called two-covariance PLDA,具体理解可先假设全部数据中的任一样本[公式],其是第[公式]类的第[公式]个样本,均值是:


    其中,第[公式]类有[公式]个样本,全部数据共有[公式]个类别,共有[公式]个样本;

    而全部数据的均值矢量[公式]是固定的,我们先提前对每个数据移除均值矢量,则任意一个样本符合以下高斯分布:

    [公式]

    接着,假设存在类间因子[公式],该隐变量表征每个类别的虚拟类中心,则其满足:

    [公式]

    那第[公式]类的某一样本[公式],该类有[公式]个样本,则其是会满足:

    [公式]

    能从上面分布得知,假设还存在类内因子[公式],该隐变量表征着某类别内的任一样本分布,满足:

    [公式]

    综上,样本[公式]能由类间因子和类内因子表示为:


    [公式]和[公式]的分布,是分别对应类间方差[公式]和类内方差[公式],所以该PLDA被称之为two-covariance PLDA。

    该PLDA相比于基于standard PLDA系列,优势在于能根据spk2utt划分出每个说话人的样本,能有效兼顾类间和类内的关系。但由于不再存在[公式]和[公式]的子空间,所以该PLDA不能实现向量降维,要搭配PCA和LDA等back-end模型提前降维。

    目前来说,说话人识别的PLDA主要是以上两种,所以在谈Kaldi的PLDA时,不要把它和standard PLDA混在一起谈,更不要尝试硬套公式和代码,这都是不合理的~


    接下来,是本文的重头戏,我们要如何训练PLDA呢?

    在论文《Probabilistic Linear Discriminant Analysis》中,是先讲解inference再到learning,我这里反过来,先讲怎样去训练参数。Kaldi的PLDA模型主要参数是类间方差和类内方差,借助EM算法迭代收敛后,保存用于打分阶段的。这里我参考了《Probabilistic Linear Discriminant Analysis》和《A Note on Kaldi's PLDA Implementation》,我把后者的训练推导以我理解过的,更详细地方式展开顺一遍,读者若有不解的地方可以留言备注,https://arxiv.org/pdf/1804.00403.pdf。


    我们这里先从上一节样本[公式]的表示方法开始。

    由于[公式],会有[公式],所以能理解为PLDA在做参数重估时只有一个隐变量,我们可以先只关注[公式]的分布,之后能同理可得到[公式]的分布。

    假设PLDA的参数为[公式],对于给定的可观察变量[公式],根据极大似然估计有

    [公式]

    表示存在最优解参数[公式],其能使得以上的似然函数最大。由于上式有隐变量,且高斯分布存在多个凸函数簇,无法直接解得全局最优解,也就是没法获得闭式解。但由于琴生不等式的成立,我们可用EM算法去进行逼近估算。

    根据EM算法,对于完全数据的似然概率[公式],E步有期望:[公式]

    根据贝叶斯公式和高斯概率密度函数,上式可转换为:


    之后要做微分,所以提前把[公式]和[公式]省掉,并把右项进一步展开:


    截止到现在都很顺利,之后的推导需要一个数学技巧。上式的展开是基于[公式],从另一个角度看,[公式]和[公式]都是满足高斯分布,高斯分布的联合概率依然是高斯分布,所以肯定存在:

    [公式]

    根据高斯概率密度函数,又会有:


    对比[2]和[3]式,小括号内的完全平方差是能对应起来,同时[2]的第一项对应着[3]的方差,所以能直接求解出方差为(这是个小技巧):[公式]

    接着把[公式]的结果代回去[3]中,可得:


    我们又对比[1]和[4]式,基于第一项和第二项,能类比得到均值为(眼要够尖):


    截至为止,就可证论文《A Note on Kaldi's PLDA Implementation》中的公式(13)和(14)。

    综上,[公式]满足高斯分布:

    [公式]

    由于给定了已知[公式],所以[公式]的分布也是[公式]的分布:

    [公式]

    而隐变量[公式],同理可得,[公式]的分布是:

    [公式]

    接下来,终于到EM算法了。

    分别对隐变量[公式]和[公式]的对数似然概率计算E步,有:


    然后,分别对隐变量[公式]和[公式]的对数似然概率计算M步,要使极值点最大,分别对各自的Q函数的方差求偏导。

    对[6]式求偏导:

    [公式]

    令上式等于0,可得新的[公式],


    其中,随着PLDA迭代训练的推进,[公式]的均值和方差不再是初始的0和[公式]了,而是[5]中的迭代中间值,把[5]式的分布代入到上面即可得下一轮迭代的结果。

    同理,对于隐变量[公式]的[7]式求偏导,可得新的[公式],


    可证论文《A Note on Kaldi's PLDA Implementation》中的公式(17)和(18)。到这里为止,PLDA的EM训练就全部完成了!


    文章来源知乎,本文作者:Leon晋