kaldi部分训练方法DNN-HMM模型

时间:2024-03-31 22:00:33

kaldi部分训练方法

语音识别基本概念
kaldi部分训练方法DNN-HMM模型

DNN-HMM模型

语音识别框架都是基于GMM-HMM的,然而浅层的模型结构的建模能力有限,不能捕捉获取数据特征之间的高阶相关性。而DNN-HMM系统利用DNN很强的表现学习能力,再配合HMM的系列化建模能力,在很多大规模语音识别任务中都超过了GMM模型。

下图给出一个DNN-HMM系统的结构图。在这个框架中,HMM用来描述语音信号的动态变化,用DNN的每个输出节点来估计连续密度HMM的某个状态的后验概率。在Kaldi中,该模型的整体输入是fbank特征,而后DNN对所有聚类后的状态(如状态绑定后的三音素)的似然度进行建模,得到后验概率。再结合HMM对其进行解码。

kaldi部分训练方法DNN-HMM模型

DNN的建模对象

我们知道,语音识别问题可表示为找到使得概率P(W|O)最大的句子:

W=argmaxWP(W|O)=argmaxWp(O|W)P(W)/P(W)=argmaxWp(O|W)P(W)

其中p(w)是语言模型,p(o|w)就是声学模型。用Viterbi解码的方式对其进行展开:
p(o|w)=qp(o,p|w)p(q|w)maxπ(q0)t=1Taqt1qtt=1Tp(ot|qt)

传统的GMM-HMM模型中,我们使用GMM对声学模型进行建模,它是一个生成模型,可以直接生成似然概率p(ot|qt),这个似然概率就是HMM所需要的观察概率。

而现在我们要使用DNN,但DNN只能给出观测值输入到DNN输出层之后在每个节点(状态)上的后验概率p(qt|ot),因此我们通过贝叶斯定理将其转换一下:

p(ot|qt)=p(qt|ot)p(ot)/p(qt)

其中p(ot)不变,p(qt)是关于状态的先验概率,这个概率也是训练过程中训练出来的(就是把观测值(特征向量)网状态上对齐,跟某个状态对齐的观测值的个数占比就是这个状态的先验概率)。这样我们就可以对DNN-HMM模型进行解码和训练了。

基于DNN-HMM的模型训练算法

DNN-HMM 模型的主要训练步骤如下:

  1. 首先训练一个状态共享的三音素 GMM-HMM 汉语识别系统,使用决策树来决定如何共享状态。设训练完成的系统为 gmm-hmm。
  2. 用步骤 1 得到的 gmm-hmm 初始化一个新隐马尔可夫模型(包括转移概率,观测概率,隐马尔可夫模型的状态),并生成一个 DNN-HMM 模型,设该模型为 dnn-hmm1。
  3. 预训练 dnn-hmm1 系统中的深度神经网络,得到的深度神经网络为ptdnn。
  4. 使用 gmm-hmm 系统对语音训练数据作排列(即求出训练数据对应哪个隐马尔可夫模型中的状态),得到的数据设为 align-raw。
  5. 使用步骤 4 得到的数据对 ptdnn的参数作微调(可以使用随机梯度下降算法)。设得到的深度神经网络为 dnn。
  6. 利用 dnn 与 dnn-hmm1 和最大似然算法重新估计隐马尔可夫中的参数(转移概率,观测概率),设新得到的系统为 dnn-hmm2。
  7. 如果步骤 6 的精度不再提高则退出算法,否则使用 dnn 和 dnn-hmm2产生新的语音训练数据的排列数据,然后回到步骤 5。
  8. 利用训练数据估计概率 P(qt)的值

Kaldi中的DNN

  1. 存储在本地的40维fMLLR特征, 使用steps//nnet//make_fmllr_feats.sh, 这简化了训练脚本,40维的特征是使用CMN的MFCC-LDA-MLLT-fMLLR。
  2. RBM 预训练, steps/nnet/pretrain_dbn.sh,是根据Geoff Hinton’s tutorial paper来实现的。训练方法是使用1步马尔科夫链蒙特卡罗采样的对比散度算法(CD-1)。 第一层的RBM是Gaussian-Bernoulli, 和接下里的RBMs是Bernoulli-Bernoulli。这里的超参数基准是在100h Switchboard subset数据集上调参得到的。如果数据集很小的话,迭代次数N就需要变为100h/set_size。训练是无监督的,所以可以提供足够多的输入特征数据目录。
    当训练Gaussian-Bernoulli的RBM时,将有很大的风险面临权重爆炸,尤其是在很大的学习率和成千上万的隐层神经元上。为了避免权重爆炸,我们在实现时需要在一个minbatch上比较训练数据的方差和重构数据的方差。如果重构的方差是训练数据的2倍以上,权重将缩小和学习率将暂时减小。
  3. 帧交叉熵训练,steps/nnet/train.sh, 这个阶段时训练一个DNN来把帧分到对应的三音素状态(比如: PDFs)中。这是通过mini-batch随机梯度下降法来做的。默认的是使用Sigmoid隐层单元,Softmax输出单元和全连接层AffineTransform。学习率是0.008,minibatch的大小是256;我们未使用冲量和正则化(注: 最佳的学习率与不同的隐含层单元类型有关,sigmoid的值0.008,tanh是0.00001)。
    输入变换和预训练DBN(比如:深度信念网络,RBMs块)是使用选项 ,‘–input-transform’和’–dbn’传递给脚本的,这里仅仅输出层是随机初始化的。我们使用提早停止(early stopping)来防止过拟合。为了这个,我们需要在交叉验证集(比如: held-out set)上计算代价函数,因此两对特征对齐目录需要做有监督的训练。

  4. sMBR(State-level minimum Bayes risk)序列区分性训练,steps/nnet/train_mpe.sh(minimum phone erro, MPE), 这个阶段对所有的句子联合优化来训练神经网络,比帧层训练更接近一般的ASR目标。

    1. sMBR的目标是最大化从参考的对齐中得到的状态标签的期望正确率,然而一个词图框架是来使用表示这种竞争假设。
    2. 训练是使用每句迭代的随机梯度下降法,我们还使用一个低的固定的学习率1e-5 (sigmoids)和跑3-5轮。
    3. 当在第一轮迭后重新生成词图,我们观察到快速收敛。我们支持MMI, BMMI, MPE 和sMBR训练。所有的技术在Switchboard 100h集上是相同的,仅仅在sMBR好一点点。
    4. 在sMBR优化中,我们在计算近似正确率的时候忽略了静音帧。具体更加详细的描述见http://www.danielpovey.com/files/2013_interspeech_dnn.pdf