机器学习_HMM
HMM是一种结构简单的贝叶斯网络,主要用于时序数据建模,在语音识别,自然语言处理等领域有广泛应用。一、HMM概述1、HMM模型的网络结构上图为HMM模型的结构,其中[z1,z2,....,zn][z_1,z_2,....,z_n][z1,z2,....,zn]是不可观测的状态序列;[x1,x2,...,xn][x_1,x_2,...,x_n][x1,x2,...,xn]为观测序...
HMM是一种结构简单的贝叶斯网络,主要用于时序数据建模,在语音识别,自然语言处理等领域有广泛应用。
一、HMM概述
1、HMM模型的网络结构
上图为HMM模型的结构,其中 [ z 1 , z 2 , . . . . , z n ] [z_1,z_2,....,z_n] [z1,z2,....,zn]是不可观测的状态序列; [ x 1 , x 2 , . . . , x n ] [x_1,x_2,...,x_n] [x1,x2,...,xn]为观测序列。 z i z_i zi表示第 i i i时刻的状态变量,取值为 [ s 1 , s 2 , . . . , s N ] [s_1,s_2,...,s_N] [s1,s2,...,sN];。 x i x_i xi表示第 i i i时刻的观测值,取值为 [ o 1 , o 2 , . . . , o M ] [o_1,o_2,...,o_M] [o1,o2,...,oM]
2、HMM模型的三组参数
λ
=
[
A
,
B
,
π
]
\lambda=[A,B,\pi]
λ=[A,B,π]
-
A = [ a i , j ] N ∗ N A=[a_{i,j}]_{N*N} A=[ai,j]N∗N为状态转移矩阵。从前一个状态转移到后一个状态的概率。
a i , j = Pr ( z t + 1 = s j ∣ z t = s i ) , 1 ≤ i , j ≤ N a_{i,j}=\Pr(z_{t+1}=s_j|z_t=s_i),1\leq i, j\leq N ai,j=Pr(zt+1=sj∣zt=si),1≤i,j≤N -
B = [ b i , j ] N ∗ M B=[b_{i,j}]_{N*M} B=[bi,j]N∗M为观测概率分布矩阵,在当前状态下取某个观测值的概率
b i , j = Pr ( x t = o j ∣ z t = s i ) , 1 ≤ i ≤ N , 1 ≤ j ≤ M b_{i,j}=\Pr(x_t=o_j|z_t=s_i), 1\leq i\leq N, 1\leq j\leq M bi,j=Pr(xt=oj∣zt=si),1≤i≤N,1≤j≤M -
π = [ π 1 , . . . . , π N ] \pi=[\pi_1,....,\pi_N] π=[π1,....,πN]为初始概率矩阵, 表示初始时刻各状态出现概率。
π = Pr ( z 1 = s i ) , 1 ≤ i ≤ N \pi=\Pr(z_1=s_i),1\leq i\leq N π=Pr(z1=si),1≤i≤N注意: 1、状态序列是离散的,观测序列可以是离散的,也可以是连续的。 2、t观测值只与t时刻状态相关,t+1时刻状态值只与t时刻状态值相关
例子:HMM分词
假设我们相对如下这行话进行分词:
【欢迎来到我的博客】
上面有8个字,即8个时刻。
假设我们是这样分的:找到“终止字”,然后根据终止字来分词。即:对于这行字,“迎、到、我、的、客”是终止字,于是最终这么分词:欢迎/来到/我/的/博客。那么我们对每个字只需判断它是否为终止字,这就是所谓的隐变量。有
[
s
1
,
s
2
]
[s_1,s_2]
[s1,s2]=[‘是终止字’,‘不是终止字’]
下面用上面的知识对这个例子建立HMM的 λ = [ A , B , π ] \lambda=[A,B,\pi] λ=[A,B,π]
-
A 状态转移矩阵的确定:
A = [ a i , j ] 2 ∗ 2 , A=[a_{i,j}]_{2*2}, A=[ai,j]2∗2,
其中, a i , j = Pr ( z t + 1 = s j ∣ z t = s i ) , 1 ≤ i , j ≤ 2. a_{i,j}=\Pr(z_{t+1}=s_j|z_t=s_i),1\leq i, j\leq 2. ai,j=Pr(zt+1=sj∣zt=si),1≤i,j≤2. -
B观测矩阵的确定:
如果我们的目标文字使用Unicode编码,那么上面的任何一个字都是0~65535中的一个数,于是我们的观测就会是 [ o 1 , o 2 , . . . , o M ] , M = 65536 [o_1,o_2,...,o_M], M=65536 [o1,o2,...,oM],M=65536,于是观测矩阵就是个2*M的矩阵,如下:
B = [ b i , j ] 2 ∗ 65536 B=[b_{i,j}]_{2*65536} B=[bi,j]2∗65536
其中, b i , j = Pr ( x t = o j ∣ z t = s i ) , 1 ≤ i ≤ N , 1 ≤ j ≤ M b_{i,j}=\Pr(x_t=o_j|z_t=s_i), 1\leq i\leq N, 1\leq j\leq M bi,j=Pr(xt=oj∣zt=si),1≤i≤N,1≤j≤M -
π \pi π初始概率矩阵的确定
π = [ π 1 , π 2 ] π = [\pi_1,\pi_2] π=[π1,π2]
其中, π i = P ( z 1 = s i ) , i = 1 , 2 \pi_i= P(z_1=s_i),i=1,2 πi=P(z1=si),i=1,2HMM怎么生成观测序列【欢迎来到我的博客】? 假设有了 z1=“非终止字”这个状态,然后根据这个状态从65535个字中选出x1=“欢”这个字,然后根据状态转移矩阵,下一次转移到了Z2 =“终止字”,然后根据Z2从65535个字中选出了x2=“迎”这个字,这样,最终生成了这句话。
3、HMM模型关注的三个问题
- 1)概率计算问题:给定参数
λ
\lambda
λ和观测序列
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
x=[x_1,x_2,...,x_n]
x=[x1,x2,...,xn],计算
Pr
(
x
∣
λ
)
\Pr(x|\lambda)
Pr(x∣λ)。
使用前向后向算法(动态规划) - 2)学习问题:已知观测序列
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
x=[x_1,x_2,...,x_n]
x=[x1,x2,...,xn],求解参数
λ
\lambda
λ,使得
Pr
(
x
∣
λ
)
\Pr(x|\lambda)
Pr(x∣λ)最大,即求解
arg max
λ
Pr
(
x
∣
λ
)
\argmax_{\lambda} \Pr(x|\lambda)
λargmaxPr(x∣λ)。
采用Baum-Welch算法(EM) - 3)预测问题:已知
λ
\lambda
λ和观测序列
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
x=[x_1,x_2,...,x_n]
x=[x1,x2,...,xn],求隐藏的状态序列的概率。即求
Pr
(
z
∣
x
,
λ
)
\Pr(z|x,\lambda)
Pr(z∣x,λ),例已知参数和观测值,求每个字是不是终止字,这样就可以分词了啊。
采用Viterbi算法(动态规划)
二、HMM关注的问题求解
1、概率计算问题
-
首先给出直接求解的方法,它的缺点是时间复杂度极高。
(注意:下面的 x i x_i xi代表的都是一个已知的具体的观测值, [ x 1 , x 2 , x 3 ] [x_1,x_2,x_3] [x1,x2,x3]=[红白红])
-
给出前向后向算法,时间复杂度极大地减小。
下图给出了前向概率和后向概率的表示, α t ( i ) \alpha_t(i) αt(i)为给定 λ \lambda λ的条件下,计算时刻t观测值为i且观测值为 [ y 1 , y 2 , . . . , y t ] [y_1,y_2,...,y_t] [y1,y2,...,yt]的前向概率。
下面给出一道例题来直观理解前向算法的迭代过程
-
前向后向算法的关系
Pr ( z t = s i , x ∣ λ ) = α t ( i ) β t ( i ) \Pr(z_t=s_i,x|\lambda)=\alpha_t(i)\beta_t(i) Pr(zt=si,x∣λ)=αt(i)βt(i) -
初步给出了预测问题的近似解。
已知 λ \lambda λ和观测序列 x = [ x 1 , x 2 , . . . , x n ] x=[x_1,x_2,...,x_n] x=[x1,x2,...,xn],求t时刻隐藏的状态序列的概率。即求 γ t ( i ) = Pr ( z t = s i ∣ x , λ ) \gamma_t(i)=\Pr(z_t=s_i|x,\lambda) γt(i)=Pr(zt=si∣x,λ),它求的是单个状态的概率。
γ t ( i ) = α t ( i ) β t ( i ) ∑ i = 1 N α t ( i ) β t ( i ) \gamma_t(i)=\frac{\alpha_t(i)\beta_t(i)}{\sum_{i=1}^N\alpha_t(i)\beta_t(i)} γt(i)=∑i=1Nαt(i)βt(i)αt(i)βt(i)
有了上式,我们可以根据观测序列和 λ \lambda λ,求得每个字是否为"停止字"的概率,假设是的概率大于否的概率,则判定这个字是停止字,从而进行分词处理。
两个状态的联合概率分布 ξ t ( i , j ) = Pr ( z t = s i , z t + 1 = s j ∣ x , λ ) \xi_t(i,j)=\Pr(z_t=s_i,z_{t+1}=s_j|x,\lambda) ξt(i,j)=Pr(zt=si,zt+1=sj∣x,λ)
2、学习问题
- 给出观测序列和状态序列(监督学习)
以HMM分词为例,你已经拿到了语料库,即有每个字的(B,M,E,S)四种状态。训练得到参数,在测试语料上分词。此时利用大数定律来学习参数 λ \lambda λ
- 只给了观测序列(无监督学习)
采用Baum-Welch算法(可以看成EM算法的推广)
推导就是EM算法的E步(求Q)和M步(求参数),这里不做赘述。下图就是最终得到的算法。
3、预测问题
Viterbi算法
对比前向算法,发现只是把
Σ
\Sigma
Σ换为
max
\max
max
直观例题理解
当球为红白红时,三次从哪个盒子摸出的概率最大。
参考文章:参考文章
更多推荐
所有评论(0)