一直有个疑问在我心头,就是为什么有MacroDef这个概念,它和HMMDef是什么关系。从上一篇博客,我们知道MacroDef中的一个指针指向具体的HMMDef,在MacroDef中指定当前的HMM是什么类型。为什么要这样设计?带着这个疑问,看《HTK Book》第七章。
HMM模型定义时,实现了一套形式语言,就是指定了包含哪些Token。这些就是这个形式语言的“单词”,把这些单词按照既定语法规则组织起来,就成了special domain language。Token包括<BeginHMM>、<EndHMM>、<VecSize>、<MFCC>等等。
下面就来看看包含哪些Token,以及它们分别代表的意思。
一般hmm定义的最前面,是这样的,【~h “hmmname1” 】,它表示接下来定义的类型是“h”——hmm,它的名字是“hmmname1”。可以推测,字符【~】后面还会跟其他字符,例如“l”,“o”等等。它们分别的意义是什么?后面逐一介绍。
宏,Macro是模型定义的一部分,可以通过名字被单独访问。它的语法形式为“~[o|h|v|l]”、然后接上字符串表示该宏的名字。
~o,表示全局选项;
~h,表示HMM模型;
这两个比较特殊,因为没有其他定义引用它们。其中~o的不同之处是,它是全局唯一的,因此它后面没有名字。
与~h对应的是~l,也就是logical的意思,而h代表的是physical。
《HTK Book》原文中7.4节有这么一句话,“Every HMM has tow names, a logical name and a physical name. The logical name reflects the role of the model, and the physical name is used to identify the definition on disk. By default, they are identical.”当我们想绑定两个HMM模型时,就是指定逻辑上不同的hmm共享同一个物理hmm。其实也好理解,就是本来它们是不同的,但是落到实处时没有区别,比如同音字,两个完全不同的字,但是听起来就完全相同。字相当于逻辑HMM,而音相当于物理HMM。
先结束这篇博客吧。看了《HTK Book》第七章,收获满满。因为搞明白了为什么在HMM模型上还需要Marcro这个概念。它其实是HMM的子组件,HMM模型通过多个宏组合起来。当然也可以单独定义HMM。因此HMM本身也变成了宏的一种(~h或者~l),这样的递归定义关系。可以让HMM系统更加灵活。
(几天后……)
好吧,我还是不放心,再回头看一遍第七章。并记录下对它的理解,一是加深印象,二是理清思路。
HMM模型有多个状态。一般的,Entry state和Exit state是Non-emitting,其中间三个(一般Number of state是5)为emitting,就是有观察概率。它指示如果给定观察向量,可以计算出该状态生成它的概率大小。如果不考虑状态直接转移和路径信息,就可以认定那个最可能产生该向量的状态即为识别结果,把所有的识别状态组合起来就是隐含的状态系列了。问题是如何得到这个观察概率(GMM来表示)的参数。这个过程就是模型参数估计,也叫“训练”。
什么是macro,为什么要定义macro?答案是,为了更加精细的控制HMM模型的状态、参数、实现绑定等等。而macro的类型定义了可以组装起来的所有子概念,例如全局设置(~o)、协方差向量(~v)、均值(~u)、共享状态(~s)、共享的转移概率矩阵(~t)等等。当需要定义一个HMM时,可以选择原生组件,就是HMM tokens,或者是之前定义的各种macro来替代部分,可以在不同的HMM之间共享。
关于逻辑hmm和物理hmm,在hlist中出现的所有hmm,系统会自动构建logical hmm。默认情况下,系统同时为它建立一个同名的physical hmm。如果在HMM list中的hmm名称后面添加一个hmm,则将前一个逻辑hmm与后面的物理hmm绑定。
再看一下高斯绑定系统:
每个状态的观察概率是由M个高斯混合来拟合的。
而所有的状态之间是共享高斯分布的。也就是整个系统有个高斯函数池,各个模型的各状态都从这个高斯池中挑选M个高斯,设定权重来决定各个高斯的占比,从而区分不同的状态概率。