语音识别 HMM和端到端Seq-to-Seq模型的异同


前言

本文主要是李宏毅老师语音识别公开课(4/7)的笔记,图片也是从PPT中截取,全部课程可以参考这里,很推荐这里面讲RNN-T的部分,原始论文因为篇幅有限所以有些晦涩。

近几年语音领域的顶会发表了很多关于端到端Seq-to-Seq模型的研究,并且根据实验数据,在大规模语音数据集的支持下,他们的WER或者是CER都已经超过了传统的HMM,或者是hybrid HMM-DNN模型。但是以HMM为核心的开源工具kaldi仍然被用在工业应用的一线,低延迟和流式(straming)识别的能力使其备受青睐。在这里我想整理一下HMM和Seq-to-Seq模型的异同之处,并且分析一下各自的利弊,其中Seq-to-Seq模型主要以CTCRNN-T模型最为代表,虽然课程中也讲到了LAS模型,这里就暂时不整理了。

1 Hidden Markov Model (HMM)

1-1 传统HMM

先是老生常谈的语音识别经典条件概率公式:
Y ∗ = a r g m a x Y P ( Y ∣ X ) = a r g m a x Y P ( X ∣ Y ) P ( Y ) P ( X ) = a r g m a x Y P ( X ∣ Y ) P ( Y ) Y^*=\underset{Y}{argmax}P(Y|X)=\underset{Y}{argmax}\frac{P(X|Y)P(Y)}{P(X)}=\underset{Y}{argmax}P(X|Y)P(Y) Y=YargmaxP(YX)=YargmaxP(X)P(XY)P(Y)=YargmaxP(XY)P(Y)
统计学的思想就是,给定一个序列的特征向量 X X X,穷举出所有可能的token序列组合 Y Y Y,从这些token序列中找出使这个条件概率最大的序列作为识别结果 Y ∗ Y^* Y,不管是HMM还是Seq-to-Seq模型他们不外乎都是在为 P ( X ∣ Y ) P(X|Y) P(XY)这个声学模型建模。

HMM中的序列单位既不是word也不是token,它比一个phoneme还要小,是一个state。我们首先说phoneme,或者音素,它是发音的最基本单位,以下图的waht do you think 为例,他的phoneme可以拆解为hh w aa t d uw y uw th ih ng k,进一步phoneme还以拆解为triphone,比如上面的d可以拆解为t-d+uwth可以拆解为uw-th+ih,注意这不是三个phoneme连在一起,而是将一个phoneme细分为更小的考虑上下文发音的单位。triphone还可以进一步细分,每个triphone还可为分解为多个state,一般是3个或者5个,比如上面的t-d+uw可以拆分为t-d+uw1 t-d+uw2 t-d+uw3

在一个triphone中,从起始状态开始到终止状态结束,每个状态可以生成1个或多个特征向量,之后在跳转到下一个状态或者自跳转,在这里我们用状态序列S代替token序列Y,现在需要求解的就是 P ( X ∣ S ) P(X|S) P(XS),即给定状态序列能生成什么样的特征向量序列。这里我们需要对转移概率(transition probability)和发射概率(emission probability)进行建模。对于转移概率,如果从状态a跳到状态b,用条件概率表示转移概率就是 P ( b ∣ a ) P(b|a) P(ba),对于发射概率,我们需要知道给定一个state,这个state产生某一段特征向量的概率有多大,这里有一个前提条件,就是我们已经知道每个state产生的音频特征向量会遵循固定的概率分布 P ( X ∣ t − d + u w 1 ) P(X|t-d+uw1) P(Xtd+uw1),这个分布我们用Gaussian Mixture Model (GMM)来表示。在HMM中之所以使用这么小的单位,是因为我们要确保每个状态都能对应不同的音频特征分布,只有这样我们的前提条件才能成立。

但此时出现了一个问题,那就是这么细分的话state数量会是指数级的,同时也就需要同样数量的GMM,但在我们的训练集中很可能某个state只出现几次,根本无法得知它对应的GMM长什么样子。为了解决这个问题便引入了Tied state技术,或者状态聚类,也就是将几个发音相似的state公用一个GMM,将极少出现的几个state并入到经常出现的state中,以大幅减少GMM的建模数量,人们很长一段时间都在研究将哪些state归为一类共用GMM,也就是决策树枝剪需要的规则,最终这种技术便发展为Subspace GMM

现在我们假设已经知道了每个state的发射概率和转移概率(具体计算推荐参考这个公开课),也就是 P θ ( X ∣ S ) P_{\theta}(X|S) Pθ(XS)中的参数 θ \theta θ,但还是没法计算 P ( X ∣ S ) P(X|S) P(XS),因为缺少关键的alignment,也就是说对于给定的特征向量序列,我们不知道哪些时刻的特征向量对应哪个state,很明显特征向量序列的长度是要大于state数量的,比如下图中的6个特征向量可以对应到aabbcc这样的state序列,即每个state按顺序产生2个特征向量,一旦有了alignment 的信息,我们可以根据已知的发射概率 P ( x 1 ∣ a ) , P ( x 2 ∣ a ) , . . . P ( x 6 ∣ c ) P(x^1|a),P(x^2|a),...P(x^6|c) P(x1a)P(x2a)...P(x6c)和转移概率 P ( a ∣ a ) , P ( b ∣ a ) , . . . P ( c ∣ c ) P(a|a),P(b|a),...P(c|c) P(aa)P(ba)...P(cc)来计算 P ( X ∣ h 1 ) P(X|h^1) P(Xh1)。在不知道alignment的情况下,HMM的做法是穷举所有的alignment,也就是说
P θ ( X ∣ S ) = ∑ h ∈ a l i g n ( S ) P ( X ∣ h ) P_{\theta}(X|S)=\sum_{h\in align(S)}P(X|h) Pθ(XS)=halign(S)P(Xh),这里的 h h h是所有有效的alignment

1-2 HMM+Deep Learning

1-2-1 Tendam

Tandem方法基本上与传统HMM是一致的,唯一区别就是它不直接读取特征向量序列,而是先把每个时刻的特征向量送入DNN中做一个优化,之后将DNN的输出向量作为特征向量使用,其他的都和HMM保持一致。这里DNN的输出是一个维度为state个数的向量,输出层用一个softmax函数将输出结果表示为该时刻特征值属于各个state的概率是多少,如下图所示的 [ p ( a ∣ x i ) , p ( b ∣ x i ) , p ( x i ∣ c ) . . . ] [p(a|x^i), p(b|x^i), p(x^i|c)...] [p(axi),p(bxi),p(xic)...],这是最早的HMM和深度学习结合的方法。

1-2-2 DNN-HMM混合模型

也就是 DNN-HMM Hybrid,在传统的HMM中,我们用GMM来拟合某个state生成特征向量的概率分布 p ( x ∣ a ) p(x|a) p(xa),那么我们希望可以用DNN来取代GMM。DNN计算的是给定某个特征向量,该特征向量属于哪个state的概率分布即 p ( a ∣ x ) p(a|x) p(ax),因此我们用贝叶斯公式把他们结合起来,即
P ( x ∣ a ) = P ( x , a ) P ( a ) = P ( a ∣ x ) P ( x ) P ( a ) P(x|a)=\frac{P(x,a)}{P(a)}=\frac{P(a|x)P(x)}{P(a)} P(xa)=P(a)P(x,a)=P(a)P(ax)P(x)
这里的 P ( a ∣ x ) P(a|x) P(ax)就对应DNN的输出, P ( a ) P(a) P(a)是某个状态出现的概率,可以通过统计训练集得到,由此我们可以直接用DNN的输出来代替GMM。而DNN优于GMM的主要原因是,我们可以发现之前的每个state对应一个GMM,每个GMM都有自己的均值向量和协方差矩阵,但DNN确是被所有state共用的,可以理解为一个终极Tied state。但同时我们也会注意到一个问题,DNN的训练是区分式训练(discriminative),不像GMM是生成式训练可以通过最大似然估计来进行迭代,DNN的训练需要label,即哪个特征向量对应哪个state,也就是上面说到的alignment,很明显我们不知道这种信息。这里采用的方法是先训练一个HMM-GMM模型用来生成一个alignment,再根据这个alignment训练DNN,也就是在kaldi中从monophone的训练到tri4训练的阶段。这种混合模型是现在最广泛被应用到产品中的模型,虽然最新的论文都是关于Seq-to-Seq的,但还没有被广泛应用。

2 Seq-to-Seq模型

2-1 CTC

CTC我比较熟悉,这里就暂时不做笔记了,但RNN-T没怎么用过,所以只对RNN-T单独做一下笔记

2-2 RNN Transducer

在说明RNN-T之前有必要引入RNA(Recurrent Neural Aligner)模型和CTC进行对比,CTC最大的特点就是给定一个输入(encoder之后的特征向量)产生一个输出,并且前后完全独立互不影响。如果将CTC的输出层替换成一个上下文相关的RNN,就转换成了RNA模型,如下图所示:

我们接着对RNA进一步改进,不再是一个输入对应一个输出的结构,而是使其给一个输入能够产生多个token输出,直到输出1个空字符 ϕ \phi ϕ表示需要下一个输入,也就是说最后 ϕ \phi ϕ的数量一定是和输入的长度相同,因为每一帧输入一定会产生一个 ϕ \phi ϕ,这一点在RNN-T的原始论文Sequence Transduction with Recurrent Neural Networks中几乎没有说明,我也看得很迷,该示意图如下图所示:

到此还不是RNN-T的完全体,因为还没有出现论文中的Prediction Network,原文中的Transcription Network对应的应该是一个特征向量的encoder,但他这个课程里面的示意图有一点很奇怪,那就是他的RNN输入除了输入特征向量和hidden state,还有前一帧的output distribution,一般RNN的输出可以写成:
h t = H ( W i h i t + W h h h t − 1 + b h ) h_t=H(W_{ih}i_t+W_{hh}h_{t-1}+b_h) ht=H(Wihit+Whhht1+bh)
但这里是不是应该写成:
y t − 1 = s o f t m a x ( F ( h t − 1 ) ) h t = H ( W i h [ i t ; y t − 1 ] + W h h h t − 1 + b h ) y_{t-1}=softmax(F(h_{t-1}))\\h_t=H(W_{ih}[i_t;y_{t-1}]+W_{hh}h_{t-1}+b_h) yt1=softmax(F(ht1))ht=H(Wih[it;yt1]+Whhht1+

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值