Chapter1-4_Speech_Recognition(HMM)

文章目录

    • 1 HMM用在哪里
    • 2 HMM的state
    • 3 改造成DNN
      • 3.1 Tandem
      • 3.2 DNN-HMM Hybrid

本文为李弘毅老师【Speech Recognition - HMM (optional)】的课程笔记,课程视频youtube地址,点这里(需)。其中也涉及到了部分李琳山老师关于HMM的详解(讲得非常清楚,请务必先搞懂HMM,再看这篇)。

下文中用到的图片均来自于李宏毅老师和李琳山老师的PPT,若有侵权,必定删除。

文章索引:

上篇 - 1-3 CTC, RNN-T and more

下篇 - 1-5 Alignment of HMM, CTC and RNN-T

总目录

1 HMM用在哪里

没有深度学习的语音识别系统可以用下面这幅图来表示,不过很多用到深度学习的也基本是把其中的一些模块替换调成了DNN而已。要输出一段声音信号,得到对应的文字,需要四个东西:

  • 声音特征(Feature Vectors)。这个我们之前也有提到过,忘了的可以看下这里,一般会用一个叫做MFCC的方法,把声音信号转化成长度为 T T T,特征维度为39维的向量。
  • 声学模型(Acoustic Models)。这里是用到HMM(Hidden Markov Model)的地方,就是输入Feature Vectors,得到每个Feature Vector对应的state是什么,而这里的state一般是指比Phoneme(发音的基本单元,比如th-ih-s-ih-z-s-p-ih-ch)更小的基本单元。
  • 词典(Lexicon)。用来把声学模型得到的一串state转换成对应的单词,比如(th-ih-s) → this。
  • 语言模型(Language Model)。这个就是把得到的单词变成一个完整通顺的句子的模型。

Chapter1-4_Speech_Recognition(HMM)_第1张图片

我们这篇主要讲的就是这个声学模型(Acoustic Models),其他的部分暂时不去关心。

上面这个是李琳山老师的说法,李弘毅老师讲的更抽象一些,但本质是一样的。如下图所示,比如我们有一个模型可以计算给定声音信号 X X X,得到输出序列 Y Y Y的概率 P ( Y ∣ X ) P(Y|X) P(YX),那么我们只需要遍历所有的 Y Y Y,然后找到使得 P ( Y ∣ X ) P(Y|X) P(YX)的概率最大的那个 Y Y Y就可以了。但是, Y Y Y的可能性太多了,这样的计算消耗太大了,这个方案,这里不讨论。

学过贝叶斯定理的都知道,这个条件概率是可以变一变的,经过如下图所示的变化后,我们只需要找到一个 Y Y Y,使得 P ( X ∣ Y ) P ( Y ) P(X|Y)P(Y) P(XY)P(Y)最大就可以了,而这里的 P ( X ∣ Y ) P(X|Y) P(XY)就是我们的声学模型(Acoustic Models),这里的 P ( Y ) P(Y) P(Y)就是我们的语言模型(Language Model), P ( X ) P(X) P(X)和我们要找的 Y Y Y没有关系,可以直接扔掉。有时 P ( Y ) P(Y) P(Y)也可以不用考虑。而这里的 P ( X ∣ Y ) P(X|Y) P(XY)可以用很机智的演算法去求解。

其实李弘毅老师讲的 P ( X ∣ Y ) P(X|Y) P(XY)就是李琳山老师讲的声学模型(Acoustic Models)和词典(Lexicon)的结合。
Chapter1-4_Speech_Recognition(HMM)_第2张图片

2 HMM的state

HMM里需要一个叫做state的东西,如上文所述,它在我们的声学模型里,就是一个比Phoneme更小的东西,那它究竟有多小呢?答案就是,它可以任意小,只要我们的计算资源足够就可以。首先,Phoneme会根据上下文被拆分成Tri-phone,Tri-phone就是说,我们今天的"uw"的这个音在不同的上下文中是不一样的,可以是"d-uw+y"的"uw",也可以是"y-uw+th"的"uw",把句子中前一个Phoneme和后一个Phoneme都加进来,就变成了Tri-phone。而我们的state比Tri-phone还要小,一个Tri-phone可以拆成多个state,这个state人已经无法分辨了,具体要拆成几个state,就看我们的计算资源有多少了。

为什么要拆的这么小呢?因为在计算HMM的时候,我们希望人在发出每个state所对应的音的时候,是可以用高斯混合模型(GMM)去模拟它的分布的,而不同的人说同一个词时,发出的音时不一样的,所以希望这个state可以代表非常细的音。

所有的 Y Y Y都可以转换成state,所以,我们我们今天要求的 P ( X ∣ Y ) P(X|Y) P(XY),就可以转变为求 P ( X ∣ S ) P(X|S) P(XS)

Chapter1-4_Speech_Recognition(HMM)_第3张图片

可以想象,按这种做法的话,我们的state会非常多,比如Phoneme有30个,最后把每个Tri-phone再切成3个单元的话,我们将会有 3 0 3 × 3 30^3\times3 303×3个state。这意味着什么?Emmm~这意味着我们要很多的高斯混合模型(GMM)。我们先来讲下HMM的计算中需用到的几个概率函数。

计算HMM的时候,我们需要知道三个概率,一个叫做转移概率(Transition Probability),一个叫做发射概率(Emission Probability),还有一个叫做初始概率(initial state probabilities)。李弘毅老师在讲的时候没有提到初始概率,那我们就默认是所有的state初始概率都是相等的吧。

  • 转移概率:从一个state变到任意另一个state的概率。
  • 发射概率:每个state产生该time step对应的特征向量的概率,如 P ( X 1 ∣ " t − d − u w 1 " ) P(X^1|"t-d-uw1") P(X1"tduw1")
  • 初始概率:最开始从某个state开始的概率。

其中的发射概率就是说我们的每个state都要有一个高斯混合模型(GMM),也就是我们要 3 0 3 × 3 30^3\times3 303×3个GMM!更难处理的是,有些state在数据中出现的是很少的,我们称为rare state,很难学好。这个时候,一种方法是把这些rare state映射到其他相近的state的GMM上,另一种就是2010年提出的Subspace GMM。Subspace GMM这里简单说一下,就是说我们现在所有的state都有一个公用的池子(Pool),每个state要计算发射概率的时候,从Pool里捞几个GMM出来就可以了。

好,现在假设我们已经有了转移概率和发射概率,但我们仍旧无法把 P ( X ∣ S ) P(X|S) P(XS)计算出来,因为我们并不知道每个 X i X^i Xi是由哪个state产生的。李弘毅老师说,states的个数往往小于声音特征向量 X X X的长度。因此,如果按顺序用完所有的state的话,可以有很多条路径,HMM做的就是把所有路径的概率加起来。

这个从路径对应到特征向量的操作,就叫做对齐(alignment)。这个在下节课会详细介绍。
Chapter1-4_Speech_Recognition(HMM)_第4张图片

3 改造成DNN

3.1 Tandem

Tandem没有改变原来的整套方案,只是在对于输入的特征进行了一个分类,使得每个time step的acoustic feature都有预测出来的对应于每一个state的概率。然后把这个DNN的输出当作新的acoustic feature,再放进原来的模型里去跑就可以了。
Chapter1-4_Speech_Recognition(HMM)_第5张图片

3.2 DNN-HMM Hybrid

HMM里面是有一个GMM的模型的,也就是上文所说的发射概率的计算模型。DNN-HMM Hybrid就是把这个GMM模型换成了DNN去做。DNN可以是CNN或者LSTM这些。

之前GMM模型是计算出 P ( x ∣ a ) P(x|a) P(xa),也就是给定state a a a发射出特征 x x x的概率。现在的DNN能计算 P ( a ∣ x ) P(a|x) P(ax),也就是给定特征 x x x,则 x x x是state a a a的概率。然而,这两个东西不一样呀。于是就需要用条件概率转换一下,得到
P ( x ∣ a ) = P ( a ∣ x ) P ( x ) P ( a ) P(x|a)=\frac{P(a|x)P(x)}{P(a)} P(xa)=P(a)P(ax)P(x)

然后这里, P ( a ∣ x ) P(a|x) P(ax)就是DNN的输出, P ( a ) P(a) P(a)可以从数据中统计出来, P ( x ) P(x) P(x)不用去管它。。。
Chapter1-4_Speech_Recognition(HMM)_第6张图片

为什么要用DNN来替换GMM呢?有人认为 P ( x ∣ a ) P(x|a) P(xa)是generative learning,而 P ( a ∣ x ) P(a|x) P(ax)是discriminative learning,然后大家认为后者比较厉害,这样。也有人认为DNN的参数比较多,比较厉害,这样。而实际证明,这种方法,很强。

我仔细想了下,感觉这个和Tandem的区别其实并不大。它们其实都是要有一个DNN的state classifier。

不过,这个state classifier怎么train呢?我们都知道,trainDNN的模型是需要标签的,然而我们并不知道现在的 X i X^i Xi分别属于哪一个state。这该咋办?实际操作的时候,用了类似于半监督的方法,就是利用HMM+GMM来train一个模型,然后拿这个train好的模型的结果来当作标签去train这个DNN的模型。然后再把train的DNN的结果当作标签,训练一个新的DNN,一直反复这样下去。这样的方法很强,train出来的模型结果和人类接近!

你可能感兴趣的:(课程笔记,自然语言处理,神经网络,深度学习,李弘毅)