HMM在自然语言处理中的应用

读者可以去我的github阅读一份可读性高的HMM用于NER识别的代码,欢迎点star,欢迎fork


一、HMM基本概念的介绍

以一个例子介绍HMM,可以避开抽象的定义:
例如:N个袋子,每个袋子中有M种不同颜色的球。一实验员根据某一概率分布选择一个袋子,然后根据袋子中不同颜色球的概率分布随机取出一个球,并报告该球的颜色。对局外人:可观察的过程是不同颜色球的序列,而袋子的序列是不可观察的。每只袋子对应HMM中的一个状态;球的颜色对应于HMM中状态的输出。

状态转移概率矩阵为 A = a i j A = a_{ij} A=aij, a i j a_{ij} aij为实验员从一只袋子(状态 s i s_i si) 转向另一只袋子(状态 S j S_j Sj ) 取球的概率。
从状态 S j S_j Sj 观察到某一特定符号 v k v_k vk 的概率分布矩阵为:
B = b j ( k ) B=b_j(k) B=bj(k)
其中, b j ( k ) b_j(k) bj(k)为实验员从第 j j j个袋子中取出第 k k k种颜色的球的概率。

为了方便,一般将HMM记为: μ = ( A , B , π ) \mu = (A,B,\pi) μ=(A,B,π)

HMM的三个问题:

  • 在给定模型 μ = ( A , B , π ) \mu =(A, B, \pi) μ=(A,B,π) 和观察序列 O = O 1 , O 2 … O T O=O_1,O_2…O_T OO1,O2OT的情况下,怎样快速计算概率 p ( O ∣ μ ) p(O|\mu) p(Oμ)?
  • 在给定模型 μ = ( A , B , π ) \mu=(A, B,\pi) μ=(A,B,π)和观察序列 O = O 1 , O 2 … O T O=O_1,O_2…O_T OO1,O2OT的情况下,如何选择在一定意义下“最优”的状态序列 Q = q 1 , q 2 , . . . , q T Q = q_1, q_2,...,q_T Q=q1,q2,...,qT,使得该状态序列“最好地解释”观察序列?
  • 给定一个观察序列 O = O 1 , O 2 , … , O T O=O_1,O_2,…,O_T OO1,O2,,OT ,如何根据最大似然估计来求模型的参数值?即如何调节模型的参数,使得 p ( O ∣ μ ) p(O|\mu) p(Oμ)最大?

二、 HMM第一个问题的求解

p ( O ∣ μ ) p(O|\mu) p(Oμ)可以由如下式计算

p ( O ∣ μ ) = ∑ Q p ( O , Q ∣ μ ) = ∑ Q p ( Q ∣ μ ) ∗ p ( O ∣ Q , μ ) p(O|\mu) = \sum_Q p(O,Q|\mu) = \sum_Qp(Q|\mu)*p(O|Q,\mu) p(Oμ)=Qp(O,Qμ)=Qp(Qμ)p(OQ,μ)

其中

P ( Q ∣ μ ) = π q 1 ∗ a q 1 q 2 ∗ a q 2 q 3 ∗ . . . ∗ a q T − 1 q T P(Q|\mu) = \pi_{q_1}*a_{q_1q_2}*a_{q_2q_3}*...*a_{q_{T-1}q_T} P(Qμ)=πq1aq1q2aq2q3...aqT1qT

p ( O ∣ Q , μ ) = b q 1 ( O 1 ) ∗ b q 2 ( O 2 ) ∗ . . . ∗ b q T ( O T ) p(O|Q,\mu) = b_{q_1}(O_1)*b_{q_2}(O_2)*...*b_{q_T}(O_T) p(OQ,μ)=bq1(O1)bq2(O2)...bqT(OT)
相当于对所有Q的可能性的求和。

遍历计算复杂度太高,利用动态规划降低复杂度。

α t ( i ) = p ( O 1 O 2 . . . O t , q t = S i ∣ μ ) \alpha_t(i) = p(O_1O_2...O_t,q_t = S_i|\mu) αt(i)=p(O1O2...Ot,qt=Siμ)
如果可以高效地计算 α t ( i ) \alpha_t(i) αt(i),就可以高效地求得 P ( O ∣ μ ) P(O|\mu) P(Oμ)

事实上有如下递推公式:
α t + 1 ( j ) = [ ∑ i = 1 N α t ( i ) a i j ] ∗ b j ( O t + 1 ) \alpha_{t+1}(j) = [\sum_{i=1}^N \alpha_t(i)a_{ij}]*b_j(O_{t+1}) αt+1(j)=[i=1Nαt(i)aij]bj(Ot+1)

三、 HMM第二个问题的求解

问题二的本质是如何发现最优状态序列去最好地解释观察序列

一种解释是:状态序列中每个状态都单独地具有概率,对于每个时刻t,寻找 q t q_t qt使得 γ t ( i ) = p ( q t = S i ∣ O , μ ) 最 大 \gamma_t(i) = p(q_t = S_i|O,\mu)最大 γt(i)=p(qt=SiO,μ)

另一种解释:在给定模型 μ \mu μ 和观察序列 O O O的条件下求概率最大的状态序列:
Q ~ = a r g m a x p ( Q ∣ O , μ ) \tilde Q = arg max p(Q|O,\mu) Q~=argmaxp(QO,μ)

Viterbi算法:动态规划最优状态序列
定义:Viterbi 变量是在时间 δ t ( i ) \delta_t(i) δt(i)时,模型沿着某一条路径到达 S i S_i Si,输出观察序列$O=O_1O_2 …O_t $的最大概率为:
δ t ( i ) = q 1 , q 2 , . . . , q t − 1 m a x p ( q 1 , q 2 , . . . , q t = S i , O 1 O 2 . . . O t ∣ μ ) \delta_t(i) = \mathop{}_{q_1,q_2,...,q_{t-1}}^{max} p(q_1,q_2,...,q_t = S_i,O_1O_2...O_t|\mu) δt(i)=q1,q2,...,qt1maxp(q1,q2,...,qt=Si,O1O2...Otμ)

递归算法: δ t + 1 ( i ) = j m a x [ δ t ( j ) ⋅ a j i ] ⋅ b i ( O t + 1 ) \delta_{t+1}(i) = \mathop{}_j^{max}[\delta_t(j)\cdot a_{ji}]\cdot b_i(O_{t+1}) δt+1(i)=jmax[δt(j)aji]bi(Ot+1)

解释一下这个式子:
模型沿着某一条路径到达 S i + 1 S_{i+1} Si+1,输出观察序列 O = O 1 O 2 . . . O t + 1 O = O_1O_2...O_{t+1} O=O1O2...Ot+1的最大概率为在t时刻到达状态中选取使此式概率最大的j,因此最大概率之间构成递推关系,我们可以用Viterbi算法去求解。

四、HMM第三个问题的求解:

参数学习

给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2OT,如何根据最大似然估计来求模型的参数值?或者说如何调节模型 μ \mu μ的参数,使得 p ( O ∣ μ ) p(O|\mu) p(Oμ) 最大?即估计模型中的 π i , a i j , b j ( k ) \pi_i, a_{ij}, b_j(k) πi,aij,bj(k)使得观察序列O的概率$p(O|\mu) $最大。

即通过观察序列去重建模型中的参数

如果产生观察序列 O O O 的状态 Q = q 1 q 2 … q T Q = q_1q_2…q_T Q=q1q2qT 已知(即存在大量标注的样本),可以用最大似然估计来计算 μ \mu μ的参数:

各估计如下:
p ~ i = δ ( q 1 , S i ) \tilde p_i = \delta(q_1,S_i) p~i=δ(q1,Si)

a ~ i j = Q 中 从 状 态 q i 转 移 到 q j 的 次 数 Q 中 所 有 从 状 态 q i 转 移 到 另 一 状 态 ( 包 括 q j 自 身 ) 的 总 数 = ∑ t = 1 T − 1 δ ( q t , S i ) ∗ δ ( q t + 1 , S j ) ∑ t = 1 T − 1 δ ( q t , S i ) \tilde a_{ij} =\frac{Q中从状态q_i转移到q_j的次数}{Q中所有从状态q_i转移到另一状态(包括q_j自身)的总数} =\frac{\sum_{t=1}^{T-1} \delta(q_t,S_i)*\delta(q_{t+1},S_j)}{\sum_{t=1}^{T-1} \delta(q_t,S_i)} a~ij=QqiqjQqiqj=t=1T1δ(qt,Si)t=1T1δ(qt,Si)δ(qt+1,Sj)

类似的:
b ~ j ( k ) = Q 中 从 状 态 q j 输 出 符 号 Q 到 达 q j 地 总 次 数 = ∑ t = 1 T − 1 δ ( q t , S j ) ∗ δ ( O t , v k ) ∑ t = 1 T δ ( q t , S i ) \tilde b_j(k) =\frac{Q中从状态q_j输出符号}{Q到达q_j地总次数} = \frac{\sum_{t=1}^{T-1} \delta(q_t,S_j)*\delta(O_{t},v_k)}{\sum_{t=1}^{T} \delta(q_t,S_i)} b~j(k)=QqjQqj=t=1Tδ(qt,Si)t=1T1δ(qt,Sj)δ(Ot,vk)

其中, V k V_k Vk是模型输出符号集中地第k个符号。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值