说话人识别中取到i-vector之后怎么做分类?i-vector又是如何推导?

现在有了gmm-ubm,自适应得到了每个人的gmm模型,用M=m+Tw得到了w,即每个人的i-vector,接下来怎么办呢?这时来了一个测试音频,是某…
关注者
142
被浏览
52,622

6 个回答

最近新添加了PLDA的数学推导,搭配i-vector食用能更全面QAQ


下面修正了关于T矩阵特点的描述~感谢 @Coast 的指出

另外附上更为详细的i-vector推导过程(但整个推导过程还是过于麻烦==||,所以有些地方我会打马虎眼,请别介意)~~

假设训练集有 S 句话,有 S = \left \{ 1, 2, ..., s \right \}

s 句话有 H(s) 帧,其每帧的声学特征有 D 维,则每句语音的声学特征矩阵如下:

X(s) = \left [ x_1, x_2, ..., x_i, ..., x_H(s)\right ]

所以 X(s) 是以帧数为行,维度为列;

假设GMM-UBM有 C 个高斯分量,而第 c 个单高斯的参数则为: \lambda = \left \{ \pi _c, \mu _c, \Sigma _c \right \}^C_{c=1}

并从已训练完成的UBM中,提取出其每个高斯的均值矢量,拼接成如下形式:

m = \left [ \mu _1^T, \mu_2^T,...,\mu_c^T \right ]^T

其中 m 是一个 C \cdot D 的超矢量,因此也被叫做均值超矢量;

先直接给出我们的目标函数(最熟悉最出名的那条公式):

M(s) = m + Tw(s) (1)

其中, T 是总变化矩阵,其维度是 C \cdot D \times Rw(s)R 维的隐变量i-vector,其是符合高斯分布; M(s) 是经过GMM-UBM的MAP后获得的第 s 句话的均值超矢量;在(1)中,其实需要估计的就参数 T ,而 w(s) 则是隐变量i-vector;

此时,我再给出B-W的3种充分统计量,这是给后面EM估计 T 时要用到的:

对于第 c 个单高斯,第 s 句话的充分统计量如下:

N_c(s) = \sum_{i=1}^{H(s)}P_\lambda(c|x_i)

F_c(s) = \sum_{i=1}^{H(s)}P_\lambda(c|x_i)(x_i - \mu_c)

S_c(s) = \sum_{i=1}^{H(s)}P_\lambda(c|x_i)(x_i - \mu_c)(x_i - \mu_c)^T

若把该句话的所有高斯分量的充分统计量整合起来成矩阵形式,则如下:

N(s) = \begin{bmatrix} N_1(s)I & & 0 \\ & ... & \\ 0 & & N_c(s)I \end{bmatrix} (2)

F(s) = \begin{bmatrix} F_1(s)\\ ...\\ F_c(s) \end{bmatrix} (3)

其中 N(s) 是一个主对角线矩阵。

好了,现在开始推导T矩阵的EM公式==||,其中E步比较复杂。。。

对于E步,第 t 次迭代期望的Q函数如下(4):

Q(T|T^{(t)})=\sum_{s=1}^SE(logP_T(X(s), w(s))) \\ = \sum_{s=1}^SE(logP_T(X(s)|w(s))) + \sum_{s=1}^SE(logP_T(w(s)))

此步是把观测数据 X(s) 和隐数据 w(s) 的条件概率拆开,展开为似然概率与边缘概率的乘积,可以参考《统计学习方法》的(9.12)公式;

由于(4)中的第二项是边缘概率,与 T 无关,所以在M步中会被偏导置零,这里就先提前忽略掉,继续展开(4):

Q(T|T^{(t)}) = \sum_{s=1}^S E(logP_T(X(s)|w(s)) \\ = \sum_{s=1}^S E(G(s) + H_T(s, w(s)))

其中, G(s) 是和二阶统计量的相关项,但跟 T 估计无关的,所以也提前忽略;

H_T(s, w(s)) 则与零阶、一阶、 Tw(s) 都相关的一项,其可展开为:

H_T(s, w(s)) = w(s)^TT^T\Sigma ^{-1}F(s) - \frac{1}{2}w(s)^TT^T\Sigma^{-1}N(s)Tw(s) (5)

如果说(4)式是EM的最核心,那(5)式可以说是i-vector推导中的最重要,把(5)代入到(4)中,并展开如下:

Q(T|T^{(t)}) = \sum_{s=1}^SE(\widehat{w}^{(t)}(s)^T T^{T}\Sigma^{-1}F(s)) \\ - \frac{1}{2}\sum^{S}_{s=1}E(\widehat{w}^{(t)}(s)^T T^{T}\Sigma^{-1}N(s)T\widehat{w}^{(t)}(s)^T)

上式(6)中关键的部分有两个,分别是 w(s) 的后验密度函数的均值与协方差:

均值 E(\widehat{w}^{(t)}(s)^T) = \sigma^{{t}}(s)^{-1}T^T\Sigma^{-1}F(s) (7)

协方差 E(\widehat{w}^{(t)}(s)^T\cdot\widehat{w}^{(t)}(s)) = \sigma^{{t}}(s)^{-1} + E(\widehat{w}^{(t)}(s)^T)\cdot E(\widehat{w}^{(t)}(s)^T)^T (8)

其中, \sigma^{{t}}(s) = I + T^T \Sigma^{-1}N(s)T (9)

截至到现在,E步就完成了,简化得到(6)式。


对于M步,对(6)式求极大:

T^{t+1} = argmax Q(T|T^{(t)}) (10)

T^{(t)} 求偏导,并求极值点:

\sum_{s=1}^S\Sigma^{-1}F(s)E(\widehat{w}^{(t)}(s)^T) -\\ \frac{1}{2}\sum^S_{s=1}\Sigma^{-1}N(s) \cdot 2T^{t+1} \cdot E(\widehat{w}^{(t)}(s)^T \cdot \widehat{w}^{(t)}(s)) = 0

化简,把第二项挪到等号右边;除了 T^{t+1} 这项外,把其它一堆东西除到等号左边,就可以求到 t+1 次迭代的T矩阵:

T^{(t+1)} = \frac{\sum_{s=1}^S \Sigma^{-1}F(s)E(\widehat{w}^{(t)}(s)^T)}{\sum_{s=1}^S \Sigma^{-1}N(s)E(\widehat{w}^{(t)}(s)^T \cdot \widehat{w}^{(t)}(s))} (11)

通常会迭代T矩阵5~6次认为收敛,最后把 Tm 代入到(1)中,即可用于提取i-vector


先写那么多,有空对着Kaldi源码再逐一印证一波~~

-------------------------------分割线-----------------------------------------------------

根据知友要求,再详细介绍从GMM-UBM,T矩阵,均值超矢量,和i-vector这个流程是怎样来的。现在很多papers虽然都省略了介绍ivector提取的具体介绍,甚至连M=m+Tw这个公式也不放上来(不过我也是这样子了),不过这个算法很经典,也是公认基线系统,过程较复杂的,我在这里尽力梳理(真的尽力了QAQ。。。)。。。

1、先用一部分训练集(包含多个说话人),通过EM期望最大化算法,训练UBM通用背景模型;通常我们会先训练一个协方差对角矩阵,再训练全矩阵,理由如下:


1、M阶高斯的稠密全矩阵UBM效果等同于一个更大高斯分量的对角矩阵;

2、对角UBM较为稀疏,计算量低效率快;

3、对角UBM性能上有优势;

UBM特点:一个与说话人、信道无关的高斯混合模型;可以作为这个训练集的统一参考坐标空间;在一定程度上,还解决了某些说话人少样本问题;

2、假如初始化UBM时,我设了M=2048个高斯分量components,就会有2048个单高斯分量,每个 i 分量(i=1,2,...,M)包括一个权重、一个均值矢量、一个协方差矩阵:λ = {ci,μi,∑i},其中μi和∑i分别是矢量与矩阵;

假如声学特征是D=39维,则UBM的第 i 个高斯分量的均值矢量将包含了D维

如果把均值矢量与协方差对角阵展开,则是μi = {μi1,μi2,...,μiD},∑i = diag{σ^(2)i1,σ^(2)i2,...,σ^(2)iD},即均值是一个D x 1维矢量,方差是D x D维对角(全)矩阵

3、训练好了UBM,接下来就是计算充分统计量,我们会用一大部分的训练集去计算;充分统计量包括零阶、一阶(部分存在二阶),这是用于接下来训练总变化子空间矩阵T,公式分别如下:

Pr(i | x)是UBM的第 i 个高斯分量的后验概率,如下:

xt 是某句话的第 t 帧(D维),有改进的论文会把一阶统计量公式的 xt 改为 (xt - μi),这是基于UBM通用背景的均值矢量,实现去中心化,使 xt 更突出它的说话人变化性,如:

这里我截图了别的论文,和上图是对应的,c是第c个高斯分量,F是一阶统计量

可以把上图的yt改为如下:

4、根据充分统计量,我们会先将M个高斯分量的均值矢量(每个矢量有D维),串接在一起形成一个高斯均值超矢量,即M x D维,构成F(x)F(x)是MD维矢量;同时利用零阶统计量构造N,N是MD x MD维对角矩阵,以后验概率作为主对角线元素拼接而成;然后,先初始化T矩阵,构造一个[MD, V]维矩阵,V要远小于MD,V<<MD,这个V就是 i-vector 维度;公式如下:

接着,固定T矩阵,根据最大似然准则MLE,估算隐变量 w 的零阶和一阶统计量;再把新的零阶和一阶统计量放回去上面的式子,继续估算w……即使用无监督EM算法去迭代收敛,反复迭代5-6次,即可认为T矩阵收敛。

T矩阵特点:总变化的截荷空间,用于表征总体变化子空间,可以认为包含了说话人信息、信道信息和噪声信息;是一个映射矩阵,类似于权重矩阵;能把高维统计量(超矢量)映射到低维说话人表征(i-vector);起到降维作用;


5、当UBM和T训练好,我们会将待提取i-vector的语音,提取高斯均值超矢量;基于UBM模型,用最大后验概率MAP去自适应当前句子的GMM模型,方法如下:

训练当中,可以只对均值进行更新,因为大量实验证明过只更新均值是性能最好的;然后生成M个分量的GMM,以每个高斯分量的均值矢量(每个矢量有D维)作为串接单元,形成MD维的高斯均值超矢量M

6、根据联合因子分析(简化):

M是第5步的待提取iv的语音的高斯均值超矢量,m是UBM的高斯均值超矢量,T是总变化子空间矩阵,w是i-vector;

维度对应的是 : MD = MD + [MD , V]*V 如果MFCCs设为13维,一二阶差分后成39维,UBM是2048分量,那均值超矢量就是79,872维,V设600即i-vector维度

参考文献:

【1】Speaker Verification Using Adapted Gaussian Mixture Models

【2】Front-End Factor Analysis for Speaker Verification
【3】SVM BASED SPEAKER VERIFICATION USING A GMM SUPERVECTOR KERNEL AND NAP VARIABILITY COMPENSATION

-------------------------------分割线-----------------------------------------------------

下面是给题目,上面是给科普(伪),QAQ错了记得戳我来改。。。
-------------------------------------------------------再分割----------------------------
训练时有了GMM-UBM,有了T矩阵,测试时就对enrollment和test的MFCC提取高斯超矢量M;然后根据M = m + Tw,得到w,也就是属于enrollment和test的i-vector;接下来就可以做分类了。

得到i-vector,那接下来就用PLDA或者cos作为后端分类器就好了,这个在kaldi的SRE10里有脚本。

如果想要在提取i-vector过程中使用到DNN,那就是借助语音识别的办法,训练DNN模型;然后以DNN的输出节点数作为UBM的高斯数。这个在SRE10-v2里有,不过这整套工程跑起来挺费时。

如果把DNN作为后端分类,也不是不行,就是把整个流程搞得太长了:得到i-vector之后,每次直接把单句话的iv输入进去,输入节点数等于iv维度;集内有多少个SPK,输出节点就有多少维,标签就有多少维;每个SPK的标签都保持one-hot;训练阶段用softmax或者cross entroy;这样就可以完成集内的识别。当然这方法有几个弊端,一是集内二是基于ivector。

如果要做识别,当然还有更暴力的方法,脱掉UBM T矩阵 ivector那一套,如果数据量够多的话,直接用MFCC输入DNN作识别就OK了,参考d-vector方法;不过dvector办法还是有弊端。同样,做二分类确认,也可以直接用DNN解决,只是还有些trick。

@yichi 的回答稍微补充一点, 对于 1:N 识别的话,最简单的就是对注册集的每一个人的ivector特征取平均,直接作为这个人的model, 然后测试的时候直接计算cos距离就好了,取top1作为识别结果(亲测比gmm-ubm效果要好一点,可以直接yichi提到的sre10/v1中的脚本提)。 同理的可以lda之后再这么做。 如果数据足够多的话,可以用ivector特征再用简单的dnn模型训或者svm,random forest, 当然,一般注册集每个人就几句话,所以一般可以不考虑这种做法, 还有就是如果新注册一个说话人,难道你要重新训一遍模型?