声学模型代码

翻譯: 老那([email protected])

时间: 2014年4月

简介

我们先来简单说说Kaldi中用于建模的代码的思路,以及为什么这样设计。我们的目标是使Kaldi支持传统模型,也就是对角阵高斯混合模型 (GMM)和子空间高斯混合模型(SGMM),同时也要便于扩展到新的模型。在上一轮代码设计过程中,我们设计了一个虚基类,从其中衍生出GMM类和SGMM类,然后编写了一个命令行工具用于操作这两种模型。但是根据我们的经验,基类并不像事先想象的那样能派上大用场,因为这两种模型之间的差异太大(例如,它们支持的自适应算法不同)。为了构建我们想象中具有“普适性”的代码,使它能够处理不同模型类别,我们不得不不断的扩展基类。最终,我们的命令行工具已经很难修改和维护了。

在重设计代码的时候,我们决定使用更“现代化”的软件工程方法,不为了增强普适性而过于强调类的层级结构,而是专注于创建简单的、可复用的组件。例如,我们的解码器代码是很通用的,因为它的需求很少,它只要我们从简单的基类DecodableInterface中 创造一个衍生的实例。这个实例操作起来类似于由一个句子的声学似然度组成的矩阵(参见Kaldi工具中的解码器)。同时,每个命令行工具更简单易用,例如gmm-align用于给定对角GMM获得一句话的状态级对齐结果。总的想法是,要实现某种新技术只要编写一个新的命令行程序,而不是增加已有的命令行程序的复杂度。

对角GMM

DiagGmm类表示一个对角协方差矩阵的高斯混合模型。一组DiagGmm的对象,由从0开始的pdf-ids索引组合在一起,组成声学模型。这个声学模型是由AmDiagGmm类实现的。尽管这个声学模型类的接口比单个GMM丰富,但你可以简单地把AmDiagGmm看作是DiagGmm的矢量。把声学模型表示为独立模型的集合,每个模型用于表示一个pdf,我们可以想象,这不是对所有模型都适用的构建方法。例如,SGMM就不能这样表示。而且,如果我们想实现不同状态之间GMM子成分的捆绑,就不能把每个pdf单独表示了。(译者注:pdf,科技文献中写作p.d.f.,是概率密度函数的缩写。)

独立GMM

理论上,DiagGmm类是一个简单的、被动的对象,负责存储高斯混合模型的参数,并且有一个用于计算似然度的成员函数。它完全不知道自己会被如何使用,它只提供获取其成员的接口。它不获取累计量(Accumulation),不更新参数(对于参数更新,参见MlEstimateDiagGmm类)。DiagGmm类存储参数的方式是:方差的倒数,以及均值乘以方差倒数的结果。这意味着,通过简单的内积操作就可以计算似然度。与HTK的gconst不同,Kaldi中的gconst是独立于均值的。

由于以这种方式调整高斯参数很不方便,我们提供了DiagGmmNormal类, 用于以简单直观的方式存储参数。同时,我们提供了DiagGmmDiagGmmNormal实 例互相转换的函数。大部分的参数更新代码作用于DiagGmmNormal类。

基于GMM的声学模型

AmDiagGmm类 表示一组DiagGmm对象,由pdf-id索引。该类不表示HMM-GMM模型,仅仅是一组GMM的集合。将其与HMM组合在一起由其他代码负责,主要是负责拓扑结构和转移概率部分的代码以 及负责整合解码图的代码(参见HMM的拓扑结构和状态转移的建模)。在这里需要指出的是,在声学模型中,我们没有只存储一个AmDiagGmm对象,而是同时保存了一个TransitionModel对象和一个AmDiagGmm对象。这是为了避免在存储器上写入太多的独立文件。这样做的原因是,高斯模型和转移概率的更新往往是同时进行的。这样做的初衷是,在创建其他类型的 模型时,我们可以将一个TransitionModel和一个目标模型的对象保存在同一个文件中。这样,那些只需要读取转移模型的程序(如创建解码图)就可以直接读取模型文件,而不需要知道其中声学模型的类型。

AmDiagGmm类是一个相对简单的对象,并不负责模型估计(参见AccumAmDiagGmm)和变换矩阵估计等工作。在Kaldi中,有其他的代码来负责这些工作,参见特征域和模型域变换

满协方差GMM

对于满协方差矩阵的GMM,我们创建了FullGmm类,其作用与DiagGmm相似,区别只在与协方差矩阵的形式。这个类主要是用来在SGMM建模中训练满协方差的广义背景模型(UBM)。唯一用于满方差GMM的命令行工具是用于训练全局混合模型的,也就是UBM。我们没有编写AmDiagGmm类的满方差版本以及对应的命令行工具。不过要实现这个功能也不是难事。

子空间高斯混合模型(SGMM)

子空间高斯混合模型(SGMM)由AmSgmm类实现。这个类从本质上实现了''The Subspace Gaussian Mixture Model – a Structured Model for Speech Recognition''(by D. Povey, Lukas Burget et. al, Computer Speech and Language, 2011.)这篇论文中的方法。AmSgmm类表示一个完整的pdf的集合。Kaldi中没有用于表示一个SGMM的类(如用于GMM的DiagGmm)。SGMM参数的估计是由MleAmSgmmAccs类和MleAmSgmmUpdater类完成的。

对于如何训练一个基于SGMM系统的示例脚本,参见egs/rm/s1/steps/train_ubma.shegs/rm/s1/steps/train_sgmma.shegs/rm/s1/steps/decode_sgmma.sh