Kaldi GMM-HMM中GMM成分更新过程

Kaldi GMM-HMM中GMM成分更新过程

在使用kaldi的脚本的时候,发现在训练gmm-hmm模型的时候,就指定了总的混合高斯的数量totgauss,但是每个phone的发射状态是一个gmm,每个gmm的成分是多少呢?查了好久没找到答案,看了kaldi里的源码,才发现,真是厉害啊。
Kaldi GMM-HMM中GMM成分更新过程_第1张图片
kaldi里是每次分配给一个gmm一个成分,然后每次进行迭代增加的,有一个参数指定最大增加迭代次数:max_iter_inc,表示的是高斯成分增加的轮数。这样用总的高斯数和增加的轮数就可以计算每轮最多增加多少个高斯成分了:

incgauss=$[($totgauss-$numgauss)/$max_iter_inc] # per-iter increment for #Gauss

那每次哪些gmm的成分进行增加呢?

kaldi里面每次根据每个gmm的占有情况来进行gmm成分的修改,其实就是统计每个gmm的帧数,帧数越多的gmm优先拿来进行成分的增加。
假设一个gmm的分布如下:
Kaldi GMM-HMM中GMM成分更新过程_第2张图片
单个成分的gmm分布:
Kaldi GMM-HMM中GMM成分更新过程_第3张图片
增加一个新的成分的gmm分布:
Kaldi GMM-HMM中GMM成分更新过程_第4张图片
可见增加一个成分,gmm的效果拟合的更好,所以应该对数据点(占有数)越多的gmm进行成分的增加,让其更好的拟合数据分布。

gmm的成分增加一个成分如何初始化呢?

同样的在gmm内部成分之间,会挑选成分中占有数最多的成分进行增加新的成分来拟合它,可以理解为,这个成分的数据多,单纯用一个高斯拟合的不好,新增一个高斯拟合的会更好,类似上面挑选gmm进行成分增加的一样。
找到要成分中最多占有数的成分,使用相同的均值,同事方差添加扰动值,作为新的成分的均值和方差,在下一轮的时候进行更新。(这个过程可以参考聚类算法EM,原理类似)

gmm的成分有增加也有删除

kaldi中会对成分中占有数做限制的,如果占有数小于阈值的时候(默认为10),会移除该成分,但是每个gmm至少会保留一个成分。

你可能感兴趣的:(语音识别)