在上一篇博客基于GMMs-HMMs的语音识别原理中,介绍了第一代较为成熟的GMMs-HMMs语音识别模型。但随着神经网络技术的发展,后面又出现了基于DNN-HMMs的语音识别模型,一句话概括就是用DNN代替之前的GMMs,有更好的建模能力。这篇博客将详细介绍它的原理。
PS:假设读者已经有了GMMs-HMMs模型的基础(没有的话,请移步笔者的上一篇博客),这里只详细介绍两个模型之间不同的部分,以及其对比。并且,博客中对于DNN的部分只涉及到模型的介绍,至于其训练要用到的梯度下降、反向传播等算法,这里将不会涉及细节,毕竟处在深度学习时代,这些东西早应烂熟于心。
文章目录
一. DNN-HMMs原理
1.1 整体思路
重温一下语音识别模型希望最大化的概率: P ( S ∣ X ) = P ( X ∣ S ) P ( S ) P(S|X) = P(X|S)P(S) P(S∣X)=P(X∣S)P(S), X X X 是输入的语音特征, S S S 是识别出的句子, P ( S ) P(S) P(S) 是语言模型, P ( X ∣ S ) P(X|S) P(X∣S) 则是GMMs-HMMs和DNN-HMMs要进行建模的部分。
之前GMMs-HMMs对于 P ( X ∣ S ) P(X|S) P(X∣S) 的建模可以展开成类似为:
P ( X ∣ S ) = P ( x 1 ∣ s 1 ) P ( s 1 ∣ s 1 ) P ( x 2 ∣ s 1 ) P ( s 2 ∣ s 1 ) P ( x 3 ∣ s 2 ) P ( s 3 ∣ s 2 ) P ( x 4 ∣ s 3 ) . . . . P(X|S) = P(x1|s1) P(s1|s1) P(x2|s1) P(s2|s1) P(x3|s2) P(s3|s2) P(x4|s3).... P(X∣S)=P(x1∣s1)P(s1∣s1)P(x2∣s1)P(s2∣s1)P(x3∣s2)P(s3∣s2)P(x4∣s3)....
其中的 s s s 为HMM状态, x x x 为输入的帧, P ( s j ∣ s i ) P(s_j|s_i) P(sj∣si)是HMM的转移概率, P ( x ∣ s ) P(x|s) P(x∣s)则是GMM要建模的输出概率。
区别来了! 在DNN-HMMs模型中, P ( x ∣ s ) P(x|s) P(x∣s)是用DNN来建模。
DNN模型在这里并不是去直接构建 P ( x ∣ s ) P(x|s) P(x∣s)这样一个生成模型,而是将其转化为:
P ( x ∣ s ) = P ( s ∣ x ) P ( s ) P ( x ) ≈ P ( s ∣ x ) P ( s ) P(x|s) = \frac{P(s|x)}{P(s)} P(x) \approx \frac{P(s|x)}{P(s)} P(x∣s)=P(s)P(s∣x)P(x)≈P(s)P(s∣x)
这里的 P ( x ) P(x) P(x)在 x x x 固定时,对最终的建模没有影响,因此可以将其舍去; P ( s ) P(s) P(s)为状态 s s s 的先验概率,可以通过统计得出。
这样就将DNN的建模,从生成模型 P ( x ∣ s ) P(x|s) P(x∣s)转化为判别模型 P ( s ∣ x ) P(s|x) P(s∣x)。
对判别模型 P ( s ∣ x ) P(s|x) P(s∣x)的建模,白话解释就是,输入的某个帧 x x x 属于状态 s s s 的概率。如果将输入帧看成一幅图片,状态看成类别,那可不就是分类模型?再加上用DNN建模,那就是一个典型的基于深度学习的分类模型,建模每个输入帧属于各个状态的概率。
这里有一个问题就是,DNN的训练需要 l a b e l label label,即要提前标注好每个输入帧是属于哪个状态的。这个 l a b e l label label 要怎么获取?比较常用的办法是先用 ( X , S ) (X, S) (X,S) 训练一个GMMs-HMMs的语音识别模型 P ( X ∣ S ) P(X|S) P(