赞
踩
本文主要介绍NLP领域中很重要的一个模型——隐马尔科夫模型(Hidden Markov Model,HMM)。希望读完本文后,大家能够清楚地理解HMM并能够应用到实际中。
隐马尔科夫模型是结构最简单的动态贝叶斯网(dynamic Bayesian network,也被称作有向图模型),HMM是可以用于标注问题的统计数学模型,描述由隐藏的马尔科夫链随机生成观测序列的过程,属于生成模型。HMM模型在语音识别、自然语言处理、生物信息、模式识别等领域有广泛的应用。
首先看看什么样的问题可以使用HMM模型解决。
使用HMM模型来解决的问题一般有两个特征:
如果问题有了这两个特征,那么这个问题一般可以使用HMM模型尝试解决,这样的问题在生活中是很多的。例如,说一句话,发出的声音是观测序列,想表达的意思是隐藏状态序列;写文章的过程可以想象为先在脑海中构思好一个满足语法的词性序列,然后再将每个词性填充为具体的词语。
隐马尔科夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程(摘自《统计学习方法》)。隐藏的马尔科夫链随机生成的状态的序列,称为状态序列(state sequence),记作
y
\boldsymbol{y}
y;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence),记作
x
\boldsymbol{x}
x。序列的每一个位置又可以看作一个时刻。
首先介绍一下马尔科夫假设:每个事件的发生概率只取决于前一个事件。将满足该假设的连续多个事件串联在一起,就构成了马尔科夫链。在NLP语境下,可以将事件具象为单词,于是马尔科夫模型就是二元语法。
有了隐马尔科夫链,如何建立与观测序列 x \boldsymbol{x} x的联系呢?HMM做了第二个假设:
设
Q
Q
Q是所有可能的状态的集合,
V
V
V是所有可能的观测的集合。
Q
=
{
q
1
,
q
2
,
.
.
.
,
q
N
}
,
V
=
{
v
1
,
v
2
,
v
3
,
.
.
.
,
v
N
}
Q=\{q_1,q_2,...,q_N\},V=\{v_1,v_2,v_3,...,v_N\}
Q={q1,q2,...,qN},V={v1,v2,v3,...,vN}
其中,N是可能的状态数,M是可能的观测数。
HMM模型用三元组来表示
λ
=
(
π
,
A
,
B
)
\lambda=(\boldsymbol{\pi},A,B)
λ=(π,A,B):
系统怎么从零开始呢? 观测值是由隐藏状态产生的,所以系统最初应该是生成隐藏状态。
初始概率向量指的是系统启动时进入的第一个状态 y 1 y_1 y1成为初始状态, y \boldsymbol{y} y有 N N N种取值,从 Q Q Q集合中选取一个,即 y ∈ { q 1 , q 2 , . . . , q N } \boldsymbol{y} \in \{q_1,q_2,...,q_N\} y∈{q1,q2,...,qN}。由于 y 1 y_1 y1是第一个状态,是一个独立的离散随机变量,可以用 p ( y 1 ∣ π ) p(y_1|\boldsymbol{\pi}) p(y1∣π)来描述, y 1 y_1 y1只由 π \boldsymbol{\pi} π来控制,其中 π = ( π 1 , π 2 , π 3 , . . . , π N ) T , 0 ≤ π i ≤ 1 , ∑ i = 1 N π i \boldsymbol{\pi}=(\pi_1,\pi_2,\pi_3,...,\pi_N)^T,0\leq\pi_i\leq1,\sum\limits^{N}_{i=1}{\pi_i} π=(π1,π2,π3,...,πN)T,0≤πi≤1,i=1∑Nπi=1。 π \boldsymbol{\pi} π是概率分布的参数向量,称为初始状态概率向量。给定 π \boldsymbol{\pi} π,初始状态 y 1 y_1 y1的取值分布就确定了。以中文分词问题为例,采用{B,M,E,S}标记时,其中B代表一个词的第一个字,M代表词的中间字,E代表词的末尾字,S代表单字成词。 y 1 y_1 y1所有可能的取值及对应的概率如下:
p ( y 1 = B ) = 0.7 p(y_1=B)=0.7 p(y1=B)=0.7
p ( y 1 = M ) = 0 p(y_1=M)=0 p(y1=M)=0
p ( y 1 = E ) = 0 p(y_1=E)=0 p(y1=E)=0
p ( y 1 = s ) = 0.3 p(y_1=s)=0.3 p(y1=s)=0.3
则 π = [ 0.7 , 0 , 0 , 0.3 ] \pi=[0.7,0,0,0.3] π=[0.7,0,0,0.3],也就是说句子第一个字可能是一个单字或者一个词的首字,不可能是一个词的中间或者尾字。
y 1 y_1 y1确定之后,怎么产生 x 1 x_1 x1呢?如何确定 x 1 x_1 x1的概率分布呢?
根据第二个假设:当前观测值
x
1
x_1
x1仅取决于当前的状态
y
1
y_1
y1,对于从
Q
Q
Q中取出的每一种状态
y
1
y_1
y1,
x
1
x_1
x1都可以从
V
V
V集合中的
M
M
M个值选一个,所以对于每一个
y
,
x
y,x
y,x都是一个独立的离散随机变量,其概率参数对应一个向量,维度为
M
M
M,即
x
∈
{
v
1
,
v
2
,
.
.
.
,
v
N
}
\boldsymbol{x} \in \{v_1,v_2,...,v_N\}
x∈{v1,v2,...,vN}。由于一共有
N
N
N种
y
y
y,所以这些向量构成了一个
N
×
M
N\times M
N×M矩阵,称为发射概率矩阵
B
\boldsymbol{B}
B。
B
=
[
b
i
j
]
N
×
M
=
[
p
(
x
t
=
v
i
∣
y
t
=
q
j
)
]
N
×
M
\boldsymbol{B}=[b_{ij}]_{N\times M}=[p(x_t=v_i|y_t=q_j)]_{N\times M}
B=[bij]N×M=[p(xt=vi∣yt=qj)]N×M
其中, p ( x t = v i ∣ y t = q j ) p(x_t=v_i|y_t=q_j) p(xt=vi∣yt=qj)代表t时刻,隐藏状态 y t y_t yt是 q j q_j qj,由这个状态产生的观测值 x t x_t xt等于 v i v_i vi的概率。
状态 | 观测值1 | 观测值2 | … | 观测值M |
---|---|---|---|---|
状态1 | ||||
状态2 | ||||
… | ||||
状态N |
发射概率矩阵是一个非常形象的术语:可以将
y
\boldsymbol{y}
y想象成为不同的彩弹枪,
x
\boldsymbol{x}
x为不同颜色的子弹,每把彩弹枪内的颜色子弹比例不一样,导致有的彩弹枪红色子弹较多比较容易发射红色彩弹,一些彩弹枪绿色子弹较多更容易发射绿色彩弹。
发射概率在中文分词中也具有实际意义,有些字符构词的位置比较固定,比如一把作为词首的枪,不容易发射出“餮”,因为“餮”一般作为“饕餮”的词尾出现。通过给
p
(
x
1
=
餮
∣
y
1
=
B
)
p(x_1=餮|y_1=B)
p(x1=餮∣y1=B)较低的概率,HMM模型可以有效的防止“饕餮”被错误的切分。
y 1 y_1 y1确定之后,如何转移状态到 y 2 y_2 y2?乃至 y n y_n yn?
根据HMM模型的第一个假设:
t
+
1
t+1
t+1时刻的状态仅仅取决于
t
t
t时刻的状态。类似发射概率矩阵,对于
t
t
t时刻的每一种状态,
y
t
+
1
y_{t+1}
yt+1是一个离散的随机变量,取值有
N
N
N种。
t
t
t时刻一共可能有
N
N
N种状态,所以从
t
t
t时刻到
t
+
1
t+1
t+1时刻的状态转移矩阵为
N
×
N
N\times N
N×N的方阵,称为状态转移概率矩阵
A
\boldsymbol{A}
A:
A
=
[
a
i
j
]
N
×
N
=
[
p
(
y
t
+
1
=
v
j
∣
y
t
=
v
i
)
]
N
×
N
\boldsymbol{A}=[a_{ij}]_{N\times N}=[p(y_{t+1}=v_j|y_t=v_i)]_{N\times N}
A=[aij]N×N=[p(yt+1=vj∣yt=vi)]N×N
其中, p ( y t + 1 = s j ∣ y t = s i ) p(y_{t+1}=s_j|y_t=s_i) p(yt+1=sj∣yt=si)表示 t t t时刻的状态为 v i v_i vi, t + 1 t+1 t+1时刻的状态为 v j v_j vj的概率。
当前状态 | 下一状态是状态1 | 状态2 | … | 状态N |
---|---|---|---|---|
状态1 | ||||
状态2 | ||||
… | ||||
状态N |
例如,在中文分词中,标签B后面不可能是S,于是给 p ( y t + 1 = S ∣ y t = B ) = 0 p(y_{t+1}=S|y_t=B)=0 p(yt+1=S∣yt=B)=0就可以防止B后面接S的情况出现。
初始状态概率向量、状态转移概率矩阵与发射概率矩阵称为HMM模型的三元组 λ = ( π , A , B ) \lambda=(\boldsymbol{\pi},A,B) λ=(π,A,B),只要三元组确定了,HMM模型就确定了。
举一个经典的例子:
假设有四个盒子,每个盒子里都装有红白两种颜色的球,如下表:
盒子 | 1 | 2 | 3 | 4 |
---|---|---|---|---|
红球数 | 5 | 3 | 6 | 8 |
白球数 | 5 | 7 | 4 | 2 |
按照下面的方法抽球,产生一个球的颜色观察序列:
一共抽取出来5个球,得到一个球的颜色观察序列:
x
=
{
红
,
红
,
白
,
白
,
红
}
\boldsymbol{x}=\{\color{red}红,红,\color{black}白,白,\color{red}红\}
x={红,红,白,白,红}
在这个过程中,观察者只能观测到球的颜色序列,观测不到球是从哪个盒子取出的,即观察不到盒子的序列。
这个例子中有两个随机序列,一个是盒子的序列(状态序列),一个是球的颜色的观测序列(观测序列),前者是隐藏的,后者是可以观测的。根据所给的条件可以明确状态集合、观测集合、序列长度以及模型的三要素。
有了HMM模型之后,如何使用模型呢?HMM模型一个可以解决三个问题:
概率计算问题,也就是在给定的模型参数三元组的条件生成观测序列的过程。给定模型参数 λ = ( π , A , B ) \lambda=(\boldsymbol{\pi},A,B) λ=(π,A,B)和一个观测序列 x \boldsymbol{x} x,,计算在这个模型参数 λ \lambda λ下,观测序列出现的最大概率,即 p ( x ∣ λ ) p(\boldsymbol{x}|\lambda) p(x∣λ)的最大值。先介绍概念上可行但计算上不行的直接计算法(暴力解法),然后介绍前向算法与后向算法。
给定模型参数
λ
=
(
π
,
A
,
B
)
\boldsymbol{\lambda}=(\boldsymbol{\pi},A,B)
λ=(π,A,B)和一个观测序列
x
=
{
x
1
,
x
2
,
x
3
,
.
.
.
x
T
}
\boldsymbol{x}=\{x_1,x_2,x_3,...x_T\}
x={x1,x2,x3,...xT},计算观测序列出现的概率
p
(
x
∣
λ
)
p(\boldsymbol{x}|\lambda)
p(x∣λ),最直接的方法就是按照概率公式直接计算,通过列举所有可能的长度为
T
T
T的状态序列
y
=
{
y
1
,
y
2
,
y
3
,
.
.
.
,
y
T
}
\boldsymbol{y}=\{y_1,y_2,y_3,...,y_T\}
y={y1,y2,y3,...,yT},求各个状态序列
y
\boldsymbol{y}
y与观测序列
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_T)
x=(x1,x2,x3,...,xT)的联合概率
p
(
x
,
y
∣
λ
)
p(\boldsymbol{x},\boldsymbol{y}|\boldsymbol{\lambda})
p(x,y∣λ),,然后对所有可能的状态序列求和,得到
p
(
x
∣
λ
)
p(\boldsymbol{x}|\boldsymbol{\lambda})
p(x∣λ)。
状态序列
y
=
(
y
1
,
y
2
,
y
3
,
.
.
.
,
y
T
)
\boldsymbol{y}=(y_1,y_2,y_3,...,y_T)
y=(y1,y2,y3,...,yT)发生的概率是:
p
(
y
∣
λ
)
=
π
y
1
a
y
1
y
2
a
y
2
y
3
.
.
.
a
y
T
−
1
y
T
p(\boldsymbol{y}|\boldsymbol{\lambda})=\pi_{y_1}a_{y_1y_2}a_{y_2y_3}...a_{y_{T-1}y_T}
p(y∣λ)=πy1ay1y2ay2y3...ayT−1yT
对固定的状态序列
y
=
(
y
1
,
y
2
,
y
3
,
.
.
.
,
y
T
)
\boldsymbol{y}=(y_1,y_2,y_3,...,y_T)
y=(y1,y2,y3,...,yT)并且观测序列为
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_T)
x=(x1,x2,x3,...,xT)的概率是:
p
(
x
∣
y
,
λ
)
=
b
y
1
x
1
b
y
2
x
2
b
y
3
x
3
.
.
.
b
y
T
x
T
p(\boldsymbol{x}|\boldsymbol{y},\boldsymbol{\lambda})=b_{y_1x_1}b_{y_2x_2}b_{y_3x_3}...b_{y_Tx_T}
p(x∣y,λ)=by1x1by2x2by3x3...byTxT
在给定HMM模型参数
λ
\boldsymbol{\lambda}
λ的条件下,
x
,
y
\boldsymbol{x},\boldsymbol{y}
x,y同时出现的联合概率为:
p
(
x
,
y
∣
λ
)
=
p
(
x
∣
y
,
λ
)
p
(
y
∣
λ
)
=
π
y
1
b
y
1
x
1
a
y
1
y
2
b
y
2
x
2
a
y
2
y
3
b
y
3
x
3
.
.
.
a
y
T
−
1
y
T
b
y
T
x
T
然后,对所有可能的状态序列
y
\boldsymbol{y}
y求和,得到观测序列
x
\boldsymbol{x}
x的概率
p
(
x
∣
λ
)
p(\boldsymbol{x}|\lambda)
p(x∣λ),即:
p
(
x
∣
λ
)
=
∑
y
p
(
x
,
y
∣
λ
)
=
∑
y
p
(
x
∣
y
,
λ
)
p
(
y
∣
λ
)
=
∑
y
1
,
y
2
,
y
3
,
.
.
.
,
y
T
π
y
1
b
y
1
x
1
a
y
1
y
2
b
y
2
x
2
a
y
2
y
3
b
y
3
x
3
.
.
.
a
y
T
−
1
y
T
b
y
T
x
T
利用这个公式计算量很大,复杂度是 O ( T N T ) O(TN^T) O(TNT),在实际中是不可行的。
首先需要定义前向概率:给定HMM模型
λ
\boldsymbol{\lambda}
λ,定义时刻
t
t
t部分观测序列为
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_t)
x=(x1,x2,x3,...,xt)且状态为
q
i
q_i
qi的概率为前向概率,记作:
α
t
(
i
)
=
p
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
,
y
t
=
q
i
∣
λ
)
\alpha_t(i)=p(x_1,x_2,x_3,...,x_t,y_t=q_i|\boldsymbol{\lambda})
αt(i)=p(x1,x2,x3,...,xt,yt=qi∣λ)
前向算法:
算法步骤:
对
t
=
1
,
2
,
3
,
.
.
.
T
−
1
t=1,2,3,...T-1
t=1,2,3,...T−1,有:
α
t
+
1
(
i
)
=
[
∑
j
=
1
N
α
t
(
j
)
a
j
i
]
b
i
x
t
+
1
,
i
=
1
,
2
,
3
,
.
.
.
N
\alpha_{t+1}(i)=[\sum\limits^N_{j=1}\alpha_t(j)a_{ji}]b_{ix_{t+1}},\quad i=1,2,3,...N
αt+1(i)=[j=1∑Nαt(j)aji]bixt+1,i=1,2,3,...N
3. 终止:
时刻
t
=
T
t=T
t=T:
根据定义可知:
α
T
(
i
)
\alpha_T(i)
αT(i)表示,
t
=
T
t=T
t=T时刻,处于状态
y
T
=
q
i
y_T=q_i
yT=qi,并且观察到的序列为
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_T)
x=(x1,x2,x3,...,xT)的概率:
α
T
(
i
)
=
p
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
,
y
T
=
q
i
∣
λ
)
=
p
(
x
,
y
T
=
q
i
∣
λ
)
所以:
p ( x ∣ λ ) = ∑ i = 1 N α T ( i ) p(\boldsymbol{x}|\boldsymbol{\lambda})=\sum\limits^N_{i=1}\alpha_T(i) p(x∣λ)=i=1∑NαT(i)
前向算法实际是基于“状态序列的路径结构”递推计算 p ( x ∣ λ ) p(\boldsymbol{x}|\boldsymbol{\lambda}) p(x∣λ)的算法。前向算法高效的关键是其局部计算前向概率,然后利用路径结构将前向概率递推到全局,得到 p ( x ∣ λ ) p(\boldsymbol{x}|\boldsymbol{\lambda}) p(x∣λ)。在 t = 1 t=1 t=1时刻计算 α 1 ( i ) \alpha_1(i) α1(i)的 N N N个值,而当 t ≥ 2 t\geq2 t≥2时,计算每一个\alpha_t(i)的值都会利用前 N N N个 α t − 1 ( i ) \alpha_{t-1}(i) αt−1(i)的值,减少计算量的原因在于每一次计算都直接引用前一个时刻的计算结果,避免了概率的重复计算,复杂度为 O ( N ∗ N ∗ T ) O(N*N*T) O(N∗N∗T),而不是直接算法的 O ( T N T ) O(TN^T) O(TNT)。
例:上文中的盒子和球模型,状态集合为
Q
=
{
1
,
2
,
3
}
Q=\{1,2,3\}
Q={1,2,3},观测集合为
V
=
{
红
,
白
}
V=\{红,白\}
V={红,白},
A
=
[
0.5
0.2
0.3
0.3
0.5
0.2
0.2
0.3
0.5
]
A=
设
T
=
3
T=3
T=3,
x
=
(
红
,
白
,
红
)
\boldsymbol{x}=(红,白,红)
x=(红,白,红),用前向算法来计算
p
(
x
∣
λ
)
p(\boldsymbol{x}|\boldsymbol{\lambda})
p(x∣λ)。
解:
α 1 ( 2 ) = π 2 b 2 x 1 = 0.4 × 0.4 = 0.16 \alpha_1(2)=\pi_2b_{2x_1}=0.4\times0.4=0.16 α1(2)=π2b2x1=0.4×0.4=0.16
α
1
(
3
)
=
π
3
b
3
x
1
=
0.4
×
0.7
=
0.28
\alpha_1(3)=\pi_3b_{3x_1}=0.4\times0.7=0.28
α1(3)=π3b3x1=0.4×0.7=0.28
2. 递推计算:
α
2
(
1
)
=
[
∑
i
=
1
3
α
1
(
i
)
a
i
1
]
b
1
x
2
=
[
0.10
×
0.5
+
0.16
×
0.3
+
0.28
×
0.2
)
]
×
0.5
=
0.077
\alpha_2(1)=[\sum\limits_{i=1}^3\alpha_1(i)a_{i1}]b_{1x_2}=[0.10\times0.5+0.16\times0.3+0.28\times0.2)]\times0.5=0.077
α2(1)=[i=1∑3α1(i)ai1]b1x2=[0.10×0.5+0.16×0.3+0.28×0.2)]×0.5=0.077
α 2 ( 2 ) = [ ∑ i = 1 3 α 1 ( i ) a i 2 ] b 2 x 2 = [ 0.10 × 0.2 + 0.16 × 0.5 + 0.28 × 0.3 ) ] × 0.5 = 0.1104 \alpha_2(2)=[\sum\limits_{i=1}^3\alpha_1(i)a_{i2}]b_{2x_2}=[0.10\times0.2+0.16\times0.5+0.28\times0.3)]\times0.5=0.1104 α2(2)=[i=1∑3α1(i)ai2]b2x2=[0.10×0.2+0.16×0.5+0.28×0.3)]×0.5=0.1104
α 2 ( 3 ) = [ ∑ i = 1 3 α 1 ( i ) a i 3 ] b 3 x 2 = [ 0.10 × 0.3 + 0.16 × 0.2 + 0.28 × 0.5 ) ] × 0.5 = 0.0606 \alpha_2(3)=[\sum\limits_{i=1}^3\alpha_1(i)a_{i3}]b_{3x_2}=[0.10\times0.3+0.16\times0.2+0.28\times0.5)]\times0.5=0.0606 α2(3)=[i=1∑3α1(i)ai3]b3x2=[0.10×0.3+0.16×0.2+0.28×0.5)]×0.5=0.0606
α 3 ( 1 ) = [ ∑ i = 1 3 α 2 ( i ) a i 1 ] b 1 x 3 = 0.04187 \alpha_3(1)=[\sum\limits_{i=1}^3\alpha_2(i)a_{i1}]b_{1x_3}=0.04187 α3(1)=[i=1∑3α2(i)ai1]b1x3=0.04187
α 3 ( 2 ) = [ ∑ i = 1 3 α 2 ( i ) a i 2 ] b 2 x 3 = 0.03551 \alpha_3(2)=[\sum\limits_{i=1}^3\alpha_2(i)a_{i2}]b_{2x_3}=0.03551 α3(2)=[i=1∑3α2(i)ai2]b2x3=0.03551
α 3 ( 3 ) = [ ∑ i = 1 3 α 2 ( i ) a i 3 ] b 3 x 3 = 0.05284 \alpha_3(3)=[\sum\limits_{i=1}^3\alpha_2(i)a_{i3}]b_{3x_3}=0.05284 α3(3)=[i=1∑3α2(i)ai3]b3x3=0.05284
p ( x ∣ λ ) = ∑ i = 1 3 α 3 ( i ) = 0.13022 p(\boldsymbol{x}|\boldsymbol{\lambda})=\sum\limits_{i=1}^3\alpha_3(i)=0.13022 p(x∣λ)=i=1∑3α3(i)=0.13022
类似前向算法,定义:给定HMM模型
λ
\boldsymbol{\lambda}
λ,定义时刻
t
t
t状态为
q
i
q_i
qi的条件下,从
t
+
1
到
T
t+1到T
t+1到T的部分观测序列为
x
t
+
1
,
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
x_{t+1},x_{t+2},x_{t+3},...,x_T
xt+1,xt+2,xt+3,...,xT的概率为后向概率,记作:
β
t
(
i
)
=
p
(
x
t
+
1
,
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
∣
y
t
=
q
i
,
λ
)
\beta_t(i)=p(x_{t+1},x_{t+2},x_{t+3},...,x_T|y_t=q_i,\boldsymbol{\lambda})
βt(i)=p(xt+1,xt+2,xt+3,...,xT∣yt=qi,λ)
后向算法:
a i j = p ( y t + 1 = q j ∣ y t = q i , λ ) ) a_{ij}=p(y_{t+1}=q_j|y_t=q_i,\boldsymbol{\lambda})) aij=p(yt+1=qj∣yt=qi,λ))
β t + 1 ( j ) = p ( x t + 2 , x t + 3 , . . . , x T ∣ y t + 1 = q j , λ ) \beta_{t+1}(j)=p(x_{t+2},x_{t+3},...,x_T|y_{t+1}=q_j,\boldsymbol{\lambda}) βt+1(j)=p(xt+2,xt+3,...,xT∣yt+1=qj,λ)
由状态
y
t
+
1
=
q
j
y_{t+1}=q_j
yt+1=qj生成
t
+
1
t+1
t+1时刻的观测值
x
t
+
1
x_{t+1}
xt+1:
b
j
x
t
+
1
β
t
+
1
(
j
)
=
p
(
x
t
+
1
∣
y
t
+
1
=
q
j
,
λ
)
p
(
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
=
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
按照条件概率来理解:在
t
+
1
t+1
t+1时刻状态为
y
t
+
1
=
q
j
y_{t+1}=q_j
yt+1=qj的条件下,观察到
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
x_{t+1},x_{t+2},...,x_T
xt+1,xt+2,...,xT的概率为
b
j
x
t
+
1
β
t
+
1
(
j
)
b_{jx_{t+1}}\beta_{t+1}(j)
bjxt+1βt+1(j),由于
β
t
(
i
)
\beta_t(i)
βt(i)与
t
t
t时刻的状态
y
t
y_t
yt有关,根据HMM模型的第一个假设,
y
t
+
1
y_{t+1}
yt+1仅仅与
y
t
y_t
yt有关,且概率
a
i
j
a_{ij}
aij由状态转移矩阵矩阵A提供。
β
t
(
i
)
\beta_t(i)
βt(i)表示在
t
t
t时刻状态为
y
t
=
q
i
y_t=q_i
yt=qi的条件下,观察到
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
x_{t+1},x_{t+2},...,x_T
xt+1,xt+2,...,xT的概率,这个概率若要用
β
t
+
1
(
j
)
\beta_{t+1}(j)
βt+1(j)来表示,针对每一个
y
t
+
1
=
q
j
y_{t+1}=q_j
yt+1=qj,都要乘以从
y
t
=
q
i
y_t=q_i
yt=qi到
y
t
+
1
=
q
j
y_{t+1}=q_j
yt+1=qj的状态转移概率
a
i
j
a_{ij}
aij,
y
t
+
1
y_{t+1}
yt+1一共有N种状态,所以:
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
=
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
a
i
j
=
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
p
(
y
t
+
1
=
q
j
∣
y
t
=
q
i
,
λ
)
)
=
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
,
y
t
+
1
=
q
j
,
∣
y
t
=
q
i
,
λ
)
β
t
(
i
)
=
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
∣
y
t
=
q
i
,
λ
)
=
∑
y
t
+
1
p
(
x
t
+
1
,
x
t
+
2
,
.
.
.
,
x
T
,
y
t
+
1
=
q
j
,
∣
y
t
=
q
i
,
λ
)
=
∑
j
=
1
N
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
所以:
β
t
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
,
i
=
1
,
2
,
3
,
.
.
.
,
N
\beta_t(i)=\sum\limits_{j=1}^Na_{ij}b_{jx_{t+1}}\beta_{t+1}(j),\quad i=1,2,3,...,N
βt(i)=j=1∑Naijbjxt+1βt+1(j),i=1,2,3,...,N
3. 当
t
=
1
t=1
t=1时,
β
1
(
i
)
=
p
(
x
2
,
x
3
,
x
4
,
.
.
.
,
x
T
∣
y
1
=
q
i
,
λ
)
\beta_1(i)=p(x_2,x_3,x_4,...,x_T|y_1=q_i,\boldsymbol{\lambda})
β1(i)=p(x2,x3,x4,...,xT∣y1=qi,λ);按照步骤2的思想,针对
t
=
1
t=1
t=1时刻的每一种状态
y
1
=
q
i
y_1=q_i
y1=qi,都需要乘上初始状态概率向量和相应的发射概率矩阵。
p
(
x
∣
λ
)
=
∑
i
=
1
N
π
i
b
i
x
1
β
1
(
i
)
p(\boldsymbol{x}|\boldsymbol{\lambda})=\sum\limits_{i=1}^N\pi_ib_{ix_1}\beta_{1}(i)
p(x∣λ)=i=1∑Nπibix1β1(i)
利用前向概率和后向概率,可以得到关于单个状态和两个状态概率的计算公式。
可以用过前向和后向算法来算:
γ
t
(
i
)
=
p
(
y
t
=
q
i
∣
x
,
λ
)
=
p
(
y
t
=
q
i
,
x
∣
λ
)
p
(
x
∣
λ
)
α
t
(
i
)
\alpha_t(i)
αt(i)定义为时刻
t
t
t部分观测序列为
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_t)
x=(x1,x2,x3,...,xt)且状态为
q
i
q_i
qi的概率,
β
t
(
i
)
\beta_t(i)
βt(i)定义为时刻
t
t
t状态为
q
i
q_i
qi的条件下,从
t
+
1
到
T
t+1到T
t+1到T的部分观测序列为
x
t
+
1
,
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
x_{t+1},x_{t+2},x_{t+3},...,x_T
xt+1,xt+2,xt+3,...,xT的概率,则两者相乘表示,观察序列为
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
)
\boldsymbol{x}=(x_1,x_2,x_3,...,x_T)
x=(x1,x2,x3,...,xT)且状态为
q
i
q_i
qi的概率,数学表示为:
α
t
(
i
)
β
t
(
i
)
=
p
(
y
t
=
q
i
,
x
∣
λ
)
\alpha_t(i)\beta_t(i)=p(y_t=q_i,\boldsymbol{x}|\boldsymbol{\lambda})
αt(i)βt(i)=p(yt=qi,x∣λ)
p ( x ∣ λ ) = ∑ y t p ( y t = q i , x ∣ λ ) = ∑ j = 1 N α t ( i ) β t ( i ) p(\boldsymbol{x}|\boldsymbol{\lambda})=\sum\limits_{y_t}p(y_t=q_i,\boldsymbol{x}|\boldsymbol{\lambda})=\sum\limits_{j=1}^N\alpha_t(i)\beta_t(i) p(x∣λ)=yt∑p(yt=qi,x∣λ)=j=1∑Nαt(i)βt(i)
所以:
γ
t
(
i
)
=
α
t
(
i
)
β
t
(
i
)
p
(
x
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
∑
j
=
1
N
α
t
(
i
)
β
t
(
i
)
\gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{p(\boldsymbol{x}|\boldsymbol{\lambda})}=\frac{\alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N\alpha_t(i)\beta_t(i)}
γt(i)=p(x∣λ)αt(i)βt(i)=j=1∑Nαt(i)βt(i)αt(i)βt(i)
2. 给定HMM模型参数
λ
\boldsymbol{\lambda}
λ和观测序列
x
\boldsymbol{x}
x,在时刻
t
t
t处于状态
q
i
q_i
qi且在时刻
t
+
1
t+1
t+1处于状态
q
j
q_j
qj的概率,记作
ξ
t
(
i
,
j
)
\xi_t(i,j)
ξt(i,j):
ξ
t
(
i
,
j
)
=
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
∣
x
,
λ
)
\xi_t(i,j)=p(y_t=q_i,y_{t+1}=q_j|\boldsymbol{x},\boldsymbol{\lambda})
ξt(i,j)=p(yt=qi,yt+1=qj∣x,λ)
使用前向和后向算法来计算:
ξ
t
(
i
,
j
)
=
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
∣
x
,
λ
)
=
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
,
x
∣
λ
)
p
(
x
,
λ
)
=
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
,
x
∣
λ
)
∑
i
=
1
N
∑
j
=
1
N
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
,
x
∣
λ
)
而
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
,
x
∣
λ
)
p(y_t=q_i,y_{t+1}=q_j,\boldsymbol{x}|\boldsymbol{\lambda})
p(yt=qi,yt+1=qj,x∣λ)表示在模型参数下,观测序列
x
\boldsymbol{x}
x以及
t
t
t时刻状态为
q
i
q_i
qi且时刻
t
+
1
t+1
t+1处于状态
q
j
q_j
qj的概率,
α
t
(
i
)
=
p
(
y
t
=
q
i
,
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
∣
λ
)
\alpha_t(i)=p(y_t=q_i,x_1,x_2,x_3,...,x_t|\boldsymbol{\lambda})
αt(i)=p(yt=qi,x1,x2,x3,...,xt∣λ)表示在模型参数下,观测序列
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
x_1,x_2,x_3,...,x_t
x1,x2,x3,...,xt以及
t
t
t时刻状态为
q
i
q_i
qi的概率,
β
t
+
1
(
j
)
=
p
(
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
\beta_{t+1}(j)=p(x_{t+2},x_{t+3},...,x_T|y_{t+1}=q_j,\boldsymbol{\lambda})
βt+1(j)=p(xt+2,xt+3,...,xT∣yt+1=qj,λ)表示在模型参数和
t
+
1
t+1
t+1时刻状态为
q
j
q_j
qj的条件下,观察序列为
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
x_{t+2},x_{t+3},...,x_T
xt+2,xt+3,...,xT,两者之间差一个从时刻
t
到
t
+
1
t到t+1
t到t+1的状态转移概率以及时刻
t
+
1
t+1
t+1状态
q
j
q_j
qj产生序列
x
t
+
1
x_{t+1}
xt+1的概率:
p
(
y
t
=
q
i
,
y
t
+
1
=
q
j
,
x
∣
λ
)
=
p
(
y
t
=
q
i
,
x
1
,
x
2
,
.
.
.
,
x
t
∣
λ
)
p
(
y
t
+
1
∣
y
t
,
λ
)
p
(
x
t
+
1
∣
y
t
+
1
,
λ
)
p
(
x
t
+
2
,
x
t
+
3
,
.
.
.
,
x
T
∣
y
t
+
1
=
q
j
,
λ
)
=
α
t
(
i
)
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
所以:
ξ
t
(
i
,
j
)
=
α
t
(
i
)
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
∑
i
=
1
N
∑
j
=
1
N
α
t
(
i
)
a
i
j
b
j
x
t
+
1
β
t
+
1
(
j
)
\xi_t(i,j)=\frac{\alpha_t(i)a_{ij}b_{jx_{t+1}}\beta_{t+1}(j)}{\sum\limits_{i=1}^N\sum\limits_{j=1}^N\alpha_t(i)a_{ij}b_{jx_{t+1}}\beta_{t+1}(j)}
ξt(i,j)=i=1∑Nj=1∑Nαt(i)aijbjxt+1βt+1(j)αt(i)aijbjxt+1βt+1(j)
3.将 ξ t ( i , j ) \xi_t(i,j) ξt(i,j)和 γ t ( i ) \gamma_t(i) γt(i)对各个时刻求和,可以得到一些有用的期望值:
给定训练集 ( x ( i ) , y ( i ) ) (\boldsymbol{x}^{(i)},\boldsymbol{y}^{(i)}) (x(i),y(i)),估计模型参数 λ = ( π , A , B ) \lambda=(\boldsymbol{\pi},A,B) λ=(π,A,B),使得在该模型下观测序列概率 p ( x ∣ λ ) p(\boldsymbol{x}|\lambda) p(x∣λ)最大。根据训练数据是否有状态序列数据分为:完全数据和非完全数据,分别使用监督学习和非监督学习实现。
在监督学习中,我们使用极大似然法来估计HMM模型参数。
假设给定训练数据包含S个长度相同的观测序列
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
S
,
y
S
)
}
\{(\boldsymbol{x}^1,\boldsymbol{y}^1),(\boldsymbol{x}^2,\boldsymbol{y}^2),...,(\boldsymbol{x}^S,\boldsymbol{y}^S)\}
{(x1,y1),(x2,y2),...,(xS,yS)},使用极大似然法来估计HMM模型参数。
初始状态概率向量的估计:
统计S个样本中,初始状态为
q
i
q_i
qi的频率。
π
^
i
=
N
q
i
S
\hat{\pi}_i=\frac{N_{q_i}}{S}
π^i=SNqi
其中,
N
q
i
N_{q_i}
Nqi是初始状态为
q
i
q_i
qi的样本数量,S是样本的数量。
状态转移概率矩阵的估计:
设样本中时刻t处于状态
q
i
q_i
qi,时刻t+1处于状态
q
j
q_j
qj的频数为
A
i
j
A_{ij}
Aij,那么状态转移概率矩阵的估计为:
a
^
i
j
=
A
i
j
∑
j
=
1
N
A
i
j
,
j
=
1
,
2
,
3
,
.
.
.
,
N
;
i
=
1
,
2
,
3
,
.
.
.
,
N
\hat{a}_{ij}=\frac{A_{ij}}{\sum\limits_{j=1}^NA_{ij}},\quad j=1,2,3,...,N;\quad i=1,2,3,...,N
a^ij=j=1∑NAijAij,j=1,2,3,...,N;i=1,2,3,...,N
发射概率矩阵的估计:
设样本中状态为
i
i
i并观测值为
j
j
j的频数
B
i
j
B_{ij}
Bij,那么状态为
i
i
i观测为
j
j
j的概率
b
i
j
b_{ij}
bij的估计为:
b
^
i
j
=
B
i
j
∑
j
=
1
M
B
i
j
,
j
=
1
,
2
,
3
,
.
.
.
,
M
;
i
=
1
,
2
,
3
,
.
.
.
,
N
\hat{b}_{ij}=\frac{B_{ij}}{\sum\limits_{j=1}^MB_{ij}},\quad j=1,2,3,...,M;\quad i=1,2,3,...,N
b^ij=j=1∑MBijBij,j=1,2,3,...,M;i=1,2,3,...,N
监督学习的方法就是拿频率来估计概率。
假设给定训练数据只包含S个长度为T的观测序列
x
=
{
x
1
,
x
2
,
,
.
.
.
,
x
S
}
\boldsymbol{x}=\{\boldsymbol{x}^1,\boldsymbol{x}^2,,...,\boldsymbol{x}^S\}
x={x1,x2,,...,xS}而没有对应的状态序列,目标是学习HMM模型的参数
λ
=
(
π
,
A
,
B
)
\boldsymbol{\lambda}=(\boldsymbol{\pi},A,B)
λ=(π,A,B)。将状态序列看作不可观测的隐数据
Y
\boldsymbol{Y}
Y,HMM模型事实上是一个含有隐变量的概率模型:
p
(
X
∣
λ
)
=
∑
Y
p
(
X
∣
Y
,
λ
)
p
(
Y
∣
λ
)
p(\boldsymbol{X}|\boldsymbol{\lambda})=\sum\limits_\boldsymbol{Y}p(\boldsymbol{X}|\boldsymbol{Y},\boldsymbol{\lambda})p(\boldsymbol{Y}|\boldsymbol{\lambda})
p(X∣λ)=Y∑p(X∣Y,λ)p(Y∣λ)
这个参数可以由EM算法实现。
确定数据的对数似然函数
所有观测数据写成
x
=
{
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
}
\boldsymbol{x}=\{x_1,x_2,x_3,...,x_T\}
x={x1,x2,x3,...,xT},所有的隐藏状态数据写成
y
=
{
y
1
,
y
2
,
,
.
.
.
,
y
T
}
\boldsymbol{y}=\{y_1,y_2,,...,y_T\}
y={y1,y2,,...,yT},则完全数据是
(
x
,
y
)
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
T
,
y
1
,
y
2
,
,
.
.
.
,
y
T
)
(\boldsymbol{x},\boldsymbol{y})=(x_1,x_2,x_3,...,x_T,y_1,y_2,,...,y_T)
(x,y)=(x1,x2,x3,...,xT,y1,y2,,...,yT),完全数据的对数似然函数是
log
p
(
x
,
y
∣
λ
)
\log{p(\boldsymbol{x},\boldsymbol{y}|\boldsymbol{\lambda})}
logp(x,y∣λ)。
Em算法的E步:求Q函数
Q
(
λ
,
λ
‾
)
=
E
y
[
log
p
(
y
,
y
∣
λ
)
∣
x
,
λ
‾
]
=
∑
y
log
p
(
x
,
y
∣
λ
)
p
(
x
,
y
∣
λ
‾
)
其中
λ
‾
\overline{\boldsymbol{\lambda}}
λ是HMM模型参数的当前估计值,
λ
\boldsymbol{\lambda}
λ是要极大化的HMM模型参数。
p
(
x
,
y
∣
λ
)
=
π
y
1
b
y
1
x
1
a
y
1
y
2
b
y
2
x
2
⋅
.
.
.
⋅
a
y
T
−
1
y
T
b
y
T
x
T
p(\boldsymbol{x},\boldsymbol{y}|\boldsymbol{\lambda})=\pi_{y_1}b_{y_1x_1}a_{y_1y_2}b_{y_2x_2}\cdot ...\cdot a_{y_{T-1}y_T}b_{y_Tx_T}
p(x,y∣λ)=πy1by1x1ay1y2by2x2⋅...⋅ayT−1yTbyTxT
所以:
Q
(
λ
,
λ
‾
)
=
∑
y
log
π
y
1
p
(
x
,
y
∣
λ
‾
)
+
∑
y
[
∑
t
=
1
T
−
1
log
a
y
t
y
t
+
1
]
p
(
x
,
y
∣
λ
‾
)
+
∑
y
[
∑
t
=
1
T
log
b
y
t
x
t
]
p
(
x
,
y
∣
λ
‾
)
Q(\boldsymbol{\lambda},\overline{\boldsymbol{\lambda}})=\sum\limits_\boldsymbol{y}\log{\pi_{y_1}p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})+\sum\limits_\boldsymbol{y}[\sum\limits^{T-1}_{t=1}\log{a_{y_ty_{t+1}}]p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})+\sum\limits_\boldsymbol{y}[\sum\limits_{t=1}^T\log{b_{y_tx_t}]p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})
Q(λ,λ)=y∑logπy1p(x,y∣λ)+y∑[t=1∑T−1logaytyt+1]p(x,y∣λ)+y∑[t=1∑Tlogbytxt]p(x,y∣λ)
∑ i = 1 N log π i p ( x , y 1 = q i ∣ λ ‾ ) + γ ( ∑ i = 1 N − 1 ) \sum\limits_{i=1}^N\log{\pi_ip(\boldsymbol{x},y_1=q_i|\overline{\boldsymbol{\lambda}})}+\gamma(\sum\limits^{N}_{i=1}-1) i=1∑Nlogπip(x,y1=qi∣λ)+γ(i=1∑N−1)
求偏导并令其等于0:
∂ ∂ π i [ ∑ i = 1 N log π i p ( x , y 1 = q i ∣ λ ‾ ) + γ ( ∑ i = 1 N − 1 ) ] = 0 \frac{\partial}{\partial \pi_i}[\sum\limits_{i=1}^N\log{\pi_ip(\boldsymbol{x},y_1=q_i|\overline{\boldsymbol{\lambda}})}+\gamma(\sum\limits^{N}_{i=1}-1)]=0 ∂πi∂[i=1∑Nlogπip(x,y1=qi∣λ)+γ(i=1∑N−1)]=0
得到:
p ( x , y 1 = q i ∣ λ ‾ ) + γ π i = 0 p(\boldsymbol{x},y_1=q_i|\overline{\boldsymbol{\lambda}})+\gamma\pi_i=0 p(x,y1=qi∣λ)+γπi=0
对i求和:
γ
=
−
p
(
x
∣
λ
‾
)
\gamma=-p(\boldsymbol{x}|\overline{\boldsymbol{\lambda}})
γ=−p(x∣λ)
所以,得到 π i \pi_i πi:
π i = p ( x , y 1 = q i ∣ λ ‾ ) p ( x ∣ λ ‾ ) \pi_i=\frac{p(\boldsymbol{x},y_1=q_i|\overline{\boldsymbol{\lambda}})}{p(\boldsymbol{x}|\overline{\boldsymbol{\lambda}})} πi=p(x∣λ)p(x,y1=qi∣λ)
第二项:
∑
y
[
∑
t
=
1
T
−
1
log
a
y
t
y
t
+
1
]
p
(
x
,
y
∣
λ
‾
)
=
∑
i
=
1
N
∑
j
=
1
N
∑
t
=
1
T
−
1
log
a
i
j
p
(
x
,
y
t
=
q
i
,
y
t
+
1
=
q
j
∣
λ
‾
)
\sum\limits_\boldsymbol{y}[\sum\limits^{T-1}_{t=1}\log{a_{y_ty_{t+1}}]p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})=\sum\limits_{i=1}^N\sum\limits_{j=1}^N\sum\limits_{t=1}^{T-1}\log{a_{ij}p(\boldsymbol{x},y_t=q_i,y_{t+1}=q_j|\overline{\boldsymbol{\lambda}})}
y∑[t=1∑T−1logaytyt+1]p(x,y∣λ)=i=1∑Nj=1∑Nt=1∑T−1logaijp(x,yt=qi,yt+1=qj∣λ)
类似第一项,应用
∑
j
=
1
N
=
1
\sum\limits_{j=1}^N=1
j=1∑N=1的拉格朗日乘子法可以求出:
a
i
j
=
∑
t
=
1
T
−
1
p
(
x
,
y
t
=
q
i
,
y
t
+
1
=
q
j
∣
λ
‾
)
∑
t
=
1
T
−
1
p
(
x
,
y
t
=
q
i
∣
λ
‾
)
a_{ij}=\frac{\sum\limits_{t=1}^{T-1}p(\boldsymbol{x},y_t=q_i,y_{t+1}=q_j|\overline{\boldsymbol{\lambda}})}{\sum\limits_{t=1}^{T-1}p(\boldsymbol{x},y_t=q_i|\overline{\boldsymbol{\lambda}})}
aij=t=1∑T−1p(x,yt=qi∣λ)t=1∑T−1p(x,yt=qi,yt+1=qj∣λ)
第三项:
∑
y
[
∑
t
=
1
T
log
b
y
t
x
t
]
p
(
x
,
y
∣
λ
‾
)
=
∑
j
=
1
N
∑
t
=
1
T
log
b
j
x
t
p
(
x
,
y
t
=
q
j
∣
λ
‾
)
\sum\limits_\boldsymbol{y}[\sum\limits_{t=1}^T\log{b_{y_tx_t}]p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})=\sum\limits_{j=1}^N\sum\limits_{t=1}^{T}\log{b_{jx_t}p(\boldsymbol{x},y_t=q_j|\overline{\boldsymbol{\lambda}})}
y∑[t=1∑Tlogbytxt]p(x,y∣λ)=j=1∑Nt=1∑Tlogbjxtp(x,yt=qj∣λ)
同样使用拉格朗日乘子法,求得:
b
j
k
=
∑
t
=
1
T
p
(
x
,
y
t
=
q
j
∣
λ
‾
)
I
(
x
t
=
v
k
)
∑
t
=
1
T
p
(
x
,
y
t
=
q
j
∣
λ
‾
)
b_{jk}=\frac{\sum\limits_{t=1}^Tp(\boldsymbol{x},y_t=q_j|\overline{\boldsymbol{\lambda}})I(x_t=v_k)}{\sum\limits_{t=1}^Tp(\boldsymbol{x},y_t=q_j|\overline{\boldsymbol{\lambda}})}
bjk=t=1∑Tp(x,yt=qj∣λ)t=1∑Tp(x,yt=qj∣λ)I(xt=vk)
将EM算法的参数式子分别用前向和后向概率算出的
γ
t
(
i
)
,
ξ
t
(
i
,
j
)
\gamma_t(i),\xi_t(i,j)
γt(i),ξt(i,j)表示则:
a
i
j
=
∑
t
=
1
T
−
1
ξ
t
(
i
,
j
)
∑
t
=
1
T
−
1
γ
t
(
i
)
a_{ij}=\frac{\sum\limits_{t=1}^{T-1}\xi_t(i,j)}{\sum\limits_{t=1}^{T-1}\gamma_t(i)}
aij=t=1∑T−1γt(i)t=1∑T−1ξt(i,j)
b i j = ∑ t = 1 , x t = v j T γ t ( i ) ∑ t = 1 T γ t ( i ) b_{ij}=\frac{\sum\limits_{t=1,x_t=v_j}^T\gamma_t(i)}{\sum\limits_{t=1}^T\gamma_t(i)} bij=t=1∑Tγt(i)t=1,xt=vj∑Tγt(i)
π i = γ 1 ( i ) \pi_i=\gamma_1(i) πi=γ1(i)
序列预测问题就是已知模型参数 λ = ( π , A , B ) \lambda=(\boldsymbol{\pi},A,B) λ=(π,A,B),给定观测序列 x \boldsymbol{x} x,求最有可能的状态序列 y \boldsymbol{y} y,即求 p ( y ∣ x ) p(\boldsymbol{y}|\boldsymbol{x}) p(y∣x)的最大值。一般有两种解法:近似解法与维特比解法。
近似算法的思想是,在每个时刻
t
t
t选择该时刻最有可能出现的状态
y
t
∗
y_t^*
yt∗,从而得到一个状态序列
y
=
(
y
i
∗
,
y
2
∗
,
.
.
.
,
y
t
∗
)
\boldsymbol{y}=(y_i^*,y_2^*,...,y_t^*)
y=(yi∗,y2∗,...,yt∗),将它作为预测的结果。
给定模型
λ
\boldsymbol{\lambda}
λ和观测
x
\boldsymbol{x}
x,在时刻
t
t
t处于状态
q
i
q_i
qi的概率:
γ
t
(
i
)
=
=
α
t
(
i
)
β
t
(
i
)
p
(
x
∣
λ
)
=
α
t
(
i
)
β
t
(
i
)
∑
j
=
1
N
α
t
(
i
)
β
t
(
i
)
\gamma_t(i)==\frac{\alpha_t(i)\beta_t(i)}{p(\boldsymbol{x}|\boldsymbol{\lambda})}=\frac{\alpha_t(i)\beta_t(i)}{\sum\limits_{j=1}^N\alpha_t(i)\beta_t(i)}
γt(i)==p(x∣λ)αt(i)βt(i)=j=1∑Nαt(i)βt(i)αt(i)βt(i)
在每一个时刻最有可能的状态
y
t
∗
y_t^*
yt∗是:
y
t
∗
=
arg max
1
≤
i
≤
N
[
γ
t
(
i
)
]
,
t
=
1
,
2
,
3...
,
T
y_t^*=\argmax_{1\leq i\leq N}[\gamma_t(i)],\quad t=1,2,3...,T
yt∗=1≤i≤Nargmax[γt(i)],t=1,2,3...,T
从而得到整个序列。
近似算法的优点是计算简单,其缺点是不能保证预测的状态序列整体是最有可能的状态序列,因为预测的状态序列可能有实际不发生的部分。事实上,上述方法得到的状态序列中有可能存在转移概率为0的相邻状态。尽管如此,近似算法仍然是有用的。
维特比算法实际是用动态规划解HMM模型序列预测问题,用动态规划求解概率最大路径(最优路径),一条路径对应一个状态序列。
根据图论,假设最优路径为
y
∗
\boldsymbol{y}^*
y∗,其中从起点到时刻
t
t
t的一段最优路径是
(
y
1
∗
,
y
2
∗
,
.
.
.
,
y
t
∗
)
(y_1^*,y_2^*,...,y_t^*)
(y1∗,y2∗,...,yt∗),则这部分路径对于后序最优路径(
y
t
∗
,
y
t
+
1
∗
,
y
t
+
2
∗
,
.
.
.
,
y
T
∗
y_t^*,y_{t+1}^*,y_{t+2}^*,...,y_T^*
yt∗,yt+1∗,yt+2∗,...,yT∗)的选取来说一定也是最优的。可以使用反证法来证明:假设存在另一条局部路径
(
y
1
,
,
y
2
,
,
.
.
.
,
y
t
,
)
(y_1^,,y_2^,,...,y_t^,)
(y1,,y2,,...,yt,)要优于
(
y
1
∗
,
y
2
∗
,
.
.
.
,
y
t
∗
)
(y_1^*,y_2^*,...,y_t^*)
(y1∗,y2∗,...,yt∗),那么它与(
y
t
∗
,
y
t
+
1
∗
,
y
t
+
2
∗
,
.
.
.
,
y
T
∗
y_t^*,y_{t+1}^*,y_{t+2}^*,...,y_T^*
yt∗,yt+1∗,yt+2∗,...,yT∗)拼接起来蝴蝶刀另一条更优的全局最优路径,与定义矛盾。
根据HMM模型的第一个假设,
y
t
+
1
y_{t+1}
yt+1仅仅只与
y
t
y_t
yt相关,所以网状图可以动态规划地搜索。定义:二维数组
δ
t
(
i
)
\delta_t(i)
δt(i)表示在时刻
t
t
t以
q
j
q_j
qj结尾的所有局部路径的最大概率。从第一步推到第T步,每次递推都在上一次的N条局部路径中挑选,所以复杂度为
O
(
T
N
)
O(TN)
O(TN)。为了得到路径,还需要定义一个二维数组
ψ
t
(
i
)
\psi_t(i)
ψt(i),记录每个状态的前驱。
δ t ( i ) = max y 1 , y 2 , . . . , y t − 1 p ( y t = q i , y t − 1 , . . . y 1 , x t , x t − 1 , . . . , x 1 ∣ λ ) \delta_t(i)=\max_{y_1,y_2,...,y_{t-1}}p(y_t=q_i,y_{t-1},...y_1,x_t,x_{t-1},...,x_1|\boldsymbol{\lambda}) δt(i)=y1,y2,...,yt−1maxp(yt=qi,yt−1,...y1,xt,xt−1,...,x1∣λ)
ψ t ( i ) = arg max 1 ≤ j ≤ N [ δ t − 1 ( j ) a j i ] \psi_t(i)=\arg\max_{1\leq j \leq N}[\delta_{t-1}(j)a_{ji}] ψt(i)=arg1≤j≤Nmax[δt−1(j)aji]
维特比算法:
ψ 1 ( i ) = 0 , i = 1 , 2 , 3 , . . , N \psi_1(i)=0,\quad i=1,2,3,..,N ψ1(i)=0,i=1,2,3,..,N
ψ t ( i ) = arg max 1 ≤ j ≤ N ( δ t ( j ) a j i ) , i = 1 , 2 , 3 , . . , N \psi_t(i)=\arg\max_{1\leq j \leq N}(\delta_t(j)a_{ji}),\quad i=1,2,3,..,N ψt(i)=arg1≤j≤Nmax(δt(j)aji),i=1,2,3,..,N
y T ∗ = arg max 1 ≤ j ≤ N δ T ( i ) y_T^*=\arg\max_{1\leq j \leq N}\delta_T(i) yT∗=arg1≤j≤NmaxδT(i)
举个例子:
上文中的盒子和球模型,状态集合为
Q
=
{
1
,
2
,
3
}
Q=\{1,2,3\}
Q={1,2,3},观测集合为
V
=
{
红
,
白
}
V=\{红,白\}
V={红,白},
A
=
[
0.5
0.2
0.3
0.3
0.5
0.2
0.2
0.3
0.5
]
A=
设
T
=
3
T=3
T=3,
x
=
(
红
,
白
,
红
)
\boldsymbol{x}=(红,白,红)
x=(红,白,红),求最优状态序列,即最优路径
y
∗
=
(
y
1
∗
,
y
2
∗
,
.
.
.
,
y
T
∗
)
\boldsymbol{y}^*=(y_1^*,y_2^*,...,y_T^*)
y∗=(y1∗,y2∗,...,yT∗)。
解:
δ 1 ( 1 ) = 0.2 × 0.5 = 0.1 , δ 1 ( 2 ) = 0.4 × 0.4 = 0.16 , δ 1 ( 3 ) = 0.4 × 0.7 = 0.28 \delta_1(1)=0.2\times0.5=0.1,\delta_1(2)=0.4\times0.4=0.16,\delta_1(3)=0.4\times0.7=0.28 δ1(1)=0.2×0.5=0.1,δ1(2)=0.4×0.4=0.16,δ1(3)=0.4×0.7=0.28
ψ
1
(
i
)
=
0
,
i
=
1
,
2
,
3
\psi_1(i)=0,\quad i=1,2,3
ψ1(i)=0,i=1,2,3
2. 在
t
=
2
t=2
t=2时,对每个状态
i
,
i
=
1
,
2
,
3
i,i=1,2,3
i,i=1,2,3:
δ
2
(
i
)
=
max
1
≤
j
≤
3
[
δ
1
(
j
)
a
j
i
]
b
i
白
,
i
=
1
,
2
,
3
,
.
.
,
N
\delta_2(i)=\max_{1\leq j \leq 3}[\delta_{1}(j)a_{ji}]b_{i白},\quad i=1,2,3,..,N
δ2(i)=1≤j≤3max[δ1(j)aji]bi白,i=1,2,3,..,N
δ
2
(
1
)
=
max
1
≤
j
≤
3
[
δ
1
(
j
)
a
j
i
]
b
i
白
=
max
j
{
o
.
1
×
0.5
,
0.16
×
0.3
,
0.28
×
0.2
}
×
0.5
=
0.028
ψ 2 ( 1 ) = 3 \psi_2(1)=3 ψ2(1)=3
同理:
δ 2 ( 2 ) = 0.0504 , ψ 2 ( 3 ) = 3 \delta_2(2)=0.0504,\quad\psi_2(3)=3 δ2(2)=0.0504,ψ2(3)=3
δ 2 ( 3 ) = 0.042 , ψ 2 ( 3 ) = 3 \delta_2(3)=0.042,\quad\psi_2(3)=3 δ2(3)=0.042,ψ2(3)=3
同样, t = 3 t=3 t=3:
δ 3 ( 1 ) = 0.00756 , ψ 3 ( 1 ) = 2 \delta_3(1)=0.00756,\quad\psi_3(1)=2 δ3(1)=0.00756,ψ3(1)=2
δ 3 ( 2 ) = 0.01008 , ψ 3 ( 2 ) = 2 \delta_3(2)=0.01008,\quad\psi_3(2)=2 δ3(2)=0.01008,ψ3(2)=2
δ 3 ( 3 ) = 0.0417 , ψ 3 ( 3 ) = 3 \delta_3(3)=0.0417,\quad\psi_3(3)=3 δ3(3)=0.0417,ψ3(3)=3
y 3 ∗ = arg max 1 ≤ j ≤ 3 δ 3 ( i ) = 3 y_3^*=\argmax_{1\leq j \leq 3}\delta_3(i)=3 y3∗=1≤j≤3argmaxδ3(i)=3
t = 1 , y 1 ∗ = ψ 2 ( y 2 ∗ ) = ψ 2 ( 3 ) = 3 t=1,\quad y_1^*=\psi_2(y_2^*)=\psi_2(3)=3 t=1,y1∗=ψ2(y2∗)=ψ2(3)=3
所以,最优路径为 y ∗ = ( y 1 ∗ , y 2 ∗ , y 3 ∗ ) = ( 3 , 3 , 3 ) \boldsymbol{y}^*=(y_1^*,y_2^*,y_3^*)=(3,3,3) y∗=(y1∗,y2∗,y3∗)=(3,3,3)。
hmmlearn是一个实现了hmm的python库,安装很简单,使用pip install hmmlearn
就行。
hmmlearn实现了三种HMM模型,分成两类:
对于MultinomialHMM的模型,使用比较简单,"startprob_"参数对应我们的初始状态概率向量 π \pi π, "transmat_"对应我们的状态转移矩阵 A A A, "emissionprob_"对应我们的发射概率矩阵 B B B。
对于连续观测状态的HMM模型,GaussianHMM类假设观测状态符合高斯分布,而GMMHMM类则假设观测状态符合混合高斯分布。一般情况下我们使用GaussianHMM即高斯分布的观测状态即可。以下对于连续观测状态的HMM模型,我们只讨论GaussianHMM类。
在GaussianHMM类中,"startprob_"参数对应我们的隐藏状态初始分布 π \pi π , "transmat_"对应我们的状态转移矩阵A, 比较特殊的是发射概率的表示方法,此时由于观测状态是连续值,我们无法像MultinomialHMM一样直接给出矩阵B。而是采用给出各个隐藏状态对应的观测状态高斯分布的概率密度函数的参数。
如果观测序列是一维的,则观测状态的概率密度函数是一维的普通高斯分布。如果观测序列是
N维的,则隐藏状态对应的观测状态的概率密度函数是N维高斯分布。高斯分布的概率密度函数参数可以用μ表示高斯分布的期望向量,Σ表示高斯分布的协方差矩阵。在GaussianHMM类中,“means”用来表示各个隐藏状态对应的高斯分布期望向量μ形成的矩阵,而“covars”用来表示各个隐藏状态对应的高斯分布协方差矩阵Σ形成的三维张量。
参考:深度剖析HMM
测试工具unnitest非常容易使用,首先是建立一个继承自TestCase的测试类,然后通过覆盖setUp()完成相关初始化,最后通过覆盖tearDown()方法清除测试中产生的数据,为以后的TestCase留下一个干净的环境。我们需要在测试类中编写以test_开头的测试函数,unnitest会在测试中自动执行以test_开头的测试函数,unnitest的使用框架:
import unittest
class XXXXX(unittest.TestCase):
def setUp(self):
# 自行编写
pass
if __name__ == '__main__':
unittest.main()
对离散HMM模型的测试代码:
# 计算平方误差 def s_error(A, B): return sqrt(np.sum((A-B)*(A-B)))/np.sum(B) class DiscreteHMM_Test(unittest.TestCase): def setUp(self): # 建立两个HMM,隐藏状态个数为4,X可能分布为10类 n_state =4 n_feature = 10 X_length = 1000 n_batch = 100 # 批量数目 self.n_batch = n_batch self.X_length = X_length self.test_hmm = hmm.DiscreteHMM(n_state, n_feature) self.comp_hmm = ContrastHMM(n_state, n_feature) self.X, self.Z = self.comp_hmm.module.sample(self.X_length*10) self.test_hmm.train(self.X, self.Z) def test_train_batch(self): X = [] Z = [] for b in range(self.n_batch): b_X, b_Z = self.comp_hmm.module.sample(self.X_length) X.append(b_X) Z.append(b_Z) batch_hmm = hmm.DiscreteHMM(self.test_hmm.n_state, self.test_hmm.x_num) batch_hmm.train_batch(X, Z) # 判断概率参数是否接近 # 初始概率判定没有通过!!! self.assertAlmostEqual(s_error(batch_hmm.start_prob, self.comp_hmm.module.startprob_), 0, 1) self.assertAlmostEqual(s_error(batch_hmm.transmat_prob, self.comp_hmm.module.transmat_), 0, 1) self.assertAlmostEqual(s_error(batch_hmm.emission_prob, self.comp_hmm.module.emissionprob_), 0, 1) def test_train(self): # 判断概率参数是否接近 # 单批量的初始概率一定是不准的 # self.assertAlmostEqual(s_error(self.test_hmm.start_prob, self.comp_hmm.module.startprob_), 0, 1) self.assertAlmostEqual(s_error(self.test_hmm.transmat_prob, self.comp_hmm.module.transmat_), 0, 1) self.assertAlmostEqual(s_error(self.test_hmm.emission_prob, self.comp_hmm.module.emissionprob_), 0, 1) def test_X_prob(self): X,_ = self.comp_hmm.module.sample(self.X_length) prob_test = self.test_hmm.X_prob(X) prob_comp = self.comp_hmm.module.score(X) self.assertAlmostEqual(s_error(prob_test, prob_comp), 0, 1) def test_predict(self): X, _ = self.comp_hmm.module.sample(self.X_length) prob_next = self.test_hmm.predict(X,np.random.randint(0,self.test_hmm.x_num-1)) self.assertEqual(prob_next.shape,(self.test_hmm.n_state,)) def test_decode(self): X,_ = self.comp_hmm.module.sample(self.X_length) test_decode = self.test_hmm.decode(X) _, comp_decode = self.comp_hmm.module.decode(X) self.assertAlmostEqual(s_error(test_decode, comp_decode), 0, 1) if __name__ == '__main__': unittest.main()
利用hmmlearn初始化一个高斯模型
class ContrastHMM():
def __init__(self, n_state, n_feature):
self.module = hmmlearn.hmm.GaussianHMM(n_components=n_state,covariance_type="full")
# 初始概率
self.module.startprob_ = np.random.random(n_state)
self.module.startprob_ = self.module.startprob_ / np.sum(self.module.startprob_)
# 转换概率
self.module.transmat_ = np.random.random((n_state,n_state))
self.module.transmat_ = self.module.transmat_ / np.repeat(np.sum(self.module.transmat_, 1),n_state).reshape((n_state,n_state))
# 高斯发射概率
self.module.means_ = np.random.random(size=(n_state,n_feature))*10
self.module.covars_ = .5 * np.tile(np.identity(n_feature), (n_state, 1, 1))
利用hmmlearn初始化一个离散HMM模型:
class ContrastHMM(): def __init__(self, n_state, n_feature): self.module = hmmlearn.hmm.MultinomialHMM(n_components=n_state) # 初始概率 self.module.startprob_ = np.random.random(n_state) self.module.startprob_ = self.module.startprob_ / np.sum(self.module.startprob_) # print self.module.startprob_ # 转换概率 self.module.transmat_ = np.random.random((n_state,n_state)) self.module.transmat_ = self.module.transmat_ / np.repeat(np.sum(self.module.transmat_, 1),n_state).reshape((n_state,n_state)) # print self.module.transmat_ # 发射概率 self.module.emissionprob_ = np.random.random(size=(n_state,n_feature)) self.module.emissionprob_ = self.module.emissionprob_ / np.repeat(np.sum(self.module.emissionprob_, 1),n_feature).reshape((n_state,n_feature)) # print self.module.emissionprob_
代码详情请见我的github,请大家帮忙点个star。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。