读者可以去我的github阅读一份可读性高的HMM用于NER识别的代码,欢迎点star,欢迎fork
以一个例子介绍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的三个问题:
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∣μ)=Q∑p(O,Q∣μ)=Q∑p(Q∣μ)∗p(O∣Q,μ)
其中
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∣μ)=πq1∗aq1q2∗aq2q3∗...∗aqT−1qT
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(O∣Q,μ)=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)
问题二的本质是如何发现最优状态序列去最好地解释观察序列
一种解释是:状态序列中每个状态都单独地具有概率,对于每个时刻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=Si∣O,μ)最大
另一种解释:在给定模型 μ \mu μ 和观察序列 O O O的条件下求概率最大的状态序列:
Q ~ = a r g m a x p ( Q ∣ O , μ ) \tilde Q = arg max p(Q|O,\mu) Q~=argmaxp(Q∣O,μ)
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,...,qt−1maxp(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算法去求解。
参数学习
给定一个观察序列 O = O 1 O 2 … O T O = O_1O_2…O_T O=O1O2…OT,如何根据最大似然估计来求模型的参数值?或者说如何调节模型 μ \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=q1q2…qT 已知(即存在大量标注的样本),可以用最大似然估计来计算 μ \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=Q中所有从状态qi转移到另一状态(包括qj自身)的总数Q中从状态qi转移到qj的次数=∑t=1T−1δ(qt,Si)∑t=1T−1δ(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)=Q到达qj地总次数Q中从状态qj输出符号=∑t=1Tδ(qt,Si)∑t=1T−1δ(qt,Sj)∗δ(Ot,vk)
其中, V k V_k Vk是模型输出符号集中地第k个符号。