最近 由于科研的需要,重新 学习了一下HMM里的学习和预测算法(解码),里面的两个重要的算法,就是Baum-Welch和Viterbi算法。
- 概率计算问题即模型评价问题——前向算法和后向算法
- 学习问题即参数估计问题——Baum-Welch算法
- 预测问题即解码问题——Viterbi算法
Baum-Welch算法
Baum-Welch算法是为了解决HMM的参数估计问题而提出的,而且是没有标注也就是HMM的状态序列未知的参数估计问题。具体来说,就是已知观测序列 O=(o1,o2,...,oT) ,估计模型参数 λ=(A,B,π) ,使得在该模型下观测序列概率 P(O|λ) 最大。由于状态序列未知,因此这可以看做是一个含有隐变量的参数估计问题,解决这一问题的经典算法就是EM算法。Baum-Welch算法就是EM算法在隐马尔科夫模型学习中的具体体现。下面简单叙述一下该算法。
首先按照EM算法,我们需要先写出Q函数。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)ai1i2bi2(o2)...aiT?1iTbiT(oT)
于是Q函数可以写成:
Q(λ,λ??)=∑Ilogπi1P(O,I|,λ??)++∑I(∑t=1T?1log aitit+1)P(O,I|,λ??)
+∑I(∑t=1Tlog bit(ot))P(O,I|,λ??)
此时我们看到待估计的参数刚好分别出现在三个项中,所以只需对各个项分别极大化。然后直接极大化我们无法对公式进行细致描述,因此需要将以上Q函数形式修改一下,变成下面这样:
Q(λ,λ??)=∑i=1NlogπiP(O,i1=i|,λ??)+∑i=1N∑j=1N∑t=1T?1log aijP(O,it=i,it+1=j|,λ??)
+∑j=1N∑t=1Tlog bj(ot)P(O,it=j|,λ??)
可以看到,我们将三项中分别的对
I
的求和进行了划分。由于隐变量
I=(i1,i2,...,iT)
。原来的求和需要遍历所有
I
的取值,然后进行求和,然而这基本是不可能完成的任务。改写后,我们将遍历的空间进行了划分,同时很好地将
P(O,I|,λ??)
部分改写后也融入到求和其中。比如第一项,对
I
的遍历等价于先固定状态
i1
,使其分别取值所有可能的状态(共有N个可取的离散状态),而
i2,...,iT
仍然像原来一样随便取值。这样,就把
I
空间划分成了N个更小的空间。然后再把这N个空间的结果相加,等价于原来对空间
I
进行遍历。
而且,改写之后, P(O,I|,λ??) 部分变的可以表示了。如果对Q函数的三项分别求极大,在计算后会发现,最后的结果可以用前一篇博文末尾的一些有意义的概率来表示。这也就是之前对Q函数进行修改的原因。
OK,Baum-welch算法就介绍到这里。