本文讲阐述在语音识别中GMM-HMM的知识。其中包括了对GMM(Gauss Mixture Model)和HMM(Hidden Markov Model)的定义、原理及其算法的介绍。
GMM(高斯混合模型)
设有随机变量X,则混合高斯模型可以用下式表示:
p(x)=∑k=1KπnN(x|μk,∑k)
其中
N(x|μk),∑k称为高斯混合模型中的第K个分量。且满足:
∑k=1Kπk=1,0≤πk≤1
可以看到
πk相当于每个分量
N(x|μk,∑k)的权重。
GMM参数估计过程
GMM的贝叶斯理解
在GMM的定义中,πk是混合系数,表示第K个分布被选中的概率。下面引入一个K维随机变量Z,其中zk定义如下:
zk={10selectothersk,1≤k≤K
记第k个分布被选中的概率为
p(zk=1)=pk,那么第k个分布未被选中的概率为
p(zk=0)=1−pk。因此,有:
∑Kzk=1。假设
zk之间是独立同分布的,则z的联合概率分布形式为:
p(z)=p(z1)p(z2)...p(zk)=∏k=1Kpzkk
类似的,给定z的一个特定的值,x关于z的条件概率分布是一个高斯分布
p(x|zk=1)=N(x|mk,∑k),也可以写成
p(x|z)=∏k=1KN(x|m,∑k)zk
联合概率分布为
p(z)p(x|z),从而x的边缘概率分布可以通过将联合概率分布对所有的z求和的方式得到,即
p(x)=∑Zp(z)p(x|z)=∑k=1K(∏k=1K(pzkk)N(x|mk,∑k)zk)=∑k=1KpkN(x|mk,∑k)
根据贝叶斯定理,后验概率可以表示为:
γ(zk)=p(zk=1|x)=p(zk=1)p(x|zk=1)/∑j=1Kp(zj=1)p(x|zj=1)=πkN(x|μk,∑k)/∑j=1KπjN(x|μj,∑j)
EM 算法估计GMM参数
EM算法分两步,第一步先求出要估计参数的粗略值,第二部使用第一步的值最大似然估计。因此要先求出GMM的似然函数。
假设x={x1,x2,...,xN},GMM模型中有三个参数需要估计,分别为π,μ,∑。并且有:
p(x|π,μ,∑)=∑k=1KπkN(x|μk,∑k)
为了估计这三个参数,需要分别求解出这三个参数的最大似然函数。先求解
μk的最大似然函数。对上式取对数后在对
μk求导并令导数为0即得到最大似然函数。
0=−∑n=1NπkN(xn|μk,∑k)∑k(xn−μk)/∑jπkN(xn|μj,∑j)
注意到上式中分数的一项的形式正好是后验概率的形式。两边同乘
∑−1k,重新整理可以得到:
μk=(1/Nk)∑n=1Nγ(znk)xn
其中:
Nk=∑Nn=1γ(znk)上面两式中,N表示点的数量。
γ(znk)表示点属于聚类k的后验概率。则
Nk可以表示属于第k个聚类的点的数量。那么
μk表示所有点的加权平均,每个点的权值是
∑Nn=1γ(znk),跟第k个聚类有关。
同理可求
∑k的最大似然函数,可以得到:
∑k=(1/Nk)∑n=1Nγ(znk)(xn−μk)(xn−μk)T
最后剩下
πk的最大似然函数。注意到
πk有限制条件
∑Kk=1πk=1,因此我们需要加入拉格朗日因子
lnp(x|π,μ,∑)+λ(∑k=1Kπk−1)
求上式关于
πk的最大似然函数,得到:
0=∑n=1N(N(xn|μk,∑k)/∑jπjN(xn|μj,∑j))+λ
上式两边同乘
πk,可以得到
λ=−N,进而可以得到
πk更简洁的表达式:
πk=Nk/N
EM算法估计GMM参数化
μk=(1/Nk)∑Nn=1γ(znk)xn,
∑k=(1/Nk)∑Nn=1γ(znk)(xn−μk)(xn−μk)T,
πk=Nk/N需要用到以上式子。我们先指定
π,
μ,
∑(以下将以上三式称为1,2,3)的初始值,带入后验概率公式计算出
γ(znk),然后再将带入(1,2,3)式,得到
πk,μk,∑k;接着用求得的
πk,μk,∑k再带入后验概率公式得到新的
γ(znk),再将更新后的带入(1,2,3),如此往复,直到算法收敛。
EM 算法
1.定义分量数目K,对每个分量k设置πk,μk,∑k的初始值,然后计算
p(x|π,μ,∑)=∑k=1KπkN(x|μk,∑k)
的对数似然函数。
2.E step
根据当前的
πk,μk,∑k计算后验概率
γ(znk) γ(znk)=πkN(xn|μn,∑n)/∑j=1πjN(xn|μj,∑j)
3.M step
根据E step中计算
γ(znk)再计算新的
πk,μk,∑k μnewk=(1/Nk)∑n=1Nγ(znk)xn
∑knew=(1/Nk)∑n=1Nγ(znk)(xn−μnewk)(xn−μnewk)T
πnewk=Nk/N
其中:
Nk=∑n=1Nγ(znk)
4.计算后验概率的对数似然函数
lnp(x|π,μ,∑)=∑n=1Nln{∑k=1KπkN(xk|μk,∑k)}
5.检查参数是否收敛或对数似然函数是否收敛,若不收敛,则返回第2步。
HMM(隐马尔科夫模型)
隐马尔科夫模型是关于时序的概率模型,描述由一个隐蔽的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程。隐藏的马尔科夫链随机生成的状态的序列,称为状态序列(state sequence);每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence)。序列的每一个位置又可以看作是一个时刻。隐马尔科夫模型是统计模型,它用来描述一个含有隐含未知参数的马尔科夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来做进一步的分析,例如模型识别。
隐马尔科夫模型由初始概率分布、状态转移概率分布以及观测概率分布确定。其形式定义如下:
设Q是所有可能的状态集合,V是所有可能的观测的集合。
Q={q1,q2,...,qN},V={v1,v2,...,vM}
其中,N是可能的状态数,M是可能的观测数。
I是长度为T的状态序列,O是对应的观测序列。
I={i1,i2,...,iT},O={o1,o2,...,oT}
A是状态转移概率矩阵:
A=[aij]N×N
其中,
aij=P(it+1=q|it=qi),i=1,2,...,N;j=1,2,...,N
是在时刻t处于状态
qi的条件下在时刻t+1转移状态
qj的概率。
B是观测概率矩阵:
B=[bj(k)]N×N
其中,
bj(k)P(ot=vk|it=qj),k=1,2,...,M;j=1,2,...,N
是在时刻t处于状态
qj的条件下生成观测
vk的概率。
π是初始状态概率向量:
π=(πi)
其中,
πi=P(i1=qi),i=1,2,...N
是时刻t=1处于状态
qi的概率。
隐马尔科夫模型由初始概率向量
π,状态转移矩阵A和观测概率矩阵B决定。
π和A决定状态序列,B决定观测序列。因此,隐马尔科夫模型
λ可以用三元符号表示,即
λ=(A,B,π)
A,B,
λ称为隐马尔科夫模型的三要素。
从定义可知,隐马尔科夫模型做了两个基本假设:
(1)齐次马尔科夫性假设,即假设隐藏的马尔科夫链在任意时刻t的状态只依赖于其前一个状态,与其他时刻的状态及观测无关,也与时刻t无关。
P(it|it−1,ot−1,...,i1,o1)=P(i1|it−1)
(2)观测独立性假设,即假设任意时刻的观测只依赖于该时刻的马尔科夫链的状态,与其他观测及状态无关。
P(ot|iT,oT,iT−1,oT−1,...,it+1,ot+1,it,it−1,ot−1,...,i1,o1)=P(i1|it−1)
下面给出一个隐马尔科夫的例子。
假设存在三个不同的骰子。第一个骰子是六面体(这里成为D6),每个面(1,2,3,4,4,5,6)出现的概率均为1/6。第二个骰子是个四面体(D4),每个面(1,2,3,4)出现的概率为1/4。第三个骰子是八面体(D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

假设我们开始投掷骰子,我们先从三个骰子中挑一个挑到任何一个的概率均为1/3,然后投掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。我们不停的重复上述过程,我们便可以得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。比如我们投掷5次骰子得到五个数字1,6,3,5,2,这串数字叫做可见状态链。但是在隐马尔科夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。比如这个例子中的隐含状态链就有可能是D6,D8,D8,D6,D4 。
一般来说,HMM说到的马尔科夫链其实是指隐马尔科夫链,因为隐含状态之间存在转换概率,在我们这个例子中D6的的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的概率也是1/3。我们假定是为了更好的说清楚,但是我们其实可以随意设定转换概率的。
同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有输出概率。如图所示


如果提前知道所有隐含状态之间的转换概率和输出概率,做模拟是相当容易的。但对于缺失的信息做起来就相当麻烦了,需要一些算法进行处理,这些算法我们在后面讲解。
观测序列的生成过程
输入:隐马尔科夫模型λ=(A,B,π),观测序列长度T
输出:观测序列O=(o1,o2,...,oT)。
(1) 按照初始状态分布π产生状态i1
(2) 令t=1
(3) 按照状态it的观测概率分布bit(k)生成ot
(4)按照状态it的状态转移概率分布{ait,it+1}产生状态it+1,it+1=1,2,...N
(5)令t=t+1;如果t
隐马尔科夫模型的3个基本问题
(1)概率计算问题。给定模型λ=(A,B,π)和观测序列O=(o1,o2,...,oT),计算在模型λ下序列O出现的概率P(O|λ)。
(2)学习问题。已知观测序列O=(o1,o2,...,oT),估计模型λ=(A,B,π)参数,使得在该模型下观测序列概率P(O|λ)最大。即使用极大似然估计的方法估计参数。
(3)预测问题,也称为解码问题。已知模型λ=(A,B,π)和观测序列O=(o1,o2,...,oT),求对给定观测序列条件概率P(O|I)最大的状态序列I=(i1,i2,...,iT)。
接下来我们将逐一介绍这三个基本问题的解法。
概率计算方法
在介绍前向算法和后向算法前,先介绍概念上可行但计算上不可行的直接计算法。
直接计算法
给定模型λ=(A,B,π)和观测序列O=(o1,o2,...,oT),计算观测序列出现的概率P(O|λ)。最直接的方法就是按照公式直接计算。通过列举所有可能的的长度为T的序列I=(i1,i2,...,iT),求各个状态序列I与观测序列O=(o1,o2,...,oT)的联合概率P(O,I|λ),然后对所有可能的状态序列求和,得到P(O|λ)
状态序列I=(i1,i2,...,iT)的概率是
P(I|λ)=πi1ai1i2ai3i4...aiT−1iT
对于固定的状态序列
I=(i1,i2,...,iT),观测序列
O=(o1,o2,...,oT)的概率是
P(O|I,λ),
P(O|I,λ)=bi1(o1)bi2(o2)...biT(oT)
O和
I同时出现的联合概率为
P(O,I|λ)=P(O|I,λ)P(I|λ)
然后,对所有可能的状态序列
I求和,得到观测序列
O的概率,即
P(O,I|λ)=∑IP(O|I,λ)P(I|λ)
但是,利用上式的计算量很大,这种算法不可行。下面介绍计算观测序列概率
P(O|λ)的有效算法:前向-后向算法。
前向算法
前向算法定义了一个前向概率隐马尔科夫模型的概念。给定λ,定义到时刻t部分观测序列为o1,o2,...,ot且状态为qi的概率为前向概率,记作:
αt(i)=P(o1,o2,...,ot,it=qi|λ)
有了前向概率,我们就可以递推的求出前向概率
αt(i)及观测序列概率
P(O|λ)。具体地推过程为:
αt+1(i)=[∑j=1Nαt(j)aji]bi(ot+1)
其中
aji为转移概率,具体为:
aji=P(it+1=qi|it=qj)
而根据前向概率的定义:
at(i)=P(o1,o2,...,ot,it=qt|λ)
根据上面提到的齐次马尔科夫假设,有:
aji=P(it+1=qi|it=qj)=P(it+1qi|o1,o2,...,ot,it=qj)
因此可以将
αt(j)aji合并为:
P(o1,o2,...,ot,it=qj,it+1=qi|λ)
在经过求和符号处理之后,有:
∑j=1Nαt(j)αji=P(o1,o2,...,it+1=qi|λ)
然后递推式中
bi(ot+1)的是观测概率,具体为:
bi(ot+1)=P(ot+1|it+1=qi)=P(ot+1|o1,o2,...,ot,it+1=qi)
后面的连等成立是因为应用了前面提到的观测独立性假设。这样就有
αt+1(i)=P(o1,o2,...,ot,ot+1,...,it+1=qi|λ)
最后为了得到 ,我们只要把马尔科夫状态序列的最后一个状态的所有前向概率进行求和就可以了,具体为:
P(O|λ)=∑i=1NαT(i)=P(o1,o2,...,ot,ot+1,...,oT|λ)
后向算法
后向算法与前向算法类似,他定义了一个概念叫后向概率:给定隐马尔科夫模型λ,定义在时刻t状态为qi的条件下,从t+1到T的部分观测序列为ot+1,ot+2,...oT的概率为后向概率,记作
βt(i)=P(ot+1,ot+2,...oT|it=qi,λ)
同样也可以用递推的方法求得后向概率及观测概率。由于和前向算法类似这里推导过程忽略,介绍下后向算法的步骤:
输入:隐马尔科夫模型
λ,观测序列
O;
输出:观测序列概率
P(O|λ)
1.
βT(i)=1,i=1,2,...,N
2. 对
t=T−1,T−2,...,1 βT(i)=∑j=1Naijbj(ot+1)βt+1(j)
3.
P(O|λ)=∑i=1Nπibi(o1)β1(i)
步骤1初始化后向概率,对最终时刻的所有状态
qi规定
βT(i)=1。步骤2是后向概率的递推公式。步骤3求
P(O|λ)的思路与步骤2一致,只是初始概率代替转移概率。
利用前向概率和后向概率的定义可以将观测序列概率
P(O|λ)统一写成
P(O|λ)=∑i=1N∑j=1Nαt(i)aijbj(ot+1)βt+1(j)
此时当
t=1和
t=T−1时分别为式子
P(O|λ)=∑i=1NαT=P(o1,o2,...,ot,ot+1,...,oT|λ)
和
P(O|λ)=∑i=1Nπibi(o1)β1(i)
学习算法
隐马尔科夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。接下来会先介绍监督学习算法,而后介绍非监督学习算法——Baum−Welch算法
监督学习算法
假设已给训练数据包含S个长度相同的观测序列和对应的状态序列{(O1,I1),(O2,I2),...,(OS,IS)},那么可以利用极大似然法来估计隐马尔科夫模型的参数。具体方法如下:
1. 转移概率aij的估计
设样本中时刻t处于状态i时刻t+1转移状态j的频数为Aij,那么状态转移aij的估计是
a^ij=Aij∑Nj=1Aij,i=1,2,...,N;j=1,2,...,N
2. 观测概率
bj(k)的估计
设样本状态为
j并观测为
k的频数是
Bjk,那么状态为
j观测为
k的概率
bj(k)的估计为
b^j(k)=Bjk∑Mk=1Bjk,j=1,2,...,N;k=1,2,...,M
3.初始状态概率
πi的估计
π^i为
S个样本中初始状态为
qi的频率由于监督学习需要使用训练数据,而人工标注训练数据往往代价更高,有时就会利用非监督学习的方法。
Baum−Welch算法
学习问题即参数估计的问题的解决需要Baum−Welch算法,下面介绍Baum−Welch算法。
已知观测序列O,估计模型参数λ,使得在该模型下观测序列概率P(O|λ)最大,由于状态序列未知,因此这可以看作是一个含有隐变量的参数估计问题,这一问题的解决依靠EM算法,而Baum−Welch算法就是EM算法在隐马尔科夫模型学习中的具体体现。
根据EM算法,我们需要先求出其Q函数,如下:
Q(λ,λ¯)=∑IlogP(O,I|λ)P(I|O,λ¯)
我们写出Q函数之后后面就要对它进行极大化,也就是说EM算法的M步骤。既然是最大化,那么只要保证不影响最终的结果,对Q函数进行最大化来说没有影响的常数因子乘除是可以的。我们注意到Q函数的后半部分为
P(I|O,λ¯)=P(O,I|λ¯)P(O|λ¯)
而
P(O|λ)便是概率计算问题中我们解决的问题,对于固定的模型参数来说它是一个常量,因此我们为了后边计算方便可以在上面原先的
Q函数的基础上乘以它,使得
Q函数称为:
Q(λ,λ¯)=∑IlogP(O,I|λ)P(O,I|λ¯)
为什么要这么做呢?这是为了后面将概率计算问题中有意义的一些概率计算公式直接套进去。又因为完全数据可以写成这样:
logP(O,I|λ)=πi1bi1(o1)ai1ai2b(o2)...aiT−1iTbiT(oT)
于是Q函数可以写成
Q(λ,λ¯)=∑i=1NlogπiP(O,i1=i|λ¯)+∑i=1N∑j=1N∑t=1T−1logaijP(O,it=i,it+1=j|λ¯)+∑j=1N∑t=1Tlogbj(ot)P(O,it=j|λ¯)
可以看到,我们将三项中分别的对
I的求和进行了划分。由于隐变量
I=(i1,i2,...,iT)。原来的求和需要遍历所有的I的取值,然后进行求和,然而这基本上是不可能完成的任务。改写后,我们将遍历的空间进行了划分,同时很好的将
P(O,I|λ¯)部分改写后也融入到求和之中。比如第一项,对
I的遍历等价于先固定状态
i1,使其分别取值所有可能的状态,而
i2,i3,...,iT仍然像原来一样随便取值。这样,就把
I空间划分为
N个更小的空间。然后再把这
N个空间的结果相加,等价于原来对空间
I进行遍历。而且改写之后,
P(O,I|λ¯)部分改变的就可以表示了。如果对
Q函数的三项分别求极大值,在计算后会发现,最后的结果可以用一些有意义的概率来表示。这也就是之前对
Q函数进行修改的原因。
(Baum−Welch算法)
输入:观测数据O=(o1,o2,...,oT);
输出:隐马尔科夫模型。
(1) 初始化
对n=0,a(0)ij,b(0)j,π(0)i,得到模型λ(0)=(A(0),B(0),C(0))
(2) 递推。对n=1,2,...
an+1ij=∑T−1t=1ξt(i,j)∑T−1t=1γt(i)
bj(k)(n+1)=∑T−1t=1,ot=vkγ(j)∑Tt=1γt(i)
πn+1i=γ1(i)
(3) 终止。得到模型参数
λ(n+1)=(A(n+1),B(n+1),C(n+1))
Viterbi 算法
下面介绍隐马尔科夫模型预测的算法:Viterbi 算法。
Viterbi 算法实际上是用动态规划解隐马尔科夫模型预测问题,即用动态规划求概率最大路径(最优路径)。这时一条路径对应着一个状态序列。根据动态规划原理,最优路径具有这样的特性:如果最优路径在时刻t通过结点i∗t,那么这一路径从结点i∗t到终点i∗T的部分路径,对于i∗t到i∗T的所有可能的部分路径来说,必须是最优的。因为假如不是这样的,那么从i∗t到i∗T就有另外一条更好的路径存在,如果把它和从i∗1到达i∗t的部分路径连接在一起,就会形成一条比原来更优的路径,这是矛盾的。依据这一原理,我们只需从时刻t=1开始,递推地计算在时刻t状态i的各条部分路径的最大概率,甚至得到时刻t=T状态为i的各条路径的最大概率。时刻t=T的最大概率即为最优路径的概率,最优路径的终结点也同时得到。之后,为了找出最优路径的各个结点,从终结点i∗T开始,由后向前逐步求得结点i∗T−1,...,i∗1,得到最优路径I∗=(i∗1,i∗2,...,i∗T)。这就是Viterbi 算法。
首先导入两个变量δ和ψ。定义在时刻t状态为i的所有单个路径(i1,i2,...,it)中概率最大值为
δt(i)=maxP(it=i,it−1,...,i1,ot,...,o1|λ),i=1,2,...,N
δt+1(i)=maxP(it+1=i,it,...,i1,ot+1,...,o1|λ)=max[δt(j)aij]bi(ot+1),i=1,2,...,N;t=1,2,...,T−1
定义在时刻
t状态
i的所有单个路径
(i1,i2,...,it−1,i)中概率最大的路径的第
t−1个结点为
ψt(i)=argmax[δt−1(j)aji],i=1,2,...,N
下面介绍维特比算法。
(Viterbi 算法)
输入:模型λ=(A,B,π)和观测数据O=\left ( o_{1} ,o_{2},…,o_{T}\right );
输出:最优路径I∗=(i∗1,i∗2,...,i∗T)。
(1) 初始化
δ1(i)=πibi(oi),i=1,2,...,N
ψ1(i)=0,i=1,2,...,N
(2) 递推。对
t=2,3,...,T δt(i)=max[δt−1(j)aji]bi(ot),i=1,2,...,N
ψt(i)=argmax[δt−1(j)aji],i=1,2,...N
(3) 终止。
P∗=maxδT(i)
i∗T=argmax[δT(i)]
(4) 最优路径回溯。对
t=T−1,T−2,...,1 i∗t=ψt+1(i∗t+1)
求得最优路径
I∗=(i∗1,i∗2,...,i∗T)。
隐马尔科夫模型是关于时许的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态的序列,再由各个状态随机生成一个观测而产生观测的序列的过程。
参考文献
李航. 统计学习方法[M]. 清华大学出版社:李航, 2012. 171-189
http://blog.****.net/kl1411/article/details/78155120
http://blog.****.net/u011331731/article/details/72833134