本篇将直接分享我在学习传统声学模型:HMM-GMM 的过程中,遇到一些的困惑,和自己的理解。也希望在学习这个模型过程中,遇到同样困惑的同学能够作为参考。
开整。
困惑:语音标注文件以词级为单位,没有标注到每一帧,是怎么训练的?
问题描述:
我们观察语音识别的标注文件,就会发现往往是词级别的标注或者句子级别的标注。而我们的HMM-GMM模型三个状态构成一个音素,他们这种粗粒度标注怎么样才能拿来进行训练呢?
我最开始的想法是每一帧的状态都要标注才能进行训练,而这种粒度的标注无疑相差千万里。
标注示例:今天我吃了很多饭
我主观认为标注需要下图这种每一帧的信号(观察量)都标注一个具体的状态。
然而事实并非如此,观察大多数的标注文件后才发现,真实的标注过程甚至不会标注到音素级,甚至不会标注到单词级。
虽然我们能够从细致的标注中获得收益,但是音素级的标注人力成本达到了1:400的时间成本。
---吴恩达
认清这个现实后,我百思不得其解,终于,在苦思冥想中终于有了曙光,分享思路如下:
首先,要知道训练过程中,我们用到的标注到底是什么样的。就是下图这样的,以音素为单位进行标注:
可是我们没有音素级的标注数据,怎么才能训练呢?
可以通过flat-start来进行音素级标注。原理就是粗暴的将音频按照音素个数平均分开,每段数据作为每个音素HMM的训练数据。
例子:
帧数:1 2 3 4 5 6 7 8 9 10 11 12
标注:皮卡。
拆为音素:p i k a (共计4个音素)
分配帧数:p(1 2 3); i(4 5 6); k(7 8 9); a(10 11 12);
这样,训练的问题就变成了使用(1 2 3)帧的数据来训练p音素的HMM模型:
这就是HMM的训练问题。
然而
疑惑又来了,没有每个状态对应帧,我如何训练?
这种问题,我们可以通过EM算法进行训练。理解EM算法,理解前向后向算法的作用是关键:
前向算法:可以去读读详细公式,可以理解为:下图左边t=3为S2的网络生成观察向量X1, X2, X3的概率。公式为:
后向算法:同前向算法,反过来。如果也是过t=3时,状态为S2点的话,可得下图右边网络生成观察量X4, X5, X6的概率。
如果将前向后向概率相乘,我们就可以得到t=3,状态为S2时,所有可能的网络观察到观察向量X1 2 3 4 5 6..的概率。
我们发现如果把,t=3, S1 S2 S3三个点所有的网络加起来,就是整个拓扑结构的发射概率。
而他们的比,一定程度上可以表示状态i的后验概率。
同理,如果把后向算法的点改为t+1,状态固定为j。前向算法帧为t,状态为i。中间乘以转移概率和发射到t+1观察量的发射概率,我们可以得到如下网络结构观察到观察向量X1 2 3 4 5 6..的发射概率。
该图可以表示为t状态为i,t+1状态为j,观察到X1 2 3 4 5 6的概率。
而这个网络和第一个网络概率的比值,也可以直观的理解为由状态i发射到状态j的后验转移概率。
到这里如果能够弄清楚的话,你也能够直观的理解前向后向在概率重估的过程中是如何发挥作用的啦,后面的推理相信你也一定能够理解啦。
回顾:
1、将句子标注flat-start强制对齐至音素标注
2、对照标注,按照HMM-GMM的训练方法来对每一个音素的模型进行训练。
这是本人对HMM-GMM在语音识别过程中训练的理解,如果有不对的地方,还望各位指点。
第一次写博客,已经预期到很可能逻辑有问题,但本着整理自己思路,增强写作能力的角度,还是打算写一手,总结一下最近的学习。本系列将根据我个人的学习情况进行更新,记录我从一个菜鸟变成大神的过程,写作过程会参考大量前辈的文章,再此也谢谢前辈们的无私分享,让自学之路变得轻松很多。