?t(i)?P(o1o2...ot,qt?i|?)
?t(i)的含义是,给定模型λ,时刻t,处在状态i,并且部分观察序列为O1O2O3?Ot的概率。初始化:
?1(i)??ibi(o1)(1?i?N)
迭代计算:
N?t?1(j)?[??t(i)aij]bj(ot?1) 1?t?T?1,1?j?N
i?1终止:
NP(O|?)???i?1T(i)
计算量:容易计算,该方法的计算量近似为N2T,而不是直接计算时需要的2TNT次,大大
节省了计算量(精确地讲,需要N(N+1)(T-1)+N次乘法运算,N(N-1)(T-1)次加法运算)。(之所以直接计算的计算量很大,是因为重复计算,举个例子:对于观察序列o1o2o3的两个可能的状态转移序列q1q2q3和q1q2q2,如果直接计算则会将重复计算q1q2的转移概率,而向前算法则是在q1q2基础上只计算q3和q2的转移概率。)
回到抛硬币的问题,计算观察序列(HHT)的概率。 初始化:
?1(1)??1b1(H)?1/3?0.5?0.16667
?1(2)??2b2(H)?1/3?0.75?0.25 ?1(3)??3b3(H)?1/3?0.25?0.08333
迭代:
3?2(1)?[??1(i)ai1]b1(H)?0.3000?0.5?0.15000
i?13?2(2)?[??1(i)ai2]b2(H)?0.05312
i?13?2(3)?[??1(i)ai3]b3(H)?0.03229
i?1
3?3(1)?[??2(i)ai1]b1(T)?0.08672
i?13?3(2)?[??2(i)ai2]b2(T)?0.00684
i?13?3(3)?[??2(i)ai3]b3(T)?0.02597
i?1终止:
3P(O|?)???i?13(i)?0.08672?0.00684?0.02597?0.11953
向后算法:
向后算法与向前算法类似,定义向后变量:
?t(i)?P(ot?1ot?2...oT|qt?i,?)
?t(i)的含义是,在给定模型λ,时刻t,处在状态i,并且部分观察序列为ot+1ot+2…oT的概率。 初始化:
?T(i)?1(1?i?N)
迭代计算:
N?t(i)??aj?1ij bj(ot?1)?t?1(j) 1?t?T?1,1?j?N终止:
NP(O|?)???i?1ibi(o1)?1(i)
计算量分析与计算过程与向前算法类似,不重复说明。
解码问题:
隐马尔可夫模型的第二个问题是计算出一个能最好解释观察序列的状态转换序列。理论上,可以通过枚举所有的状态转换序列,并对每一个状态转换序列Q计算P(O,Q|λ),能使P(O,Q|λ)取最大值的状态转换序列Q#就是能最好解释观察序列的状态转换序列,即:
Q?argmaxP(O,Q|?)
Q#同样,这不是一个有效的计算方法,需要寻找更好地计算方法。
韦特比算法(Viterbi Algorithm) 定义韦特比变量
?t(i)?maxP(q1q2...qt?1,qt?i,o1o2...ot|?)
q1q2...qt?1?t(i)的含义是,给定模型λ,在时刻t处于状态i,观察到o1o2o3?ot的最佳状态转换序列为q1q2?qt的概率。
如何记录路径?设定T个数组?1(N),?2(N),...,?T(N),?t(i)记录在时刻t到达状态i的最佳状态转换序列t-1时刻的最佳状态。(基于动态规划的思想,用备忘录记录当前最优值,为下阶段的策划做依据) 初始化:
?1(i)??ibi(o1),1?i?N
?1(i)=0
迭代计算:
?2(3)?max[?1(i)ai3]b3(H)?0.1125?0.25?0.02812
1?i?N?2(2)?argmax[?1(i)ai2]?3
1?i?N终止:
P?max[?3(i)]?0.03375
1?i?N#q3?argmax[?3(i)]?1
1?i?N#最佳路径:
qt??t?1(qt?1),t?T?1,T?2,...,1
##
回到抛掷硬币的问题,若给定观察序列(HHT),寻找产生该观察序列的最佳路径以及最佳路径的概率。 初始化:
?1(1)??1b1(H)?1/3?1/2?0.16667 ?1(1)?0
?1(2)??2b2(H)?1/3?0.75?0.25 ?1(2)?0
?1(3)??3b3(H)?1/3?0.25?0.08333 ?1(3)?0
迭代计算:
?2(1)?max[?1(i)ai1]b1(H)?0.15003?0.5?0.07500
1?i?N?2(1)?argmax[?1(i)ai1]?1
1?i?N?2(2)?max[?1(i)ai2]b2(H)?0.03750?0.75?0.02812
1?i?N?2(2)?argmax[?1(i)ai2]?3
1?i?N?2(3)?max[?1(i)ai3]b3(H)?0.1125?0.25?0.02812
1?i?N?2(3)?argmax[?1(i)ai3]?2
1?i?N
?3(1)?max[?2(i)ai1]b1(T)?0.675?0.5?0.3375
1?i?N?3(1)?argmax[?2(i)ai1]?1
1?i?N?3(2)?max[?2(i)ai2]b2(T)?0.01265?0.25?0.00316
1?i?N?3(2)?argmax[?2(i)ai2]?3
1?i?N?3(3)?max[?2(i)ai3]b3(T)?0.01265?0.75?0.00949
1?i?N?3(3)?argmax[?2(i)ai3]?2
1?i?N终止:
P?max[?3(i)]?0.03375
1?i?N#q3?argmax[?3(i)]?1
1?i?N#最佳路径:
q2??3(q3)??3(1)?1q??2(q)??2(1)?1#1#2##
最佳路径为111。
学习问题或训练问题
隐马尔可夫模型的第三个问题是如何根据观察序列O=(o1o2…oT)求得模型参数或调整模型参数。
在模型未知的情况下,如果给定了观察序列的同时,也给定了状态转换序列,此时可以通过有指导的学习方法学习模型参数。例如给定下面的训练数据,可以通过最大似然估计法估计模型参数: H/1 H/1 H/1 T/2 H/3 T/5 … T/2 H/1 T/2 H/3 H/3 H/1 … 参数学习非常简单,在训练数据足够大的前提下效果不错。缺点是状态信息未知时无法使用,
或者需要由人工标注状态信息,代价高。 在模型未知的情况下,如果仅仅给定了观察序列,此时学习模型的方法被称作无指导的学习方法。对于隐马尔可夫模型而言,采用无指导学习方法,没有解析方法。通常要首先给定一组不准确的参数,再通过反复迭代逐步求精的方式调整模型参数,最终使参数稳定在一个可以接受的精度。利用无指导的学习方法估计隐马尔可夫模型参数时,并不能一定保证求得最优模型,一般能得到一个局部最优模型。
关于HMM无指导学习,Baum-Welch是比较成熟的算法,暂时没有深入研究。
层叠隐马尔可夫模型(CHMM)
至此,重新回到ICTCLAS系统中的CHMM模型中,这里详细讲解该模型中的第二层HMM基于类的隐马分词和第三层,第四层HMM未登录词的隐马识别,第一层的词性标注过程和未登录词的角色标注过程本质一样,不做重复性论述。第五层的原子切分,和N-ShortPath粗切分在代码讲解时描述更为直观,这里不做论述。
基于类的隐马分词:
首先,我们可以把所有的词进行分类:
w在核心词典中收录PER w是人名且是未登录词LOC w是地名且是未登录词ORG w是机构名且是未登录词Ci =NUM w是数词且是未登录词TIME w是时间词且是未登录词BEG w是句子的开始标记END w是句子的结束标记
其中核心词典中已有的每个词对应的类就是该词本身。给定一个分词原子序列S,S的某个分词结果记为W=(w1w2…wn),W对应的类别序列记为C=(c1c2…cn),同时我们取概率最大的分词结果W#作为最终的分词结果。则
W#OTHER 其他词?argmaxP(W)
W利用贝叶斯公式进行展开,得到
W#?argmaxP(W|C)P(C)
W