HMM学习二:Baum-Welch算法详解(学习算法)

一,前言

在上篇博文中,我们学习了隐马尔可夫模型的概率计算问题,如果对隐马尔可夫模型还不胜了解的话,可参看博文HMM学习(一)

学习问题

隐马尔可夫模型的学习,根据训练数据是包括观测序列和对应的状态序列还是只有观测序列,可以分别由监督学习与非监督学习实现。本节首先介绍监督学习算法,而后介绍非监督学习算法——Baum-Welch算法(也就是EM算法)。

监督学习问题
假设已给训练数据包含S个长度相同的观测序列和对应的状态序列(O1,I1),(O2,I2),...,(OS,IS)(O1,I1),(O2,I2),...,(OS,IS){(O_1,I_1),(O_2,I_2),...,(O_S,I_S)}{(O_1,I_1),(O_2,I_2),...,(O_S,I_S)},那么可以利用极大似然估计方法来估计隐马尔可夫模型的参数,具体方法如下。

1.转移概率aijaija_{ij}a_{ij}的估计

设样本中时刻t处于状态i时刻t+1转移到j的频数为AijAijA_{ij}A_{ij},那么状态转移概率为aija_{ij}的估计是

HMM学习二:Baum-Welch算法详解(学习算法)
直接根据给定的O和I进行频数统计,在海藻模型中,我们可以统计100天前的天气转移次数,如在100天内,统计从sunny -> sunny 的次数,sunny -> cloudy 的次数,sunny - > rainy的次数,分别记作a1,a2,a3a_1,a_2,a_3,那么asunny>anystatea_{sunny−>any state}=[a1a1+a2+a3\frac{a_1}{a_1+a_2+a_3},a2a1+a2+a3\frac{a_2}{a_1+a_2+a_3},a3a1+a2+a3]\frac{a_3}{a_1+a_2+a_3]}。因此,状态转移矩阵可以根据给定的隐藏序列II计算得出。

2.观测概率bj(k)b_j(k)的估计

设样本中状态为jj并观测为kk的频数是BjkB_{jk},那么状态为jj观测为kk的概率bj(k)b_j(k)的估计是

HMM学习二:Baum-Welch算法详解(学习算法)

根据公式,我们可以知道BjkBjkB_{jk}B_{jk}跟观测序列和隐藏状态均有关系,所以给定一组观测序列和对应的隐藏状态如:O="dry","damp","soggy",I="sunny","cloudy","rainy"O="dry","damp","soggy",I="sunny","cloudy","rainy"O="dry","damp","soggy",I="sunny","cloudy","rainy"O="dry","damp","soggy",I="sunny","cloudy","rainy",当然这里的数据还不够多,假设我们有足够多的数据,那么统计sunny>drysunny -> dry的次数,sunny>dryishsunny -> dryish的次数,sunny>dampsunny -> damp的次数,sunny>rainysunny - > rainy的次数,分别记作b1,b2,b3,b4b_1,b_2,b_3,b_4,那么bsunny>anyobservationb_{sunny−>any observation}=b1sum\frac{b1}{sum},b2sum\frac{b_2}{sum},b3sum\frac{b_3}{sum},b4sum\frac{b_4}{sum}],sum=b1+b2+b3+b4sum=b1+b2+b3+b4。由此可以根据OOII算出BijBijB_{ij}B_{ij}

3.初始状态概率πiπ_i的估计πiπ_i为S个样本中初始状态为qiq_i的频率
由于监督学习需要使用训练数据,而人工标注训练数据往往代价很高,有时就会利用非监督学习的方法。

上述监督学习问题给定了大量一一对应的观察序列和隐藏序列,用最简单的概率统计方法就能求得转移矩阵,观测概率矩阵的频数,注意这里是频数而非概率。这部分的内容相对简单,但针对非监督学习问题时,由于多了隐藏变量,而系统的各种参数均未知,因此求解非监督学习问题时,就存在一定难度,本文用到的知识有极大似然估计,EM算法,基础概率论,如果对这些知识还不够熟悉的话,建议回到前言提到的链接,看完链接内容后,对理解Baum-Welch算法将大有帮助。

Baum-Welch算法
刚才提到了,非监督学习问题是为了计算模型参数λλ,使得在该参数下P(Oλ)P(Oλ)P(O|λ)P(O|λ)的概率最大。这个问题便是我们的极大似然估计,但P(Oλ)P(Oλ)P(O|λ)P(O|λ)并非孤立的存在,其背后与隐含状态相联系。这句话应该怎么理解呢,在海藻模型中,如我们观测到某一海藻序列O="dry","damp","soggy"O={"dry","damp","soggy"},但是什么决定了海藻的湿度情况呢,很明显天气的因素占有很大的一部分,因此盲人在对海藻模型进行建模时,就把隐含的天气转移状态给考虑进去了。正如双硬币模型中,由于实习生b的失误,每组数据我们并不清楚是A掷的还是B掷的,遇到信息缺失的情况,就导致了用单纯的极大似然估计求导法是无法得到解析解的。

假设给定训练数据中包含S个长度为T的观测序列O1,O2,...,OS{O_1,O_2,...,O_S}而没有对应的状态序列,目标是学习隐马尔可夫模型λ=(A,B,π)λ=(A,B,π)的参数。我们将观测序列数据看作观测数据OO,状态序列数据看作不可观测的隐数据II,那么隐马尔可夫模型事实上是一个含有隐变量的概率模型
HMM学习二:Baum-Welch算法详解(学习算法)
它的参数学习可以由EM算法实现。

1.确定完全数据的对数似然函数
所有观测数据写成O=(o1,o2,...,oT)O=(o_1,o_2,...,o_T),所有隐数据写成I=(i1,i2,...,iT)I=(i_1,i_2,...,i_T),完全数据是(O,I)=(i1,i2,...,iT)(O,I)=(i_1,i_2,...,i_T)。完全数据的对数似然函数是logP(O,Iλ)logP(O,I|λ)

2.EM算法的E步:求Q函数

HMM学习二:Baum-Welch算法详解(学习算法)
其中,λ^\hatλ是隐马尔可夫模型参数的当前估计值,λλ是要极大化的隐马尔可夫模型参数。上式公式需要注意两点,第一,仅仅取P(O,Iλ)P(O,I|λ)的对数,P(O,Iλ^)P(O,I|\hatλ)是在对数的外面;第二,P(O,Iλ^)P(O,I|\hatλ)是确定的值,即它可能为[0,1]中的任何值,根据λ^\hatλ算出。如果仔细观察式子的话,该式就是对随机变量II求期望。即E(f(I)),f(I)=logP(O,Iλ)E(f(I)),f(I)=logP(O,Iλ)E(f(I)),f(I)=logP(O,I|λ)E(f(I)),f(I)=log⁡P(O,I|λ)。又

HMM学习二:Baum-Welch算法详解(学习算法)

于是函数Q(λ,λ^)Q(λ,\hatλ)可以写成:
HMM学习二:Baum-Welch算法详解(学习算法)

式中求和都是对所有训练数的序列总长度T进行的。

3.EM算法的M步:极大化Q函数Q(λ,λ^)Q(λ,\hatλ)求模型参数A,B,πA,B,π
由于要极大化的参数在上式中单独地出现在3个项中,所以只需要对各项分别极大化。

(1)上式中的第一项可以写成:

HMM学习二:Baum-Welch算法详解(学习算法)
注释: 上面一个公式是将由于πi1π_{i1}i=1i = 1的第一个序列的,所以将概率P()P()里面的II转换到第一序列中.

注意到πiπ_i满足约束条件i=1nπi=1\displaystyle\sum_{i=1}^{n} π_i = 1,利用拉格朗日乘子法,写出拉格朗日函数:

HMM学习二:Baum-Welch算法详解(学习算法)

对其求偏导数并令结果为0
HMM学习二:Baum-Welch算法详解(学习算法)
注释:求偏导时先只对πiπ_i这一个进行求导,求导完成之后再求和

得:
HMM学习二:Baum-Welch算法详解(学习算法)
注释:因为i=1nπi=1\displaystyle\sum_{i=1}^{n} π_i = 1

HMM学习二:Baum-Welch算法详解(学习算法)

(2)上式中的第二项可以写成

HMM学习二:Baum-Welch算法详解(学习算法)
类似第一项,应用具有约束条件i=1n=1\displaystyle\sum_{i=1}^{n} = 1的拉格朗日乘子法可以求出

HMM学习二:Baum-Welch算法详解(学习算法)

(3)上式中的第三项可以写成

HMM学习二:Baum-Welch算法详解(学习算法)

同样用拉格朗日乘子法,约束条件是k=1Mbj(k)=1\displaystyle\sum_{k=1}^{M} b_j(k)= 1。注意,只有在ot=vko_t=v_k时,bj(ot)b_j(o_t)bj(k)b_j(k)的偏导数才不为0,以I(ot=vk)I(o_t=v_k)表示,求得
HMM学习二:Baum-Welch算法详解(学习算法)

正因为给出了Q函数,所以进行M步时,我们可以通过求导的方式来求得所有参数的值。但虽然知道了公式的推导过程,实际该如何操作却还是很含糊。不急,接下来我们就开始尝试把这些公式映射到物理空间中去,一步步分析它们的实际含义。

算法实际物理含义
EM算法中M步的各公式的难点在于如何求得这些概率,如aija_{ij}该公式分子分母上的联合概率如何计算。其实在我看来,对隐马尔可夫模型中的各种概率计算最后均是映射到节点上去做计算。当然,我们先来观察由EM算法推导出的参数计算公式。

观察式子aijbj(k)a_{ij}和b_j(k),你会发现不管是分子,还是分母,它们都是概率计算,只不过对应的一些状态不一样。具体以aija_{ij}举例,如在aija_{ij}的分母上计算式子P(O,it=i,it+1=jλ^)P(O,i_t=i,i_{t+1}=j|\hatλ),仔细想想,我们在计算什么的时候,有遇到过类似的式子?其实在阐述隐马尔可夫模型的第一个概率计算问题时,我们就做过类似的求解。概率计算是为了计算P(Oλ)P(O|λ)的概率,但我们是把式子扩展为IP(Oλ)\displaystyle\sum_{I}P(O|λ)进行计算的。即我们需要在任何隐藏状态序列下求出P(Oλ)P(O|λ)的概率。由此我们用前向算法和后向算法来求解该问题.

同样地,P(O,it=i,it+1=jλ^)P(O,i_t=i,i_{t+1}=j|\hatλ)不就可以看成是对

HMM学习二:Baum-Welch算法详解(学习算法)
于是我们就有了前向后向算法中ξt(i,j)ξt(i,j)的定义了,它的定义式为:
HMM学习二:Baum-Welch算法详解(学习算法)
还记得前向算法和后向算法是如何定义中间节点的嘛,为了计算P(Oλ)P(O|λ),我们给每一个t时刻的隐含状态节点定义了实际的物理含义,即把它们命名为αt(i)βt(i)αt(i)和βt(i),两个中间变量分别从两边进行有向边加权和有向边汇聚,形成一种递归结构,并且由此不断传播至两端,对任意t=1时刻,和t=T时刻,分别进行累加就能求得P(Oλ)P(O|λ),我们还举出了一个小例子,来论证前向算法和后向算法只要满足有向边加权和有向边汇聚就能得到算法的一致性,今天我们根据前向后向算法做进一步的例子推广,从而真正理解ξt(i,j)ξt(i,j)的物理含义。

P(Oλ)P(O|λ)可写成如下形式:
HMM学习二:Baum-Welch算法详解(学习算法)
此时分别当t=1和t=T-1时,前向算法和后向算法分别成立。什么意思呢,也就是根据上式,我们从t=1时刻不断向前递推,将得到前向算法的计算公式,从t=T-1时刻不断向后递推,将得到后向算法的计算公式。这不是废话嘛,没错,但我们实际的来操作一把,注意递推的中间过程,能够帮助我们论证节点图的另外一个重要的性质,也就是节点图的推广性质。

如下图所示:
HMM学习二:Baum-Welch算法详解(学习算法)
假设我们从t =T-1时刻开始递推,那么上述式子,把t=T-1代入得

HMM学习二:Baum-Welch算法详解(学习算法)

由于α是对i的累加,跟j无关,所以可以把它提到前面去,得

HMM学习二:Baum-Welch算法详解(学习算法)
又因为βt(i)β_t(i)的递推公式
HMM学习二:Baum-Welch算法详解(学习算法)
得到:
HMM学习二:Baum-Welch算法详解(学习算法)

αT1(i)α_{T−1}(i)的递推公式得
HMM学习二:Baum-Welch算法详解(学习算法)
所以说,不断的根据α,β两个递推式展开,合并,展开,合并我们能够得到
HMM学习二:Baum-Welch算法详解(学习算法)
这是根据前向算法和后向算法的递推公式推导出来的,而前向算法和后向算法的递推式则是由节点图的性质而来,两者之间是等价的.

由此,我们明确了ξt(i,j)ξ_t(i,j)的物理含义,它只是从t时刻出发,由前向算法导出的中间节点Si和从t+1时刻出发,由后向导出的中间节点SjS_j,且节点SiSjS_i和S_j中间还有一条加权有向边的关系aijbj(ot+1)a_{ij}b_j(o_{t+1}),所以我们得

HMM学习二:Baum-Welch算法详解(学习算法)

也就是说,我们对aija_{ij}分子的计算,我们完全可以有前向算法和后向算法中定义的各个中间变量来求出来。同理,《统计学习方法》中还定义了另外以变量

HMM学习二:Baum-Welch算法详解(学习算法)
所以得到:

HMM学习二:Baum-Welch算法详解(学习算法)

算法(Baum-Welch算法)

HMM学习二:Baum-Welch算法详解(学习算法)

参考文章为:

https://blog.****.net/u014688145/article/details/53046765#commentsedit

https://blog.****.net/xmu_jupiter/article/details/50965039

http://blog.sina.com.cn/s/blog_8267db980102wpvz.html

李航<<统计学习方法>>