Kaldi 决策树状态绑定学习笔记(四)
——如何构建决策树?
到现在为止,程序 acc-tree-stats 累积好了构建决策树所需的统计量,程序
cluster-phones 和 compile-questions 自动生成好了构建决策树所需的问题集,我
们也准备好了 roots.int 文件,那么我们就可以开始构建决策树,对三音素 GMM
的状态进行绑定。这次笔记的主要内容是讲解 Kaldi 如何构建决策树,实现对三
音素 GMM 状态的绑定。
在这个笔记中,首先我会介绍构建决策树的主程序 build-tree 和主函数
BuildTree(),然后介绍主函数中用到的核心函数 GetStubMap()和 SplitDecisionTree()。
建议学习 Kaldi 官方文档《Decision tree internals》的 Classes and functions
involved in tree-building 部分,官方文档《How decision trees are used in Kaldi》和
论文《Tree-Based State Tying For High Accuracy Acoustic Modelling》S.J.Young 的第
三部分 Tree-BasedClustering。
目录
build-tree ....................................................................................................................... 1
BuildTree() ...................................................................................................................... 2
GetStubMap() ................................................................................................................ 3
SplitDecisionTree() ......................................................................................................... 5
build-tree
作用:构建决策树
输入:累积的统计量 treeacc、问题集 questions.qst、roots.int、HMM 拓扑 topo
输出:决策树 tree
示例:
build-tree $context_opts --verbose=1 --max-leaves=$numleaves \
--cluster-thresh=$cluster_thresh $dir/treeacc $lang/phones/roots.int \
$dir/questions.qst $lang/topo $dir/tree
过程:
1. 读取 roots.int,得到 1)vector<vector<int>> phone_sets,其一个元素包含
roots.int 的一行上的所有音素;2)vector<bool> is_shared_root,其一个元素
指明该行的音素是否共享三个 HMM 状态的决策树树根;3)vector<bool>
is_split_root,其一个元素指明是否对该行音素对应的决策树树根进行划分。
2. 读取 topo 文件,得到保存 HMM 拓扑结构的对象 HmmTopology topo,一
般音素的 HMM 状态为三个,我们实验室只有 SIL 和 SPH 的 HMM 状态为
五个。
3. 读取 treeacc,得到累积的统计量 BuildTreeStatsType stats。