语音识别学习记录 [kaldi的chain model]

kaldi 中的'chain' models 简介

chain model是DNN-HMM模型的一种,使用nnet3结构,与传统模型有很多不同点。可以将它看作声学模型的一个创新点。

  • 使神经网络的输出的帧率缩小三倍,明显的缩小了测试时的计算量,使实时解码更加容易
  • 模型从一开始就用序列级目标函数(正确序列概率的对数)进行训练。MMI在GPU上的实现没有使用Lattices(词图),而是通过在解码图中进行一个完整的前向后向过程实现,这个解码图来源于音素的n-gram语言模型。
  • 因为缩小了帧率,所以需要使用非传统的HMM拓扑结构(允许在单一状态下遍历HMM,可以看一下kaldi的HMM-topology,了解一下kaldi中的HMM拓扑结构)。
  • 在HMM中使用固定的转移概率,并且不训练转移概率(将来可能会训练它们,但是一般来说,神经网络的输出概率可以代替转移概率,具体取决于拓扑结构)
  • 目前只有nnet3支持chain model,并且在线解码还没有实现(这个‘目前’时kaldi官方文档说的前,指的y应该时2016年,现今是否支持在线解码还不了解)
  • 目前比传统DNN-HMMs的结果要稍微好一点(大概提升了5%),但是解码速度比以前快了三倍;训练速度应该也加快了一些,训练速度的提升程度并没有进行精确的计算。

chain model 脚本

目前使用chain model的最好的脚本在Switchboard结构(Switchboard setup)中,路径为 egs/swbd/s5c;local/chain/run_tdnn_2o.sh脚本时目前最好的。该脚本的神经网络使用TDNN(使用TDNN开发,因为TDNN很容易调整为LSTM)。

chain model 介绍

Chain model本身与传统的DNN-HMM没有什么区别(和上面说的有很多不同点并不矛盾),在DNN的输出层使用缩小三倍的帧率。DNN的输入特征还是原来的帧率(100帧每秒)。其主要意义在于我们使用的神经网络(LSTM,TDNN)内部具有某种循环连接,这样它们就不再是单纯的前馈神经网络。

与传统模型的不同之处在于目标函数,传统模型的目标函数是帧级别的,并且一般会去训练它;而chain model 使用音素序列概率的对数作为目标函数,并且不会去训练它。训练过程在原理上与MMI训练相同,计算分子和分母的占有概率,并使用两者之间差异的导数。不再需要将DNN的输出归一化为每帧的总和,因为这种归一化不会对结果造成影响。

因为帧率的缩小(每30毫秒为一帧),所以需要调整HMM的拓扑结构。预期中希望可以使用单状态转移遍历HMM(不同于正常帧率的三个状态的转移矩阵)。有一个状态只会出现一次,其他的状态会出现0到多次,这是当前最受欢迎的拓扑结构。尽管拓扑结构不同,但是以GMM为基础的状态簇可以通过同样的过程获取(将alignment转换为新的拓扑结构和帧率)。

chain model的训练过程

(未完

猜你喜欢

转载自blog.csdn.net/u013569304/article/details/81290281