模型训练方式
在语音识别中,HMM的每个状态都可对应多帧观察值,观察值概率的分布不是离散的,而是连续的,适合用GMM来进行建模。HMM模块负责建立状态之间的转移概率分布,而GMM模块则负责生成HMM的观察值概率。
模型自适应:由于各地口音、采集设备、环境噪声等音素的差异,已训练过的GMM-HMM很可能和新领域的测试数据不匹配,导致识别效果变差,需要做自适应训练。
MAP(最大后验概率估计):算法本质是重新训练一次,并且平衡原有模型参数和自适应数据的估计。
MLLR(最大似然线性回归):算法核心思想是将原模型的参数进行线性变换后再进行识别,其优点是使用少量语音即可以对所有模型进行自适应训练,只要得到线性变换矩阵即可。
每个音素(或三音素)用一个 HMM 建模,每个 HMM 状态的发射概率对应一个 GMM。GMM-HMM 的目的即是找到每一帧属于哪个音素的哪个状态。GMM-HMM 的训练使用自我迭代式的 EM 算法,更直接的方式是采用维特比训练,即把EM算法应用到GMM参数的更新上,要求显示的输入每一帧对应的状态,使用带标注的训练数据更新GMM的参数,这种训练方法比Baum-Welch算法速度更快,模型性能却没有明显损失。
1、首次对齐时把训练样本按该句的状态个数平均分段。
2、每次模型参数的迭代都需要成对的使用gmm-acc-stats-ali和gmm-est工具。
3、进行多轮迭代训练后使用gmm-align-compiled工具通过其内部的维特比算法生成对齐结果。
三因子模型训练
单因子模型的基本假设是:一个音素的实际发音,与其左右相邻或相近的音素(上下文音素)无法。三因子结构中的每一个音素建模实例,都由其中心音素及其左右各一个上下文音素共同决定。无论是单因子还是三因子,通常都使用三状态的HMM结构来建模。为了解决三因子模型参数爆炸问题,将所有的三因子模型放到一起进行相似性聚类(决策树),发音相似的三因子被聚类到同一个模型,共享参数。训练脚本:steps/train_deltas.sh,目标训练一个10000状态的三因子系统:
1、以单因子为基础,训练一个5000状态的三因子模型
2、用5000状态的模型重新对训练数据进行对齐,其对齐质量必然比单因子系统对齐质量高
3、用新的对齐再去训练一个10000状态的三因子系统
基本概念
phone-id:音素的 ID,参见 data/lang/phones.txt,强制对齐的结果不含 0(表示<eps>)和消歧符 ID;
hmm-state-id:单个 HMM 的状态 ID,从 0 开始的几个数,参见 data/lang/topo;
pdf-id:GMM 的 ID,从 0 开始,总数确定了 DNN 输出节点数,通常有数千个;
transition-index:标识单个 Senone HMM 中一个状态的不同转移,从 0 开始的几个数;
transition-id:上面四项的组合 (phone-id,hmm-state-id,pdf-id,transition-index),可以涵盖所有可能动作,表示哪个 phone 的哪个 state 的哪个 transition 以及这个 state 对应的 pdf 和这个 transition 的概率,其中元组 (phone-id,hmm-state-id,pdf-id) 单独拿出来,叫 transition-state,与 transition-id 都从1开始计数。
关系:transition-id可以映射到唯一的transition-state,而transition-state可以映射到唯一的pdf-id,因此transition-id可以映射到唯一的pdf-id。pdf-id不能唯一的映射成音素,因此kaldi使用transition-id表示对齐的结果。
区分性训练
语音识别过程是在解码空间中衡量和评估所有的路径,将打分最高的路径代表的识别结果作为最终的识别结果。传统的最大似然训练是使正确路径的分数尽可能高,而区分性训练则着眼于加大这些路径之间的打分差异,不仅要使正确路径的分数仅可能高,还要使错误路径尤其是易混淆路径的分数尽可能低。
常用的区分性训练准则有最大互信息、状态级最小贝叶斯风险、最小音素错误。
分子:对于某条训练数据,其正确标注文本在解码空间中对应的所有路径的集合。
分母:理论上值整个搜索空间。通常会通过一次解码将高分路径过滤出来,近似整个分母空间,从而有效的减小参与区分性优化的分母规模。
词格(Lattice):分子、分母其实都是解码过程中一部分解码路径的集合,将这些路径紧凑有效的保存下来的数据结构就是词格。