根据知友要求,再详细介绍从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。