一文读懂NLP之隐马尔科夫模型(HMM)详解加python实现
- 1 隐马尔科夫模型
-
- 1.1 HMM解决的问题
- 1.2 HMM模型的定义
-
- 1.2.1HMM的两个假设
- 1.2.2 HMM模型
- 1.3 HMM模型的三个基本问题
- 2 概率计算问题及算法
-
- 2.1 直接计算法
- 2.2 前向算法
- 2.3 后向算法
- 2.4 一些概率与期望值的计算
- 3 模型训练问题及算法
-
- 3.1 监督学习——最大似然估计
- 3.2 非监督学习——EM算法
- 3.3 Baum-Welch算法
- 4 序列预测问题及算法
-
- 4.1 近似解法
- 4.2 维特比算法(Viterbi algorithm)
- 5 hmmlearn使用
-
- 5.1 pythonceshi工具unnitest
- 5.2 离散HMM测试
- 5.3 HMM测试
1 隐马尔科夫模型
本文主要介绍NLP领域中很重要的一个模型——隐马尔科夫模型(Hidden Markov Model,HMM)。希望读完本文后,大家能够清楚地理解HMM并能够应用到实际中。
隐马尔科夫模型是结构最简单的动态贝叶斯网(dynamic Bayesian network,也被称作有向图模型),HMM是可以用于标注问题的统计数学模型,描述由隐藏的马尔科夫链随机生成观测序列的过程,属于生成模型。HMM模型在语音识别、自然语言处理、生物信息、模式识别等领域有广泛的应用。
1.1 HMM解决的问题
首先看看什么样的问题可以使用HMM模型解决。
使用HMM模型来解决的问题一般有两个特征:
- 1) 问题是基于序列的,比如时间序列、状态序列。
- 2 )问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序列。
如果问题有了这两个特征,那么这个问题一般可以使用HMM模型尝试解决,这样的问题在生活中是很多的。例如,说一句话,发出的声音是观测序列,想表达的意思是隐藏状态序列;写文章的过程可以想象为先在脑海中构思好一个满足语法的词性序列,然后再将每个词性填充为具体的词语。
1.2 HMM模型的定义
隐马尔科夫模型是关于时序的概率模型,描述由一个隐藏的马尔科夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程(摘自《统计学习方法》)。隐藏的马尔科夫链随机生成的状态的序列,称为状态序列(state sequence),记作
y
\boldsymbol{y}
y;每个状态生成一个观测,而由此产生的观测的随机序列,称为观测序列(observation sequence),记作
x
\boldsymbol{x}
x。序列的每一个位置又可以看作一个时刻。
HMM模型示意图
1.2.1HMM的两个假设
首先介绍一下马尔科夫假设:每个事件的发生概率只取决于前一个事件。将满足该假设的连续多个事件串联在一起,就构成了马尔科夫链。在NLP语境下,可以将事件具象为单词,于是马尔科夫模型就是二元语法。
- 第一个假设:将马尔科夫假设作用于状态序列,假设当前状态
y
t
y_t
y
t
−
1
y_{t-1}
y
\boldsymbol{y}
p
(
y
t
∣
y
t
−
1
,
x
t
−
1
,
y
t
−
2
,
x
t
−
2
,
y
t
−
3
,
x
t
−
3
,
.
.
.
,
y
1
,
x
1
)
=
p
(
y
t
∣
y
t
−
1
)
,
t
=
1
,
2
,
3
,
.
.
.
,
T
p(y_t|y_{t-1},x_{t-1},y_{t-2},x_{t-2},y_{t-3},x_{t-3},…,y_{1},x_1)=p(y_t|y_{t-1}), t=1,2,3,…,T
有了隐马尔科夫链,如何建立与观测序列
x
\boldsymbol{x}
x的联系呢?HMM做了第二个假设:
- 第二个假设:任意时刻的观测
x
t
x_t
y
t
y_t
p
(
x
t
∣
y
T
,
x
T
,
y
t
−
1
,
x
t
−
1
,
.
.
.
,
y
t
+
1
,
x
t
+
1
,
y
t
,
y
t
−
1
,
x
t
−
1
,
.
.
.
y
1
,
x
1
)
=
p
(
x
t
∣
y
t
)
,
t
=
1
,
2
,
3
,
.
.
.
,
T
p(x_t|y_T,x_T,y_{t-1},x_{t-1},…,y_{t+1},x_{t+1},y_t,y_{t-1},x_{t-1},…y_1,x_1)=p(x_t|y_t),t=1,2,3,…,T
1.2.2 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):
-
π
\boldsymbol{\pi}
- 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 |
按照下面的方法抽球,产生一个球的颜色观察序列:
- 从4个盒子里以等概率随机选取一个盒子,从这个盒子里随机抽取一个球,记录颜色后,放回;
- 从当前盒子随机转移到下一个盒子,规则是:如果当前盒子是盒子1,那么下一个盒子一定是盒子2,如果当前是盒子2或者3,那么分别以概率0.4和0.6转移到左边或右边的盒子,如果当前盒子是4,那么各以0.5的概率停留在盒子4或者转移到盒子3;
- 确定转移盒子后,再从这个盒子里随机抽取一个球,记录其颜色,放回;
- 重复2,3步骤3次
一共抽取出来5个球,得到一个球的颜色观察序列:
x
=
{
红
,
红
,
白
,
白
,
红
}
\boldsymbol{x}=\{\color{red}红,红,\color{black}白,白,\color{red}红\}
x={红,红,白,白,红}
在这个过程中,观察者只能观测到球的颜色序列,观测不到球是从哪个盒子取出的,即观察不到盒子的序列。
这个例子中有两个随机序列,一个是盒子的序列(状态序列),一个是球的颜色的观测序列(观测序列),前者是隐藏的,后者是可以观测的。根据所给的条件可以明确状态集合、观测集合、序列长度以及模型的三要素。
- 状态集合是
Q
=
{
盒
子
1
,
盒
子
2
,
盒
子
3
,
盒
子
4
}
,
N
=
4
Q=\{盒子1,盒子2,盒子3,盒子4\},N=4
- 观测集合是
V
=
{
红
,
白
}
V=\{\color{red}红,\color{black}白\}
- 状态序列和观测序列的长度
T
=
5
T=5
- 初始状态概率向量为
π
=
(
0.25
,
0.25
,
0.25
,
0.25
)
T
\boldsymbol{\pi}=(0.25,0.25,0.25,0.25)^T
- 状态转移概率矩阵
A
=
[
0
1
0
0
0.4
0
0.6
0
0
0.4
0
0.6
0
0
0.5
0.5
]
A=[01000.400.6000.400.6000.50.5]
- 发射概率矩阵
B
=
[
0.5
0.5
0.3
0.7
0.6
0.4
0.8
0.2
]
B=[0.50.50.30.70.60.40.80.2]
1.3 HMM模型的三个基本问题
有了HMM模型之后,如何使用模型呢?HMM模型一个可以解决三个问题:
- 概率计算问题:给定模型参数
λ
=
(
π
,
A
,
B
)
\lambda=(\boldsymbol{\pi},A,B)
x
\boldsymbol{x}
λ
\lambda
p
(
x
∣
λ
)
p(\boldsymbol{x}|\lambda)
- 模型训练问题:给定训练集
(
x
(
i
)
,
y
(
i
)
)
(\boldsymbol{x}^{(i)},\boldsymbol{y}^{(i)})
λ
=
(
π
,
A
,
B
)
\lambda=(\boldsymbol{\pi},A,B)
p
(
x
∣
λ
)
p(\boldsymbol{x}|\lambda)
- 序列预测问题:也称为解码问题,已知模型参数
λ
=
(
π
,
A
,
B
)
\lambda=(\boldsymbol{\pi},A,B)
x
\boldsymbol{x}
y
\boldsymbol{y}
p
(
y
∣
x
)
p(\boldsymbol{y}|\boldsymbol{x})
2 概率计算问题及算法
概率计算问题,也就是在给定的模型参数三元组的条件生成观测序列的过程。给定模型参数
λ
=
(
π
,
A
,
B
)
\lambda=(\boldsymbol{\pi},A,B)
λ=(π,A,B)和一个观测序列
x
\boldsymbol{x}
x,,计算在这个模型参数
λ
\lambda
λ下,观测序列出现的最大概率,即
p
(
x
∣
λ
)
p(\boldsymbol{x}|\lambda)
p(x∣λ)的最大值。先介绍概念上可行但计算上不行的直接计算法(暴力解法),然后介绍前向算法与后向算法。
2.1 直接计算法
给定模型参数
λ
=
(
π
,
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
p(x,y|λ)=p(x|y,λ)p(y|λ)=πy1by1x1ay1y2by2x2ay2y3by3x3...ayT−1yTbyTxT
p(x,y∣λ)=p(x∣y,λ)p(y∣λ)=πy1by1x1ay1y2by2x2ay2y3by3x3...ayT−1yTbyTxT
然后,对所有可能的状态序列
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
p(x|λ)=∑yp(x,y|λ)=∑yp(x|y,λ)p(y|λ)=∑y1,y2,y3,...,yTπy1by1x1ay1y2by2x2ay2y3by3x3...ayT−1yTbyTxT
p(x∣λ)=y∑p(x,y∣λ)=y∑p(x∣y,λ)p(y∣λ)=y1,y2,y3,...,yT∑πy1by1x1ay1y2by2x2ay2y3by3x3...ayT−1yTbyTxT
利用这个公式计算量很大,复杂度是
O
(
T
N
T
)
O(TN^T)
O(TNT),在实际中是不可行的。
2.2 前向算法
首先需要定义前向概率:给定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∣λ)
前向算法:
- 输入:HMM模型参数
λ
\boldsymbol{\lambda}
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
)
\boldsymbol{x}=(x_1,x_2,x_3,…,x_t)
- 输出:观测序列概率
p
(
x
∣
λ
)
p(\boldsymbol{x}|\boldsymbol{\lambda})
算法步骤:
- 初始:
根据π
\boldsymbol{\pi}
t
=
1
t=1
y
1
=
q
i
y_1=q_i
π
i
\pi_i
B
\boldsymbol{B}
y
1
=
q
i
y_1=q_i
x
1
x_1
b
i
x
1
b_{ix_1}
α
1
(
i
)
=
π
i
b
i
x
1
\alpha_1(i)=\pi_ib_{ix_1}
- 递推:
当t
=
2
t=2
A
\boldsymbol{A}
y
1
=
q
j
y_1=q_j
y
2
=
q
i
y_2=q_i
a
j
i
a_{ji}
p
(
y
2
=
q
i
,
y
1
=
q
j
,
x
1
∣
λ
)
=
α
1
(
j
)
a
j
i
p(y_2=q_i,y_1=q_j,x_1|\boldsymbol{\lambda})=\alpha_1(j)a_{ji}
y
1
y_1
y
2
=
q
i
y_2=q_i
y
1
y_1
∑
j
=
1
N
α
1
(
j
)
a
j
i
\sum\limits_{j=1}^N\alpha_1(j)a_{ji}
α
t
(
i
)
\alpha_t(i)
t
=
2
t=2
y
2
=
q
i
y_2=q_i
x
2
x_2
b
i
x
2
b_{ix_2}
α
2
(
i
)
=
[
∑
j
=
1
N
α
1
(
j
)
a
j
i
]
b
i
x
2
\alpha_2(i)=[\sum\limits_{j=1}^N\alpha_1(j)a_{ji}]b_{ix_2}
对
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
∣
λ
)
αT(i)=p(x1,x2,x3,...,xT,yT=qi|λ)=p(x,yT=qi|λ)
αT(i)=p(x1,x2,x3,...,xT,yT=qi∣λ)=p(x,yT=qi∣λ)
所以:
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=[0.50.20.30.30.50.20.20.30.5]
A=⎣⎡0.50.30.20.20.50.30.30.20.5⎦⎤ ,
B
=
[
0.5
0.5
0.4
0.6
0.7
0.3
]
B=[0.50.50.40.60.70.3]
B=⎣⎡0.50.40.70.50.60.3⎦⎤ ,
π
=
(
0.2
,
0.4
,
0.4
)
T
\pi=(0.2,0.4,0.4)^T
π=(0.2,0.4,0.4)T
设
T
=
3
T=3
T=3,
x
=
(
红
,
白
,
红
)
\boldsymbol{x}=(红,白,红)
x=(红,白,红),用前向算法来计算
p
(
x
∣
λ
)
p(\boldsymbol{x}|\boldsymbol{\lambda})
p(x∣λ)。
解:
- 计算初值:
α
1
(
1
)
=
π
1
b
1
x
1
=
0.2
×
0.5
=
0.10
\alpha_1(1)=\pi_1b_{1x_1}=0.2\times0.5=0.10
α
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
2.3 后向算法
类似前向算法,定义:给定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,λ)
后向算法:
- 输入:HMM模型参数
λ
\boldsymbol{\lambda}
x
=
(
x
1
,
x
2
,
x
3
,
.
.
.
,
x
t
)
\boldsymbol{x}=(x_1,x_2,x_3,…,x_t)
- 输出:观测序列概率
p
(
x
∣
λ
)
p(\boldsymbol{x}|\boldsymbol{\lambda})
- 当
t
=
T
t=T
β
T
(
i
)
=
p
(
这
里
没
东
西
∣
y
T
=
q
i
,
λ
)
=
1
\beta_T(i)=p(这里没东西|y_T=q_i,\boldsymbol{\lambda})=1
这里可以这么理解:按理说好需要看看T时刻过后是什么观测值,但是T时刻之后没有观测值了,不管T时刻状态是什么,之后就是没有观测值,所以没有观测值的概率为1,且与状态无关。 - 对
t
=
T
−
1
t=T-1
已知β
T
(
j
)
\beta_T(j)
y
T
=
q
j
y_T=q_j
y
T
−
1
y_{T-1}
y
T
−
1
=
q
i
y_{T-1}=q_i
a
i
j
a_{ij}
根据β
T
−
1
(
i
)
\beta_{T-1}(i)
T
−
1
T-1
y
T
−
1
=
q
i
y_{T-1}=q_i
x
T
x_T
y
T
=
q
j
y_T=q_j
x
T
x_T
b
j
x
T
b_{jx_T}
β
T
−
1
(
i
)
=
∑
j
=
1
N
a
i
j
b
j
x
T
β
T
(
j
)
\beta_{T-1}(i)=\sum\limits^N_{j=1}a_{ij}b_{jx_T}\beta_T(j)
对t
=
T
−
1
,
T
−
2
,
.
.
.
,
1
t=T-1,T-2,…,1
b
j
x
t
=
p
(
x
t
∣
y
t
=
q
j
,
λ
)
)
b_{jx_t}=p(x_t|y_t=q_j,\boldsymbol{\lambda}))
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
,
λ
)
bjxt+1βt+1(j)=p(xt+1|yt+1=qj,λ)p(xt+2,xt+3,...,xT|yt+1=qj,λ)=p(xt+1,xt+2,...,xT|yt+1=qj,λ)
bjxt+1βt+1(j)=p(xt+1∣yt+1=qj,λ)p(xt+2,xt+3,...,xT∣yt+1=qj,λ)=p(xt+1,xt+2,...,xT∣yt+1=qj,λ)
按照条件概率来理解:在
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
,
λ
)
aijbjxt+1βt+1(j)=p(xt+1,xt+2,...,xT|yt+1=qj,λ)aij=p(xt+1,xt+2,...,xT|yt+1=qj,λ)p(yt+1=qj|yt=qi,λ))=p(xt+1,xt+2,...,xT,yt+1=qj,|yt=qi,λ)
aijbjxt+1βt+1(j)=p(xt+1,xt+2,...,xT∣yt+1=qj,λ)aij=p(xt+1,xt+2,...,xT∣yt+1=qj,λ)p(yt+1=qj∣yt=qi,λ))=p(xt+1,xt+2,...,xT,yt+1=qj,∣yt=qi,λ)
β
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)=p(xt+1,xt+2,...,xT|yt=qi,λ)=∑yt+1p(xt+1,xt+2,...,xT,yt+1=qj,|yt=qi,λ)=N∑j=1aijbjxt+1βt+1(j)
βt(i)=p(xt+1,xt+2,...,xT∣yt=qi,λ)=yt+1∑p(xt+1,xt+2,...,xT,yt+1=qj,∣yt=qi,λ)=j=1∑Naijbjxt+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)
2.4 一些概率与期望值的计算
利用前向概率和后向概率,可以得到关于单个状态和两个状态概率的计算公式。
- 给定模型
λ
\boldsymbol{\lambda}
x
\boldsymbol{x}
t
t
q
i
q_i
γ
t
(
i
)
\gamma_t(i)
γ
t
(
i
)
=
p
(
y
t
=
q
i
∣
x
,
λ
)
\gamma_t(i)=p(y_t=q_i|\boldsymbol{x},\boldsymbol{\lambda})
可以用过前向和后向算法来算:
γ
t
(
i
)
=
p
(
y
t
=
q
i
∣
x
,
λ
)
=
p
(
y
t
=
q
i
,
x
∣
λ
)
p
(
x
∣
λ
)
γt(i)=p(yt=qi|x,λ)=p(yt=qi,x|λ)p(x|λ)
γt(i)=p(yt=qi∣x,λ)=p(x∣λ)p(yt=qi,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
∣
λ
)
ξt(i,j)=p(yt=qi,yt+1=qj|x,λ)=p(yt=qi,yt+1=qj,x|λ)p(x,λ)=p(yt=qi,yt+1=qj,x|λ)N∑i=1N∑j=1p(yt=qi,yt+1=qj,x|λ)
ξt(i,j)=p(yt=qi,yt+1=qj∣x,λ)=p(x,λ)p(yt=qi,yt+1=qj,x∣λ)=i=1∑Nj=1∑Np(yt=qi,yt+1=qj,x∣λ)p(yt=qi,yt+1=qj,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
)
p(yt=qi,yt+1=qj,x|λ)=p(yt=qi,x1,x2,...,xt|λ)p(yt+1|yt,λ)p(xt+1|yt+1,λ)p(xt+2,xt+3,...,xT|yt+1=qj,λ)=αt(i)aijbjxt+1βt+1(j)
p(yt=qi,yt+1=qj,x∣λ)=p(yt=qi,x1,x2,...,xt∣λ)p(yt+1∣yt,λ)p(xt+1∣yt+1,λ)p(xt+2,xt+3,...,xT∣yt+1=qj,λ)=αt(i)aijbjxt+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
\boldsymbol{x}
q
i
q_i
∑
t
=
1
T
γ
t
(
i
)
\sum\limits_{t=1}^T\gamma_t(i)
- 在观测
x
\boldsymbol{x}
q
i
q_i
∑
t
=
1
T
−
1
γ
t
(
i
)
\sum\limits_{t=1}^{T-1}\gamma_t(i)
- 在观测
x
\boldsymbol{x}
q
i
q_i
q
j
q_j
∑
t
=
1
T
−
1
ξ
t
(
i
,
j
)
\sum\limits_{t=1}^{T-1}\xi_t(i,j)
3 模型训练问题及算法
给定训练集
(
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∣λ)最大。根据训练数据是否有状态序列数据分为:完全数据和非完全数据,分别使用监督学习和非监督学习实现。
3.1 监督学习——最大似然估计
在监督学习中,我们使用极大似然法来估计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
监督学习的方法就是拿频率来估计概率。
3.2 非监督学习——EM算法
假设给定训练数据只包含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
∣
λ
‾
)
Q(λ,¯λ)=Ey[logp(y,y|λ)|x,¯λ]=∑ylogp(x,y|λ)p(x,y|¯λ)
Q(λ,λ)=Ey[logp(y,y∣λ)∣x,λ]=y∑logp(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∣λ)
- EM算法的M步:极大化Q函数求模型的参数
第一项:
∑
y
log
π
y
1
p
(
x
,
y
∣
λ
‾
)
=
∑
i
=
1
N
log
π
i
p
(
x
,
y
1
=
q
i
∣
λ
‾
)
\sum\limits_\boldsymbol{y}\log{\pi_{y_1}p(\boldsymbol{x},\boldsymbol{y}|\overline{\boldsymbol{\lambda}}})=\sum\limits_{i=1}^N\log{\pi_ip(\boldsymbol{x},y_1=q_i|\overline{\boldsymbol{\lambda}})}