在实习的时候有用到LSTM+CRF,但以前对HMM、CRF理论了解的不多,导致自己在理论方面有所欠缺。因此特此写一篇从HMM到CRF再到LSTM+CRF中的非纯理论性质的文章,算是一个阶段性笔记和总结。
本文的侧重点还是以LSTM+CRF为主,对于LSTM+CRF中依赖到的HMM、CRF中的概念会做详细说明,主要包含几个部分:
- 马尔科夫模型
- 隐马尔科夫模型(HMM)
- HMM中的前向算法
- 维特比算法(viterbe)
- 条件随机场(CRF)
- CRF中的矩阵表示
- CRF中的前向算法
- LSTM+CRF模型
- LSTM+CRF中CRF层
- 源码解析
本文长而杂,阅读须谨慎。
0. Markov Model
之前也看过隐马尔科夫模型,也知道它有转移矩阵A、观测矩阵B。但是看完没多久又忘了,又说不出。所以还是概念不清楚。这里再巩固下。
在隐马尔科夫模型前,先忘掉HMM中的状态或观测的概念,先引入马尔科夫模型的概念。
假设我们有一个随机变量序列 X=(X1,X2,...,XT) X = ( X 1 , X 2 , . . . , X T ) , 它们的取值都来自一个状态集合 S={ s1,s2,...,s|S|} S = { s 1 , s 2 , . . . , s | S | } ,将状态值带入到随机变量序列中我们就得到了一个长度为 T T 的状态序列。以天气系统为例, , |S|=3 | S | = 3 ,当观测长度为 T=3 T = 3 时,可能的一个状态序列为 { X1=ssun,X2=scloud,X3=srain} { X 1 = s s u n , X 2 = s c l o u d , X 3 = s r a i n } 。
上面的状态序列,在马尔科夫模型中做了两个假设:
Limited Horizon:
P(St+1=sk∣X1,X2,...,Xt)=P(St+1=sk∣Xt) P ( S t + 1 = s k ∣ X 1 , X 2 , . . . , X t ) = P ( S t + 1 = s k ∣ X t )即下一个状态的输出概率只与上一个状态有关
Time Invariant
P(St+1=sk∣Xt)=P(X2=sk∣X1) P ( S t + 1 = s k ∣ X t ) = P ( X 2 = s k ∣ X 1 )即状态 St+1 S t + 1 与 St S t 输出概率之间的关系与时刻t无关,不会应为时刻不同而改变。
在马尔科夫模型中,为了确定状态到状态的转移概率,因此我们需要定义状态转移矩阵 A A ,而在状态到达初始时刻则需要定义初始状态概率向量 。
下面以一个例子说明马尔科夫模型:
(1) 记状态序列为
(2) 初始状态概率为
(3) 转移矩阵为
对应的转移状态图为
则状态序列为1011的概率为:
从上面这个例子可以看到,马尔科夫模型只能解决简单的状态转移问题。也即我观测到了一个状态序列,同时我知道状态间如何转移,那么我就知道整个状态产生的概率。但如果我们无法观测到这个状态序列,该怎么办?
一个典型的例子就是Ice Cream Climatology问题,我想预测一段时间的气候是HOT还是COLD,但是我我无法观测到这段时间的气候是什么,我只能观测到我每天吃了多少个冰激凌。因此对我来说,气候就是个隐含序列,真正的观测序列是我这段时间吃的冰激凌数目序列。
另一个例子就是NLP中词性标注(POS Tagging)问题,我有两个序列,一个是句子序列,一个是句子中每个词的词性构成的标记序列。但实际中我通常只有句子序列,在预测前词性无法得知,因此词性就是个隐含序列。
当实际问题中即包含观测序列又包含隐含的状态序列时,就需要隐马尔科夫了。
1. Hidden Markov Model
隐马尔科夫模型包含两个序列,一个状态序列 Q={
q1,q2,...,qn} Q = { q 1 , q 2 , . . . , q n } ,一个观测序列 O={
o1,o2,...,on} O = { o 1 , o 2 , . . . , o n } ,每个状态 qi q i 生成一个观测 oi o i 。在隐马尔科夫模型中,做了一个输出独立的假设:
即t时刻的观测值只依赖于t时刻的状态,与其他时刻状态无关。符号系统我沿用了《统计学习方法》。
隐马尔科夫模型同样需要初始向量 π π ,状态转移矩阵 A A 。由于我们多引入了一个观测序列,因此需要额外定义一个观测概率矩阵 ,用于描述某个状态 qt q t 产生某个观测值 ot o t 的概率。 λ=(A,B,π) λ = ( A , B , π ) 即模型的参数。
在隐马尔科夫模型中,有3个基本问题,这里我主要描述其中的两个:
(1) 概率计算问题:给定模型 λ=(A,B,π) λ = ( A , B , π ) 和观测序列 O={ o1,o2,...,on} O = { o 1 , o 2 , . . . , o n } ,求观测 O O 出现的概率
(2) 预测问题:给定模型 λ=(A,B,π) λ = ( A , B , π ) 和观测序列 O={ o1,o2,...,on} O = { o 1 , o 2 , . . . , o n } ,求条件概率 P(I∣O) P ( I ∣ O ) 最大的隐含状态序列 I={ ii,i2,...,iT} I = { i i , i 2 , . . . , i T }
1.1 前向算法
求观测序列 O O 出现的概率的一种方式是求出所有状态序列
产生观测序列 O O 的概率。这里要求出所有可能的状态序列是不可行的。思路是对的,但是有种更高效的计算方式。记前向概率为:
表示到t时刻部分观测序列为 o