Kaldi GMM-HMM中GMM成分更新过程
在使用kaldi的脚本的时候,发现在训练gmm-hmm模型的时候,就指定了总的混合高斯的数量totgauss,但是每个phone的发射状态是一个gmm,每个gmm的成分是多少呢?查了好久没找到答案,看了kaldi里的源码,才发现,真是厉害啊。
kaldi里是每次分配给一个gmm一个成分,然后每次进行迭代增加的,有一个参数指定最大增加迭代次数:max_iter_inc,表示的是高斯成分增加的轮数。这样用总的高斯数和增加的轮数就可以计算每轮最多增加多少个高斯成分了:
incgauss=$[($totgauss-$numgauss)/$max_iter_inc] # per-iter increment for #Gauss
那每次哪些gmm的成分进行增加呢?
kaldi里面每次根据每个gmm的占有情况来进行gmm成分的修改,其实就是统计每个gmm的帧数,帧数越多的gmm优先拿来进行成分的增加。
假设一个gmm的分布如下:
单个成分的gmm分布: